1
0

ShowHandItemOverlay.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System.Numerics;
  2. using Content.Client.Hands.Systems;
  3. using Content.Shared.CCVar;
  4. using Robust.Client.GameObjects;
  5. using Robust.Client.Graphics;
  6. using Robust.Client.Input;
  7. using Robust.Client.UserInterface;
  8. using Robust.Shared.Configuration;
  9. using Robust.Shared.Enums;
  10. using Robust.Shared.Graphics;
  11. using Robust.Shared.Map;
  12. using Direction = Robust.Shared.Maths.Direction;
  13. namespace Content.Client.Hands
  14. {
  15. public sealed class ShowHandItemOverlay : Overlay
  16. {
  17. [Dependency] private readonly IConfigurationManager _cfg = default!;
  18. [Dependency] private readonly IInputManager _inputManager = default!;
  19. [Dependency] private readonly IClyde _clyde = default!;
  20. [Dependency] private readonly IEntityManager _entMan = default!;
  21. private HandsSystem? _hands;
  22. private readonly IRenderTexture _renderBackbuffer;
  23. public override OverlaySpace Space => OverlaySpace.ScreenSpace;
  24. public Texture? IconOverride;
  25. public EntityUid? EntityOverride;
  26. public ShowHandItemOverlay()
  27. {
  28. IoCManager.InjectDependencies(this);
  29. _renderBackbuffer = _clyde.CreateRenderTarget(
  30. (64, 64),
  31. new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb, true),
  32. new TextureSampleParameters
  33. {
  34. Filter = true
  35. }, nameof(ShowHandItemOverlay));
  36. }
  37. protected override void DisposeBehavior()
  38. {
  39. base.DisposeBehavior();
  40. _renderBackbuffer.Dispose();
  41. }
  42. protected override bool BeforeDraw(in OverlayDrawArgs args)
  43. {
  44. if (!_cfg.GetCVar(CCVars.HudHeldItemShow))
  45. return false;
  46. return base.BeforeDraw(in args);
  47. }
  48. protected override void Draw(in OverlayDrawArgs args)
  49. {
  50. var mousePos = _inputManager.MouseScreenPosition;
  51. // Offscreen
  52. if (mousePos.Window == WindowId.Invalid)
  53. return;
  54. var screen = args.ScreenHandle;
  55. var offset = _cfg.GetCVar(CCVars.HudHeldItemOffset);
  56. var offsetVec = new Vector2(offset, offset);
  57. if (IconOverride != null)
  58. {
  59. screen.DrawTexture(IconOverride, mousePos.Position - IconOverride.Size / 2 + offsetVec, Color.White.WithAlpha(0.75f));
  60. return;
  61. }
  62. _hands ??= _entMan.System<HandsSystem>();
  63. var handEntity = _hands.GetActiveHandEntity();
  64. if (handEntity == null || !_entMan.TryGetComponent(handEntity, out SpriteComponent? sprite))
  65. return;
  66. var halfSize = _renderBackbuffer.Size / 2;
  67. var uiScale = (args.ViewportControl as Control)?.UIScale ?? 1f;
  68. screen.RenderInRenderTarget(_renderBackbuffer, () =>
  69. {
  70. screen.DrawEntity(handEntity.Value, halfSize, new Vector2(1f, 1f) * uiScale, Angle.Zero, Angle.Zero, Direction.South, sprite);
  71. }, Color.Transparent);
  72. screen.DrawTexture(_renderBackbuffer.Texture, mousePos.Position - halfSize + offsetVec, Color.White.WithAlpha(0.75f));
  73. }
  74. }
  75. }