]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Remove stamina + damageable .Owner (#14602)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 12 Mar 2023 13:19:05 +0000 (00:19 +1100)
committerGitHub <noreply@github.com>
Sun, 12 Mar 2023 13:19:05 +0000 (09:19 -0400)
* Remove stamina + damageable .Owner

* More

12 files changed:
Content.IntegrationTests/Tests/Damageable/DamageableTest.cs
Content.IntegrationTests/Tests/Destructible/DestructibleDamageGroupTest.cs
Content.IntegrationTests/Tests/Destructible/DestructibleThresholdActivationTest.cs
Content.IntegrationTests/Tests/SaveLoadMapTest.cs
Content.Server/Damage/Systems/GodmodeSystem.cs
Content.Server/Polymorph/Systems/PolymorphSystem.cs
Content.Server/Repairable/RepairableSystem.cs
Content.Server/Salvage/SalvageMobRestrictionsSystem.cs
Content.Server/Zombies/ZombifyOnDeathSystem.cs
Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs
Content.Shared/Damage/Systems/DamageableSystem.cs
Content.Shared/Damage/Systems/StaminaSystem.cs

index e7f11d4034bcb08332a58c0601acc0407307acf6..35d8afe45888efb6a8446ffb2aff9ec32abdd1b0 100644 (file)
@@ -193,9 +193,9 @@ namespace Content.IntegrationTests.Tests.Damageable
                 Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
 
                 // Test SetAll function
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 10);
+                sDamageableSystem.SetAllDamage(sDamageableEntity, sDamageableComponent, 10);
                 Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(FixedPoint2.New(10 * sDamageableComponent.Damage.DamageDict.Count())));
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDamageableEntity, sDamageableComponent, 0);
                 Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
 
                 // Test 'wasted' healing
index ff157aff8932aeb7b6ed4b266c744407ab23b3a6..aa54ad5a38941681a111a85ffcf05bb58ea9eff2 100644 (file)
@@ -39,7 +39,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 var coordinates = testMap.GridCoords;
 
                 sDestructibleEntity = sEntityManager.SpawnEntity(DestructibleDamageGroupEntityId, coordinates);
-                sDamageableComponent = IoCManager.Resolve<IEntityManager>().GetComponent<DamageableComponent>(sDestructibleEntity);
+                sDamageableComponent = sEntityManager.GetComponent<DamageableComponent>(sDestructibleEntity);
 
                 sTestThresholdListenerSystem = sEntitySystemManager.GetEntitySystem<TestDestructibleListenerSystem>();
                 sTestThresholdListenerSystem.ThresholdsReached.Clear();
@@ -125,7 +125,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 sTestThresholdListenerSystem.ThresholdsReached.Clear();
 
                 // Heal both classes of damage to 0
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
 
                 // No new thresholds reached, healing should not trigger it
                 Assert.IsEmpty(sTestThresholdListenerSystem.ThresholdsReached);
@@ -163,7 +163,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 threshold.TriggersOnce = true;
 
                 // Heal brute and burn back to 0
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
 
                 // No new thresholds reached from healing
                 Assert.IsEmpty(sTestThresholdListenerSystem.ThresholdsReached);
index a72d6e7e72a48de5f1948e415644748a963f40a3..863a0df31c5724cd6cb6c3dc475b29b626554cc7 100644 (file)
@@ -30,6 +30,7 @@ namespace Content.IntegrationTests.Tests.Destructible
             var sEntityManager = server.ResolveDependency<IEntityManager>();
             var sPrototypeManager = server.ResolveDependency<IPrototypeManager>();
             var sEntitySystemManager = server.ResolveDependency<IEntitySystemManager>();
+            var audio = sEntitySystemManager.GetEntitySystem<SharedAudioSystem>();
 
             var testMap = await PoolManager.CreateTestMap(pairTracker);
 
@@ -44,8 +45,8 @@ namespace Content.IntegrationTests.Tests.Destructible
                 var coordinates = testMap.GridCoords;
 
                 sDestructibleEntity = sEntityManager.SpawnEntity(DestructibleEntityId, coordinates);
