Nullable grid Uid (#8798)
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Content.Server.AI.Operators.Inventory
|
||||
{
|
||||
var targetTransform = _entMan.GetComponent<TransformComponent>(_useTarget);
|
||||
|
||||
if (targetTransform.GridEntityId != _entMan.GetComponent<TransformComponent>(_owner).GridEntityId)
|
||||
if (targetTransform.GridUid != _entMan.GetComponent<TransformComponent>(_owner).GridUid)
|
||||
{
|
||||
return Outcome.Failed;
|
||||
}
|
||||
|
||||
@@ -168,10 +168,10 @@ namespace Content.Server.AI.Pathfinding.Accessible
|
||||
{
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(target);
|
||||
// TODO: Handle this gracefully instead of just failing.
|
||||
if (!xform.GridEntityId.IsValid())
|
||||
if (xform.GridUid == null)
|
||||
return false;
|
||||
|
||||
var targetTile = _mapManager.GetGrid(xform.GridEntityId).GetTileRef(xform.Coordinates);
|
||||
var targetTile = _mapManager.GetGrid(xform.GridUid.Value).GetTileRef(xform.Coordinates);
|
||||
var targetNode = _pathfindingSystem.GetNode(targetTile);
|
||||
|
||||
var collisionMask = 0;
|
||||
@@ -206,10 +206,10 @@ namespace Content.Server.AI.Pathfinding.Accessible
|
||||
{
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
|
||||
if (xform.GridEntityId != targetNode.TileRef.GridUid)
|
||||
if (xform.GridUid != targetNode.TileRef.GridUid || xform.GridUid == null)
|
||||
return false;
|
||||
|
||||
var entityTile = _mapManager.GetGrid(xform.GridEntityId).GetTileRef(xform.Coordinates);
|
||||
var entityTile = _mapManager.GetGrid(xform.GridUid.Value).GetTileRef(xform.Coordinates);
|
||||
var entityNode = _pathfindingSystem.GetNode(entityTile);
|
||||
var entityRegion = GetRegion(entityNode);
|
||||
var targetRegion = GetRegion(targetNode);
|
||||
@@ -421,12 +421,12 @@ namespace Content.Server.AI.Pathfinding.Accessible
|
||||
{
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
|
||||
if (!xform.GridEntityId.IsValid())
|
||||
if (xform.GridUid == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var entityTile = _mapManager.GetGrid(xform.GridEntityId).GetTileRef(xform.Coordinates);
|
||||
var entityTile = _mapManager.GetGrid(xform.GridUid.Value).GetTileRef(xform.Coordinates);
|
||||
var entityNode = _pathfindingSystem.GetNode(entityTile);
|
||||
return GetRegion(entityNode);
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ public sealed partial class PathfindingSystem
|
||||
|
||||
private bool IsRelevant(TransformComponent xform, PhysicsComponent physics)
|
||||
{
|
||||
return xform.GridEntityId != EntityUid.Invalid && (TrackedCollisionLayers & physics.CollisionLayer) != 0;
|
||||
return xform.GridUid != null && (TrackedCollisionLayers & physics.CollisionLayer) != 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -143,7 +143,7 @@ public sealed partial class PathfindingSystem
|
||||
!Resolve(entity, ref physics, false)) return;
|
||||
|
||||
if (!IsRelevant(xform, physics) ||
|
||||
!_mapManager.TryGetGrid(xform.GridEntityId, out var grid))
|
||||
!_mapManager.TryGetGrid(xform.GridUid, out var grid))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -158,7 +158,7 @@ public sealed partial class PathfindingSystem
|
||||
private void OnEntityRemove(EntityUid entity, TransformComponent? xform = null)
|
||||
{
|
||||
if (!Resolve(entity, ref xform, false) ||
|
||||
!_mapManager.TryGetGrid(xform.GridEntityId, out var grid)) return;
|
||||
!_mapManager.TryGetGrid(xform.GridUid, out var grid)) return;
|
||||
|
||||
var node = GetNode(grid.GetTileRef(xform.Coordinates));
|
||||
node.RemoveEntity(entity);
|
||||
@@ -166,7 +166,7 @@ public sealed partial class PathfindingSystem
|
||||
|
||||
private void OnEntityRemove(EntityUid entity, EntityCoordinates coordinates)
|
||||
{
|
||||
var gridId = coordinates.GetGridEntityId(EntityManager);
|
||||
var gridId = coordinates.GetGridUid(EntityManager);
|
||||
if (!_mapManager.TryGetGrid(gridId, out var grid)) return;
|
||||
|
||||
var node = GetNode(grid.GetTileRef(coordinates));
|
||||
@@ -175,13 +175,13 @@ public sealed partial class PathfindingSystem
|
||||
|
||||
private PathfindingNode? GetNode(TransformComponent xform)
|
||||
{
|
||||
if (!_mapManager.TryGetGrid(xform.GridEntityId, out var grid)) return null;
|
||||
if (!_mapManager.TryGetGrid(xform.GridUid, out var grid)) return null;
|
||||
return GetNode(grid.GetTileRef(xform.Coordinates));
|
||||
}
|
||||
|
||||
private PathfindingNode? GetNode(EntityCoordinates coordinates)
|
||||
{
|
||||
if (!_mapManager.TryGetGrid(coordinates.GetGridEntityId(EntityManager), out var grid)) return null;
|
||||
if (!_mapManager.TryGetGrid(coordinates.GetGridUid(EntityManager), out var grid)) return null;
|
||||
return GetNode(grid.GetTileRef(coordinates));
|
||||
}
|
||||
|
||||
@@ -215,8 +215,10 @@ public sealed partial class PathfindingSystem
|
||||
// Also look at increasing tile cost the more physics entities are on it
|
||||
public bool CanTraverse(EntityUid entity, EntityCoordinates coordinates)
|
||||
{
|
||||
var gridId = coordinates.GetGridEntityId(EntityManager);
|
||||
var tile = _mapManager.GetGrid(gridId).GetTileRef(coordinates);
|
||||
var gridId = coordinates.GetGridUid(EntityManager);
|
||||
if (gridId == null)
|
||||
return false;
|
||||
var tile = _mapManager.GetGrid(gridId.Value).GetTileRef(coordinates);
|
||||
var node = GetNode(tile);
|
||||
return CanTraverse(entity, node);
|
||||
}
|
||||
|
||||
@@ -242,7 +242,8 @@ namespace Content.Server.AI.Steering
|
||||
if (Deleted(entity) ||
|
||||
!EntityManager.TryGetComponent(entity, out AiControllerComponent? controller) ||
|
||||
!controller.CanMove ||
|
||||
!EntityManager.GetComponent<TransformComponent>(entity).GridEntityId.IsValid())
|
||||
!TryComp(entity, out TransformComponent? xform) ||
|
||||
xform.GridUid == null)
|
||||
{
|
||||
return SteeringStatus.NoPath;
|
||||
}
|
||||
@@ -255,7 +256,7 @@ namespace Content.Server.AI.Steering
|
||||
return SteeringStatus.NoPath;
|
||||
}
|
||||
|
||||
if (_mapManager.IsGridPaused(EntityManager.GetComponent<TransformComponent>(entity).GridEntityId))
|
||||
if (_mapManager.IsGridPaused(xform.GridUid.Value))
|
||||
{
|
||||
controller.VelocityDir = Vector2.Zero;
|
||||
return SteeringStatus.Pending;
|
||||
@@ -263,14 +264,14 @@ namespace Content.Server.AI.Steering
|
||||
|
||||
// Validation
|
||||
// Check if we can even arrive -> Currently only samegrid movement supported
|
||||
if (EntityManager.GetComponent<TransformComponent>(entity).GridEntityId != steeringRequest.TargetGrid.GetGridEntityId(EntityManager))
|
||||
if (xform.GridUid != steeringRequest.TargetGrid.GetGridUid(EntityManager))
|
||||
{
|
||||
controller.VelocityDir = Vector2.Zero;
|
||||
return SteeringStatus.NoPath;
|
||||
}
|
||||
|
||||
// Check if we have arrived
|
||||
var targetDistance = (EntityManager.GetComponent<TransformComponent>(entity).MapPosition.Position - steeringRequest.TargetMap.Position).Length;
|
||||
var targetDistance = (xform.MapPosition.Position - steeringRequest.TargetMap.Position).Length;
|
||||
steeringRequest.TimeUntilInteractionCheck -= frameTime;
|
||||
|
||||
if (targetDistance <= steeringRequest.ArrivalDistance && steeringRequest.TimeUntilInteractionCheck <= 0.0f)
|
||||
@@ -407,9 +408,13 @@ namespace Content.Server.AI.Steering
|
||||
return;
|
||||
}
|
||||
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
if (xform.GridUid == null)
|
||||
return;
|
||||
|
||||
var cancelToken = new CancellationTokenSource();
|
||||
var gridManager = _mapManager.GetGrid(EntityManager.GetComponent<TransformComponent>(entity).GridEntityId);
|
||||
var startTile = gridManager.GetTileRef(EntityManager.GetComponent<TransformComponent>(entity).Coordinates);
|
||||
var gridManager = _mapManager.GetGrid(xform.GridUid.Value);
|
||||
var startTile = gridManager.GetTileRef(xform.Coordinates);
|
||||
var endTile = gridManager.GetTileRef(steeringRequest.TargetGrid);
|
||||
var collisionMask = 0;
|
||||
if (EntityManager.TryGetComponent(entity, out IPhysBody? physics))
|
||||
@@ -439,7 +444,10 @@ namespace Content.Server.AI.Steering
|
||||
{
|
||||
_pathfindingRequests.Remove(entity);
|
||||
|
||||
var entityTile = _mapManager.GetGrid(EntityManager.GetComponent<TransformComponent>(entity).GridEntityId).GetTileRef(EntityManager.GetComponent<TransformComponent>(entity).Coordinates);
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
if (xform.GridUid == null)
|
||||
return;
|
||||
var entityTile = _mapManager.GetGrid(xform.GridUid.Value).GetTileRef(xform.Coordinates);
|
||||
var tile = path.Dequeue();
|
||||
var closestDistance = PathfindingHelpers.OctileDistance(entityTile, tile);
|
||||
|
||||
@@ -508,7 +516,12 @@ namespace Content.Server.AI.Steering
|
||||
{
|
||||
if (_paths[entity].Count == 0) return;
|
||||
var nextTile = dequeue ? _paths[entity].Dequeue() : _paths[entity].Peek();
|
||||
var nextGrid = _mapManager.GetGrid(EntityManager.GetComponent<TransformComponent>(entity).GridEntityId).GridTileToLocal(nextTile.GridIndices);
|
||||
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
if (xform.GridUid == null)
|
||||
return;
|
||||
|
||||
var nextGrid = _mapManager.GetGrid(xform.GridUid.Value).GridTileToLocal(nextTile.GridIndices);
|
||||
_nextGrid[entity] = nextGrid;
|
||||
}
|
||||
|
||||
@@ -630,8 +643,13 @@ namespace Content.Server.AI.Steering
|
||||
var avoidanceVector = Vector2.Zero;
|
||||
var checkTiles = new HashSet<TileRef>();
|
||||
var avoidTiles = new HashSet<TileRef>();
|
||||
var entityGridCoords = EntityManager.GetComponent<TransformComponent>(entity).Coordinates;
|
||||
var grid = _mapManager.GetGrid(EntityManager.GetComponent<TransformComponent>(entity).GridEntityId);
|
||||
|
||||
var xform = EntityManager.GetComponent<TransformComponent>(entity);
|
||||
if (xform.GridUid == null)
|
||||
return default;
|
||||
|
||||
var entityGridCoords = xform.Coordinates;
|
||||
var grid = _mapManager.GetGrid(xform.GridUid.Value);
|
||||
var currentTile = grid.GetTileRef(entityGridCoords);
|
||||
var halfwayTile = grid.GetTileRef(entityGridCoords.Offset(direction / 2));
|
||||
var nextTile = grid.GetTileRef(entityGridCoords.Offset(direction));
|
||||
|
||||
@@ -51,10 +51,12 @@ namespace Content.Server.AI.Utility.Actions.Idle
|
||||
};
|
||||
}
|
||||
|
||||
private EntityCoordinates FindRandomGrid(IRobustRandom robustRandom)
|
||||
private EntityCoordinates FindRandomGrid(IRobustRandom robustRandom, IEntityManager? entMan = null)
|
||||
{
|
||||
IoCManager.Resolve(ref entMan);
|
||||
|
||||
// Very inefficient (should weight each region by its node count) but better than the old system
|
||||
var reachableSystem = EntitySystem.Get<AiReachableSystem>();
|
||||
var reachableSystem = entMan.EntitySysManager.GetEntitySystem<AiReachableSystem>();
|
||||
var reachableArgs = ReachableArgs.GetArgs(Owner);
|
||||
var entityRegion = reachableSystem.GetRegion(Owner);
|
||||
var reachableRegions = reachableSystem.GetReachableRegions(reachableArgs, entityRegion);
|
||||
@@ -76,9 +78,11 @@ namespace Content.Server.AI.Utility.Actions.Idle
|
||||
}
|
||||
|
||||
var targetNode = robustRandom.Pick(reachableNodes);
|
||||
var mapManager = IoCManager.Resolve<IMapManager>();
|
||||
var grid = mapManager.GetGrid(IoCManager.Resolve<IEntityManager>().GetComponent<TransformComponent>(Owner).GridEntityId);
|
||||
var targetGrid = grid.GridTileToLocal(targetNode.TileRef.GridIndices);
|
||||
|
||||
if (!entMan.TryGetComponent(entMan.GetComponent<TransformComponent>(Owner).GridUid, out IMapGridComponent? grid))
|
||||
return default;
|
||||
|
||||
var targetGrid = grid.Grid.GridTileToLocal(targetNode.TileRef.GridIndices);
|
||||
|
||||
return targetGrid;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Content.Server.AI.Utility.Considerations.Movement
|
||||
var entities = IoCManager.Resolve<IEntityManager>();
|
||||
|
||||
if (context.GetState<TargetEntityState>().GetValue() is not {Valid: true} target || entities.Deleted(target) ||
|
||||
entities.GetComponent<TransformComponent>(target).GridEntityId != entities.GetComponent<TransformComponent>(self).GridEntityId)
|
||||
entities.GetComponent<TransformComponent>(target).GridUid != entities.GetComponent<TransformComponent>(self).GridUid)
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Content.Server.AI.Utils
|
||||
{
|
||||
var transform = entityManager.GetComponent<TransformComponent>(entity);
|
||||
|
||||
if (transform.Coordinates.GetGridEntityId(entityManager) != grid.GetGridEntityId(entityManager))
|
||||
if (transform.Coordinates.GetGridUid(entityManager) != grid.GetGridUid(entityManager))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user