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; } }