]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix shield absorbing asphyxiation damage (#25972)
authornikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
Mon, 11 Mar 2024 01:55:19 +0000 (03:55 +0200)
committerGitHub <noreply@github.com>
Mon, 11 Mar 2024 01:55:19 +0000 (12:55 +1100)
* Fix shield absorbing asphyxiation damage

Shields will no longer reduce damage on their user that they themselves
can't absorb.

* Update Content.Shared/Blocking/BlockingSystem.User.cs

---------

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Content.Shared/Blocking/BlockingSystem.User.cs

index 87f285597f80eec4f8c07b71e3c55ca29f4b4a6c..2cd1db7f1fe13d6fc298d7a85664abfcacba1504 100644 (file)
@@ -47,13 +47,23 @@ public sealed partial class BlockingSystem
             if (args.Damage.GetTotal() <= 0)
                 return;
 
+            // A shield should only block damage it can itself absorb. To determine that we need the Damageable component on it.
+            if (!TryComp<DamageableComponent>(component.BlockingItem, out var dmgComp))
+                return;
+
             var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction;
             blockFraction = Math.Clamp(blockFraction, 0, 1);
             _damageable.TryChangeDamage(component.BlockingItem, blockFraction * args.OriginalDamage);
 
-            args.Damage *= (1 - blockFraction);
+            var modify = new DamageModifierSet();
+            foreach (var key in dmgComp.Damage.DamageDict.Keys)
+            {
+                modify.Coefficients.TryAdd(key, 1 - blockFraction);
+            }
+
+            args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, modify);
 
-            if (blocking.IsBlocking)
+            if (blocking.IsBlocking && !args.Damage.Equals(args.OriginalDamage))
             {
                 _audio.PlayPvs(blocking.BlockSound, uid);
             }