From d0acfd7790ad33bad81c4595f3e568e17957d364 Mon Sep 17 00:00:00 2001 From: Aviu00 <93730715+Aviu00@users.noreply.github.com> Date: Sun, 21 Jul 2024 11:30:47 +0000 Subject: [PATCH] - add: Enhanced vision refactor. (#471) --- .../_White/Overlays/NightVisionSystem.cs | 9 +-- .../_White/Overlays/ThermalVisionOverlay.cs | 47 ++++++++++++-- .../_White/Overlays/ThermalVisionSystem.cs | 15 +++-- .../_Miracle/Systems/NightVisionSystem.cs | 4 +- .../_Miracle/Systems/ThermalVisionSystem.cs | 4 +- .../Systems/SharedEnhancedVisionSystem.cs | 64 +++++++++++++++++++ .../Systems/SharedNightVisionSystem.cs | 64 ------------------- .../Systems/SharedThermalVisionSystem.cs | 64 ------------------- .../Overlays/BaseEnhancedVisionComponent.cs | 24 +++++++ .../_White/Overlays/NightVisionComponent.cs | 16 +---- .../_White/Overlays/ThermalVisionComponent.cs | 16 +---- 11 files changed, 156 insertions(+), 171 deletions(-) create mode 100644 Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs delete mode 100644 Content.Shared/_Miracle/Systems/SharedNightVisionSystem.cs delete mode 100644 Content.Shared/_Miracle/Systems/SharedThermalVisionSystem.cs create mode 100644 Content.Shared/_White/Overlays/BaseEnhancedVisionComponent.cs diff --git a/Content.Client/_White/Overlays/NightVisionSystem.cs b/Content.Client/_White/Overlays/NightVisionSystem.cs index 92d7d88ac3..6d5812fa20 100644 --- a/Content.Client/_White/Overlays/NightVisionSystem.cs +++ b/Content.Client/_White/Overlays/NightVisionSystem.cs @@ -7,7 +7,8 @@ using Robust.Shared.Player; namespace Content.Client._White.Overlays; -public sealed class NightVisionSystem : SharedNightVisionSystem +public sealed class NightVisionSystem : SharedEnhancedVisionSystem { [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; @@ -46,12 +47,12 @@ public sealed class NightVisionSystem : SharedNightVisionSystem if (TryComp(ent, out NightVisionComponent? nightVision) && nightVision.IsActive) return; - UpdateNightVision(ent, false); + UpdateEnhancedVision(ent, false); } private void OnTempInit(Entity ent, ref ComponentInit args) { - UpdateNightVision(ent, true); + UpdateEnhancedVision(ent, true); } private void OnPlayerAttached(EntityUid uid, NightVisionComponent component, PlayerAttachedEvent args) @@ -76,7 +77,7 @@ public sealed class NightVisionSystem : SharedNightVisionSystem UpdateNightVision(active); } - protected override void UpdateNightVision(EntityUid uid, bool active) + protected override void UpdateEnhancedVision(EntityUid uid, bool active) { if (_player.LocalSession?.AttachedEntity != uid) return; diff --git a/Content.Client/_White/Overlays/ThermalVisionOverlay.cs b/Content.Client/_White/Overlays/ThermalVisionOverlay.cs index ace9bfaf5a..04ed047b23 100644 --- a/Content.Client/_White/Overlays/ThermalVisionOverlay.cs +++ b/Content.Client/_White/Overlays/ThermalVisionOverlay.cs @@ -22,6 +22,7 @@ public sealed class ThermalVisionOverlay : Overlay public override OverlaySpace Space => OverlaySpace.WorldSpace; private readonly List _entries = new(); + private EntityUid _pointLightEntity; public ThermalVisionOverlay() { @@ -46,23 +47,50 @@ public sealed class ThermalVisionOverlay : Overlay return; } + var transform = _entity.GetComponent(ent); + if (_pointLightEntity == default) + { + _pointLightEntity = _entity.SpawnAttachedTo(null, transform.Coordinates); + _entity.EnsureComponent(_pointLightEntity); + _transform.SetParent(_pointLightEntity, ent); + } + else + { + var pointLightXForm = _entity.GetComponent(_pointLightEntity); + if (pointLightXForm.ParentUid != ent) + _transform.SetParent(_pointLightEntity, pointLightXForm, ent, transform); + } + if (HasOccluders(ent)) return; var handle = args.WorldHandle; var eye = args.Viewport.Eye; + var mapId = eye?.Position.MapId; var eyeRot = eye?.Rotation ?? default; _entries.Clear(); var entities = _entity.EntityQueryEnumerator(); while (entities.MoveNext(out var uid, out _, out var sprite, out var xform)) { - if (HasOccluders(uid)) + var entity = uid; + + if (_container.TryGetOuterContainer(uid, xform, out var container)) + { + var owner = container.Owner; + if (_entity.TryGetComponent(owner, out var ownerSprite) && + _entity.TryGetComponent(owner, out var ownerXform)) + { + entity = owner; + sprite = ownerSprite; + xform = ownerXform; + } + } + + if (_entries.Any(e => e.Ent.Item1 == entity)) continue; - _entries.Add(new NightVisionRenderEntry((uid, sprite, xform), - eye?.Position.MapId, - eyeRot)); + _entries.Add(new NightVisionRenderEntry((entity, sprite, xform), mapId, eyeRot)); } foreach (var entry in _entries) @@ -79,7 +107,7 @@ public sealed class ThermalVisionOverlay : Overlay Angle eyeRot) { var (uid, sprite, xform) = ent; - if (xform.MapID != map || _container.IsEntityOrParentInContainer(uid)) + if (xform.MapID != map || HasOccluders(uid)) return; var position = _transform.GetWorldPosition(xform); @@ -95,6 +123,15 @@ public sealed class ThermalVisionOverlay : Overlay Box2.CenteredAround(mapCoordinates.Position, new Vector2(0.4f, 0.4f))); return occluders.Any(o => o.Component.Enabled); } + + public void Reset() + { + if (_pointLightEntity == default) + return; + + _entity.DeleteEntity(_pointLightEntity); + _pointLightEntity = default; + } } public record struct NightVisionRenderEntry( diff --git a/Content.Client/_White/Overlays/ThermalVisionSystem.cs b/Content.Client/_White/Overlays/ThermalVisionSystem.cs index 42457c0bb5..09b4c41235 100644 --- a/Content.Client/_White/Overlays/ThermalVisionSystem.cs +++ b/Content.Client/_White/Overlays/ThermalVisionSystem.cs @@ -1,13 +1,15 @@ using Content.Shared._Miracle.Systems; using Content.Shared.GameTicking; using Content.Shared._White.Overlays; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; namespace Content.Client._White.Overlays; -public sealed class ThermalVisionSystem : SharedThermalVisionSystem +public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem { [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; @@ -46,12 +48,12 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem if (TryComp(ent, out ThermalVisionComponent? thermalVision) && thermalVision.IsActive) return; - UpdateThermalVision(ent, false); + UpdateEnhancedVision(ent, false); } private void OnTempInit(Entity ent, ref ComponentInit args) { - UpdateThermalVision(ent, true); + UpdateEnhancedVision(ent, true); } private void OnPlayerAttached(EntityUid uid, ThermalVisionComponent component, PlayerAttachedEvent args) @@ -76,7 +78,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem UpdateThermalVision(active); } - protected override void UpdateThermalVision(EntityUid uid, bool active) + protected override void UpdateEnhancedVision(EntityUid uid, bool active) { if (_player.LocalSession?.AttachedEntity != uid) return; @@ -89,6 +91,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem { if (_player.LocalEntity == null) { + _overlay.Reset(); _overlayMan.RemoveOverlay(_overlay); return; } @@ -99,11 +102,15 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem if (active) _overlayMan.AddOverlay(_overlay); else + { + _overlay.Reset(); _overlayMan.RemoveOverlay(_overlay); + } } private void OnRestart(RoundRestartCleanupEvent ev) { + _overlay.Reset(); _overlayMan.RemoveOverlay(_overlay); } } diff --git a/Content.Server/_Miracle/Systems/NightVisionSystem.cs b/Content.Server/_Miracle/Systems/NightVisionSystem.cs index 7575cd518e..2380c607e2 100644 --- a/Content.Server/_Miracle/Systems/NightVisionSystem.cs +++ b/Content.Server/_Miracle/Systems/NightVisionSystem.cs @@ -1,7 +1,9 @@ using Content.Shared._Miracle.Systems; +using Content.Shared._White.Overlays; namespace Content.Server._Miracle.Systems; -public sealed class NightVisionSystem : SharedNightVisionSystem +public sealed class NightVisionSystem : SharedEnhancedVisionSystem { } diff --git a/Content.Server/_Miracle/Systems/ThermalVisionSystem.cs b/Content.Server/_Miracle/Systems/ThermalVisionSystem.cs index 5d13e52fa7..b7404ef95c 100644 --- a/Content.Server/_Miracle/Systems/ThermalVisionSystem.cs +++ b/Content.Server/_Miracle/Systems/ThermalVisionSystem.cs @@ -1,7 +1,9 @@ using Content.Shared._Miracle.Systems; +using Content.Shared._White.Overlays; namespace Content.Server._Miracle.Systems; -public sealed class ThermalVisionSystem : SharedThermalVisionSystem +public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem { } diff --git a/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs b/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs new file mode 100644 index 0000000000..b9920a3fd8 --- /dev/null +++ b/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs @@ -0,0 +1,64 @@ +using Content.Shared._White.Overlays; +using Content.Shared.Actions; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Timing; + +namespace Content.Shared._Miracle.Systems; + +public abstract class SharedEnhancedVisionSystem : EntitySystem + where TComp : BaseEnhancedVisionComponent + where TEvent : InstantActionEvent + where TTempComp : Component +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnToggle); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnRemove); + } + + private void OnRemove(EntityUid uid, TComp component, ComponentRemove args) + { + _actions.RemoveAction(uid, component.ToggleActionEntity); + + if (HasComp(uid)) + return; + + UpdateEnhancedVision(uid, false); + } + + private void OnInit(EntityUid uid, TComp component, ComponentInit args) + { + _actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); + + if (!component.IsActive && HasComp(uid)) + return; + + UpdateEnhancedVision(uid, component.IsActive); + } + + protected virtual void UpdateEnhancedVision(EntityUid uid, bool active) { } + + private void OnToggle(EntityUid uid, TComp component, TEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + component.IsActive = !component.IsActive; + + _audio.PlayPredicted(component.IsActive ? component.ActivateSound : component.DeactivateSound, uid, uid); + + args.Handled = true; + + if (!component.IsActive && HasComp(uid)) + return; + + UpdateEnhancedVision(uid, component.IsActive); + } +} diff --git a/Content.Shared/_Miracle/Systems/SharedNightVisionSystem.cs b/Content.Shared/_Miracle/Systems/SharedNightVisionSystem.cs deleted file mode 100644 index b81792167e..0000000000 --- a/Content.Shared/_Miracle/Systems/SharedNightVisionSystem.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Content.Shared._White.Overlays; -using Content.Shared.Actions; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Timing; - -namespace Content.Shared._Miracle.Systems; - -public abstract class SharedNightVisionSystem : EntitySystem -{ - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnToggle); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnRemove); - } - - private void OnRemove(EntityUid uid, NightVisionComponent component, ComponentRemove args) - { - _actions.RemoveAction(uid, component.ToggleActionEntity); - - if (HasComp(uid)) - return; - - UpdateNightVision(uid, false); - } - - private void OnInit(EntityUid uid, NightVisionComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); - - if (!component.IsActive && HasComp(uid)) - return; - - UpdateNightVision(uid, component.IsActive); - } - - protected virtual void UpdateNightVision(EntityUid uid, bool active) { } - - private void OnToggle(EntityUid uid, NightVisionComponent component, ToggleNightVisionEvent args) - { - if (!_timing.IsFirstTimePredicted) - return; - - component.IsActive = !component.IsActive; - - if (component.IsActive && component.ActivateSound != null) - _audio.PlayPredicted(component.ActivateSound, uid, uid); - else if (component.DeactivateSound != null) - _audio.PlayPredicted(component.DeactivateSound, uid, uid); - - args.Handled = true; - - if (!component.IsActive && HasComp(uid)) - return; - - UpdateNightVision(uid, component.IsActive); - } -} diff --git a/Content.Shared/_Miracle/Systems/SharedThermalVisionSystem.cs b/Content.Shared/_Miracle/Systems/SharedThermalVisionSystem.cs deleted file mode 100644 index 7c36bd2cbd..0000000000 --- a/Content.Shared/_Miracle/Systems/SharedThermalVisionSystem.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Content.Shared._White.Overlays; -using Content.Shared.Actions; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Timing; - -namespace Content.Shared._Miracle.Systems; - -public abstract class SharedThermalVisionSystem : EntitySystem -{ - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnToggle); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnRemove); - } - - private void OnRemove(EntityUid uid, ThermalVisionComponent component, ComponentRemove args) - { - _actions.RemoveAction(uid, component.ToggleActionEntity); - - if (HasComp(uid)) - return; - - UpdateThermalVision(uid, false); - } - - private void OnInit(EntityUid uid, ThermalVisionComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); - - if (!component.IsActive && HasComp(uid)) - return; - - UpdateThermalVision(uid, component.IsActive); - } - - protected virtual void UpdateThermalVision(EntityUid uid, bool active) { } - - private void OnToggle(EntityUid uid, ThermalVisionComponent component, ToggleThermalVisionEvent args) - { - if (!_timing.IsFirstTimePredicted) - return; - - component.IsActive = !component.IsActive; - - if (component.IsActive && component.ActivateSound != null) - _audio.PlayPredicted(component.ActivateSound, uid, uid); - else if (component.DeactivateSound != null) - _audio.PlayPredicted(component.DeactivateSound, uid, uid); - - args.Handled = true; - - if (!component.IsActive && HasComp(uid)) - return; - - UpdateThermalVision(uid, component.IsActive); - } -} diff --git a/Content.Shared/_White/Overlays/BaseEnhancedVisionComponent.cs b/Content.Shared/_White/Overlays/BaseEnhancedVisionComponent.cs new file mode 100644 index 0000000000..bf002b3bb6 --- /dev/null +++ b/Content.Shared/_White/Overlays/BaseEnhancedVisionComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._White.Overlays; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public abstract partial class BaseEnhancedVisionComponent : BaseNvOverlayComponent +{ + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public bool IsActive = true; + + [DataField] + public virtual SoundSpecifier? ActivateSound { get; set; }= new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg"); + + [DataField] + public virtual SoundSpecifier? DeactivateSound { get; set; } = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg"); + + [DataField] + public virtual EntProtoId? ToggleAction { get; set; } + + [ViewVariables] + public EntityUid? ToggleActionEntity; +} diff --git a/Content.Shared/_White/Overlays/NightVisionComponent.cs b/Content.Shared/_White/Overlays/NightVisionComponent.cs index ed706b5241..97c8fe2901 100644 --- a/Content.Shared/_White/Overlays/NightVisionComponent.cs +++ b/Content.Shared/_White/Overlays/NightVisionComponent.cs @@ -6,25 +6,13 @@ using Robust.Shared.Prototypes; namespace Content.Shared._White.Overlays; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -public sealed partial class NightVisionComponent : BaseNvOverlayComponent +public sealed partial class NightVisionComponent : BaseEnhancedVisionComponent { [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public override Color Color { get; set; } = Color.FromHex("#98FB98"); - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - public bool IsActive = true; - [DataField] - public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg"); - - [DataField] - public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg"); - - [DataField] - public EntProtoId? ToggleAction = "ToggleNightVision"; - - [ViewVariables] - public EntityUid? ToggleActionEntity; + public override EntProtoId? ToggleAction { get; set; } = "ToggleNightVision"; } public sealed partial class ToggleNightVisionEvent : InstantActionEvent diff --git a/Content.Shared/_White/Overlays/ThermalVisionComponent.cs b/Content.Shared/_White/Overlays/ThermalVisionComponent.cs index 7e081a138b..5f3c1d1110 100644 --- a/Content.Shared/_White/Overlays/ThermalVisionComponent.cs +++ b/Content.Shared/_White/Overlays/ThermalVisionComponent.cs @@ -6,25 +6,13 @@ using Robust.Shared.Prototypes; namespace Content.Shared._White.Overlays; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -public sealed partial class ThermalVisionComponent : BaseNvOverlayComponent +public sealed partial class ThermalVisionComponent : BaseEnhancedVisionComponent { [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public override Color Color { get; set; } = Color.FromHex("#F84742"); - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - public bool IsActive = true; - [DataField] - public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg"); - - [DataField] - public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg"); - - [DataField] - public EntProtoId? ToggleAction = "ToggleThermalVision"; - - [ViewVariables] - public EntityUid? ToggleActionEntity; + public override EntProtoId? ToggleAction { get; set; } = "ToggleThermalVision"; } public sealed partial class ToggleThermalVisionEvent : InstantActionEvent