Nullable grid Uid (#8798)

This commit is contained in:
Leon Friedrich
2022-06-20 12:14:35 +12:00
committed by GitHub
parent ef41cd5aa8
commit fa4c6f63f8
82 changed files with 318 additions and 242 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}