-                sDamageableComponent = IoCManager.Resolve<IEntityManager>().GetComponent<DamageableComponent>(sDestructibleEntity);
-                sDestructibleComponent = IoCManager.Resolve<IEntityManager>().GetComponent<DestructibleComponent>(sDestructibleEntity);
+                sDamageableComponent = sEntityManager.GetComponent<DamageableComponent>(sDestructibleEntity);
+                sDestructibleComponent = sEntityManager.GetComponent<DestructibleComponent>(sDestructibleEntity);
 
                 sTestThresholdListenerSystem = sEntitySystemManager.GetEntitySystem<TestDestructibleListenerSystem>();
                 sTestThresholdListenerSystem.ThresholdsReached.Clear();
@@ -102,9 +103,9 @@ namespace Content.IntegrationTests.Tests.Destructible
                 var actsThreshold = (DoActsBehavior) threshold.Behaviors[2];
 
                 Assert.That(actsThreshold.Acts, Is.EqualTo(ThresholdActs.Breakage));
-                Assert.That(soundThreshold.Sound.GetSound(), Is.EqualTo("/Audio/Effects/woodhit.ogg"));
+                Assert.That(audio.GetSound(soundThreshold.Sound), Is.EqualTo("/Audio/Effects/woodhit.ogg"));
                 Assert.That(spawnThreshold.Spawn, Is.Not.Null);
-                Assert.That(spawnThreshold.Spawn.Count, Is.EqualTo(1));
+                Assert.That(spawnThreshold.Spawn, Has.Count.EqualTo(1));
                 Assert.That(spawnThreshold.Spawn.Single().Key, Is.EqualTo(SpawnedEntityId));
                 Assert.That(spawnThreshold.Spawn.Single().Value.Min, Is.EqualTo(1));
                 Assert.That(spawnThreshold.Spawn.Single().Value.Max, Is.EqualTo(1));
@@ -120,7 +121,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 Assert.IsEmpty(sTestThresholdListenerSystem.ThresholdsReached);
 
                 // Set damage to 0
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
 
                 // Damage for 100, up to 100
                 sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage*10, true);
@@ -166,7 +167,7 @@ namespace Content.IntegrationTests.Tests.Destructible
 
                 // Check that it matches the YAML prototype
                 Assert.That(actsThreshold.Acts, Is.EqualTo(ThresholdActs.Breakage));
-                Assert.That(soundThreshold.Sound.GetSound(), Is.EqualTo("/Audio/Effects/woodhit.ogg"));
+                Assert.That(audio.GetSound(soundThreshold.Sound), Is.EqualTo("/Audio/Effects/woodhit.ogg"));
                 Assert.That(spawnThreshold.Spawn, Is.Not.Null);
                 Assert.That(spawnThreshold.Spawn.Count, Is.EqualTo(1));
                 Assert.That(spawnThreshold.Spawn.Single().Key, Is.EqualTo(SpawnedEntityId));
@@ -179,7 +180,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 sTestThresholdListenerSystem.ThresholdsReached.Clear();
 
                 // Heal all damage
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
 
                 // Damage up to 50
                 sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage*5, true);
@@ -219,7 +220,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 Assert.That(actsThreshold.Acts, Is.EqualTo(ThresholdActs.Breakage));
                 Assert.That(soundThreshold.Sound.GetSound(), Is.EqualTo("/Audio/Effects/woodhit.ogg"));
                 Assert.That(spawnThreshold.Spawn, Is.Not.Null);
-                Assert.That(spawnThreshold.Spawn.Count, Is.EqualTo(1));
+                Assert.That(spawnThreshold.Spawn, Has.Count.EqualTo(1));
                 Assert.That(spawnThreshold.Spawn.Single().Key, Is.EqualTo(SpawnedEntityId));
                 Assert.That(spawnThreshold.Spawn.Single().Value.Min, Is.EqualTo(1));
                 Assert.That(spawnThreshold.Spawn.Single().Value.Max, Is.EqualTo(1));
@@ -230,7 +231,7 @@ namespace Content.IntegrationTests.Tests.Destructible
                 sTestThresholdListenerSystem.ThresholdsReached.Clear();
 
                 // Heal the entity completely
-                sDamageableSystem.SetAllDamage(sDamageableComponent, 0);
+                sDamageableSystem.SetAllDamage(sDestructibleEntity, sDamageableComponent, 0);
 
                 // Check that the entity has 0 damage
                 Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
