diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs index d9d2fb4033..c2acad78cd 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs @@ -49,9 +49,18 @@ public sealed partial class PathfindingSystem SubscribeLocalEvent(OnGridPathShutdown); SubscribeLocalEvent(OnCollisionChange); SubscribeLocalEvent(OnBodyTypeChange); + SubscribeLocalEvent(OnTileChange); SubscribeLocalEvent(OnMoveEvent); } + private void OnTileChange(TileChangedEvent ev) + { + if (ev.OldTile.IsEmpty == ev.NewTile.Tile.IsEmpty) + return; + + DirtyChunk(ev.Entity, Comp(ev.Entity).GridTileToLocal(ev.NewTile.GridIndices)); + } + private void OnGridPathPause(EntityUid uid, GridPathfindingComponent component, ref EntityUnpausedEvent args) { component.NextUpdate += args.PausedTime; @@ -88,8 +97,10 @@ public sealed partial class PathfindingSystem }; // We defer chunk updates because rebuilding a navmesh is hella costly - // If we're paused then NPCs can't run anyway. - foreach (var comp in EntityQuery()) + // Still run even when paused. + var query = AllEntityQuery(); + + while (query.MoveNext(out var comp)) { if (comp.DirtyChunks.Count == 0 || comp.NextUpdate < curTime || @@ -318,6 +329,17 @@ public sealed partial class PathfindingSystem private void OnGridInit(GridInitializeEvent ev) { EnsureComp(ev.EntityUid); + + // Pathfinder refactor + var mapGrid = Comp(ev.EntityUid); + + for (var x = Math.Floor(mapGrid.LocalAABB.Left); x <= Math.Ceiling(mapGrid.LocalAABB.Right + ChunkSize); x += ChunkSize) + { + for (var y = Math.Floor(mapGrid.LocalAABB.Bottom); y <= Math.Ceiling(mapGrid.LocalAABB.Top + ChunkSize); y += ChunkSize) + { + DirtyChunk(ev.EntityUid, mapGrid.GridTileToLocal(new Vector2i((int) x, (int) y))); + } + } } private void OnGridRemoved(GridRemovalEvent ev)