]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
fix: dirty SSD indicator comp on mapinit (#38891)
authorPerry Fraser <perryprog@users.noreply.github.com>
Tue, 22 Jul 2025 15:40:15 +0000 (11:40 -0400)
committerGitHub <noreply@github.com>
Tue, 22 Jul 2025 15:40:15 +0000 (17:40 +0200)
Content.Shared/SSDIndicator/SSDIndicatorComponent.cs
Content.Shared/SSDIndicator/SSDIndicatorSystem.cs

index 9547b6ce4ef026aa3ea737282b6725553a72ad46..6bfb3fdfd6636743b17de152359a5762cf5fae13 100644 (file)
@@ -1,29 +1,49 @@
+using Content.Shared.CCVar;
 using Content.Shared.StatusIcon;
 using Robust.Shared.GameStates;
 using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
 
 namespace Content.Shared.SSDIndicator;
 
 /// <summary>
-///     Shows status icon when player in SSD
+/// Shows status icon when an entity is SSD, based on if a player is attached or not.
 /// </summary>
 [RegisterComponent, NetworkedComponent]
 [AutoGenerateComponentState, AutoGenerateComponentPause]
 public sealed partial class SSDIndicatorComponent : Component
 {
-    [DataField, ViewVariables(VVAccess.ReadOnly)]
+    /// <summary>
+    /// Whether or not the entity is SSD.
+    /// </summary>
     [AutoNetworkedField]
+    [DataField, ViewVariables(VVAccess.ReadOnly)]
     public bool IsSSD = true;
 
+    /// <summary>
+    /// The icon displayed next to the associated entity when it is SSD.
+    /// </summary>
     [DataField]
     public ProtoId<SsdIconPrototype> Icon = "SSDIcon";
 
     /// <summary>
-    ///     When the entity should fall asleep
+    /// The time at which the entity will fall asleep, if <see cref="CCVars.ICSSDSleep"/> is true.
     /// </summary>
-    [DataField]
     [AutoNetworkedField, AutoPausedField]
     [Access(typeof(SSDIndicatorSystem))]
+    [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
     public TimeSpan FallAsleepTime = TimeSpan.Zero;
+
+    /// <summary>
+    /// The next time this component will be updated.
+    /// </summary>
+    [AutoNetworkedField, AutoPausedField]
+    [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
+    public TimeSpan NextUpdate = TimeSpan.Zero;
+
+    /// <summary>
+    /// The time between updates checking if the entity should be force slept.
+    /// </summary>
+    [DataField]
+    public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1);
 }
index b9c6659c9cc848dd58c1c60ec6a23acd0c50e781..14d71d90d979f96b2255f0c08a0e9c9319767c91 100644 (file)
@@ -61,12 +61,12 @@ public sealed class SSDIndicatorSystem : EntitySystem
     // Prevents mapped mobs to go to sleep immediately
     private void OnMapInit(EntityUid uid, SSDIndicatorComponent component, MapInitEvent args)
     {
-        if (_icSsdSleep &&
-            component.IsSSD &&
-            component.FallAsleepTime == TimeSpan.Zero)
-        {
-            component.FallAsleepTime = _timing.CurTime + TimeSpan.FromSeconds(_icSsdSleepTime);
-        }
+        if (!_icSsdSleep || !component.IsSSD)
+            return;
+
+        component.FallAsleepTime = _timing.CurTime + TimeSpan.FromSeconds(_icSsdSleepTime);
+        component.NextUpdate = _timing.CurTime + component.UpdateInterval;
+        Dirty(uid, component);
     }
 
     public override void Update(float frameTime)
@@ -76,17 +76,21 @@ public sealed class SSDIndicatorSystem : EntitySystem
         if (!_icSsdSleep)
             return;
 
+        var curTime = _timing.CurTime;
         var query = EntityQueryEnumerator<SSDIndicatorComponent>();
 
         while (query.MoveNext(out var uid, out var ssd))
         {
             // Forces the entity to sleep when the time has come
-            if (ssd.IsSSD &&
-                ssd.FallAsleepTime <= _timing.CurTime &&
-                !TerminatingOrDeleted(uid))
-            {
-                _statusEffects.TrySetStatusEffectDuration(uid, StatusEffectSSDSleeping, null);
-            }
+            if (!ssd.IsSSD
+                || ssd.NextUpdate > curTime
+                || ssd.FallAsleepTime > curTime
+                || TerminatingOrDeleted(uid))
+                continue;
+
+            _statusEffects.TryUpdateStatusEffectDuration(uid, StatusEffectSSDSleeping);
+            ssd.NextUpdate += ssd.UpdateInterval;
+            Dirty(uid, ssd);
         }
     }
 }