index 90beefcd532f8458dafc54ee6c56a5fa482a06a8..caf8e672cd3183d1c21a3c4ac6bf5a48b7b48d5e 100644 (file)
@@ -24,6 +24,7 @@ namespace Content.IntegrationTests.Tests
             var mapManager = server.ResolveDependency<IMapManager>();
             var sEntities = server.ResolveDependency<IEntityManager>();
             var mapLoader = sEntities.System<MapLoaderSystem>();
+            var xformSystem = sEntities.EntitySysManager.GetEntitySystem<SharedTransformSystem>();
             var resManager = server.ResolveDependency<IResourceManager>();
 
             await server.WaitPost(() =>
@@ -36,13 +37,13 @@ namespace Content.IntegrationTests.Tests
                 {
                     var mapGrid = mapManager.CreateGrid(mapId);
                     var mapGridEnt = mapGrid.Owner;
-                    sEntities.GetComponent<TransformComponent>(mapGridEnt).WorldPosition = new Vector2(10, 10);
+                    xformSystem.SetWorldPosition(mapGridEnt, new Vector2(10, 10));
                     mapGrid.SetTile(new Vector2i(0,0), new Tile(1, (TileRenderFlag)1, 255));
                 }
                 {
                     var mapGrid = mapManager.CreateGrid(mapId);
                     var mapGridEnt = mapGrid.Owner;
-                    sEntities.GetComponent<TransformComponent>(mapGridEnt).WorldPosition = new Vector2(-8, -8);
+                    xformSystem.SetWorldPosition(mapGridEnt, new Vector2(-8, -8));
                     mapGrid.SetTile(new Vector2i(0, 0), new Tile(2, (TileRenderFlag)1, 254));
                 }
 
@@ -67,7 +68,7 @@ namespace Content.IntegrationTests.Tests
                         return;
                     }
 
-                    Assert.That(gridXform.WorldPosition, Is.EqualTo(new Vector2(10, 10)));
+                    Assert.That(xformSystem.GetWorldPosition(gridXform), Is.EqualTo(new Vector2(10, 10)));
 
                     Assert.That(mapGrid.GetTileRef(new Vector2i(0, 0)).Tile, Is.EqualTo(new Tile(1, (TileRenderFlag)1, 255)));
                 }
@@ -79,7 +80,7 @@ namespace Content.IntegrationTests.Tests
                         return;
                     }
 
-                    Assert.That(gridXform.WorldPosition, Is.EqualTo(new Vector2(-8, -8)));
+                    Assert.That(xformSystem.GetWorldPosition(gridXform), Is.EqualTo(new Vector2(-8, -8)));
                     Assert.That(mapGrid.GetTileRef(new Vector2i(0, 0)).Tile, Is.EqualTo(new Tile(2, (TileRenderFlag)1, 254)));
                 }
             });
index aa0ff234e23bd461b254ec74062aa03b352e3773..38b06cad0bae2b8edb5433aed582e48d39879cf1 100644 (file)
@@ -39,7 +39,7 @@ namespace Content.Server.Damage.Systems
 
             if (EntityManager.TryGetComponent(entity, out DamageableComponent? damageable))
             {
-                _damageableSystem.SetDamage(damageable, new DamageSpecifier());
+                _damageableSystem.SetDamage(entity, damageable, new DamageSpecifier());
             }
 
             return true;
@@ -66,7 +66,7 @@ namespace Content.Server.Damage.Systems
             {
                 if (old.Damage != null)
                 {
-                    _damageableSystem.SetDamage(damageable, old.Damage);
+                    _damageableSystem.SetDamage(entity, damageable, old.Damage);
                 }
             }
 
index bc91d2ed1b6ef13b653663d888051d2f2e1c3b09..c08a92be1739d2c2248e8cafbf3386ab1a4704fe 100644 (file)
@@ -155,7 +155,7 @@ namespace Content.Server.Polymorph.Systems
                 _mobThreshold.GetScaledDamage(uid, child, out var damage) &&
                 damage != null)
             {
-                _damageable.SetDamage(damageParent, damage);
+                _damageable.SetDamage(child, damageParent, damage);
             }
 
             if (proto.Inventory == PolymorphInventoryChange.Transfer)
