1
0

CableNode.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Content.Server.NodeContainer;
  2. using Content.Server.NodeContainer.Nodes;
  3. using Robust.Shared.Map;
  4. using Robust.Shared.Map.Components;
  5. namespace Content.Server.Power.Nodes
  6. {
  7. [DataDefinition]
  8. public sealed partial class CableNode : Node
  9. {
  10. public override IEnumerable<Node> GetReachableNodes(TransformComponent xform,
  11. EntityQuery<NodeContainerComponent> nodeQuery,
  12. EntityQuery<TransformComponent> xformQuery,
  13. MapGridComponent? grid,
  14. IEntityManager entMan)
  15. {
  16. if (!xform.Anchored || grid == null)
  17. yield break;
  18. var gridIndex = grid.TileIndicesFor(xform.Coordinates);
  19. // While we go over adjacent nodes, we build a list of blocked directions due to
  20. // incoming or outgoing wire terminals.
  21. var terminalDirs = 0;
  22. List<(Direction, Node)> nodeDirs = new();
  23. foreach (var (dir, node) in NodeHelpers.GetCardinalNeighborNodes(nodeQuery, grid, gridIndex))
  24. {
  25. if (node is CableNode && node != this)
  26. {
  27. nodeDirs.Add((dir, node));
  28. }
  29. if (node is CableDeviceNode && dir == Direction.Invalid)
  30. {
  31. // device on same tile
  32. nodeDirs.Add((Direction.Invalid, node));
  33. }
  34. if (node is CableTerminalNode)
  35. {
  36. if (dir == Direction.Invalid)
  37. {
  38. // On own tile, block direction it faces
  39. terminalDirs |= 1 << (int) xformQuery.GetComponent(node.Owner).LocalRotation.GetCardinalDir();
  40. }
  41. else
  42. {
  43. var terminalDir = xformQuery.GetComponent(node.Owner).LocalRotation.GetCardinalDir();
  44. if (terminalDir.GetOpposite() == dir)
  45. {
  46. // Target tile has a terminal towards us, block the direction.
  47. terminalDirs |= 1 << (int) dir;
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. foreach (var (dir, node) in nodeDirs)
  54. {
  55. // If there is a wire terminal connecting across this direction, skip the node.
  56. if (dir != Direction.Invalid && (terminalDirs & (1 << (int) dir)) != 0)
  57. continue;
  58. yield return node;
  59. }
  60. }
  61. }
  62. }