// TODO: Dump all this shit and just do it live it's probably fast enough.
if (comp.DirtyChunks.Count == 0 ||
curTime < comp.NextUpdate ||
- !TryComp<MapGridComponent>(uid, out var mapGridComp))
+ !_gridQuery.TryGetComponent(uid, out var mapGridComp))
{
continue;
}
// 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<AccessReaderComponent>();
- var destructibleQuery = GetEntityQuery<DestructibleComponent>();
- var doorQuery = GetEntityQuery<DoorComponent>();
- var climbableQuery = GetEntityQuery<ClimbableComponent>();
- var fixturesQuery = GetEntityQuery<FixturesComponent>();
- var xformQuery = GetEntityQuery<TransformComponent>();
- BuildBreadcrumbs(dirt[i], (uid, mapGridComp), accessQuery, destructibleQuery, doorQuery, climbableQuery,
- fixturesQuery, xformQuery);
+ BuildBreadcrumbs(dirt[i], (uid, mapGridComp));
});
const int Division = 4;
private void OnMoveEvent(ref MoveEvent ev)
{
- if (!TryComp<FixturesComponent>(ev.Sender, out var fixtures) ||
+ if (!_fixturesQuery.TryGetComponent(ev.Sender, out var fixtures) ||
!IsBodyRelevant(fixtures) ||
- HasComp<MapGridComponent>(ev.Sender))
+ _gridQuery.HasComponent(ev.Sender))
{
return;
}
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<MapGridComponent> grid,
- EntityQuery<AccessReaderComponent> accessQuery,
- EntityQuery<DestructibleComponent> destructibleQuery,
- EntityQuery<DoorComponent> doorQuery,
- EntityQuery<ClimbableComponent> climbableQuery,
- EntityQuery<FixturesComponent> fixturesQuery,
- EntityQuery<TransformComponent> xformQuery)
+ private void BuildBreadcrumbs(GridPathfindingChunk chunk, Entity<MapGridComponent> grid)
{
var sw = new Stopwatch();
sw.Start();
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;
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;
}
foreach (var ent in tileEntities)
{
- if (!fixturesQuery.TryGetComponent(ent, out var fixtures))
+ if (!_fixturesQuery.TryGetComponent(ent, out var fixtures))
continue;
var colliding = false;
}
if (!intersects ||
- !xformQuery.TryGetComponent(ent, out var xform))
+ !_xformQuery.TryGetComponent(ent, out var xform))
{
continue;
}
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();
}
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;
[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!;
private int _portalIndex;
private readonly Dictionary<int, PathPortal> _portals = new();
+ private EntityQuery<AccessReaderComponent> _accessQuery;
+ private EntityQuery<DestructibleComponent> _destructibleQuery;
+ private EntityQuery<DoorComponent> _doorQuery;
+ private EntityQuery<ClimbableComponent> _climbableQuery;
+ private EntityQuery<FixturesComponent> _fixturesQuery;
+ private EntityQuery<MapGridComponent> _gridQuery;
+ private EntityQuery<TransformComponent> _xformQuery;
+
public override void Initialize()
{
base.Initialize();
+
+ _accessQuery = GetEntityQuery<AccessReaderComponent>();
+ _destructibleQuery = GetEntityQuery<DestructibleComponent>();
+ _doorQuery = GetEntityQuery<DoorComponent>();
+ _climbableQuery = GetEntityQuery<ClimbableComponent>();
+ _fixturesQuery = GetEntityQuery<FixturesComponent>();
+ _gridQuery = GetEntityQuery<MapGridComponent>();
+ _xformQuery = GetEntityQuery<TransformComponent>();
+
_playerManager.PlayerStatusChanged += OnPlayerChange;
InitializeGrid();
SubscribeNetworkEvent<RequestPathfindingDebugMessage>(OnBreadcrumbs);