@@ -244,7 +244,7 @@ namespace Content.Server.Polymorph.Systems
                 _mobThreshold.GetScaledDamage(uid, parent, out var damage) &&
                 damage != null)
             {
-                _damageable.SetDamage(damageParent, damage);
+                _damageable.SetDamage(parent, damageParent, damage);
             }
 
             if (proto.Inventory == PolymorphInventoryChange.Transfer)
index d9d53686d3c6d64aff5799d8e4d278e9dc6dd287..bf7593185d21423d117745690f6b1e4dcb0ead2e 100644 (file)
@@ -34,7 +34,7 @@ namespace Content.Server.Repairable
             else
             {
                 // Repair all damage
-                _damageableSystem.SetAllDamage(damageable, 0);
+                _damageableSystem.SetAllDamage(uid, damageable, 0);
                 _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} back to full health");
             }
 
index c176d9684a829ab0b618fe302174298d1347e462..d326c36f299a4eddf2a4696c52b37de7dcf57d61 100644 (file)
@@ -62,7 +62,7 @@ public sealed class SalvageMobRestrictionsSystem : EntitySystem
             }
             else if (damageQuery.TryGetComponent(target, out var damageableComponent))
             {
-                _damageableSystem.SetAllDamage(damageableComponent, 200);
+                _damageableSystem.SetAllDamage(target, damageableComponent, 200);
             }
         }
     }
index 49b95f422befb9f51a2e891de0505a8f74f03aef..9202e7fcefe7cce939aa351c6c29c7bd8dc008cc 100644 (file)
@@ -165,7 +165,7 @@ namespace Content.Server.Zombies
 
             //Heals the zombie from all the damage it took while human
             if (TryComp<DamageableComponent>(target, out var damageablecomp))
-                _damageable.SetAllDamage(damageablecomp, 0);
+                _damageable.SetAllDamage(target, damageablecomp, 0);
 
             //gives it the funny "Zombie ___" name.
             var meta = MetaData(target);
index 39fe65c07bf58d61ff8aea1afaf6a90f8ffd4fc3..c5ed0ddb6021dc5da799247c3fd8e30e2d33c862 100644 (file)
@@ -12,7 +12,7 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs
     /// <summary>
     /// List of hit stamina components.
     /// </summary>
-    public List<StaminaComponent> HitList;
+    public List<(EntityUid Entity, StaminaComponent Component)> HitList;
 
     /// <summary>
     /// The multiplier. Generally, try to use *= or /= instead of overwriting.
@@ -24,7 +24,7 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs
     /// </summary>
     public float FlatModifier = 0;
 
-    public StaminaMeleeHitEvent(List<StaminaComponent> hitList)
+    public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList)
     {
         HitList = hitList;
     }
index 7b4b0b2d2d9cf369bc0e99ced13d6400eef70947..9e7f9cb09f77adc8c4cc4dfa97ee05ca3e20ad59 100644 (file)
@@ -99,10 +99,10 @@ namespace Content.Shared.Damage
         ///     Useful for some unfriendly folk. Also ensures that cached values are updated and that a damage changed
         ///     event is raised.
         /// </remarks>
-        public void SetDamage(DamageableComponent damageable, DamageSpecifier damage)
+        public void SetDamage(EntityUid uid, DamageableComponent damageable, DamageSpecifier damage)
         {
             damageable.Damage = damage;
-            DamageChanged(damageable);
+            DamageChanged(uid, damageable);
         }
 
         /// <summary>
@@ -112,19 +112,19 @@ namespace Content.Shared.Damage
         ///     This updates cached damage information, flags the component as dirty, and raises a damage changed event.
         ///     The damage changed event is used by other systems, such as damage thresholds.
         /// </remarks>
