diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index d42222841a..3132eefd68 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -117,7 +117,7 @@ namespace Content.Server.Atmos.EntitySystems var gridUid = grid.Owner; var query = EntityManager.GetEntityQuery(); - _explosionSystem.UpdateAirtightMap(gridId, pos, query); + _explosionSystem.UpdateAirtightMap(gridId, pos, grid, query); // TODO make atmos system use query _atmosphereSystem.InvalidateTile(gridUid, pos); } diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs index 9125b22876..1a9f957218 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs @@ -42,10 +42,10 @@ public sealed partial class ExplosionSystem : EntitySystem // indices to this tile-data struct. private Dictionary> _airtightMap = new(); - public void UpdateAirtightMap(EntityUid gridId, Vector2i tile, EntityQuery? query = null) + public void UpdateAirtightMap(EntityUid gridId, Vector2i tile, MapGridComponent? grid = null, EntityQuery? query = null) { - if (_mapManager.TryGetGrid(gridId, out var grid)) - UpdateAirtightMap(grid, tile, query); + if (Resolve(gridId, ref grid, false)) + UpdateAirtightMap(gridId, grid, tile, query); } /// @@ -58,25 +58,26 @@ public sealed partial class ExplosionSystem : EntitySystem /// something like a normal and a reinforced windoor on the same tile. But given that this is a pretty rare /// occurrence, I am fine with this. /// - public void UpdateAirtightMap(MapGridComponent grid, Vector2i tile, EntityQuery? query = null) + public void UpdateAirtightMap(EntityUid gridId, MapGridComponent grid, Vector2i tile, EntityQuery? query = null) { var tolerance = new float[_explosionTypes.Count]; var blockedDirections = AtmosDirection.Invalid; - if (!_airtightMap.ContainsKey(grid.Owner)) - _airtightMap[grid.Owner] = new(); + if (!_airtightMap.ContainsKey(gridId)) + _airtightMap[gridId] = new(); query ??= EntityManager.GetEntityQuery(); var damageQuery = EntityManager.GetEntityQuery(); var destructibleQuery = EntityManager.GetEntityQuery(); + var anchoredEnumerator = grid.GetAnchoredEntitiesEnumerator(tile); - foreach (var uid in grid.GetAnchoredEntities(tile)) + while (anchoredEnumerator.MoveNext(out var uid)) { if (!query.Value.TryGetComponent(uid, out var airtight) || !airtight.AirBlocked) continue; blockedDirections |= airtight.AirBlockedDirection; - var entityTolerances = GetExplosionTolerance(uid, damageQuery, destructibleQuery); + var entityTolerances = GetExplosionTolerance(uid.Value, damageQuery, destructibleQuery); for (var i = 0; i < tolerance.Length; i++) { tolerance[i] = Math.Max(tolerance[i], entityTolerances[i]); @@ -84,9 +85,9 @@ public sealed partial class ExplosionSystem : EntitySystem } if (blockedDirections != AtmosDirection.Invalid) - _airtightMap[grid.Owner][tile] = new(tolerance, blockedDirections); + _airtightMap[gridId][tile] = new(tolerance, blockedDirections); else - _airtightMap[grid.Owner].Remove(tile); + _airtightMap[gridId].Remove(tile); } /// @@ -104,7 +105,7 @@ public sealed partial class ExplosionSystem : EntitySystem if (!_mapManager.TryGetGrid(transform.GridUid, out var grid)) return; - UpdateAirtightMap(grid, grid.CoordinatesToTile(transform.Coordinates)); + UpdateAirtightMap(transform.GridUid.Value, grid, grid.CoordinatesToTile(transform.Coordinates)); } ///