From e02714787c3c8c9f580edeec29294826eb421d44 Mon Sep 17 00:00:00 2001 From: Aviu00 Date: Tue, 5 Mar 2024 08:47:31 +0300 Subject: [PATCH] - add: Rubber bullet stamina damage resist. --- .../StaminaDamageOnCollideComponent.cs | 3 ++ .../Damage/Systems/StaminaSystem.cs | 14 +++++++- .../Inventory/InventorySystem.Relay.cs | 2 ++ .../StaminaProtectionSystem.cs | 32 +++++++++++++++++++ .../Guns/Ammunition/Projectiles/grenade.yml | 3 +- .../Guns/Ammunition/Projectiles/magnum.yml | 1 + .../Guns/Ammunition/Projectiles/shotgun.yml | 3 +- .../Weapons/Guns/Projectiles/projectiles.yml | 1 + 8 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs diff --git a/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs b/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs index 5ed2bb628e..496614fbda 100644 --- a/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs +++ b/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs @@ -11,6 +11,9 @@ public sealed partial class StaminaDamageOnCollideComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("damage")] public float Damage = 55f; + [ViewVariables(VVAccess.ReadWrite), DataField] + public bool IgnoreResistances = true; + [DataField("sound")] public SoundSpecifier? Sound; } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 52eef1183a..0b1e9f083c 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Shared._White.StaminaProtection; using Content.Shared.Administration.Logs; using Content.Shared.Alert; using Content.Shared.CombatMode; @@ -204,7 +205,18 @@ public sealed partial class StaminaSystem : EntitySystem if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + // WD EDIT START + var damage = component.Damage; + + if (!component.IgnoreResistances) + { + var modifyEv = new StaminaDamageModifyEvent {Damage = damage}; + RaiseLocalEvent(target, modifyEv); + damage = modifyEv.Damage; + } + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); + // WD EDIT END } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index 89cb3c61a6..bb5413bfb2 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,3 +1,4 @@ +using Content.Shared._White.StaminaProtection; using Content.Shared.Chemistry; using Content.Shared.Damage; using Content.Shared.Electrocution; @@ -27,6 +28,7 @@ public partial class InventorySystem SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); // WD + SubscribeLocalEvent(RelayInventoryEvent); // WD SubscribeLocalEvent(RelayInventoryEvent); // by-ref events diff --git a/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs new file mode 100644 index 0000000000..934ebce818 --- /dev/null +++ b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs @@ -0,0 +1,32 @@ +using Content.Shared.Armor; +using Content.Shared.Inventory; + +namespace Content.Shared._White.StaminaProtection; + +public sealed class StaminaProtectionSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnDamageModify); + } + + private void OnDamageModify(Entity ent, ref InventoryRelayedEvent args) + { + var modifiers = ent.Comp.Modifiers; + + if (modifiers.FlatReduction.TryGetValue("Blunt", out var flat)) + args.Args.Damage = MathF.Max(0f, args.Args.Damage - flat); + + if (modifiers.Coefficients.TryGetValue("Blunt", out var coefficient)) + args.Args.Damage *= coefficient; + } +} + +public sealed class StaminaDamageModifyEvent : EntityEventArgs, IInventoryRelayEvent +{ + public SlotFlags TargetSlots => ~SlotFlags.POCKET; + + public float Damage; +} diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml index ec62121c6b..133eadb047 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml @@ -15,7 +15,8 @@ - type: CanPenetrate penetrationLayer: MobLayer - type: StaminaDamageOnCollide - damage: 55 + ignoreResistances: false + damage: 70 - type: TimedDespawn lifetime: 0.25 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml index ddb4b52396..8ed25153e2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml @@ -31,6 +31,7 @@ types: Blunt: 3 - type: StaminaDamageOnCollide + ignoreResistances: false damage: 35 # 3 hits to stun cuz revolver - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 7720dd58da..fb4d422a0d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -26,7 +26,8 @@ types: Blunt: 10 - type: StaminaDamageOnCollide - damage: 40 # 3 hits to stun + ignoreResistances: false + damage: 70 - type: entity id: PelletShotgun diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 8eb5fb26bf..ca3d638c65 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -121,6 +121,7 @@ soundHit: path: /Audio/Weapons/Guns/Hits/snap.ogg - type: StaminaDamageOnCollide + ignoreResistances: false damage: 22 # 5 hits to stun sounds reasonable - type: entity