using Content.Server.AI.Pathfinding.Pathfinders; using Content.Shared.AI; using JetBrains.Annotations; using Robust.Shared.Map; namespace Content.Server.AI.Pathfinding { #if DEBUG [UsedImplicitly] public sealed class ServerPathfindingDebugSystem : EntitySystem { public override void Initialize() { base.Initialize(); AStarPathfindingJob.DebugRoute += DispatchAStarDebug; JpsPathfindingJob.DebugRoute += DispatchJpsDebug; SubscribeNetworkEvent(DispatchGraph); } public override void Shutdown() { base.Shutdown(); AStarPathfindingJob.DebugRoute -= DispatchAStarDebug; JpsPathfindingJob.DebugRoute -= DispatchJpsDebug; } private void DispatchAStarDebug(SharedAiDebug.AStarRouteDebug routeDebug) { var mapManager = IoCManager.Resolve(); var route = new List(); foreach (var tile in routeDebug.Route) { var tileGrid = mapManager.GetGrid(tile.GridIndex).GridTileToLocal(tile.GridIndices); route.Add(tileGrid.ToMapPos(EntityManager)); } var cameFrom = new Dictionary(); foreach (var (from, to) in routeDebug.CameFrom) { var tileOneGrid = mapManager.GetGrid(from.GridIndex).GridTileToLocal(from.GridIndices); var tileOneWorld = tileOneGrid.ToMapPos(EntityManager); var tileTwoGrid = mapManager.GetGrid(to.GridIndex).GridTileToLocal(to.GridIndices); var tileTwoWorld = tileTwoGrid.ToMapPos(EntityManager); cameFrom[tileOneWorld] = tileTwoWorld; } var gScores = new Dictionary(); foreach (var (tile, score) in routeDebug.GScores) { var tileGrid = mapManager.GetGrid(tile.GridIndex).GridTileToLocal(tile.GridIndices); gScores[tileGrid.ToMapPos(EntityManager)] = score; } var systemMessage = new SharedAiDebug.AStarRouteMessage( routeDebug.EntityUid, route, cameFrom, gScores, routeDebug.TimeTaken ); RaiseNetworkEvent(systemMessage); } private void DispatchJpsDebug(SharedAiDebug.JpsRouteDebug routeDebug) { var mapManager = IoCManager.Resolve(); var route = new List(); foreach (var tile in routeDebug.Route) { var tileGrid = mapManager.GetGrid(tile.GridIndex).GridTileToLocal(tile.GridIndices); route.Add(tileGrid.ToMapPos(EntityManager)); } var jumpNodes = new List(); foreach (var tile in routeDebug.JumpNodes) { var tileGrid = mapManager.GetGrid(tile.GridIndex).GridTileToLocal(tile.GridIndices); jumpNodes.Add(tileGrid.ToMapPos(EntityManager)); } var systemMessage = new SharedAiDebug.JpsRouteMessage( routeDebug.EntityUid, route, jumpNodes, routeDebug.TimeTaken ); RaiseNetworkEvent(systemMessage); } private void DispatchGraph(SharedAiDebug.RequestPathfindingGraphMessage message) { var pathfindingSystem = EntityManager.EntitySysManager.GetEntitySystem(); var mapManager = IoCManager.Resolve(); var result = new Dictionary>(); var idx = 0; foreach (var (gridId, chunks) in pathfindingSystem.Graph) { var gridManager = mapManager.GetGrid(gridId); foreach (var chunk in chunks.Values) { var nodes = new List(); foreach (var node in chunk.Nodes) { var worldTile = gridManager.GridTileToWorldPos(node.TileRef.GridIndices); nodes.Add(worldTile); } result.Add(idx, nodes); idx++; } } var systemMessage = new SharedAiDebug.PathfindingGraphMessage(result); RaiseNetworkEvent(systemMessage); } } #endif }