foreach (var tileRef in _map.GetAllTiles(ev.EntityUid, grid))
{
- if (IsEdge(grid, tileRef.GridIndices, out var dir))
+ if (IsEdge((ev.EntityUid, grid), tileRef.GridIndices, out var dir))
edges.Add(tileRef.GridIndices, dir);
}
}
}
// finally check if the new tile is itself an edge tile
- if (IsEdge(grid, change.GridIndices, out var spaceDir))
+ if (IsEdge((ev.Entity, grid), change.GridIndices, out var spaceDir))
edges.Add(change.GridIndices, spaceDir);
}
}
/// Optionally ignore a specific Vector2i. Used by <see cref="OnTileChanged"/> when we already know that a
/// given tile is not space. This avoids unnecessary TryGetTileRef calls.
/// </remarks>
- private bool IsEdge(MapGridComponent grid, Vector2i index, out NeighborFlag spaceDirections)
+ private bool IsEdge(Entity<MapGridComponent> grid, Vector2i index, out NeighborFlag spaceDirections)
{
spaceDirections = NeighborFlag.Invalid;
for (var i = 0; i < NeighbourVectors.Length; i++)
{
- if (!grid.TryGetTileRef(index + NeighbourVectors[i], out var neighborTile) || neighborTile.Tile.IsEmpty)
+ if (!_mapSystem.TryGetTileRef(grid, grid.Comp, index + NeighbourVectors[i], out var neighborTile) || neighborTile.Tile.IsEmpty)
spaceDirections |= (NeighborFlag) (1 << i);
}
/// <summary>
/// Same as <see cref="ExplodeTile"/>, but for SPAAAAAAACE.
/// </summary>
- internal void ExplodeSpace(BroadphaseComponent lookup,
+ internal void ExplodeSpace(Entity<BroadphaseComponent> lookup,
Matrix3x2 spaceMatrix,
Matrix3x2 invSpaceMatrix,
Vector2i tile,
var state = (list, processed, invSpaceMatrix, lookup.Owner, EntityManager.TransformQuery, gridBox, _transformSystem);
// get entities:
- lookup.DynamicTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
- lookup.StaticTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
- lookup.SundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
- lookup.StaticSundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.DynamicTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.StaticTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.SundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.StaticSundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
foreach (var (uid, xform) in state.Item1)
{
// Also, throw any entities that were spawned as shrapnel. Compared to entity spawning & destruction, this extra
// lookup is relatively minor computational cost, and throwing is disabled for nukes anyways.
list.Clear();
- lookup.DynamicTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
- lookup.SundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.DynamicTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
+ lookup.Comp.SundriesTree.QueryAabb(ref state, SpaceQueryCallback, worldBox, true);
foreach (var (uid, xform) in list)
{
/// <summary>
/// Lookup component for this grid (or space/map).
/// </summary>
- public BroadphaseComponent Lookup;
+ public Entity<BroadphaseComponent> Lookup;
/// <summary>
/// The actual grid that this corresponds to. If null, this implies space.
/// </summary>
- public MapGridComponent? MapGrid;
+ public Entity<MapGridComponent>? MapGrid;
}
private readonly List<ExplosionData> _explosionData = new();
#if DEBUG
private DamageSpecifier? _expectedDamage;
#endif
- private BroadphaseComponent _currentLookup = default!;
- private MapGridComponent? _currentGrid;
+ private Entity<BroadphaseComponent> _currentLookup = default!;
+ private Entity<MapGridComponent>? _currentGrid;
private float _currentIntensity;
private float _currentThrowForce;
private List<Vector2i>.Enumerator _currentEnumerator;
/// The set of tiles that need to be updated when the explosion has finished processing. Used to avoid having
/// the explosion trigger chunk regeneration & shuttle-system processing every tick.
/// </summary>
- private readonly Dictionary<MapGridComponent, List<(Vector2i, Tile)>> _tileUpdateDict = new();
+ private readonly Dictionary<Entity<MapGridComponent>, List<(Vector2i, Tile)>> _tileUpdateDict = new();
// Entity Queries
private readonly EntityQuery<TransformComponent> _xformQuery;
_explosionData.Add(new()
{
TileLists = spaceData.TileLists,
- Lookup = entMan.GetComponent<BroadphaseComponent>(mapUid),
+ Lookup = (mapUid, entMan.GetComponent<BroadphaseComponent>(mapUid)),
MapGrid = null
});
_explosionData.Add(new ExplosionData
{
TileLists = grid.TileLists,
- Lookup = entMan.GetComponent<BroadphaseComponent>(grid.Grid.Owner),
+ Lookup = (grid.Grid, entMan.GetComponent<BroadphaseComponent>(grid.Grid)),
MapGrid = grid.Grid,
});
}
_currentDataIndex++;
// sanity checks, in case something changed while the explosion was being processed over several ticks.
- if (_currentLookup.Deleted || _currentGrid != null && !_entMan.EntityExists(_currentGrid.Owner))
+ if (_currentLookup.Comp.Deleted || _currentGrid != null && !_entMan.EntityExists(_currentGrid.Value))
continue;
return true;
}
// Is the current tile on a grid (instead of in space)?
- if (_currentGrid != null &&
- _currentGrid.TryGetTileRef(_currentEnumerator.Current, out var tileRef) &&
+ if (_currentGrid is { } currentGrid &&
+ _mapSystem.TryGetTileRef(currentGrid, currentGrid.Comp, _currentEnumerator.Current, out var tileRef) &&
!tileRef.Tile.IsEmpty)
{
- if (!_tileUpdateDict.TryGetValue(_currentGrid, out var tileUpdateList))
+ if (!_tileUpdateDict.TryGetValue(currentGrid, out var tileUpdateList))
{
tileUpdateList = new();
- _tileUpdateDict[_currentGrid] = tileUpdateList;
+ _tileUpdateDict[currentGrid] = tileUpdateList;
}
// damage entities on the tile. Also figures out whether there are any solid entities blocking the floor
// from being destroyed.
var canDamageFloor = _system.ExplodeTile(_currentLookup,
- (_currentGrid.Owner, _currentGrid),
+ currentGrid,
_currentEnumerator.Current,
_currentThrowForce,
_currentDamage,