GunSpreadOverlay.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using Content.Client.Weapons.Ranged.Systems;
  2. using Robust.Client.Graphics;
  3. using Robust.Client.Input;
  4. using Robust.Client.Player;
  5. using Robust.Shared.Enums;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Timing;
  8. namespace Content.Client.Weapons.Ranged;
  9. public sealed class GunSpreadOverlay : Overlay
  10. {
  11. public override OverlaySpace Space => OverlaySpace.WorldSpace;
  12. private IEntityManager _entManager;
  13. private readonly IEyeManager _eye;
  14. private readonly IGameTiming _timing;
  15. private readonly IInputManager _input;
  16. private readonly IPlayerManager _player;
  17. private readonly GunSystem _guns;
  18. private readonly SharedTransformSystem _transform;
  19. public GunSpreadOverlay(IEntityManager entManager, IEyeManager eyeManager, IGameTiming timing, IInputManager input, IPlayerManager player, GunSystem system, SharedTransformSystem transform)
  20. {
  21. _entManager = entManager;
  22. _eye = eyeManager;
  23. _input = input;
  24. _timing = timing;
  25. _player = player;
  26. _guns = system;
  27. _transform = transform;
  28. }
  29. protected override void Draw(in OverlayDrawArgs args)
  30. {
  31. var worldHandle = args.WorldHandle;
  32. var player = _player.LocalEntity;
  33. if (player == null ||
  34. !_entManager.TryGetComponent<TransformComponent>(player, out var xform))
  35. {
  36. return;
  37. }
  38. var mapPos = _transform.GetMapCoordinates(player.Value, xform: xform);
  39. if (mapPos.MapId == MapId.Nullspace)
  40. return;
  41. if (!_guns.TryGetGun(player.Value, out var gunUid, out var gun))
  42. return;
  43. var mouseScreenPos = _input.MouseScreenPosition;
  44. var mousePos = _eye.PixelToMap(mouseScreenPos);
  45. if (mapPos.MapId != mousePos.MapId)
  46. return;
  47. // (☞゚ヮ゚)☞
  48. var maxSpread = gun.MaxAngleModified;
  49. var minSpread = gun.MinAngleModified;
  50. var timeSinceLastFire = (_timing.CurTime - gun.NextFire).TotalSeconds;
  51. var currentAngle = new Angle(MathHelper.Clamp(gun.CurrentAngle.Theta - gun.AngleDecayModified.Theta * timeSinceLastFire,
  52. gun.MinAngleModified.Theta, gun.MaxAngleModified.Theta));
  53. var direction = (mousePos.Position - mapPos.Position);
  54. worldHandle.DrawLine(mapPos.Position, mousePos.Position + direction, Color.Orange);
  55. // Show max spread either side
  56. worldHandle.DrawLine(mapPos.Position, mousePos.Position + maxSpread.RotateVec(direction), Color.Red);
  57. worldHandle.DrawLine(mapPos.Position, mousePos.Position + (-maxSpread).RotateVec(direction), Color.Red);
  58. // Show min spread either side
  59. worldHandle.DrawLine(mapPos.Position, mousePos.Position + minSpread.RotateVec(direction), Color.Green);
  60. worldHandle.DrawLine(mapPos.Position, mousePos.Position + (-minSpread).RotateVec(direction), Color.Green);
  61. // Show current angle
  62. worldHandle.DrawLine(mapPos.Position, mousePos.Position + currentAngle.RotateVec(direction), Color.Yellow);
  63. worldHandle.DrawLine(mapPos.Position, mousePos.Position + (-currentAngle).RotateVec(direction), Color.Yellow);
  64. }
  65. }