| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using Content.Shared.Flash;
- using Content.Shared.Flash.Components;
- using Content.Shared.StatusEffect;
- using Robust.Client.Graphics;
- using Robust.Client.Player;
- using Robust.Shared.Enums;
- using Robust.Shared.Prototypes;
- using Robust.Shared.Timing;
- namespace Content.Client.Flash
- {
- public sealed class FlashOverlay : Overlay
- {
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- [Dependency] private readonly IEntityManager _entityManager = default!;
- [Dependency] private readonly IPlayerManager _playerManager = default!;
- [Dependency] private readonly IGameTiming _timing = default!;
- private readonly SharedFlashSystem _flash;
- private readonly StatusEffectsSystem _statusSys;
- public override OverlaySpace Space => OverlaySpace.WorldSpace;
- private readonly ShaderInstance _shader;
- public float PercentComplete = 0.0f;
- public Texture? ScreenshotTexture;
- public FlashOverlay()
- {
- IoCManager.InjectDependencies(this);
- _shader = _prototypeManager.Index<ShaderPrototype>("FlashedEffect").InstanceUnique();
- _flash = _entityManager.System<SharedFlashSystem>();
- _statusSys = _entityManager.System<StatusEffectsSystem>();
- }
- protected override void FrameUpdate(FrameEventArgs args)
- {
- var playerEntity = _playerManager.LocalEntity;
- if (playerEntity == null)
- return;
- if (!_entityManager.HasComponent<FlashedComponent>(playerEntity)
- || !_entityManager.TryGetComponent<StatusEffectsComponent>(playerEntity, out var status))
- return;
- if (!_statusSys.TryGetTime(playerEntity.Value, _flash.FlashedKey, out var time, status))
- return;
- var curTime = _timing.CurTime;
- var lastsFor = (float) (time.Value.Item2 - time.Value.Item1).TotalSeconds;
- var timeDone = (float) (curTime - time.Value.Item1).TotalSeconds;
- PercentComplete = timeDone / lastsFor;
- }
- protected override bool BeforeDraw(in OverlayDrawArgs args)
- {
- if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp))
- return false;
- if (args.Viewport.Eye != eyeComp.Eye)
- return false;
- return PercentComplete < 1.0f;
- }
- protected override void Draw(in OverlayDrawArgs args)
- {
- if (RequestScreenTexture && ScreenTexture != null)
- {
- ScreenshotTexture = ScreenTexture;
- RequestScreenTexture = false; // we only need the first frame, so we can stop the request now for performance reasons
- }
- if (ScreenshotTexture == null)
- return;
- var worldHandle = args.WorldHandle;
- _shader.SetParameter("percentComplete", PercentComplete);
- worldHandle.UseShader(_shader);
- worldHandle.DrawTextureRectRegion(ScreenshotTexture, args.WorldBounds);
- worldHandle.UseShader(null);
- }
- protected override void DisposeBehavior()
- {
- base.DisposeBehavior();
- ScreenshotTexture = null;
- }
- }
- }
|