diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs index 7a18c1f30c..11b6065381 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs @@ -458,10 +458,11 @@ public sealed partial class PathfindingSystem continue; // TODO: Inefficient af - foreach (var (_, fixture) in fixtures.Fixtures) + foreach (var fixture in fixtures.Fixtures.Values) { // Don't need to re-do it. - if ((collisionMask & fixture.CollisionMask) == fixture.CollisionMask && + if (!fixture.Hard || + (collisionMask & fixture.CollisionMask) == fixture.CollisionMask && (collisionLayer & fixture.CollisionLayer) == fixture.CollisionLayer) continue; diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index 62ead9f4d2..504f3c443f 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -11,6 +11,7 @@ using Content.Shared.NPC; using Robust.Server.Player; using Robust.Shared.Enums; using Robust.Shared.Map; +using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; using Robust.Shared.Players; @@ -43,6 +44,7 @@ namespace Content.Server.NPC.Pathfinding [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly DestructibleSystem _destructible = default!; [Dependency] private readonly FixtureSystem _fixtures = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; private ISawmill _sawmill = default!; @@ -239,10 +241,9 @@ namespace Content.Server.NPC.Pathfinding var layer = 0; var mask = 0; - if (TryComp(entity, out var body)) + if (TryComp(entity, out var fixtures)) { - layer = body.CollisionLayer; - mask = body.CollisionMask; + (layer, mask) = _physics.GetHardCollision(entity, fixtures); } var request = new BFSPathRequest(maxRange, limit, start.Coordinates, flags, layer, mask, cancelToken); @@ -386,10 +387,9 @@ namespace Content.Server.NPC.Pathfinding var layer = 0; var mask = 0; - if (TryComp(entity, out var body)) + if (TryComp(entity, out var fixtures)) { - layer = body.CollisionLayer; - mask = body.CollisionMask; + (layer, mask) = _physics.GetHardCollision(entity, fixtures); } return new AStarPathRequest(start, end, flags, range, layer, mask, cancelToken); diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs index dafa524cf8..042e9df734 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs @@ -4,6 +4,7 @@ using Content.Server.NPC.Pathfinding; using Content.Shared.Doors.Components; using Content.Shared.NPC; using Content.Shared.Weapons.Melee; +using Robust.Shared.Physics; using Robust.Shared.Physics.Components; namespace Content.Server.NPC.Systems; @@ -35,20 +36,29 @@ public sealed partial class NPCSteeringSystem if (poly.Data.IsFreeSpace) return SteeringObstacleStatus.Completed; - if (!bodyQuery.TryGetComponent(component.Owner, out var body)) - return SteeringObstacleStatus.Failed; - // TODO: Store PathFlags on the steering comp // and be able to re-check it. + var layer = 0; + var mask = 0; + + if (TryComp(component.Owner, out var manager)) + { + (layer, mask) = _physics.GetHardCollision(component.Owner, manager); + } + else + { + return SteeringObstacleStatus.Failed; + } + // TODO: Should cache the fact we're doing this somewhere. // See https://github.com/space-wizards/space-station-14/issues/11475 - if ((poly.Data.CollisionLayer & body.CollisionMask) != 0x0 || - (poly.Data.CollisionMask & body.CollisionLayer) != 0x0) + if ((poly.Data.CollisionLayer & mask) != 0x0 || + (poly.Data.CollisionMask & layer) != 0x0) { var obstacleEnts = new List(); - GetObstacleEntities(poly, body.CollisionMask, body.CollisionLayer, bodyQuery, obstacleEnts); + GetObstacleEntities(poly, mask, layer, bodyQuery, obstacleEnts); var isDoor = (poly.Data.Flags & PathfindingBreadcrumbFlag.Door) != 0x0; var isAccess = (poly.Data.Flags & PathfindingBreadcrumbFlag.Access) != 0x0; diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index a74d24ffd6..a4e13510af 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -30,6 +30,7 @@ namespace Content.Server.NPC.Systems [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedMeleeWeaponSystem _melee = default!; [Dependency] private readonly SharedMoverController _mover = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; // This will likely get moved onto an abstract pathfinding node that specifies the max distance allowed from the coordinate. private const float TileTolerance = 0.40f;