TetherGunOverlay.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Content.Shared.Weapons.Misc;
  2. using Robust.Client.Graphics;
  3. using Robust.Shared.Enums;
  4. namespace Content.Client.Weapons.Misc;
  5. public sealed class TetherGunOverlay : Overlay
  6. {
  7. public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
  8. private IEntityManager _entManager;
  9. public TetherGunOverlay(IEntityManager entManager)
  10. {
  11. _entManager = entManager;
  12. }
  13. protected override void Draw(in OverlayDrawArgs args)
  14. {
  15. var query = _entManager.EntityQueryEnumerator<TetheredComponent>();
  16. var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
  17. var tetherQuery = _entManager.GetEntityQuery<TetherGunComponent>();
  18. var forceQuery = _entManager.GetEntityQuery<ForceGunComponent>();
  19. var worldHandle = args.WorldHandle;
  20. var xformSystem = _entManager.System<SharedTransformSystem>();
  21. while (query.MoveNext(out var uid, out var tethered))
  22. {
  23. var gun = tethered.Tetherer;
  24. if (!xformQuery.TryGetComponent(gun, out var gunXform) ||
  25. !xformQuery.TryGetComponent(uid, out var xform))
  26. {
  27. continue;
  28. }
  29. if (xform.MapID != gunXform.MapID)
  30. continue;
  31. var worldPos = xformSystem.GetWorldPosition(xform, xformQuery);
  32. var gunWorldPos = xformSystem.GetWorldPosition(gunXform, xformQuery);
  33. var diff = worldPos - gunWorldPos;
  34. var angle = diff.ToWorldAngle();
  35. var length = diff.Length() / 2f;
  36. var midPoint = gunWorldPos + diff / 2;
  37. const float Width = 0.05f;
  38. var box = new Box2(-Width, -length, Width, length);
  39. var rotated = new Box2Rotated(box.Translated(midPoint), angle, midPoint);
  40. var color = Color.Red;
  41. if (forceQuery.TryGetComponent(tethered.Tetherer, out var force))
  42. {
  43. color = force.LineColor;
  44. }
  45. else if (tetherQuery.TryGetComponent(tethered.Tetherer, out var tether))
  46. {
  47. color = tether.LineColor;
  48. }
  49. worldHandle.DrawRect(rotated, color.WithAlpha(0.3f));
  50. }
  51. }
  52. }