diff --git a/Content.Server/GameObjects/EntitySystems/AI/Pathfinding/PathfindingSystem.cs b/Content.Server/GameObjects/EntitySystems/AI/Pathfinding/PathfindingSystem.cs index 6443a5e0b2..385954b9d6 100644 --- a/Content.Server/GameObjects/EntitySystems/AI/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/AI/Pathfinding/PathfindingSystem.cs @@ -37,9 +37,9 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding public IReadOnlyDictionary> Graph => _graph; private readonly Dictionary> _graph = new Dictionary>(); - + private readonly PathfindingJobQueue _pathfindingQueue = new PathfindingJobQueue(); - + // Queued pathfinding graph updates private readonly Queue _collidableUpdateQueue = new Queue(); private readonly Queue _moveUpdateQueue = new Queue(); @@ -50,11 +50,11 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding private readonly Dictionary _lastKnownPositions = new Dictionary(); public const int TrackedCollisionLayers = (int) - (CollisionGroup.Impassable | + (CollisionGroup.Impassable | CollisionGroup.MobImpassable | - CollisionGroup.SmallImpassable | + CollisionGroup.SmallImpassable | CollisionGroup.VaultImpassable); - + /// /// Ask for the pathfinder to gimme somethin /// @@ -83,7 +83,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding private void ProcessGraphUpdates() { var totalUpdates = 0; - + foreach (var update in _collidableUpdateQueue) { var entity = _entitymanager.GetEntity(update.Owner); @@ -98,7 +98,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding totalUpdates++; } - + _collidableUpdateQueue.Clear(); foreach (var update in _accessReaderUpdateQueue) @@ -115,7 +115,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding totalUpdates++; } - + _accessReaderUpdateQueue.Clear(); foreach (var tile in _tileUpdateQueue) @@ -123,10 +123,10 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding HandleTileUpdate(tile); totalUpdates++; } - + _tileUpdateQueue.Clear(); var moveUpdateCount = Math.Max(50 - totalUpdates, 0); - + // Other updates are high priority so for this we'll just defer it if there's a spike (explosion, etc.) // If the move updates grow too large then we'll just do it if (_moveUpdateQueue.Count > 100) @@ -135,12 +135,12 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding } moveUpdateCount = Math.Min(moveUpdateCount, _moveUpdateQueue.Count); - + for (var i = 0; i < moveUpdateCount; i++) { HandleCollidableMove(_moveUpdateQueue.Dequeue()); } - + DebugTools.Assert(_moveUpdateQueue.Count < 1000); } @@ -171,10 +171,10 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding { _graph.Add(gridId, new Dictionary()); } - + _graph[gridId].Add(indices, newChunk); newChunk.Initialize(_mapManager.GetGrid(gridId)); - + return newChunk; } @@ -204,6 +204,9 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding public override void Initialize() { + // TODO: Remove this once the memory leaks are solved. + return; + SubscribeLocalEvent(QueueCollisionChangeMessage); SubscribeLocalEvent(QueueMoveEvent); SubscribeLocalEvent(QueueAccessChangeMessage); @@ -221,12 +224,12 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding UnsubscribeLocalEvent(); UnsubscribeLocalEvent(); UnsubscribeLocalEvent(); - + _mapManager.OnGridRemoved -= HandleGridRemoval; _mapManager.GridChanged -= QueueGridChange; _mapManager.TileChanged -= QueueTileChange; } - + private void HandleTileUpdate(TileRef tile) { var node = GetNode(tile); @@ -280,7 +283,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding { return; } - + var grid = _mapManager.GetGrid(entity.Transform.GridID); var tileRef = grid.GetTileRef(entity.Transform.GridPosition); @@ -313,7 +316,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding private void HandleCollidableMove(MoveEvent moveEvent) { var entityUid = moveEvent.Sender.Uid; - + if (!_lastKnownPositions.TryGetValue(entityUid, out var oldNode)) { return; @@ -326,7 +329,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding HandleEntityRemove(moveEvent.Sender); return; } - + var newTile = _mapManager.GetGrid(moveEvent.NewPosition.GridID).GetTileRef(moveEvent.NewPosition); if (oldNode == null || oldNode.TileRef == newTile) @@ -365,7 +368,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI.Pathfinding } var access = AccessReader.FindAccessTags(entity); - + foreach (var reader in node.AccessReaders) { if (!reader.IsAllowed(access))