AtmosPipeAppearanceSystem.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using Content.Server.NodeContainer;
  2. using Content.Server.NodeContainer.EntitySystems;
  3. using Content.Server.NodeContainer.Nodes;
  4. using Content.Shared.Atmos;
  5. using Content.Shared.Atmos.Components;
  6. using Robust.Shared.Map.Components;
  7. namespace Content.Server.Atmos.Piping.EntitySystems;
  8. public sealed class AtmosPipeAppearanceSystem : EntitySystem
  9. {
  10. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<PipeAppearanceComponent, NodeGroupsRebuilt>(OnNodeUpdate);
  15. }
  16. private void OnNodeUpdate(EntityUid uid, PipeAppearanceComponent component, ref NodeGroupsRebuilt args)
  17. {
  18. UpdateAppearance(args.NodeOwner);
  19. }
  20. private void UpdateAppearance(EntityUid uid, AppearanceComponent? appearance = null, NodeContainerComponent? container = null,
  21. TransformComponent? xform = null)
  22. {
  23. if (!Resolve(uid, ref appearance, ref container, ref xform, false))
  24. return;
  25. if (!TryComp<MapGridComponent>(xform.GridUid, out var grid))
  26. return;
  27. // get connected entities
  28. var anyPipeNodes = false;
  29. HashSet<EntityUid> connected = new();
  30. foreach (var node in container.Nodes.Values)
  31. {
  32. if (node is not PipeNode)
  33. continue;
  34. anyPipeNodes = true;
  35. foreach (var connectedNode in node.ReachableNodes)
  36. {
  37. if (connectedNode is PipeNode)
  38. connected.Add(connectedNode.Owner);
  39. }
  40. }
  41. if (!anyPipeNodes)
  42. return;
  43. // find the cardinal directions of any connected entities
  44. var netConnectedDirections = PipeDirection.None;
  45. var tile = grid.TileIndicesFor(xform.Coordinates);
  46. foreach (var neighbour in connected)
  47. {
  48. var otherTile = grid.TileIndicesFor(Transform(neighbour).Coordinates);
  49. netConnectedDirections |= (otherTile - tile) switch
  50. {
  51. (0, 1) => PipeDirection.North,
  52. (0, -1) => PipeDirection.South,
  53. (1, 0) => PipeDirection.East,
  54. (-1, 0) => PipeDirection.West,
  55. _ => PipeDirection.None
  56. };
  57. }
  58. _appearance.SetData(uid, PipeVisuals.VisualState, netConnectedDirections, appearance);
  59. }
  60. }