From 95011a4a979e08607ab9de08a7c01b595e622022 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 20 Dec 2022 14:59:33 +1100 Subject: [PATCH] Force pathfinding graph for empty chunks (#12856) * Force pathfinding graph for empty chunks * im merging --- .../NPC/Pathfinding/PathfindingSystem.Grid.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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)