Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lots of pathfinder bugfixes #8248

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions Content.Server/AI/Pathfinding/PathfindingNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,8 @@ public void AddEntity(EntityUid entity, IPhysBody physicsComponent, IEntityManag

DebugTools.Assert((PathfindingSystem.TrackedCollisionLayers & physicsComponent.CollisionLayer) != 0);

if (physicsComponent.BodyType != BodyType.Static)
if (physicsComponent.BodyType != BodyType.Static ||
!physicsComponent.Hard)
{
_physicsLayers.Add(entity, physicsComponent.CollisionLayer);
}
Expand All @@ -285,18 +286,19 @@ public void RemoveEntity(EntityUid entity)
// There's no guarantee that the entity isn't deleted
// 90% of updates are probably entities moving around
// Entity can't be under multiple categories so just checking each once is fine.
if (_physicsLayers.ContainsKey(entity))
if (_physicsLayers.Remove(entity))
{
_physicsLayers.Remove(entity);
return;
}
else if (_accessReaders.ContainsKey(entity))

if (_accessReaders.Remove(entity))
{
_accessReaders.Remove(entity);
ParentChunk.Dirty();
return;
}
else if (_blockedCollidables.ContainsKey(entity))

if (_blockedCollidables.Remove(entity))
{
_blockedCollidables.Remove(entity);
GenerateMask();
ParentChunk.Dirty();
}
Expand Down
64 changes: 46 additions & 18 deletions Content.Server/AI/Pathfinding/PathfindingSystem.Grid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@

namespace Content.Server.AI.Pathfinding;

/// <summary>
/// Handles pathfinding while on a grid.
/// </summary>
public sealed partial class PathfindingSystem
{
/*
* Handles pathfinding while on a grid.
*/

[Dependency] private readonly AccessReaderSystem _accessReader = default!;
[Dependency] private readonly IMapManager _mapManager = default!;

Expand All @@ -28,11 +29,23 @@ public override void Initialize()
SubscribeLocalEvent<AccessReaderChangeEvent>(OnAccessChange);
SubscribeLocalEvent<GridAddEvent>(OnGridAdd);
SubscribeLocalEvent<TileChangedEvent>(OnTileChange);
SubscribeLocalEvent<PhysicsBodyTypeChangedEvent>(OnBodyTypeChange);

// Handle all the base grid changes
// Anything that affects traversal (i.e. collision layer) is handled separately.
}

private void OnBodyTypeChange(ref PhysicsBodyTypeChangedEvent ev)
{
var xform = Transform(ev.Entity);

if (!IsRelevant(xform, ev.Component)) return;

var node = GetNode(xform);
node?.RemoveEntity(ev.Entity);
node?.AddEntity(ev.Entity, ev.Component, EntityManager);
}

private void OnGridAdd(GridAddEvent ev)
{
EnsureComp<GridPathfindingComponent>(ev.EntityUid);
Expand Down Expand Up @@ -91,6 +104,8 @@ private PathfindingChunk CreateChunk(GridPathfindingComponent comp, Vector2i ind
return newChunk;
}



/// <summary>
/// Return the corresponding PathfindingNode for this tile
/// </summary>
Expand Down Expand Up @@ -149,6 +164,27 @@ private void OnEntityRemove(EntityUid entity, TransformComponent? xform = null)
node.RemoveEntity(entity);
}

private void OnEntityRemove(EntityUid entity, EntityCoordinates coordinates)
{
var gridId = coordinates.GetGridId(EntityManager);
if (!_mapManager.TryGetGrid(gridId, out var grid)) return;

var node = GetNode(grid.GetTileRef(coordinates));
node.RemoveEntity(entity);
}

private PathfindingNode? GetNode(TransformComponent xform)
{
if (!_mapManager.TryGetGrid(xform.GridID, out var grid)) return null;
return GetNode(grid.GetTileRef(xform.Coordinates));
}

private PathfindingNode? GetNode(EntityCoordinates coordinates)
{
if (!_mapManager.TryGetGrid(coordinates.GetGridId(EntityManager), out var grid)) return null;
return GetNode(grid.GetTileRef(coordinates));
}

/// <summary>
/// When an entity moves around we'll remove it from its old node and add it to its new node (if applicable)
/// </summary>
Expand All @@ -159,27 +195,19 @@ private void OnEntityMove(MoveEvent moveEvent)

// If we've moved to space or the likes then remove us.
if (!TryComp<PhysicsComponent>(moveEvent.Sender, out var physics) ||
!IsRelevant(xform, physics) ||
moveEvent.NewPosition.GetGridId(EntityManager) == GridId.Invalid)
!IsRelevant(xform, physics))
{
OnEntityRemove(moveEvent.Sender, xform);
OnEntityRemove(moveEvent.Sender, moveEvent.OldPosition);
return;
}

var oldGridId = moveEvent.OldPosition.GetGridId(EntityManager);
var gridId = moveEvent.NewPosition.GetGridId(EntityManager);
var oldNode = GetNode(moveEvent.OldPosition);
var newNode = GetNode(moveEvent.NewPosition);

if (_mapManager.TryGetGrid(oldGridId, out var oldGrid))
{
var oldNode = GetNode(oldGrid.GetTileRef(moveEvent.OldPosition));
oldNode.RemoveEntity(moveEvent.Sender);
}
if (oldNode?.Equals(newNode) == true) return;

if (_mapManager.TryGetGrid(gridId, out var grid))
{
var newNode = GetNode(grid.GetTileRef(moveEvent.OldPosition));
newNode.AddEntity(moveEvent.Sender, physics, EntityManager);
}
oldNode?.RemoveEntity(moveEvent.Sender);
newNode?.AddEntity(moveEvent.Sender, physics, EntityManager);
}

// TODO: Need to rethink the pathfinder utils (traversable etc.). Maybe just chuck them all in PathfindingSystem
Expand Down
2 changes: 1 addition & 1 deletion Content.Server/Disposal/Tube/DisposalTubeSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private void OnOpenTaggerUIAttempt(EntityUid uid, DisposalTaggerComponent router
private static void BodyTypeChanged(
EntityUid uid,
DisposalTubeComponent component,
PhysicsBodyTypeChangedEvent args)
ref PhysicsBodyTypeChangedEvent args)
{
component.AnchoredChanged();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ private void InitializePartSystem()
private static void BodyTypeChanged(
EntityUid uid,
ParticleAcceleratorPartComponent component,
PhysicsBodyTypeChangedEvent args)
ref PhysicsBodyTypeChangedEvent args)
{
component.OnAnchorChanged();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ private void HandleFieldCollide(EntityUid uid, ContainmentFieldComponent compone
private static void BodyTypeChanged(
EntityUid uid,
ContainmentFieldGeneratorComponent component,
PhysicsBodyTypeChangedEvent args)
ref PhysicsBodyTypeChangedEvent args)
{
component.OnAnchoredChanged();
}
Expand Down
3 changes: 3 additions & 0 deletions Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
id: SimpleSpaceMobBase # Mob without barotrauma, freezing and asphyxiation (for space carps!?)
suffix: AI
components:
- type: Tag
tags:
- DoorBumpOpener
- type: Reactive
groups:
Flammable: [Touch]
Expand Down
4 changes: 3 additions & 1 deletion Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
fixtures:
- shape:
!type:PhysShapeCircle
radius: 0.35
radius: 0.25
mass: 120
mask:
- MobMask
Expand Down Expand Up @@ -88,6 +88,8 @@
- type: Tag
tags:
- CannotSuicide
- DoorBumpOpener
- FootstepSound
- type: NoSlip

- type: entity
Expand Down