diff --git a/Content.Server/AI/Pathfinding/Accessible/AiReachableSystem.cs b/Content.Server/AI/Pathfinding/Accessible/AiReachableSystem.cs index a3eff7de57..7b7b3af439 100644 --- a/Content.Server/AI/Pathfinding/Accessible/AiReachableSystem.cs +++ b/Content.Server/AI/Pathfinding/Accessible/AiReachableSystem.cs @@ -172,11 +172,12 @@ namespace Content.Server.AI.Pathfinding.Accessible /// public bool CanAccess(EntityUid entity, EntityUid target, float range = 0.0f) { + var xform = EntityManager.GetComponent(target); // TODO: Handle this gracefully instead of just failing. - if (!EntityManager.GetComponent(target).GridID.IsValid()) + if (!xform.GridID.IsValid()) return false; - var targetTile = _mapManager.GetGrid(EntityManager.GetComponent(target).GridID).GetTileRef(EntityManager.GetComponent(target).Coordinates); + var targetTile = _mapManager.GetGrid(xform.GridID).GetTileRef(xform.Coordinates); var targetNode = _pathfindingSystem.GetNode(targetTile); var collisionMask = 0; @@ -209,12 +210,12 @@ namespace Content.Server.AI.Pathfinding.Accessible public bool CanAccess(EntityUid entity, PathfindingNode targetNode) { - if (EntityManager.GetComponent(entity).GridID != targetNode.TileRef.GridIndex) - { - return false; - } + var xform = EntityManager.GetComponent(entity); - var entityTile = _mapManager.GetGrid(EntityManager.GetComponent(entity).GridID).GetTileRef(EntityManager.GetComponent(entity).Coordinates); + if (xform.GridID != targetNode.TileRef.GridIndex) + return false; + + var entityTile = _mapManager.GetGrid(xform.GridID).GetTileRef(xform.Coordinates); var entityNode = _pathfindingSystem.GetNode(entityTile); var entityRegion = GetRegion(entityNode); var targetRegion = GetRegion(targetNode); @@ -424,12 +425,14 @@ namespace Content.Server.AI.Pathfinding.Accessible /// public PathfindingRegion? GetRegion(EntityUid entity) { - if (!EntityManager.GetComponent(entity).GridID.IsValid()) + var xform = EntityManager.GetComponent(entity); + + if (!xform.GridID.IsValid()) { return null; } - var entityTile = _mapManager.GetGrid(EntityManager.GetComponent(entity).GridID).GetTileRef(EntityManager.GetComponent(entity).Coordinates); + var entityTile = _mapManager.GetGrid(xform.GridID).GetTileRef(xform.Coordinates); var entityNode = _pathfindingSystem.GetNode(entityTile); return GetRegion(entityNode); } diff --git a/Content.Server/AI/Pathfinding/PathfindingSystem.cs b/Content.Server/AI/Pathfinding/PathfindingSystem.cs index bc8490228a..938c63a368 100644 --- a/Content.Server/AI/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/AI/Pathfinding/PathfindingSystem.cs @@ -30,7 +30,6 @@ namespace Content.Server.AI.Pathfinding public sealed class PathfindingSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!; public IReadOnlyDictionary> Graph => _graph; @@ -207,12 +206,11 @@ namespace Content.Server.AI.Pathfinding SubscribeLocalEvent(QueueMoveEvent); SubscribeLocalEvent(QueueAccessChangeMessage); SubscribeLocalEvent(HandleGridRemoval); - SubscribeLocalEvent(QueueGridChange); SubscribeLocalEvent(QueueTileChange); // Handle all the base grid changes // Anything that affects traversal (i.e. collision layer) is handled separately. - + } private void HandleTileUpdate(TileRef tile) @@ -231,14 +229,6 @@ namespace Content.Server.AI.Pathfinding } } - private void QueueGridChange(GridModifiedEvent ev) - { - foreach (var (position, _) in ev.Modified) - { - _tileUpdateQueue.Enqueue(ev.Grid.GetTileRef(position)); - } - } - private void QueueTileChange(TileChangedEvent ev) { _tileUpdateQueue.Enqueue(ev.NewTile); @@ -264,8 +254,9 @@ namespace Content.Server.AI.Pathfinding return; } - var grid = _mapManager.GetGrid(EntityManager.GetComponent(entity).GridID); - var tileRef = grid.GetTileRef(EntityManager.GetComponent(entity).Coordinates); + var xform = EntityManager.GetComponent(entity); + var grid = _mapManager.GetGrid(xform.GridID); + var tileRef = grid.GetTileRef(xform.Coordinates); var chunk = GetChunk(tileRef); var node = chunk.GetNode(tileRef); @@ -306,9 +297,10 @@ namespace Content.Server.AI.Pathfinding } // Memory leak protection until grid parenting confirmed fix / you REALLY need the performance - var gridBounds = _mapManager.GetGrid(EntityManager.GetComponent(moveEvent.Sender).GridID).WorldBounds; + var xform = EntityManager.GetComponent(moveEvent.Sender); + var gridBounds = _mapManager.GetGrid(xform.GridID).WorldBounds; - if (!gridBounds.Contains(EntityManager.GetComponent(moveEvent.Sender).WorldPosition)) + if (!gridBounds.Contains(xform.WorldPosition)) { HandleEntityRemove(moveEvent.Sender); return; @@ -321,7 +313,7 @@ namespace Content.Server.AI.Pathfinding return; } - var newGridId = moveEvent.NewPosition.GetGridId(_entityManager); + var newGridId = moveEvent.NewPosition.GetGridId(EntityManager); if (newGridId == GridId.Invalid) { HandleEntityRemove(moveEvent.Sender); diff --git a/Content.Server/AI/Steering/AiSteeringSystem.cs b/Content.Server/AI/Steering/AiSteeringSystem.cs index 9d7bd23905..84e3adc83a 100644 --- a/Content.Server/AI/Steering/AiSteeringSystem.cs +++ b/Content.Server/AI/Steering/AiSteeringSystem.cs @@ -5,7 +5,9 @@ using Content.Server.AI.Components; using Content.Server.AI.Pathfinding; using Content.Server.AI.Pathfinding.Pathfinders; using Content.Server.CPUJob.JobQueues; +using Content.Server.Doors.Components; using Content.Shared.Access.Systems; +using Content.Shared.Doors.Components; using Content.Shared.Interaction; using Robust.Shared.Map; using Robust.Shared.Physics; @@ -385,6 +387,20 @@ namespace Content.Server.AI.Steering { movementVector += CollisionAvoidance(entity, movementVector, ignoredCollision); } + + // TODO: Jesus this code is shit, slork is a cute dork, but the pathfinder should annotate this. + if (_mapManager.TryGetGrid(nextGrid.Value.EntityId, out var grid)) + { + foreach (var ent in grid.GetAnchoredEntities(nextGrid.Value)) + { + if (HasComp(ent)) + { + _interactionSystem.InteractHand(entity, ent); + break; + } + } + } + // Group behaviors would also go here e.g. separation, cohesion, alignment // Move towards it @@ -472,10 +488,12 @@ namespace Content.Server.AI.Steering _nextGrid.Remove(entity); } + var xform = EntityManager.GetComponent(entity); + // If no tiles left just move towards the target (if we're close) if (!_paths.ContainsKey(entity) || _paths[entity].Count == 0) { - if ((steeringRequest.TargetGrid.Position - EntityManager.GetComponent(entity).Coordinates.Position).Length <= 2.0f) + if ((steeringRequest.TargetGrid.Position - xform.Coordinates.Position).Length <= 2.0f) { return steeringRequest.TargetGrid; } @@ -485,7 +503,7 @@ namespace Content.Server.AI.Steering } if (!_nextGrid.TryGetValue(entity, out var nextGrid) || - (nextGrid.Position - EntityManager.GetComponent(entity).Coordinates.Position).Length <= TileTolerance) + (nextGrid.Position - xform.Coordinates.Position).Length <= TileTolerance) { UpdateGridCache(entity); nextGrid = _nextGrid[entity];