]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix helmet lights (#41599)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Thu, 27 Nov 2025 16:01:13 +0000 (17:01 +0100)
committerGitHub <noreply@github.com>
Thu, 27 Nov 2025 16:01:13 +0000 (16:01 +0000)
fix helmet lights

Content.Server/Light/EntitySystems/HandheldLightSystem.cs
Content.Shared/Power/EntitySystems/ChargerSystem.cs
Content.Shared/PowerCell/PowerCellSystem.API.cs

index a7f5801f32a41dd4b3c768a75cae9b9e7705f997..52b6614790db12202de6aed71d8d9a4c728833da 100644 (file)
@@ -108,7 +108,7 @@ namespace Content.Server.Light.EntitySystems
             // Curently every single flashlight has the same number of levels for status and that's all it uses the charge for
             // Thus we'll just check if the level changes.
 
-            if (!_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery))
+            if (!_powerCell.TryGetBatteryFromSlotOrEntity(ent.Owner, out var battery))
                 return null;
 
             var currentCharge = _battery.GetCharge(battery.Value.AsNullable());
@@ -203,7 +203,7 @@ namespace Content.Server.Light.EntitySystems
                 return false;
             }
 
-            if (!_powerCell.TryGetBatteryFromSlot(uid.Owner, out var battery))
+            if (!_powerCell.TryGetBatteryFromSlotOrEntity(uid.Owner, out var battery))
             {
                 _audio.PlayPvs(_audio.ResolveSound(component.TurnOnFailSound), uid);
                 _popup.PopupEntity(Loc.GetString("handheld-light-component-cell-missing-message"), uid, user);
@@ -230,7 +230,7 @@ namespace Content.Server.Light.EntitySystems
         public void TryUpdate(Entity<HandheldLightComponent> uid, float frameTime)
         {
             var component = uid.Comp;
-            if (!_powerCell.TryGetBatteryFromSlot(uid.Owner, out var battery))
+            if (!_powerCell.TryGetBatteryFromSlotOrEntity(uid.Owner, out var battery))
             {
                 TurnOff(uid, false);
                 return;
index 54dac611570c1470f78f8a43d9e75ab961d5eaec..d22e45bf298622cddc63392de5490e7459b6c568 100644 (file)
@@ -68,7 +68,7 @@ public sealed class ChargerSystem : EntitySystem
                 // add how much each item is charged it
                 foreach (var contained in container.ContainedEntities)
                 {
-                    if (!SearchForBattery(contained, out var battery))
+                    if (!_powerCell.TryGetBatteryFromEntityOrSlot(contained, out var battery))
                         continue;
 
                     var chargePercentage = _battery.GetCharge(battery.Value.AsNullable()) / battery.Value.Comp.MaxCharge * 100;
@@ -93,7 +93,7 @@ public sealed class ChargerSystem : EntitySystem
             return;
 
         AddComp<InsideChargerComponent>(args.Entity);
-        if (SearchForBattery(args.Entity, out var battery))
+        if (_powerCell.TryGetBatteryFromEntityOrSlot(args.Entity, out var battery))
             _battery.RefreshChargeRate(battery.Value.AsNullable());
         UpdateStatus(ent);
     }
@@ -107,7 +107,7 @@ public sealed class ChargerSystem : EntitySystem
             return;
 
         RemComp<InsideChargerComponent>(args.Entity);
-        if (SearchForBattery(args.Entity, out var battery))
+        if (_powerCell.TryGetBatteryFromEntityOrSlot(args.Entity, out var battery))
             _battery.RefreshChargeRate(battery.Value.AsNullable());
         UpdateStatus(ent);
     }
@@ -187,22 +187,6 @@ public sealed class ChargerSystem : EntitySystem
         UpdateStatus((chargerUid, chargerComp));
     }
 
-    private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
-    {
-        // try get a battery directly on the inserted entity
-        if (TryComp<PredictedBatteryComponent>(uid, out var batteryComp))
-        {
-            battery = (uid, batteryComp);
-            return true;
-        }
-        // or by checking for a power cell slot on the inserted entity
-        if (_powerCell.TryGetBatteryFromSlot(uid, out battery))
-            return true;
-
-        battery = null;
-        return false;
-    }
-
     private void RefreshAllBatteries(Entity<ChargerComponent> ent)
     {
         // try to get contents of the charger
@@ -211,7 +195,7 @@ public sealed class ChargerSystem : EntitySystem
 
         foreach (var item in container.ContainedEntities)
         {
-            if (SearchForBattery(item, out var battery))
+            if (_powerCell.TryGetBatteryFromEntityOrSlot(item, out var battery))
                 _battery.RefreshChargeRate(battery.Value.AsNullable());
         }
     }
@@ -259,7 +243,7 @@ public sealed class ChargerSystem : EntitySystem
             return CellChargerStatus.Empty;
 
         // Use the first stored battery for visuals. If someone ever makes a multi-slot charger then this will need to be changed.
-        if (!SearchForBattery(container.ContainedEntities[0], out var battery))
+        if (!_powerCell.TryGetBatteryFromEntityOrSlot(container.ContainedEntities[0], out var battery))
             return CellChargerStatus.Off;
 
         if (_battery.IsFull(battery.Value.AsNullable()))
index 98b24edcce94ee78c075ff36dfb6d6e4383b9ec0..30c5228236cf22953e53f799a45ca7750bf045c6 100644 (file)
@@ -38,6 +38,45 @@ public sealed partial class PowerCellSystem
         return true;
     }
 
+    /// <summary>
+    /// First tries to get a battery from the entity's power cell slot.
+    /// If that fails check if the entity itself is a battery with <see cref="PredictedBatteryComponent"/>.
+    /// </summary>
+    [PublicAPI]
+    public bool TryGetBatteryFromSlotOrEntity(Entity<PowerCellSlotComponent?> ent, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
+    {
+        if (TryGetBatteryFromSlot(ent, out battery))
+            return true;
+
+        if (TryComp<PredictedBatteryComponent>(ent, out var batteryComp))
+        {
+            battery = (ent.Owner, batteryComp);
+            return true;
+        }
+
+        battery = null;
+        return false;
+    }
+
+    /// <summary>
+    /// First checks if the entity itself is a battery with <see cref="PredictedBatteryComponent"/>.
+    /// If that fails it will try to get a battery from the entity's power cell slot instead.
+    /// </summary>
+    [PublicAPI]
+    public bool TryGetBatteryFromEntityOrSlot(Entity<PowerCellSlotComponent?> ent, [NotNullWhen(true)] out Entity<PredictedBatteryComponent>? battery)
+    {
+        if (TryComp<PredictedBatteryComponent>(ent, out var batteryComp))
+        {
+            battery = (ent.Owner, batteryComp);
+            return true;
+        }
+        if (TryGetBatteryFromSlot(ent, out battery))
+            return true;
+
+        battery = null;
+        return false;
+    }
+
     /// <summary>
     /// Returns whether the entity has a slotted battery and charge for the requested action.
     /// </summary>