MeleeArcOverlay.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System.Numerics;
  2. using Content.Shared.CombatMode;
  3. using Content.Shared.Weapons.Melee;
  4. using Robust.Client.Graphics;
  5. using Robust.Client.Input;
  6. using Robust.Client.Player;
  7. using Robust.Shared.Enums;
  8. using Robust.Shared.Map;
  9. namespace Content.Client.Weapons.Melee;
  10. /// <summary>
  11. /// Debug overlay showing the arc and range of a melee weapon.
  12. /// </summary>
  13. public sealed class MeleeArcOverlay : Overlay
  14. {
  15. private readonly IEntityManager _entManager;
  16. private readonly IEyeManager _eyeManager;
  17. private readonly IInputManager _inputManager;
  18. private readonly IPlayerManager _playerManager;
  19. private readonly MeleeWeaponSystem _melee;
  20. private readonly SharedCombatModeSystem _combatMode;
  21. private readonly SharedTransformSystem _transform = default!;
  22. public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
  23. public MeleeArcOverlay(IEntityManager entManager, IEyeManager eyeManager, IInputManager inputManager, IPlayerManager playerManager, MeleeWeaponSystem melee, SharedCombatModeSystem combatMode, SharedTransformSystem transform)
  24. {
  25. _entManager = entManager;
  26. _eyeManager = eyeManager;
  27. _inputManager = inputManager;
  28. _playerManager = playerManager;
  29. _melee = melee;
  30. _combatMode = combatMode;
  31. _transform = transform;
  32. }
  33. protected override void Draw(in OverlayDrawArgs args)
  34. {
  35. var player = _playerManager.LocalEntity;
  36. if (!_entManager.TryGetComponent<TransformComponent>(player, out var xform) ||
  37. !_combatMode.IsInCombatMode(player))
  38. {
  39. return;
  40. }
  41. if (!_melee.TryGetWeapon(player.Value, out _, out var weapon))
  42. return;
  43. var mousePos = _inputManager.MouseScreenPosition;
  44. var mapPos = _eyeManager.PixelToMap(mousePos);
  45. if (mapPos.MapId != args.MapId)
  46. return;
  47. var playerPos = _transform.GetMapCoordinates(player.Value, xform: xform);
  48. if (mapPos.MapId != playerPos.MapId)
  49. return;
  50. var diff = mapPos.Position - playerPos.Position;
  51. if (diff.Equals(Vector2.Zero))
  52. return;
  53. diff = diff.Normalized() * Math.Min(weapon.Range, diff.Length());
  54. args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + diff, Color.Aqua);
  55. if (weapon.Angle.Theta == 0)
  56. return;
  57. args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + new Angle(-weapon.Angle / 2).RotateVec(diff), Color.Orange);
  58. args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + new Angle(weapon.Angle / 2).RotateVec(diff), Color.Orange);
  59. }
  60. }