diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs index b3db87e896..075011171f 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs @@ -102,7 +102,7 @@ public sealed partial class PathfindingSystem // TODO: Dump all this shit and just do it live it's probably fast enough. if (comp.DirtyChunks.Count == 0 || curTime < comp.NextUpdate || - !TryComp(uid, out var mapGridComp)) + !_gridQuery.TryGetComponent(uid, out var mapGridComp)) { continue; } @@ -145,15 +145,7 @@ public sealed partial class PathfindingSystem // Without parallel this is roughly 3x slower on my desktop. Parallel.For(0, dirt.Length, options, i => { - // Doing the queries per task seems faster. - var accessQuery = GetEntityQuery(); - var destructibleQuery = GetEntityQuery(); - var doorQuery = GetEntityQuery(); - var climbableQuery = GetEntityQuery(); - var fixturesQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - BuildBreadcrumbs(dirt[i], (uid, mapGridComp), accessQuery, destructibleQuery, doorQuery, climbableQuery, - fixturesQuery, xformQuery); + BuildBreadcrumbs(dirt[i], (uid, mapGridComp)); }); const int Division = 4; @@ -284,9 +276,9 @@ public sealed partial class PathfindingSystem private void OnMoveEvent(ref MoveEvent ev) { - if (!TryComp(ev.Sender, out var fixtures) || + if (!_fixturesQuery.TryGetComponent(ev.Sender, out var fixtures) || !IsBodyRelevant(fixtures) || - HasComp(ev.Sender)) + _gridQuery.HasComponent(ev.Sender)) { return; } @@ -408,19 +400,11 @@ public sealed partial class PathfindingSystem private Vector2i GetOrigin(EntityCoordinates coordinates, EntityUid gridUid) { - var gridXform = Transform(gridUid); - var localPos = gridXform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager)); + var localPos = _transform.GetInvWorldMatrix(gridUid).Transform(coordinates.ToMapPos(EntityManager, _transform)); return new Vector2i((int) Math.Floor(localPos.X / ChunkSize), (int) Math.Floor(localPos.Y / ChunkSize)); } - private void BuildBreadcrumbs(GridPathfindingChunk chunk, - Entity grid, - EntityQuery accessQuery, - EntityQuery destructibleQuery, - EntityQuery doorQuery, - EntityQuery climbableQuery, - EntityQuery fixturesQuery, - EntityQuery xformQuery) + private void BuildBreadcrumbs(GridPathfindingChunk chunk, Entity grid) { var sw = new Stopwatch(); sw.Start(); @@ -447,7 +431,7 @@ public sealed partial class PathfindingSystem var tilePos = new Vector2i(x, y) + gridOrigin; tilePolys.Clear(); - var tile = grid.Comp.GetTileRef(tilePos); + var tile = _maps.GetTileRef(grid.Owner, grid.Comp, tilePos); var flags = tile.Tile.IsEmpty ? PathfindingBreadcrumbFlag.Space : PathfindingBreadcrumbFlag.None; // var isBorder = x < 0 || y < 0 || x == ChunkSize - 1 || y == ChunkSize - 1; @@ -457,16 +441,16 @@ public sealed partial class PathfindingSystem foreach (var ent in available) { // Irrelevant for pathfinding - if (!fixturesQuery.TryGetComponent(ent, out var fixtures) || + if (!_fixturesQuery.TryGetComponent(ent, out var fixtures) || !IsBodyRelevant(fixtures)) { continue; } - var xform = xformQuery.GetComponent(ent); + var xform = _xformQuery.GetComponent(ent); if (xform.ParentUid != grid.Owner || - grid.Comp.LocalToTile(xform.Coordinates) != tilePos) + _maps.LocalToTile(grid.Owner, grid.Comp, xform.Coordinates) != tilePos) { continue; } @@ -489,7 +473,7 @@ public sealed partial class PathfindingSystem foreach (var ent in tileEntities) { - if (!fixturesQuery.TryGetComponent(ent, out var fixtures)) + if (!_fixturesQuery.TryGetComponent(ent, out var fixtures)) continue; var colliding = false; @@ -516,7 +500,7 @@ public sealed partial class PathfindingSystem } if (!intersects || - !xformQuery.TryGetComponent(ent, out var xform)) + !_xformQuery.TryGetComponent(ent, out var xform)) { continue; } @@ -535,22 +519,22 @@ public sealed partial class PathfindingSystem if (!colliding) continue; - if (accessQuery.HasComponent(ent)) + if (_accessQuery.HasComponent(ent)) { flags |= PathfindingBreadcrumbFlag.Access; } - if (doorQuery.HasComponent(ent)) + if (_doorQuery.HasComponent(ent)) { flags |= PathfindingBreadcrumbFlag.Door; } - if (climbableQuery.HasComponent(ent)) + if (_climbableQuery.HasComponent(ent)) { flags |= PathfindingBreadcrumbFlag.Climb; } - if (destructibleQuery.TryGetComponent(ent, out var damageable)) + if (_destructibleQuery.TryGetComponent(ent, out var damageable)) { damage += _destructible.DestroyedAt(ent, damageable).Float(); } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index 1830b35bb6..13ad963a0c 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -6,11 +6,15 @@ using System.Threading.Tasks; using Content.Server.Administration.Managers; using Content.Server.Destructible; using Content.Server.NPC.Systems; +using Content.Shared.Access.Components; using Content.Shared.Administration; +using Content.Shared.Climbing.Components; +using Content.Shared.Doors.Components; using Content.Shared.NPC; using Robust.Server.Player; using Robust.Shared.Enums; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; using Robust.Shared.Player; @@ -45,6 +49,7 @@ namespace Content.Server.NPC.Pathfinding [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly NPCSystem _npc = default!; + [Dependency] private readonly SharedMapSystem _maps = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; @@ -63,9 +68,26 @@ namespace Content.Server.NPC.Pathfinding private int _portalIndex; private readonly Dictionary _portals = new(); + private EntityQuery _accessQuery; + private EntityQuery _destructibleQuery; + private EntityQuery _doorQuery; + private EntityQuery _climbableQuery; + private EntityQuery _fixturesQuery; + private EntityQuery _gridQuery; + private EntityQuery _xformQuery; + public override void Initialize() { base.Initialize(); + + _accessQuery = GetEntityQuery(); + _destructibleQuery = GetEntityQuery(); + _doorQuery = GetEntityQuery(); + _climbableQuery = GetEntityQuery(); + _fixturesQuery = GetEntityQuery(); + _gridQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + _playerManager.PlayerStatusChanged += OnPlayerChange; InitializeGrid(); SubscribeNetworkEvent(OnBreadcrumbs);