diff --git a/Content.Client/Drugs/RainbowOverlay.cs b/Content.Client/Drugs/RainbowOverlay.cs index 9af8271dae..fbaab0dc5f 100644 --- a/Content.Client/Drugs/RainbowOverlay.cs +++ b/Content.Client/Drugs/RainbowOverlay.cs @@ -1,5 +1,6 @@ using Content.Shared.Drugs; using Content.Shared.StatusEffect; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -53,6 +54,12 @@ public sealed class RainbowOverlay : Overlay protected override bool BeforeDraw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return false; + + if (args.Viewport.Eye != eyeComp.Eye) + return false; + return EffectScale > 0; } diff --git a/Content.Client/Drunk/DrunkOverlay.cs b/Content.Client/Drunk/DrunkOverlay.cs index 0a49679846..846c86b3be 100644 --- a/Content.Client/Drunk/DrunkOverlay.cs +++ b/Content.Client/Drunk/DrunkOverlay.cs @@ -1,5 +1,6 @@ using Content.Shared.Drunk; using Content.Shared.StatusEffect; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -53,6 +54,12 @@ public sealed class DrunkOverlay : Overlay protected override bool BeforeDraw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return false; + + if (args.Viewport.Eye != eyeComp.Eye) + return false; + _visualScale = BoozePowerToVisual(CurrentBoozePower); return _visualScale > 0; } diff --git a/Content.Client/Eye/Blinding/BlindOverlay.cs b/Content.Client/Eye/Blinding/BlindOverlay.cs index c023435615..fc7367d715 100644 --- a/Content.Client/Eye/Blinding/BlindOverlay.cs +++ b/Content.Client/Eye/Blinding/BlindOverlay.cs @@ -1,3 +1,4 @@ +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -29,6 +30,12 @@ namespace Content.Client.Eye.Blinding } protected override bool BeforeDraw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return false; + + if (args.Viewport.Eye != eyeComp.Eye) + return false; + var playerEntity = _playerManager.LocalPlayer?.ControlledEntity; if (playerEntity == null) diff --git a/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs b/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs index 591ad4ffbb..376b415fab 100644 --- a/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs +++ b/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs @@ -1,3 +1,4 @@ +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -25,6 +26,12 @@ namespace Content.Client.Eye.Blinding protected override bool BeforeDraw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return false; + + if (args.Viewport.Eye != eyeComp.Eye) + return false; + var playerEntity = _playerManager.LocalPlayer?.ControlledEntity; if (playerEntity == null) diff --git a/Content.Client/Flash/FlashOverlay.cs b/Content.Client/Flash/FlashOverlay.cs index 70a3876021..31c600a46b 100644 --- a/Content.Client/Flash/FlashOverlay.cs +++ b/Content.Client/Flash/FlashOverlay.cs @@ -1,6 +1,8 @@ using Content.Client.Viewport; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.State; +using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.IoC; using Robust.Shared.Maths; @@ -16,6 +18,8 @@ namespace Content.Client.Flash [Dependency] private readonly IClyde _displayManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IStateManager _stateManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; public override OverlaySpace Space => OverlaySpace.ScreenSpace; private readonly ShaderInstance _shader; @@ -46,6 +50,12 @@ namespace Content.Client.Flash protected override void Draw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return; + + if (args.Viewport.Eye != eyeComp.Eye) + return; + var percentComplete = (float) ((_gameTiming.CurTime.TotalSeconds - _startTime) / _lastsFor); if (percentComplete >= 1.0f) return; diff --git a/Content.Client/MobState/Overlays/DamageOverlay.cs b/Content.Client/MobState/Overlays/DamageOverlay.cs index cd1d1df237..9825d15f97 100644 --- a/Content.Client/MobState/Overlays/DamageOverlay.cs +++ b/Content.Client/MobState/Overlays/DamageOverlay.cs @@ -1,5 +1,7 @@ using Content.Shared.MobState; +using Robust.Client.GameObjects; using Robust.Client.Graphics; +using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -10,6 +12,8 @@ public sealed class DamageOverlay : Overlay { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; public override OverlaySpace Space => OverlaySpace.ScreenSpace; @@ -53,6 +57,12 @@ public sealed class DamageOverlay : Overlay protected override void Draw(in OverlayDrawArgs args) { + if (!_entityManager.TryGetComponent(_playerManager.LocalPlayer?.ControlledEntity, out EyeComponent? eyeComp)) + return; + + if (args.Viewport.Eye != eyeComp.Eye) + return; + /* * Here's the rundown: * 1. There's lerping for each level so the transitions are smooth. diff --git a/Content.Client/Radiation/RadiationPulseOverlay.cs b/Content.Client/Radiation/RadiationPulseOverlay.cs index 258696ec5d..f4f7ddc27b 100644 --- a/Content.Client/Radiation/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/RadiationPulseOverlay.cs @@ -44,9 +44,12 @@ namespace Content.Client.Radiation foreach ((var shd, var instance) in _pulses.Values) { + if (instance.CurrentMapCoords.MapId != args.MapId) + continue; + // To be clear, this needs to use "inside-viewport" pixels. // In other words, specifically NOT IViewportControl.WorldToScreen (which uses outer coordinates). - var tempCoords = viewport.WorldToLocal(instance.CurrentMapCoords); + var tempCoords = viewport.WorldToLocal(instance.CurrentMapCoords.Position); tempCoords.Y = viewport.Size.Y - tempCoords.Y; shd?.SetParameter("renderScale", viewport.RenderScale); shd?.SetParameter("positionInput", tempCoords); @@ -59,7 +62,7 @@ namespace Content.Client.Radiation shd?.SetParameter("SCREEN_TEXTURE", viewport.RenderTarget.Texture); worldHandle.UseShader(shd); - worldHandle.DrawRect(Box2.CenteredAround(instance.CurrentMapCoords, new Vector2(instance.Range, instance.Range) * 2f), Color.White); + worldHandle.DrawRect(Box2.CenteredAround(instance.CurrentMapCoords.Position, new Vector2(instance.Range, instance.Range) * 2f), Color.White); } worldHandle.UseShader(null); @@ -88,7 +91,7 @@ namespace Content.Client.Radiation ( _baseShader.Duplicate(), new RadiationShaderInstance( - _entityManager.GetComponent(pulseEntity).MapPosition.Position, + _entityManager.GetComponent(pulseEntity).MapPosition, pulse.VisualRange, pulse.StartTime, pulse.VisualDuration @@ -106,7 +109,7 @@ namespace Content.Client.Radiation _entityManager.TryGetComponent(pulseEntity, out var pulse)) { var shaderInstance = _pulses[pulseEntity]; - shaderInstance.instance.CurrentMapCoords = _entityManager.GetComponent(pulseEntity).MapPosition.Position; + shaderInstance.instance.CurrentMapCoords = _entityManager.GetComponent(pulseEntity).MapPosition; shaderInstance.instance.Range = pulse.VisualRange; } else { _pulses[pulseEntity].shd.Dispose(); @@ -121,9 +124,9 @@ namespace Content.Client.Radiation return _entityManager.GetComponent(pulseEntity).MapID == currentEyeLoc.MapId && _entityManager.GetComponent(pulseEntity).Coordinates.InRange(_entityManager, EntityCoordinates.FromMap(_entityManager, _entityManager.GetComponent(pulseEntity).ParentUid, currentEyeLoc), MaxDist); } - private sealed record RadiationShaderInstance(Vector2 CurrentMapCoords, float Range, TimeSpan Start, float Duration) + private sealed record RadiationShaderInstance(MapCoordinates CurrentMapCoords, float Range, TimeSpan Start, float Duration) { - public Vector2 CurrentMapCoords = CurrentMapCoords; + public MapCoordinates CurrentMapCoords = CurrentMapCoords; public float Range = Range; public TimeSpan Start = Start; public float Duration = Duration;