NetworkConfiguratorLinkOverlay.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Content.Client.NetworkConfigurator.Systems;
  2. using Content.Shared.DeviceNetwork.Components;
  3. using Robust.Client.Graphics;
  4. using Robust.Shared.Enums;
  5. using Robust.Shared.Map;
  6. using Robust.Shared.Random;
  7. namespace Content.Client.NetworkConfigurator;
  8. public sealed class NetworkConfiguratorLinkOverlay : Overlay
  9. {
  10. [Dependency] private readonly IEntityManager _entityManager = default!;
  11. [Dependency] private readonly IRobustRandom _random = default!;
  12. private readonly DeviceListSystem _deviceListSystem;
  13. private readonly SharedTransformSystem _transformSystem;
  14. public Dictionary<EntityUid, Color> Colors = new();
  15. public EntityUid? Action;
  16. public override OverlaySpace Space => OverlaySpace.WorldSpace;
  17. public NetworkConfiguratorLinkOverlay()
  18. {
  19. IoCManager.InjectDependencies(this);
  20. _deviceListSystem = _entityManager.System<DeviceListSystem>();
  21. _transformSystem = _entityManager.System<SharedTransformSystem>();
  22. }
  23. protected override void Draw(in OverlayDrawArgs args)
  24. {
  25. var query = _entityManager.EntityQueryEnumerator<NetworkConfiguratorActiveLinkOverlayComponent>();
  26. while (query.MoveNext(out var uid, out _))
  27. {
  28. if (_entityManager.Deleted(uid) || !_entityManager.TryGetComponent(uid, out DeviceListComponent? deviceList))
  29. {
  30. _entityManager.RemoveComponentDeferred<NetworkConfiguratorActiveLinkOverlayComponent>(uid);
  31. continue;
  32. }
  33. if (!Colors.TryGetValue(uid, out var color))
  34. {
  35. color = new Color(
  36. _random.Next(0, 255),
  37. _random.Next(0, 255),
  38. _random.Next(0, 255));
  39. Colors.Add(uid, color);
  40. }
  41. var sourceTransform = _entityManager.GetComponent<TransformComponent>(uid);
  42. if (sourceTransform.MapID == MapId.Nullspace)
  43. {
  44. // Can happen if the item is outside the client's view. In that case,
  45. // we don't have a sensible transform to draw, so we need to skip it.
  46. continue;
  47. }
  48. foreach (var device in _deviceListSystem.GetAllDevices(uid, deviceList))
  49. {
  50. if (_entityManager.Deleted(device))
  51. {
  52. continue;
  53. }
  54. var linkTransform = _entityManager.GetComponent<TransformComponent>(device);
  55. if (linkTransform.MapID == MapId.Nullspace)
  56. {
  57. continue;
  58. }
  59. args.WorldHandle.DrawLine(_transformSystem.GetWorldPosition(sourceTransform), _transformSystem.GetWorldPosition(linkTransform), Colors[uid]);
  60. }
  61. }
  62. }
  63. }