diff --git a/Content.Client/Drugs/DrugOverlaySystem.cs b/Content.Client/Drugs/DrugOverlaySystem.cs index 9bfa4fdf827..60fdf12f5e3 100644 --- a/Content.Client/Drugs/DrugOverlaySystem.cs +++ b/Content.Client/Drugs/DrugOverlaySystem.cs @@ -38,6 +38,7 @@ private void OnPlayerAttached(EntityUid uid, SeeingRainbowsComponent component, private void OnPlayerDetached(EntityUid uid, SeeingRainbowsComponent component, LocalPlayerDetachedEvent args) { _overlay.Intoxication = 0; + _overlay.TimeTicker = 0; _overlayMan.RemoveOverlay(_overlay); } @@ -52,6 +53,7 @@ private void OnShutdown(EntityUid uid, SeeingRainbowsComponent component, Compon if (_player.LocalEntity == uid) { _overlay.Intoxication = 0; + _overlay.TimeTicker = 0; _overlayMan.RemoveOverlay(_overlay); } } diff --git a/Content.Client/Drugs/RainbowOverlay.cs b/Content.Client/Drugs/RainbowOverlay.cs index 6ef5d0f65ce..e62b0dfa66c 100644 --- a/Content.Client/Drugs/RainbowOverlay.cs +++ b/Content.Client/Drugs/RainbowOverlay.cs @@ -20,6 +20,7 @@ public sealed class RainbowOverlay : Overlay private readonly ShaderInstance _rainbowShader; public float Intoxication = 0.0f; + public float TimeTicker = 0.0f; private const float VisualThreshold = 10.0f; private const float PowerDivisor = 250.0f; @@ -48,7 +49,17 @@ protected override void FrameUpdate(FrameEventArgs args) return; var timeLeft = (float) (time.Value.Item2 - time.Value.Item1).TotalSeconds; - Intoxication += (timeLeft - Intoxication) * args.DeltaSeconds / 16f; + + TimeTicker += args.DeltaSeconds; + + if (timeLeft - TimeTicker > timeLeft / 16f) + { + Intoxication += (timeLeft - Intoxication) * args.DeltaSeconds / 16f; + } + else + { + Intoxication -= Intoxication/(timeLeft - TimeTicker) * args.DeltaSeconds; + } } protected override bool BeforeDraw(in OverlayDrawArgs args)