using System.Threading;
using System.Threading.Tasks;
using Content.Shared.NPC;
using Robust.Shared.Map;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Server.NPC.Pathfinding;
///
/// Stores the in-progress data of a pathfinding request.
///
public abstract class PathRequest
{
public EntityCoordinates Start;
public Task Task => Tcs.Task;
public readonly TaskCompletionSource Tcs;
public Queue Polys = new();
public bool Started = false;
#region Pathfinding state
public readonly Stopwatch Stopwatch = new();
public PriorityQueue> Frontier = default!;
public readonly Dictionary CostSoFar = new();
public readonly Dictionary CameFrom = new();
#endregion
#region Data
public readonly PathFlags Flags;
public readonly float Range;
public readonly int CollisionLayer;
public readonly int CollisionMask;
#endregion
public PathRequest(EntityCoordinates start, PathFlags flags, float range, int layer, int mask, CancellationToken cancelToken)
{
Start = start;
Flags = flags;
Range = range;
CollisionLayer = layer;
CollisionMask = mask;
Tcs = new TaskCompletionSource(cancelToken);
}
}
public sealed class AStarPathRequest : PathRequest
{
public EntityCoordinates End;
public AStarPathRequest(
EntityCoordinates start,
EntityCoordinates end,
PathFlags flags,
float range,
int layer,
int mask,
CancellationToken cancelToken) : base(start, flags, range, layer, mask, cancelToken)
{
End = end;
}
}
public sealed class BFSPathRequest : PathRequest
{
///
/// How far away we're allowed to expand in distance.
///
public float ExpansionRange;
///
/// How many nodes we're allowed to expand
///
public int ExpansionLimit;
public BFSPathRequest(
float expansionRange,
int expansionLimit,
EntityCoordinates start,
PathFlags flags,
float range,
int layer,
int mask,
CancellationToken cancelToken) : base(start, flags, range, layer, mask, cancelToken)
{
ExpansionRange = expansionRange;
ExpansionLimit = expansionLimit;
}
}
///
/// Stores the final result of a pathfinding request
///
public sealed class PathResultEvent
{
public PathResult Result;
public readonly Queue Path;
public PathResultEvent(PathResult result, Queue path)
{
Result = result;
Path = path;
}
}