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 List 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 int CollisionLayer; public readonly int CollisionMask; #endregion public PathRequest(EntityCoordinates start, PathFlags flags, int layer, int mask, CancellationToken cancelToken) { Start = start; Flags = flags; CollisionLayer = layer; CollisionMask = mask; Tcs = new TaskCompletionSource(cancelToken); } } public sealed class AStarPathRequest : PathRequest { public EntityCoordinates End; /// /// How close we need to be to the end node to be considered as arrived. /// public float Distance; public AStarPathRequest( EntityCoordinates start, EntityCoordinates end, PathFlags flags, float distance, int layer, int mask, CancellationToken cancelToken) : base(start, flags, layer, mask, cancelToken) { Distance = distance; 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, int layer, int mask, CancellationToken cancelToken) : base(start, flags, layer, mask, cancelToken) { ExpansionRange = expansionRange; ExpansionLimit = expansionLimit; } } /// /// Stores the final result of a pathfinding request /// public sealed class PathResultEvent { public PathResult Result; public readonly List Path; public PathResultEvent(PathResult result, List path) { Result = result; Path = path; } }