TetherGunSystem.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using Content.Shared.Weapons.Misc;
  2. using Robust.Client.GameObjects;
  3. using Robust.Client.Graphics;
  4. using Robust.Client.Input;
  5. using Robust.Client.Player;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Timing;
  8. namespace Content.Client.Weapons.Misc;
  9. public sealed class TetherGunSystem : SharedTetherGunSystem
  10. {
  11. [Dependency] private readonly IEyeManager _eyeManager = default!;
  12. [Dependency] private readonly IGameTiming _timing = default!;
  13. [Dependency] private readonly IInputManager _input = default!;
  14. [Dependency] private readonly IMapManager _mapManager = default!;
  15. [Dependency] private readonly IOverlayManager _overlay = default!;
  16. [Dependency] private readonly IPlayerManager _player = default!;
  17. [Dependency] private readonly MapSystem _mapSystem = default!;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<TetheredComponent, ComponentStartup>(OnTetheredStartup);
  22. SubscribeLocalEvent<TetheredComponent, ComponentShutdown>(OnTetheredShutdown);
  23. SubscribeLocalEvent<TetherGunComponent, AfterAutoHandleStateEvent>(OnAfterState);
  24. SubscribeLocalEvent<ForceGunComponent, AfterAutoHandleStateEvent>(OnAfterState);
  25. _overlay.AddOverlay(new TetherGunOverlay(EntityManager));
  26. }
  27. private void OnAfterState(EntityUid uid, BaseForceGunComponent component, ref AfterAutoHandleStateEvent args)
  28. {
  29. if (!TryComp<SpriteComponent>(component.Tethered, out var sprite))
  30. return;
  31. sprite.Color = component.LineColor;
  32. }
  33. public override void Shutdown()
  34. {
  35. base.Shutdown();
  36. _overlay.RemoveOverlay<TetherGunOverlay>();
  37. }
  38. protected override bool CanTether(EntityUid uid, BaseForceGunComponent component, EntityUid target, EntityUid? user)
  39. {
  40. // Need powercells predicted sadly :<
  41. return false;
  42. }
  43. public override void Update(float frameTime)
  44. {
  45. base.Update(frameTime);
  46. if (!_timing.IsFirstTimePredicted)
  47. return;
  48. var player = _player.LocalEntity;
  49. if (player == null ||
  50. !TryGetTetherGun(player.Value, out var gunUid, out var gun) ||
  51. gun.TetherEntity == null)
  52. {
  53. return;
  54. }
  55. var mousePos = _input.MouseScreenPosition;
  56. var mouseWorldPos = _eyeManager.PixelToMap(mousePos);
  57. if (mouseWorldPos.MapId == MapId.Nullspace)
  58. return;
  59. EntityCoordinates coords;
  60. if (_mapManager.TryFindGridAt(mouseWorldPos, out var gridUid, out _))
  61. {
  62. coords = TransformSystem.ToCoordinates(gridUid, mouseWorldPos);
  63. }
  64. else
  65. {
  66. coords = TransformSystem.ToCoordinates(_mapSystem.GetMap(mouseWorldPos.MapId), mouseWorldPos);
  67. }
  68. const float BufferDistance = 0.1f;
  69. if (TryComp(gun.TetherEntity, out TransformComponent? tetherXform) &&
  70. tetherXform.Coordinates.TryDistance(EntityManager, TransformSystem, coords, out var distance) &&
  71. distance < BufferDistance)
  72. {
  73. return;
  74. }
  75. RaisePredictiveEvent(new RequestTetherMoveEvent()
  76. {
  77. Coordinates = GetNetCoordinates(coords)
  78. });
  79. }
  80. private void OnTetheredStartup(EntityUid uid, TetheredComponent component, ComponentStartup args)
  81. {
  82. if (!TryComp<SpriteComponent>(uid, out var sprite))
  83. {
  84. return;
  85. }
  86. if (TryComp<ForceGunComponent>(component.Tetherer, out var force))
  87. {
  88. sprite.Color = force.LineColor;
  89. }
  90. else if (TryComp<TetherGunComponent>(component.Tetherer, out var tether))
  91. {
  92. sprite.Color = tether.LineColor;
  93. }
  94. }
  95. private void OnTetheredShutdown(EntityUid uid, TetheredComponent component, ComponentShutdown args)
  96. {
  97. if (!TryComp<SpriteComponent>(uid, out var sprite))
  98. return;
  99. sprite.Color = Color.White;
  100. }
  101. }