-        public void DamageChanged(DamageableComponent component, DamageSpecifier? damageDelta = null,
+        public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSpecifier? damageDelta = null,
             bool interruptsDoAfters = true, EntityUid? origin = null)
         {
             component.DamagePerGroup = component.Damage.GetDamagePerGroup(_prototypeManager);
             component.TotalDamage = component.Damage.Total;
             Dirty(component);
 
-            if (EntityManager.TryGetComponent<AppearanceComponent>(component.Owner, out var appearance) && damageDelta != null)
+            if (EntityManager.TryGetComponent<AppearanceComponent>(uid, out var appearance) && damageDelta != null)
             {
                 var data = new DamageVisualizerGroupData(damageDelta.GetDamagePerGroup(_prototypeManager).Keys.ToList());
-                _appearance.SetData(component.Owner, DamageVisualizerKeys.DamageUpdateGroups, data, appearance);
+                _appearance.SetData(uid, DamageVisualizerKeys.DamageUpdateGroups, data, appearance);
             }
-            RaiseLocalEvent(component.Owner, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin));
+            RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin));
         }
 
         /// <summary>
@@ -169,7 +169,7 @@ namespace Content.Shared.Damage
                 }
 
                 var ev = new DamageModifyEvent(damage);
-                RaiseLocalEvent(uid.Value, ev, false);
+                RaiseLocalEvent(uid.Value, ev);
                 damage = ev.Damage;
 
                 if (damage.Empty)
@@ -189,7 +189,7 @@ namespace Content.Shared.Damage
 
             if (!delta.Empty)
             {
-                DamageChanged(damageable, delta, interruptsDoAfters, origin);
+                DamageChanged(uid.Value, damageable, delta, interruptsDoAfters, origin);
             }
 
             return delta;
@@ -201,7 +201,7 @@ namespace Content.Shared.Damage
         /// <remakrs>
         ///     Does nothing If the given damage value is negative.
         /// </remakrs>
-        public void SetAllDamage(DamageableComponent component, FixedPoint2 newValue)
+        public void SetAllDamage(EntityUid uid, DamageableComponent component, FixedPoint2 newValue)
         {
             if (newValue < 0)
             {
@@ -216,7 +216,7 @@ namespace Content.Shared.Damage
 
             // Setting damage does not count as 'dealing' damage, even if it is set to a larger value, so we pass an
             // empty damage delta.
-            DamageChanged(component, new DamageSpecifier());
+            DamageChanged(uid, component, new DamageSpecifier());
         }
 
         public void SetDamageModifierSetId(EntityUid uid, string damageModifierSetId, DamageableComponent? comp = null)
@@ -258,7 +258,7 @@ namespace Content.Shared.Damage
 
         private void OnRejuvenate(EntityUid uid, DamageableComponent component, RejuvenateEvent args)
         {
-            SetAllDamage(component, 0);
+            SetAllDamage(uid, component, 0);
         }
 
         private void DamageableHandleState(EntityUid uid, DamageableComponent component, ref ComponentHandleState args)
@@ -278,7 +278,7 @@ namespace Content.Shared.Damage
             if (!delta.Empty)
             {
                 component.Damage = newDamage;
-                DamageChanged(component, delta);
+                DamageChanged(uid, component, delta);
             }
         }
     }
index e4a89aac931c66f0005425ee1ec799ef51c2e95b..561f94545854adcc917ba63f9df86abfe29c1bf3 100644 (file)
@@ -6,7 +6,6 @@ using Content.Shared.Damage.Components;
 using Content.Shared.Damage.Events;
 using Content.Shared.Database;
 using Content.Shared.IdentityManagement;
-using Content.Shared.Interaction;
 using Content.Shared.Popups;
 using Content.Shared.Rounding;
 using Content.Shared.Stunnable;
