Pathfinder tweaks (#12848)
This commit is contained in:
@@ -36,7 +36,7 @@ public sealed class NPCSteeringComponent : Component
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// How far does the last node in the path need to be before considering re-pathfinding.
|
/// How far does the last node in the path need to be before considering re-pathfinding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ViewVariables(VVAccess.ReadWrite)] public float RepathRange = 1.2f;
|
[ViewVariables(VVAccess.ReadWrite)] public float RepathRange = 1.5f;
|
||||||
|
|
||||||
public const int FailedPathLimit = 3;
|
public const int FailedPathLimit = 3;
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ public sealed class PickAccessibleComponentOperator : HTNOperator
|
|||||||
{
|
{
|
||||||
var path = await _pathfinding.GetRandomPath(
|
var path = await _pathfinding.GetRandomPath(
|
||||||
owner,
|
owner,
|
||||||
1.4f,
|
|
||||||
maxRange,
|
maxRange,
|
||||||
cancelToken,
|
cancelToken,
|
||||||
flags: _pathfinding.GetFlags(blackboard));
|
flags: _pathfinding.GetFlags(blackboard));
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ public sealed class PickAccessibleOperator : HTNOperator
|
|||||||
|
|
||||||
var path = await _pathfinding.GetRandomPath(
|
var path = await _pathfinding.GetRandomPath(
|
||||||
owner,
|
owner,
|
||||||
1.4f,
|
|
||||||
maxRange,
|
maxRange,
|
||||||
cancelToken,
|
cancelToken,
|
||||||
flags: _pathfinding.GetFlags(blackboard));
|
flags: _pathfinding.GetFlags(blackboard));
|
||||||
|
|||||||
@@ -33,17 +33,15 @@ public abstract class PathRequest
|
|||||||
#region Data
|
#region Data
|
||||||
|
|
||||||
public readonly PathFlags Flags;
|
public readonly PathFlags Flags;
|
||||||
public readonly float Range;
|
|
||||||
public readonly int CollisionLayer;
|
public readonly int CollisionLayer;
|
||||||
public readonly int CollisionMask;
|
public readonly int CollisionMask;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public PathRequest(EntityCoordinates start, PathFlags flags, float range, int layer, int mask, CancellationToken cancelToken)
|
public PathRequest(EntityCoordinates start, PathFlags flags, int layer, int mask, CancellationToken cancelToken)
|
||||||
{
|
{
|
||||||
Start = start;
|
Start = start;
|
||||||
Flags = flags;
|
Flags = flags;
|
||||||
Range = range;
|
|
||||||
CollisionLayer = layer;
|
CollisionLayer = layer;
|
||||||
CollisionMask = mask;
|
CollisionMask = mask;
|
||||||
Tcs = new TaskCompletionSource<PathResult>(cancelToken);
|
Tcs = new TaskCompletionSource<PathResult>(cancelToken);
|
||||||
@@ -54,15 +52,21 @@ public sealed class AStarPathRequest : PathRequest
|
|||||||
{
|
{
|
||||||
public EntityCoordinates End;
|
public EntityCoordinates End;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How close we need to be to the end node to be considered as arrived.
|
||||||
|
/// </summary>
|
||||||
|
public float Distance;
|
||||||
|
|
||||||
public AStarPathRequest(
|
public AStarPathRequest(
|
||||||
EntityCoordinates start,
|
EntityCoordinates start,
|
||||||
EntityCoordinates end,
|
EntityCoordinates end,
|
||||||
PathFlags flags,
|
PathFlags flags,
|
||||||
float range,
|
float distance,
|
||||||
int layer,
|
int layer,
|
||||||
int mask,
|
int mask,
|
||||||
CancellationToken cancelToken) : base(start, flags, range, layer, mask, cancelToken)
|
CancellationToken cancelToken) : base(start, flags, layer, mask, cancelToken)
|
||||||
{
|
{
|
||||||
|
Distance = distance;
|
||||||
End = end;
|
End = end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,10 +88,9 @@ public sealed class BFSPathRequest : PathRequest
|
|||||||
int expansionLimit,
|
int expansionLimit,
|
||||||
EntityCoordinates start,
|
EntityCoordinates start,
|
||||||
PathFlags flags,
|
PathFlags flags,
|
||||||
float range,
|
|
||||||
int layer,
|
int layer,
|
||||||
int mask,
|
int mask,
|
||||||
CancellationToken cancelToken) : base(start, flags, range, layer, mask, cancelToken)
|
CancellationToken cancelToken) : base(start, flags, layer, mask, cancelToken)
|
||||||
{
|
{
|
||||||
ExpansionRange = expansionRange;
|
ExpansionRange = expansionRange;
|
||||||
ExpansionLimit = expansionLimit;
|
ExpansionLimit = expansionLimit;
|
||||||
|
|||||||
@@ -82,10 +82,11 @@ public sealed partial class PathfindingSystem
|
|||||||
// Actual pathfinding here
|
// Actual pathfinding here
|
||||||
(_, currentNode) = request.Frontier.Take();
|
(_, currentNode) = request.Frontier.Take();
|
||||||
|
|
||||||
// TODO: Need this at some stage but need to fix some steering bugs first before it's useable.
|
// If we're inside the required distance OR we're at the end node.
|
||||||
if (currentNode.Equals(endNode))// ||
|
if ((request.Distance > 0f &&
|
||||||
//(endNode.GraphUid == currentNode.GraphUid &&
|
currentNode.Coordinates.TryDistance(EntityManager, request.End, out var distance) &&
|
||||||
//(endNode.Box.Center - currentNode.Box.Center).Length < request.Range))
|
distance <= request.Distance) ||
|
||||||
|
currentNode.Equals(endNode))
|
||||||
{
|
{
|
||||||
arrived = true;
|
arrived = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public sealed partial class PathfindingSystem
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Maximum amount of nodes we're allowed to expand.
|
/// Maximum amount of nodes we're allowed to expand.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const int NodeLimit = 200;
|
private const int NodeLimit = 512;
|
||||||
|
|
||||||
private sealed class PathComparer : IComparer<ValueTuple<float, PathPoly>>
|
private sealed class PathComparer : IComparer<ValueTuple<float, PathPoly>>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -228,7 +228,6 @@ namespace Content.Server.NPC.Pathfinding
|
|||||||
|
|
||||||
public async Task<PathResultEvent> GetRandomPath(
|
public async Task<PathResultEvent> GetRandomPath(
|
||||||
EntityUid entity,
|
EntityUid entity,
|
||||||
float range,
|
|
||||||
float maxRange,
|
float maxRange,
|
||||||
CancellationToken cancelToken,
|
CancellationToken cancelToken,
|
||||||
int limit = 40,
|
int limit = 40,
|
||||||
@@ -246,7 +245,7 @@ namespace Content.Server.NPC.Pathfinding
|
|||||||
mask = body.CollisionMask;
|
mask = body.CollisionMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
var request = new BFSPathRequest(maxRange, limit, start.Coordinates, flags, range, layer, mask, cancelToken);
|
var request = new BFSPathRequest(maxRange, limit, start.Coordinates, flags, layer, mask, cancelToken);
|
||||||
var path = await GetPath(request);
|
var path = await GetPath(request);
|
||||||
|
|
||||||
if (path.Result != PathResult.Path)
|
if (path.Result != PathResult.Path)
|
||||||
|
|||||||
Reference in New Issue
Block a user