Skip to content

Commit

Permalink
Mirror: NPC Steering Tweaks (#307)
Browse files Browse the repository at this point in the history
## Mirror of PR #26351: [NPC steering
tweaks](space-wizards/space-station-14#26351)
from <img src="https://avatars.githubusercontent.com/u/10567778?v=4"
alt="space-wizards" width="22"/>
[space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14)

###### `64b648ff3c5183393b28285909e6b62c2b66663e`

PR opened by <img
src="https://avatars.githubusercontent.com/u/31366439?v=4"
width="16"/><a href="https://github.com/metalgearsloth">
metalgearsloth</a> at 2024-03-23 01:33:33 UTC

---

PR changed 2 files with 20 additions and 18 deletions.

The PR had the following labels:


---

<details open="true"><summary><h1>Original Body</h1></summary>

> - Fix the free node check considering the whole tile and not the poly,
this fixes 26330.
> - Clear maps on direction resets.
> - More robust arrival checks for pathfinding nodes.
> 
> Resolves
space-wizards/space-station-14#26330
> 
> 🆑
> - fix: Fix NPCs getting stuck on railings.
> 


</details>

Signed-off-by: VMSolidus <[email protected]>
Co-authored-by: SimpleStation14 <Unknown>
Co-authored-by: VMSolidus <[email protected]>
  • Loading branch information
SimpleStation14 and VMSolidus authored Jul 9, 2024
1 parent 2cc737c commit 399bd96
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 18 deletions.
36 changes: 18 additions & 18 deletions Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private bool IsFreeSpace(

// TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future).
var ents = _entSetPool.Get();
_lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static);
_lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.Box.Enlarged(-0.04f), ents, flags: LookupFlags.Static);
var result = true;

if (ents.Count > 0)
Expand Down Expand Up @@ -158,42 +158,42 @@ private bool TrySeek(
}
}

// Check if mapids match.
var targetMap = targetCoordinates.ToMap(EntityManager, _transform);
var ourMap = ourCoordinates.ToMap(EntityManager, _transform);

if (targetMap.MapId != ourMap.MapId)
{
steering.Status = SteeringStatus.NoPath;
return false;
}

var direction = targetMap.Position - ourMap.Position;

// Need to be pretty close if it's just a node to make sure LOS for door bashes or the likes.
float arrivalDistance;
bool arrived;

if (targetCoordinates.Equals(steering.Coordinates))
{
// What's our tolerance for arrival.
// If it's a pathfinding node it might be different to the destination.
arrivalDistance = steering.Range;
arrived = direction.Length() <= steering.Range;
}
// If next node is a free tile then get within its bounds.
// This is to avoid popping it too early
else if (steering.CurrentPath.TryPeek(out var node) && IsFreeSpace(uid, steering, node))
{
arrivalDistance = MathF.Max(0.05f, MathF.Min(node.Box.Width / 2f, node.Box.Height / 2f) - 0.05f);
arrived = node.Box.Contains(ourCoordinates.Position);
}
// Try getting into blocked range I guess?
// TODO: Consider melee range or the likes.
else
{
arrivalDistance = SharedInteractionSystem.InteractionRange - 0.05f;
arrived = direction.Length() <= SharedInteractionSystem.InteractionRange - 0.05f;
}

// Check if mapids match.
var targetMap = targetCoordinates.ToMap(EntityManager, _transform);
var ourMap = ourCoordinates.ToMap(EntityManager, _transform);

if (targetMap.MapId != ourMap.MapId)
{
steering.Status = SteeringStatus.NoPath;
return false;
}

var direction = targetMap.Position - ourMap.Position;

// Are we in range
if (direction.Length() <= arrivalDistance)
if (arrived)
{
// Node needs some kind of special handling like access or smashing.
if (steering.CurrentPath.TryPeek(out var node) && !IsFreeSpace(uid, steering, node))
Expand Down
2 changes: 2 additions & 0 deletions Content.Server/NPC/Systems/NPCSteeringSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ private void SetDirection(InputMoverComponent component, NPCSteeringComponent st
if (clear && value.Equals(Vector2.Zero))
{
steering.CurrentPath.Clear();
Array.Clear(steering.Interest);
Array.Clear(steering.Danger);
}

component.CurTickSprintMovement = value;
Expand Down

0 comments on commit 399bd96

Please sign in to comment.