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];