namespace Content.Server.NPC.Pathfinding; public sealed partial class PathfindingSystem { /// /// Finds a generic path from start to end. /// public List GetPath(Vector2i start, Vector2i end, bool diagonal = false) { if (start == end) { return new List(); } var frontier = new PriorityQueue(); frontier.Enqueue(start, 0f); var cameFrom = new Dictionary(); var node = start; while (frontier.TryDequeue(out node, out _)) { if (node == end) { break; } if (diagonal) { for (var i = 0; i < 8; i++) { var direction = (DirectionFlag) i; var neighbor = node + direction.AsDir().ToIntVec(); if (!cameFrom.TryAdd(neighbor, node)) continue; var gScore = OctileDistance(neighbor, end); frontier.Enqueue(neighbor, gScore); } } else { for (var i = 0; i < 4; i++) { var direction = (DirectionFlag) Math.Pow(2, i); var neighbor = node + direction.AsDir().ToIntVec(); if (!cameFrom.TryAdd(neighbor, node)) continue; frontier.Enqueue(neighbor, ManhattanDistance(neighbor, end)); } } } if (node != end) { return new List(); } var path = new List(); do { path.Add(node); var before = cameFrom[node]; node = before; } while (node != start); path.Add(start); path.Reverse(); return path; } }