@@ -24,12 +23,12 @@ namespace Content.Shared.Damage.Systems;
 public sealed class StaminaSystem : EntitySystem
 {
     [Dependency] private readonly IGameTiming _timing = default!;
+    [Dependency] private readonly IRobustRandom _random = default!;
+    [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
     [Dependency] private readonly AlertsSystem _alerts = default!;
     [Dependency] private readonly MetaDataSystem _metadata = default!;
     [Dependency] private readonly SharedPopupSystem _popup = default!;
     [Dependency] private readonly SharedStunSystem _stunSystem = default!;
-    [Dependency] private readonly IRobustRandom _random = default!;
-    [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
 
     private const string CollideFixture = "projectile";
 
@@ -150,21 +149,24 @@ public sealed class StaminaSystem : EntitySystem
         var ev = new StaminaDamageOnHitAttemptEvent();
         RaiseLocalEvent(uid, ref ev);
 
-        if (ev.Cancelled) return;
+        if (ev.Cancelled)
+            return;
 
         args.HitSoundOverride = ev.HitSoundOverride;
         var stamQuery = GetEntityQuery<StaminaComponent>();
-        var toHit = new List<StaminaComponent>();
+        var toHit = new List<(EntityUid Entity, StaminaComponent Component)>();
 
         // Split stamina damage between all eligible targets.
         foreach (var ent in args.HitEntities)
         {
-            if (!stamQuery.TryGetComponent(ent, out var stam)) continue;
-            toHit.Add(stam);
+            if (!stamQuery.TryGetComponent(ent, out var stam))
+                continue;
+
+            toHit.Add((ent, stam));
         }
 
         var hitEvent = new StaminaMeleeHitEvent(toHit);
-        RaiseLocalEvent(uid, hitEvent, false);
+        RaiseLocalEvent(uid, hitEvent);
 
         if (hitEvent.Handled)
             return;
@@ -175,13 +177,13 @@ public sealed class StaminaSystem : EntitySystem
 
         damage += hitEvent.FlatModifier;
 
-        foreach (var comp in toHit)
+        foreach (var (ent, comp) in toHit)
         {
             var oldDamage = comp.StaminaDamage;
-            TakeStaminaDamage(comp.Owner, damage / toHit.Count, comp, source:args.User, with:component.Owner);
+            TakeStaminaDamage(ent, damage / toHit.Count, comp, source:args.User, with:ent);
             if (comp.StaminaDamage.Equals(oldDamage))
             {
-                _popup.PopupEntity(Loc.GetString("stamina-resist"), comp.Owner, args.User);
+                _popup.PopupEntity(Loc.GetString("stamina-resist"), ent, args.User);
             }
         }
     }
@@ -267,19 +269,20 @@ public sealed class StaminaSystem : EntitySystem
     {
         base.Update(frameTime);
 
-        if (!_timing.IsFirstTimePredicted) return;
+        if (!_timing.IsFirstTimePredicted)
+            return;
 
-        var metaQuery = GetEntityQuery<MetaDataComponent>();
         var stamQuery = GetEntityQuery<StaminaComponent>();
+        var query = EntityQueryEnumerator<ActiveStaminaComponent>();
         var curTime = _timing.CurTime;
 
-        foreach (var active in EntityQuery<ActiveStaminaComponent>())
+        while (query.MoveNext(out var uid, out _))
         {
             // Just in case we have active but not stamina we'll check and account for it.
-            if (!stamQuery.TryGetComponent(active.Owner, out var comp) ||
+            if (!stamQuery.TryGetComponent(uid, out var comp) ||
                 comp.StaminaDamage <= 0f && !comp.Critical)
             {
-                RemComp<ActiveStaminaComponent>(active.Owner);
+                RemComp<ActiveStaminaComponent>(uid);
                 continue;
             }
 
@@ -292,12 +295,12 @@ public sealed class StaminaSystem : EntitySystem
             // We were in crit so come out of it and continue.
             if (comp.Critical)
             {
-                ExitStamCrit(active.Owner, comp);
+                ExitStamCrit(uid, comp);
                 continue;
             }
 
             comp.NextUpdate += TimeSpan.FromSeconds(1f);
-            TakeStaminaDamage(comp.Owner, -comp.Decay, comp);
+            TakeStaminaDamage(uid, -comp.Decay, comp);
             Dirty(comp);
         }
     }
@@ -305,7 +308,10 @@ public sealed class StaminaSystem : EntitySystem
     private void EnterStamCrit(EntityUid uid, StaminaComponent? component = null)
     {
         if (!Resolve(uid, ref component) ||
-            component.Critical) return;
+            component.Critical)
+        {
+            return;
+        }
 
         // To make the difference between a stun and a stamcrit clear
         // TODO: Mask?
@@ -326,7 +332,10 @@ public sealed class StaminaSystem : EntitySystem
     private void ExitStamCrit(EntityUid uid, StaminaComponent? component = null)
     {
         if (!Resolve(uid, ref component) ||
-            !component.Critical) return;
+            !component.Critical)
+        {
+            return;
+        }
 
         component.Critical = false;
         component.StaminaDamage = 0f;