BlindOverlay.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Content.Client.Movement.Systems;
  2. using Robust.Client.Graphics;
  3. using Robust.Client.Player;
  4. using Robust.Shared.Enums;
  5. using Robust.Shared.Prototypes;
  6. using Content.Shared.Eye.Blinding;
  7. using Content.Shared.Eye.Blinding.Components;
  8. using Content.Shared.Movement.Components;
  9. using Content.Shared.Movement.Systems;
  10. namespace Content.Client.Eye.Blinding
  11. {
  12. public sealed class BlindOverlay : Overlay
  13. {
  14. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  15. [Dependency] private readonly IPlayerManager _playerManager = default!;
  16. [Dependency] private readonly IEntityManager _entityManager = default!;
  17. [Dependency] private readonly ILightManager _lightManager = default!;
  18. public override bool RequestScreenTexture => true;
  19. public override OverlaySpace Space => OverlaySpace.WorldSpace;
  20. private readonly ShaderInstance _greyscaleShader;
  21. private readonly ShaderInstance _circleMaskShader;
  22. private BlindableComponent _blindableComponent = default!;
  23. public BlindOverlay()
  24. {
  25. IoCManager.InjectDependencies(this);
  26. _greyscaleShader = _prototypeManager.Index<ShaderPrototype>("GreyscaleFullscreen").InstanceUnique();
  27. _circleMaskShader = _prototypeManager.Index<ShaderPrototype>("CircleMask").InstanceUnique();
  28. }
  29. protected override bool BeforeDraw(in OverlayDrawArgs args)
  30. {
  31. if (!_entityManager.TryGetComponent(_playerManager.LocalSession?.AttachedEntity, out EyeComponent? eyeComp))
  32. return false;
  33. if (args.Viewport.Eye != eyeComp.Eye)
  34. return false;
  35. var playerEntity = _playerManager.LocalSession?.AttachedEntity;
  36. if (playerEntity == null)
  37. return false;
  38. if (!_entityManager.TryGetComponent<BlindableComponent>(playerEntity, out var blindComp))
  39. return false;
  40. _blindableComponent = blindComp;
  41. var blind = _blindableComponent.IsBlind;
  42. if (!blind && _blindableComponent.LightSetup) // Turn FOV back on if we can see again
  43. {
  44. _lightManager.Enabled = true;
  45. _blindableComponent.LightSetup = false;
  46. _blindableComponent.GraceFrame = true;
  47. return true;
  48. }
  49. return blind;
  50. }
  51. protected override void Draw(in OverlayDrawArgs args)
  52. {
  53. if (ScreenTexture == null)
  54. return;
  55. var playerEntity = _playerManager.LocalSession?.AttachedEntity;
  56. if (playerEntity == null)
  57. return;
  58. if (!_blindableComponent.GraceFrame)
  59. {
  60. _blindableComponent.LightSetup = true; // Ok we touched the lights
  61. _lightManager.Enabled = false;
  62. } else
  63. {
  64. _blindableComponent.GraceFrame = false;
  65. }
  66. if (_entityManager.TryGetComponent<EyeComponent>(playerEntity, out var content))
  67. {
  68. _circleMaskShader?.SetParameter("Zoom", content.Zoom.X);
  69. }
  70. _greyscaleShader?.SetParameter("SCREEN_TEXTURE", ScreenTexture);
  71. var worldHandle = args.WorldHandle;
  72. var viewport = args.WorldBounds;
  73. worldHandle.UseShader(_greyscaleShader);
  74. worldHandle.DrawRect(viewport, Color.White);
  75. worldHandle.UseShader(_circleMaskShader);
  76. worldHandle.DrawRect(viewport, Color.White);
  77. worldHandle.UseShader(null);
  78. }
  79. }
  80. }