diff --git a/Content.Server/Electrocution/ElectrocutionNode.cs b/Content.Server/Electrocution/ElectrocutionNode.cs index ddf09fcce74..3f53e7718fc 100644 --- a/Content.Server/Electrocution/ElectrocutionNode.cs +++ b/Content.Server/Electrocution/ElectrocutionNode.cs @@ -14,10 +14,11 @@ namespace Content.Server.Electrocution [DataField("node")] public string? NodeName; - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { if (CableEntity == null || NodeName == null) diff --git a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs index ee72f89abbc..219f87805d3 100644 --- a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs +++ b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs @@ -350,12 +350,12 @@ namespace Content.Server.NodeContainer.EntitySystems private IEnumerable GetCompatibleNodes(Node node, EntityQuery xformQuery, EntityQuery nodeQuery) { var xform = xformQuery.GetComponent(node.Owner); - TryComp(xform.GridUid, out var grid); + Entity? gridEnt = TryComp(xform.GridUid, out var grid) ? (xform.GridUid.Value, grid) : null; if (!node.Connectable(EntityManager, xform)) yield break; - foreach (var reachable in node.GetReachableNodes(xform, nodeQuery, xformQuery, grid, EntityManager)) + foreach (var reachable in node.GetReachableNodes((node.Owner, xform), nodeQuery, xformQuery, gridEnt, EntityManager)) { DebugTools.Assert(reachable != node, "GetReachableNodes() should not include self."); diff --git a/Content.Server/NodeContainer/Nodes/AdjacentNode.cs b/Content.Server/NodeContainer/Nodes/AdjacentNode.cs index d719ccbff07..0a4e9fe4a12 100644 --- a/Content.Server/NodeContainer/Nodes/AdjacentNode.cs +++ b/Content.Server/NodeContainer/Nodes/AdjacentNode.cs @@ -1,5 +1,4 @@ using Content.Shared.NodeContainer; -using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.NodeContainer.Nodes @@ -10,18 +9,20 @@ namespace Content.Server.NodeContainer.Nodes [DataDefinition] public sealed partial class AdjacentNode : Node { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - foreach (var (_, node) in NodeHelpers.GetCardinalNeighborNodes(nodeQuery, grid, gridIndex)) + foreach (var (_, node) in NodeHelpers.GetCardinalNeighborNodes(nodeQuery, gridEnt, gridIndex, mapSystem)) { if (node != this) yield return node; diff --git a/Content.Server/NodeContainer/Nodes/NodeHelpers.cs b/Content.Server/NodeContainer/Nodes/NodeHelpers.cs index c2345fff760..10d29c31200 100644 --- a/Content.Server/NodeContainer/Nodes/NodeHelpers.cs +++ b/Content.Server/NodeContainer/Nodes/NodeHelpers.cs @@ -10,9 +10,9 @@ namespace Content.Server.NodeContainer.Nodes /// public static class NodeHelpers { - public static IEnumerable GetNodesInTile(EntityQuery nodeQuery, MapGridComponent grid, Vector2i coords) + public static IEnumerable GetNodesInTile(EntityQuery nodeQuery, Entity grid, Vector2i coords, SharedMapSystem mapSystem) { - foreach (var entityUid in grid.GetAnchoredEntities(coords)) + foreach (var entityUid in mapSystem.GetAnchoredEntities(grid, coords)) { if (!nodeQuery.TryGetComponent(entityUid, out var container)) continue; @@ -24,13 +24,20 @@ namespace Content.Server.NodeContainer.Nodes } } + [Obsolete("Use the overload that passes in Entity and SharedMapSystem")] + public static IEnumerable GetNodesInTile(EntityQuery nodeQuery, MapGridComponent grid, Vector2i coords) + { + return GetNodesInTile(nodeQuery, (grid.Owner, grid), coords, IoCManager.Resolve().System()); + } + public static IEnumerable<(Direction dir, Node node)> GetCardinalNeighborNodes( EntityQuery nodeQuery, - MapGridComponent grid, + Entity grid, Vector2i coords, + SharedMapSystem mapSystem, bool includeSameTile = true) { - foreach (var (dir, entityUid) in GetCardinalNeighborCells(grid, coords, includeSameTile)) + foreach (var (dir, entityUid) in GetCardinalNeighborCells(grid, coords, mapSystem, includeSameTile)) { if (!nodeQuery.TryGetComponent(entityUid, out var container)) continue; @@ -42,29 +49,49 @@ namespace Content.Server.NodeContainer.Nodes } } + [Obsolete("Use the overload that passes in Entity and SharedMapSystem")] + public static IEnumerable<(Direction dir, Node node)> GetCardinalNeighborNodes( + EntityQuery nodeQuery, + MapGridComponent grid, + Vector2i coords, + bool includeSameTile = true) + { + return GetCardinalNeighborNodes(nodeQuery, (grid.Owner, grid), coords, IoCManager.Resolve().System(), includeSameTile); + } + [SuppressMessage("ReSharper", "EnforceForeachStatementBraces")] + public static IEnumerable<(Direction dir, EntityUid entity)> GetCardinalNeighborCells( + Entity grid, + Vector2i coords, + SharedMapSystem mapSystem, + bool includeSameTile = true) + { + if (includeSameTile) + { + foreach (var uid in mapSystem.GetAnchoredEntities(grid, coords)) + yield return (Direction.Invalid, uid); + } + + foreach (var uid in mapSystem.GetAnchoredEntities(grid, coords + (0, 1))) + yield return (Direction.North, uid); + + foreach (var uid in mapSystem.GetAnchoredEntities(grid, coords + (0, -1))) + yield return (Direction.South, uid); + + foreach (var uid in mapSystem.GetAnchoredEntities(grid, coords + (1, 0))) + yield return (Direction.East, uid); + + foreach (var uid in mapSystem.GetAnchoredEntities(grid, coords + (-1, 0))) + yield return (Direction.West, uid); + } + + [Obsolete("Use the overload that passes in Entity and SharedMapSystem")] public static IEnumerable<(Direction dir, EntityUid entity)> GetCardinalNeighborCells( MapGridComponent grid, Vector2i coords, bool includeSameTile = true) { - if (includeSameTile) - { - foreach (var uid in grid.GetAnchoredEntities(coords)) - yield return (Direction.Invalid, uid); - } - - foreach (var uid in grid.GetAnchoredEntities(coords + (0, 1))) - yield return (Direction.North, uid); - - foreach (var uid in grid.GetAnchoredEntities(coords + (0, -1))) - yield return (Direction.South, uid); - - foreach (var uid in grid.GetAnchoredEntities(coords + (1, 0))) - yield return (Direction.East, uid); - - foreach (var uid in grid.GetAnchoredEntities(coords + (-1, 0))) - yield return (Direction.West, uid); + return GetCardinalNeighborCells((grid.Owner, grid), coords, IoCManager.Resolve().System(), includeSameTile); } } } diff --git a/Content.Server/NodeContainer/Nodes/PipeNode.cs b/Content.Server/NodeContainer/Nodes/PipeNode.cs index 3a76666a2c0..23a2c217506 100644 --- a/Content.Server/NodeContainer/Nodes/PipeNode.cs +++ b/Content.Server/NodeContainer/Nodes/PipeNode.cs @@ -156,10 +156,11 @@ namespace Content.Server.NodeContainer.Nodes CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(xform.LocalRotation); } - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { if (_alwaysReachable != null) @@ -180,10 +181,11 @@ namespace Content.Server.NodeContainer.Nodes } } - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var pos = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var pos = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) { @@ -192,7 +194,7 @@ namespace Content.Server.NodeContainer.Nodes if (!CurrentPipeDirection.HasDirection(pipeDir)) continue; - foreach (var pipe in LinkableNodesInDirection(pos, pipeDir, grid, nodeQuery)) + foreach (var pipe in LinkableNodesInDirection(pos, pipeDir, gridEnt, nodeQuery, mapSystem)) { yield return pipe; } @@ -202,10 +204,14 @@ namespace Content.Server.NodeContainer.Nodes /// /// Gets the pipes that can connect to us from entities on the tile or adjacent in a direction. /// - private IEnumerable LinkableNodesInDirection(Vector2i pos, PipeDirection pipeDir, MapGridComponent grid, - EntityQuery nodeQuery) + private IEnumerable LinkableNodesInDirection( + Vector2i pos, + PipeDirection pipeDir, + Entity grid, + EntityQuery nodeQuery, + SharedMapSystem mapSystem) { - foreach (var pipe in PipesInDirection(pos, pipeDir, grid, nodeQuery)) + foreach (var pipe in PipesInDirection(pos, pipeDir, grid, nodeQuery, mapSystem)) { if (pipe.NodeGroupID == NodeGroupID && pipe.CurrentPipeLayer == CurrentPipeLayer @@ -219,12 +225,16 @@ namespace Content.Server.NodeContainer.Nodes /// /// Gets the pipes from entities on the tile adjacent in a direction. /// - protected IEnumerable PipesInDirection(Vector2i pos, PipeDirection pipeDir, MapGridComponent grid, - EntityQuery nodeQuery) + protected IEnumerable PipesInDirection( + Vector2i pos, + PipeDirection pipeDir, + Entity grid, + EntityQuery nodeQuery, + SharedMapSystem mapSystem) { var offsetPos = pos.Offset(pipeDir.ToDirection()); - foreach (var entity in grid.GetAnchoredEntities(offsetPos)) + foreach (var entity in mapSystem.GetAnchoredEntities(grid, offsetPos)) { if (!nodeQuery.TryGetComponent(entity, out var container)) continue; diff --git a/Content.Server/NodeContainer/Nodes/PortPipeNode.cs b/Content.Server/NodeContainer/Nodes/PortPipeNode.cs index 04e0dc0ab7a..f8b8b2ad8f2 100644 --- a/Content.Server/NodeContainer/Nodes/PortPipeNode.cs +++ b/Content.Server/NodeContainer/Nodes/PortPipeNode.cs @@ -7,18 +7,20 @@ namespace Content.Server.NodeContainer.Nodes [DataDefinition] public sealed partial class PortPipeNode : PipeNode { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, gridIndex)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, gridIndex, mapSystem)) { if (node is PortablePipeNode) yield return node; diff --git a/Content.Server/NodeContainer/Nodes/PortablePipeNode.cs b/Content.Server/NodeContainer/Nodes/PortablePipeNode.cs index 427288ee502..0458c403588 100644 --- a/Content.Server/NodeContainer/Nodes/PortablePipeNode.cs +++ b/Content.Server/NodeContainer/Nodes/PortablePipeNode.cs @@ -7,18 +7,20 @@ namespace Content.Server.NodeContainer.Nodes [DataDefinition] public sealed partial class PortablePipeNode : PipeNode { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, gridIndex)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, gridIndex, mapSystem)) { if (node is PortPipeNode) yield return node; diff --git a/Content.Server/Power/Generation/Teg/TegNodeGroup.cs b/Content.Server/Power/Generation/Teg/TegNodeGroup.cs index 92a353ccb11..d1056635539 100644 --- a/Content.Server/Power/Generation/Teg/TegNodeGroup.cs +++ b/Content.Server/Power/Generation/Teg/TegNodeGroup.cs @@ -127,18 +127,19 @@ public sealed class TegNodeGroup : BaseNodeGroup public sealed partial class TegNodeGenerator : Node { public override IEnumerable GetReachableNodes( - TransformComponent xform, + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - var dir = xform.LocalRotation.GetDir(); + var dir = xform.Comp.LocalRotation.GetDir(); var a = FindCirculator(dir); var b = FindCirculator(dir.GetOpposite()); @@ -152,7 +153,7 @@ public sealed partial class TegNodeGenerator : Node { var targetIdx = gridIndex.Offset(searchDir); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, targetIdx)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, targetIdx, mapSystem)) { if (node is not TegNodeCirculator circulator) continue; @@ -179,22 +180,23 @@ public sealed partial class TegNodeGenerator : Node public sealed partial class TegNodeCirculator : Node { public override IEnumerable GetReachableNodes( - TransformComponent xform, + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - var dir = xform.LocalRotation.GetDir(); + var dir = xform.Comp.LocalRotation.GetDir(); var searchDir = dir.GetClockwise90Degrees(); var targetIdx = gridIndex.Offset(searchDir); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, targetIdx)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, targetIdx, mapSystem)) { if (node is not TegNodeGenerator generator) continue; diff --git a/Content.Server/Power/Nodes/CableDeviceNode.cs b/Content.Server/Power/Nodes/CableDeviceNode.cs index 4089cd56579..98c0261198d 100644 --- a/Content.Server/Power/Nodes/CableDeviceNode.cs +++ b/Content.Server/Power/Nodes/CableDeviceNode.cs @@ -1,4 +1,3 @@ -using Content.Server.NodeContainer; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; using Content.Shared.NodeContainer; @@ -31,18 +30,20 @@ namespace Content.Server.Power.Nodes return base.Connectable(entMan, xform); } - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, gridIndex)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, gridIndex, mapSystem)) { if (node is CableNode) yield return node; diff --git a/Content.Server/Power/Nodes/CableNode.cs b/Content.Server/Power/Nodes/CableNode.cs index b0cbad4d48b..d1fccfa4113 100644 --- a/Content.Server/Power/Nodes/CableNode.cs +++ b/Content.Server/Power/Nodes/CableNode.cs @@ -1,7 +1,5 @@ -using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Shared.NodeContainer; -using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Power.Nodes @@ -9,23 +7,25 @@ namespace Content.Server.Power.Nodes [DataDefinition] public sealed partial class CableNode : Node { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); // While we go over adjacent nodes, we build a list of blocked directions due to // incoming or outgoing wire terminals. var terminalDirs = 0; List<(Direction, Node)> nodeDirs = new(); - foreach (var (dir, node) in NodeHelpers.GetCardinalNeighborNodes(nodeQuery, grid, gridIndex)) + foreach (var (dir, node) in NodeHelpers.GetCardinalNeighborNodes(nodeQuery, gridEnt, gridIndex, mapSystem)) { if (node is CableNode && node != this) { diff --git a/Content.Server/Power/Nodes/CableTerminalNode.cs b/Content.Server/Power/Nodes/CableTerminalNode.cs index 8988a9950b0..6e113b2106a 100644 --- a/Content.Server/Power/Nodes/CableTerminalNode.cs +++ b/Content.Server/Power/Nodes/CableTerminalNode.cs @@ -9,21 +9,23 @@ namespace Content.Server.Power.Nodes [DataDefinition] public sealed partial class CableTerminalNode : CableDeviceNode { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - var dir = xform.LocalRotation.GetDir(); + var dir = xform.Comp.LocalRotation.GetDir(); var targetIdx = gridIndex.Offset(dir); - foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, grid, targetIdx)) + foreach (var node in NodeHelpers.GetNodesInTile(nodeQuery, gridEnt, targetIdx, mapSystem)) { if (node is CableTerminalPortNode) yield return node; diff --git a/Content.Server/Power/Nodes/CableTerminalPortNode.cs b/Content.Server/Power/Nodes/CableTerminalPortNode.cs index b2397ebb6ca..7cfb94f1138 100644 --- a/Content.Server/Power/Nodes/CableTerminalPortNode.cs +++ b/Content.Server/Power/Nodes/CableTerminalPortNode.cs @@ -1,7 +1,5 @@ -using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Shared.NodeContainer; -using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Power.Nodes @@ -9,18 +7,20 @@ namespace Content.Server.Power.Nodes [DataDefinition] public sealed partial class CableTerminalPortNode : Node { - public override IEnumerable GetReachableNodes(TransformComponent xform, + public override IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan) { - if (!xform.Anchored || grid == null) + if (!xform.Comp.Anchored || grid is not { } gridEnt) yield break; - var gridIndex = grid.TileIndicesFor(xform.Coordinates); + var mapSystem = entMan.System(); + var gridIndex = mapSystem.TileIndicesFor(gridEnt, xform.Comp.Coordinates); - var nodes = NodeHelpers.GetCardinalNeighborNodes(nodeQuery, grid, gridIndex, includeSameTile: false); + var nodes = NodeHelpers.GetCardinalNeighborNodes(nodeQuery, gridEnt, gridIndex, mapSystem, includeSameTile: false); foreach (var (dir, node) in nodes) { if (node is CableTerminalNode diff --git a/Content.Shared/NodeContainer/Node.cs b/Content.Shared/NodeContainer/Node.cs index cfb82756e49..561b0515d87 100644 --- a/Content.Shared/NodeContainer/Node.cs +++ b/Content.Shared/NodeContainer/Node.cs @@ -97,9 +97,10 @@ public abstract partial class Node /// of this asymmetric relation are made to manually update with . /// /// - public abstract IEnumerable GetReachableNodes(TransformComponent xform, + public abstract IEnumerable GetReachableNodes( + Entity xform, EntityQuery nodeQuery, EntityQuery xformQuery, - MapGridComponent? grid, + Entity? grid, IEntityManager entMan); }