]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Refactor LightBehaviorSystem to remove obsolete code (#30890)
authorMervill <mervills.email@gmail.com>
Sun, 11 Aug 2024 01:45:37 +0000 (18:45 -0700)
committerGitHub <noreply@github.com>
Sun, 11 Aug 2024 01:45:37 +0000 (11:45 +1000)
Content.Client/Light/Components/LightBehaviourComponent.cs
Content.Client/Light/EntitySystems/ExpendableLightSystem.cs
Content.Client/Light/EntitySystems/LightBehaviorSystem.cs
Content.Client/Light/HandheldLightSystem.cs

index 7e8bf82a29e1e6f29c5a01ed70aa25b0b82f7d00..9df793ee93ca6ffdd712689c705b071f34c7a725 100644 (file)
@@ -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<AnimationContainer> Animations = new();
 
         [ViewVariables(VVAccess.ReadOnly)]
-        private Dictionary<string, object> _originalPropertyValues = new();
+        public Dictionary<string, object> 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++;
             }
         }
-
-        /// <summary>
-        /// If we disable all the light behaviours we want to be able to revert the light to its original state.
-        /// </summary>
-        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<MetaDataComponent>(uid).EntityName} has a {nameof(LightBehaviourComponent)} but it has no {nameof(PointLightComponent)}! Check the prototype!");
-            }
-        }
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public void StartLightBehaviour(string id = "")
-        {
-            var uid = Owner;
-            if (!_entMan.TryGetComponent(uid, out AnimationPlayerComponent? animation))
-            {
-                return;
-            }
-
-            var animations = _entMan.System<AnimationPlayerSystem>();
-
-            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);
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <param name="id"></param>
-        /// <param name="removeBehaviour">Should the behaviour(s) also be removed permanently?</param>
-        /// <param name="resetToOriginalSettings">Should the light have its original settings applied?</param>
-        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<AnimationContainer>();
-            var animations = _entMan.System<AnimationPlayerSystem>();
-
-            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();
-        }
-
-        /// <summary>
-        /// Checks if at least one behaviour is running.
-        /// </summary>
-        /// <returns>Whether at least one behaviour is running, false if none is.</returns>
-        public bool HasRunningBehaviours()
-        {
-            var uid = Owner;
-            if (!_entMan.TryGetComponent(uid, out AnimationPlayerComponent? animation))
-            {
-                return false;
-            }
-
-            var animations = _entMan.System<AnimationPlayerSystem>();
-            return Animations.Any(container => animations.HasRunningAnimation(uid, animation, KeyPrefix + container.Key));
-        }
-
-        /// <summary>
-        /// Add a new light behaviour to the component and start it immediately unless otherwise specified.
-        /// </summary>
-        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);
-            }
-        }
     }
 }
index 807740673010d06cf600fab64657a7669de5978b..4d52b0933d4cf52168803e93bef8aefb93c85841 100644 (file)
@@ -11,6 +11,7 @@ public sealed class ExpendableLightSystem : VisualizerSystem<ExpendableLightComp
 {
     [Dependency] private readonly PointLightSystem _pointLightSystem = default!;
     [Dependency] private readonly SharedAudioSystem _audioSystem = default!;
+    [Dependency] private readonly LightBehaviorSystem _lightBehavior = default!;
 
     public override void Initialize()
     {
@@ -32,11 +33,11 @@ public sealed class ExpendableLightSystem : VisualizerSystem<ExpendableLightComp
         if (AppearanceSystem.TryGetData<string>(uid, ExpendableLightVisuals.Behavior, out var lightBehaviourID, args.Component)
         &&  TryComp<LightBehaviourComponent>(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<PointLightComponent>(uid, out var light))
             {
index ca19d8522c563560b9a9441e16d52d6793166fa0..5b823946f79950256445717378d7c278f00930f6 100644 (file)
@@ -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<LightBehaviourComponent> entity, ref ComponentStartup args)
     {
         // TODO: Do NOT ensure component here. And use eventbus events instead...
-        EnsureComp<AnimationPlayerComponent>(uid);
+        EnsureComp<AnimationPlayerComponent>(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);
             }
         }
     }
+
+    /// <summary>
+    /// If we disable all the light behaviours we want to be able to revert the light to its original state.
+    /// </summary>
+    private void CopyLightSettings(Entity<LightBehaviourComponent> 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<MetaDataComponent>(entity).EntityName} has a {nameof(LightBehaviourComponent)} but it has no {nameof(PointLightComponent)}! Check the prototype!");
+        }
+    }
+
+    /// <summary>
+    /// 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.
+    /// </summary>
+    public void StartLightBehaviour(Entity<LightBehaviourComponent> 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);
+                }
+            }
+        }
+    }
+
+    /// <summary>
+    /// 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.
+    /// </summary>
+    /// <param name="id"></param>
+    /// <param name="removeBehaviour">Should the behaviour(s) also be removed permanently?</param>
+    /// <param name="resetToOriginalSettings">Should the light have its original settings applied?</param>
+    public void StopLightBehaviour(Entity<LightBehaviourComponent> 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<LightBehaviourComponent.AnimationContainer>();
+
+        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();
+    }
+
+    /// <summary>
+    /// Checks if at least one behaviour is running.
+    /// </summary>
+    /// <returns>Whether at least one behaviour is running, false if none is.</returns>
+    public bool HasRunningBehaviours(Entity<LightBehaviourComponent> 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));
+    }
+
+    /// <summary>
+    /// Add a new light behaviour to the component and start it immediately unless otherwise specified.
+    /// </summary>
+    public void AddNewLightBehaviour(Entity<LightBehaviourComponent> 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);
+        }
+    }
 }
index 7f18223811d8da08c1e0bb4b211222387de9d4c3..ddd99c7c48306ff65f376ff7c5fa0a97ad6fa902 100644 (file)
@@ -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<LightBehaviourComponent>(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;
             }
         }