From 32e315c68f2c293b021048c4f77896a27cd512fc Mon Sep 17 00:00:00 2001 From: Mervill Date: Sat, 10 Aug 2024 18:45:37 -0700 Subject: [PATCH] Refactor LightBehaviorSystem to remove obsolete code (#30890) --- .../Components/LightBehaviourComponent.cs | 165 ++---------------- .../EntitySystems/ExpendableLightSystem.cs | 5 +- .../EntitySystems/LightBehaviorSystem.cs | 154 +++++++++++++++- Content.Client/Light/HandheldLightSystem.cs | 12 +- 4 files changed, 168 insertions(+), 168 deletions(-) diff --git a/Content.Client/Light/Components/LightBehaviourComponent.cs b/Content.Client/Light/Components/LightBehaviourComponent.cs index 7e8bf82a29..9df793ee93 100644 --- a/Content.Client/Light/Components/LightBehaviourComponent.cs +++ b/Content.Client/Light/Components/LightBehaviourComponent.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Shared.Light.Components; using JetBrains.Annotations; using Robust.Client.Animations; @@ -68,7 +68,7 @@ namespace Content.Client.Light.Components if (MinDuration > 0) { - MaxTime = (float) _random.NextDouble() * (MaxDuration - MinDuration) + MinDuration; + MaxTime = (float)_random.NextDouble() * (MaxDuration - MinDuration) + MinDuration; } else { @@ -192,11 +192,11 @@ namespace Content.Client.Light.Components { if (interpolateValue < 0.5f) { - ApplyInterpolation(StartValue, EndValue, interpolateValue*2); + ApplyInterpolation(StartValue, EndValue, interpolateValue * 2); } else { - ApplyInterpolation(EndValue, StartValue, (interpolateValue-0.5f)*2); + ApplyInterpolation(EndValue, StartValue, (interpolateValue - 0.5f) * 2); } } else @@ -238,9 +238,9 @@ namespace Content.Client.Light.Components public override void OnInitialize() { - _randomValue1 = (float) InterpolateLinear(StartValue, EndValue, (float) _random.NextDouble()); - _randomValue2 = (float) InterpolateLinear(StartValue, EndValue, (float) _random.NextDouble()); - _randomValue3 = (float) InterpolateLinear(StartValue, EndValue, (float) _random.NextDouble()); + _randomValue1 = (float)InterpolateLinear(StartValue, EndValue, (float)_random.NextDouble()); + _randomValue2 = (float)InterpolateLinear(StartValue, EndValue, (float)_random.NextDouble()); + _randomValue3 = (float)InterpolateLinear(StartValue, EndValue, (float)_random.NextDouble()); } public override void OnStart() @@ -258,7 +258,7 @@ namespace Content.Client.Light.Components } _randomValue3 = _randomValue4; - _randomValue4 = (float) InterpolateLinear(StartValue, EndValue, (float) _random.NextDouble()); + _randomValue4 = (float)InterpolateLinear(StartValue, EndValue, (float) _random.NextDouble()); } public override (int KeyFrameIndex, float FramePlayingTime) AdvancePlayback( @@ -362,7 +362,7 @@ namespace Content.Client.Light.Components [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IRobustRandom _random = default!; - private const string KeyPrefix = nameof(LightBehaviourComponent); + public const string KeyPrefix = nameof(LightBehaviourComponent); public sealed class AnimationContainer { @@ -387,7 +387,7 @@ namespace Content.Client.Light.Components public readonly List Animations = new(); [ViewVariables(VVAccess.ReadOnly)] - private Dictionary _originalPropertyValues = new(); + public Dictionary OriginalPropertyValues = new(); void ISerializationHooks.AfterDeserialization() { @@ -397,155 +397,12 @@ namespace Content.Client.Light.Components { var animation = new Animation() { - AnimationTracks = {behaviour} + AnimationTracks = { behaviour } }; Animations.Add(new AnimationContainer(key, animation, behaviour)); key++; } } - - /// - /// If we disable all the light behaviours we want to be able to revert the light to its original state. - /// - private void CopyLightSettings(EntityUid uid, string property) - { - if (_entMan.TryGetComponent(uid, out PointLightComponent? light)) - { - var propertyValue = AnimationHelper.GetAnimatableProperty(light, property); - if (propertyValue != null) - { - _originalPropertyValues.Add(property, propertyValue); - } - } - else - { - Logger.Warning($"{_entMan.GetComponent(uid).EntityName} has a {nameof(LightBehaviourComponent)} but it has no {nameof(PointLightComponent)}! Check the prototype!"); - } - } - - /// - /// Start animating a light behaviour with the specified ID. If the specified ID is empty, it will start animating all light behaviour entries. - /// If specified light behaviours are already animating, calling this does nothing. - /// Multiple light behaviours can have the same ID. - /// - public void StartLightBehaviour(string id = "") - { - var uid = Owner; - if (!_entMan.TryGetComponent(uid, out AnimationPlayerComponent? animation)) - { - return; - } - - var animations = _entMan.System(); - - foreach (var container in Animations) - { - if (container.LightBehaviour.ID == id || id == string.Empty) - { - if (!animations.HasRunningAnimation(uid, animation, KeyPrefix + container.Key)) - { - CopyLightSettings(uid, container.LightBehaviour.Property); - container.LightBehaviour.UpdatePlaybackValues(container.Animation); - animations.Play(uid, animation, container.Animation, KeyPrefix + container.Key); - } - } - } - } - - /// - /// If any light behaviour with the specified ID is animating, then stop it. - /// If no ID is specified then all light behaviours will be stopped. - /// Multiple light behaviours can have the same ID. - /// - /// - /// Should the behaviour(s) also be removed permanently? - /// Should the light have its original settings applied? - public void StopLightBehaviour(string id = "", bool removeBehaviour = false, bool resetToOriginalSettings = false) - { - var uid = Owner; - if (!_entMan.TryGetComponent(uid, out AnimationPlayerComponent? animation)) - { - return; - } - - var toRemove = new List(); - var animations = _entMan.System(); - - foreach (var container in Animations) - { - if (container.LightBehaviour.ID == id || id == string.Empty) - { - if (animations.HasRunningAnimation(uid, animation, KeyPrefix + container.Key)) - { - animations.Stop(uid, animation, KeyPrefix + container.Key); - } - - if (removeBehaviour) - { - toRemove.Add(container); - } - } - } - - foreach (var container in toRemove) - { - Animations.Remove(container); - } - - if (resetToOriginalSettings && _entMan.TryGetComponent(uid, out PointLightComponent? light)) - { - foreach (var (property, value) in _originalPropertyValues) - { - AnimationHelper.SetAnimatableProperty(light, property, value); - } - } - - _originalPropertyValues.Clear(); - } - - /// - /// Checks if at least one behaviour is running. - /// - /// Whether at least one behaviour is running, false if none is. - public bool HasRunningBehaviours() - { - var uid = Owner; - if (!_entMan.TryGetComponent(uid, out AnimationPlayerComponent? animation)) - { - return false; - } - - var animations = _entMan.System(); - return Animations.Any(container => animations.HasRunningAnimation(uid, animation, KeyPrefix + container.Key)); - } - - /// - /// Add a new light behaviour to the component and start it immediately unless otherwise specified. - /// - public void AddNewLightBehaviour(LightBehaviourAnimationTrack behaviour, bool playImmediately = true) - { - var key = 0; - - while (Animations.Any(x => x.Key == key)) - { - key++; - } - - var animation = new Animation() - { - AnimationTracks = {behaviour} - }; - - behaviour.Initialize(Owner, _random, _entMan); - - var container = new AnimationContainer(key, animation, behaviour); - Animations.Add(container); - - if (playImmediately) - { - StartLightBehaviour(behaviour.ID); - } - } } } diff --git a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs index 8077406730..4d52b0933d 100644 --- a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs +++ b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs @@ -11,6 +11,7 @@ public sealed class ExpendableLightSystem : VisualizerSystem(uid, ExpendableLightVisuals.Behavior, out var lightBehaviourID, args.Component) && TryComp(uid, out var lightBehaviour)) { - lightBehaviour.StopLightBehaviour(); + _lightBehavior.StopLightBehaviour((uid, lightBehaviour)); if (!string.IsNullOrEmpty(lightBehaviourID)) { - lightBehaviour.StartLightBehaviour(lightBehaviourID); + _lightBehavior.StartLightBehaviour((uid, lightBehaviour), lightBehaviourID); } else if (TryComp(uid, out var light)) { diff --git a/Content.Client/Light/EntitySystems/LightBehaviorSystem.cs b/Content.Client/Light/EntitySystems/LightBehaviorSystem.cs index ca19d8522c..5b823946f7 100644 --- a/Content.Client/Light/EntitySystems/LightBehaviorSystem.cs +++ b/Content.Client/Light/EntitySystems/LightBehaviorSystem.cs @@ -1,7 +1,9 @@ using System.Linq; using Content.Client.Light.Components; using Robust.Client.GameObjects; +using Robust.Client.Animations; using Robust.Shared.Random; +using Robust.Shared.Animations; namespace Content.Client.Light.EntitySystems; @@ -36,23 +38,163 @@ public sealed class LightBehaviorSystem : EntitySystem } } - private void OnLightStartup(EntityUid uid, LightBehaviourComponent component, ComponentStartup args) + private void OnLightStartup(Entity entity, ref ComponentStartup args) { // TODO: Do NOT ensure component here. And use eventbus events instead... - EnsureComp(uid); + EnsureComp(entity); - foreach (var container in component.Animations) + foreach (var container in entity.Comp.Animations) { - container.LightBehaviour.Initialize(uid, _random, EntityManager); + container.LightBehaviour.Initialize(entity, _random, EntityManager); } // we need to initialize all behaviours before starting any - foreach (var container in component.Animations) + foreach (var container in entity.Comp.Animations) { if (container.LightBehaviour.Enabled) { - component.StartLightBehaviour(container.LightBehaviour.ID); + StartLightBehaviour(entity, container.LightBehaviour.ID); } } } + + /// + /// If we disable all the light behaviours we want to be able to revert the light to its original state. + /// + private void CopyLightSettings(Entity entity, string property) + { + if (EntityManager.TryGetComponent(entity, out PointLightComponent? light)) + { + var propertyValue = AnimationHelper.GetAnimatableProperty(light, property); + if (propertyValue != null) + { + entity.Comp.OriginalPropertyValues.Add(property, propertyValue); + } + } + else + { + Log.Warning($"{EntityManager.GetComponent(entity).EntityName} has a {nameof(LightBehaviourComponent)} but it has no {nameof(PointLightComponent)}! Check the prototype!"); + } + } + + /// + /// Start animating a light behaviour with the specified ID. If the specified ID is empty, it will start animating all light behaviour entries. + /// If specified light behaviours are already animating, calling this does nothing. + /// Multiple light behaviours can have the same ID. + /// + public void StartLightBehaviour(Entity entity, string id = "") + { + if (!EntityManager.TryGetComponent(entity, out AnimationPlayerComponent? animation)) + { + return; + } + + foreach (var container in entity.Comp.Animations) + { + if (container.LightBehaviour.ID == id || id == string.Empty) + { + if (!_player.HasRunningAnimation(entity, animation, LightBehaviourComponent.KeyPrefix + container.Key)) + { + CopyLightSettings(entity, container.LightBehaviour.Property); + container.LightBehaviour.UpdatePlaybackValues(container.Animation); + _player.Play(entity, container.Animation, LightBehaviourComponent.KeyPrefix + container.Key); + } + } + } + } + + /// + /// If any light behaviour with the specified ID is animating, then stop it. + /// If no ID is specified then all light behaviours will be stopped. + /// Multiple light behaviours can have the same ID. + /// + /// + /// Should the behaviour(s) also be removed permanently? + /// Should the light have its original settings applied? + public void StopLightBehaviour(Entity entity, string id = "", bool removeBehaviour = false, bool resetToOriginalSettings = false) + { + if (!EntityManager.TryGetComponent(entity, out AnimationPlayerComponent? animation)) + { + return; + } + + var comp = entity.Comp; + + var toRemove = new List(); + + foreach (var container in comp.Animations) + { + if (container.LightBehaviour.ID == id || id == string.Empty) + { + if (_player.HasRunningAnimation(entity, animation, LightBehaviourComponent.KeyPrefix + container.Key)) + { + _player.Stop(entity, animation, LightBehaviourComponent.KeyPrefix + container.Key); + } + + if (removeBehaviour) + { + toRemove.Add(container); + } + } + } + + foreach (var container in toRemove) + { + comp.Animations.Remove(container); + } + + if (resetToOriginalSettings && EntityManager.TryGetComponent(entity, out PointLightComponent? light)) + { + foreach (var (property, value) in comp.OriginalPropertyValues) + { + AnimationHelper.SetAnimatableProperty(light, property, value); + } + } + + comp.OriginalPropertyValues.Clear(); + } + + /// + /// Checks if at least one behaviour is running. + /// + /// Whether at least one behaviour is running, false if none is. + public bool HasRunningBehaviours(Entity entity) + { + //var uid = Owner; + if (!EntityManager.TryGetComponent(entity, out AnimationPlayerComponent? animation)) + { + return false; + } + + return entity.Comp.Animations.Any(container => _player.HasRunningAnimation(entity, animation, LightBehaviourComponent.KeyPrefix + container.Key)); + } + + /// + /// Add a new light behaviour to the component and start it immediately unless otherwise specified. + /// + public void AddNewLightBehaviour(Entity entity, LightBehaviourAnimationTrack behaviour, bool playImmediately = true) + { + var key = 0; + var comp = entity.Comp; + + while (comp.Animations.Any(x => x.Key == key)) + { + key++; + } + + var animation = new Animation() + { + AnimationTracks = { behaviour } + }; + + behaviour.Initialize(entity.Owner, _random, EntityManager); + + var container = new LightBehaviourComponent.AnimationContainer(key, animation, behaviour); + comp.Animations.Add(container); + + if (playImmediately) + { + StartLightBehaviour(entity, behaviour.ID); + } + } } diff --git a/Content.Client/Light/HandheldLightSystem.cs b/Content.Client/Light/HandheldLightSystem.cs index 7f18223811..ddd99c7c48 100644 --- a/Content.Client/Light/HandheldLightSystem.cs +++ b/Content.Client/Light/HandheldLightSystem.cs @@ -3,15 +3,15 @@ using Content.Client.Light.Components; using Content.Shared.Light; using Content.Shared.Light.Components; using Content.Shared.Toggleable; -using Robust.Client.Animations; using Robust.Client.GameObjects; -using Robust.Shared.Animations; +using Content.Client.Light.EntitySystems; namespace Content.Client.Light; public sealed class HandheldLightSystem : SharedHandheldLightSystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly LightBehaviorSystem _lightBehavior = default!; public override void Initialize() { @@ -41,9 +41,9 @@ public sealed class HandheldLightSystem : SharedHandheldLightSystem if (TryComp(uid, out var lightBehaviour)) { // Reset any running behaviour to reset the animated properties back to the original value, to avoid conflicts between resets - if (lightBehaviour.HasRunningBehaviours()) + if (_lightBehavior.HasRunningBehaviours((uid, lightBehaviour))) { - lightBehaviour.StopLightBehaviour(resetToOriginalSettings: true); + _lightBehavior.StopLightBehaviour((uid, lightBehaviour), resetToOriginalSettings: true); } if (!enabled) @@ -56,10 +56,10 @@ public sealed class HandheldLightSystem : SharedHandheldLightSystem case HandheldLightPowerStates.FullPower: break; // We just needed to reset all behaviours case HandheldLightPowerStates.LowPower: - lightBehaviour.StartLightBehaviour(component.RadiatingBehaviourId); + _lightBehavior.StartLightBehaviour((uid, lightBehaviour), component.RadiatingBehaviourId); break; case HandheldLightPowerStates.Dying: - lightBehaviour.StartLightBehaviour(component.BlinkingBehaviourId); + _lightBehavior.StartLightBehaviour((uid, lightBehaviour), component.BlinkingBehaviourId); break; } }