diff --git a/Content.Shared/Damage/Components/ClothingSlowOnDamageModifierComponent.cs b/Content.Shared/Damage/Components/ClothingSlowOnDamageModifierComponent.cs new file mode 100644 index 0000000000..3d4bdd597c --- /dev/null +++ b/Content.Shared/Damage/Components/ClothingSlowOnDamageModifierComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Damage.Components; + +/// +/// This is used for a clothing item that modifies the slowdown from taking damage. +/// Used for entities with +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SlowOnDamageSystem))] +public sealed partial class ClothingSlowOnDamageModifierComponent : Component +{ + /// + /// A coefficient modifier for the slowdown + /// + [DataField] + public float Modifier = 1; +} diff --git a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs index 833883c144..3e50ee3557 100644 --- a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs +++ b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs @@ -1,5 +1,8 @@ +using Content.Shared.Clothing; using Content.Shared.Damage.Components; +using Content.Shared.Examine; using Content.Shared.FixedPoint; +using Content.Shared.Inventory; using Content.Shared.Movement.Systems; namespace Content.Shared.Damage @@ -14,6 +17,11 @@ namespace Content.Shared.Damage SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnRefreshMovespeed); + + SubscribeLocalEvent>(OnModifySpeed); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); } private void OnRefreshMovespeed(EntityUid uid, SlowOnDamageComponent component, RefreshMovementSpeedModifiersEvent args) @@ -36,7 +44,10 @@ namespace Content.Shared.Damage if (closest != FixedPoint2.Zero) { var speed = component.SpeedModifierThresholds[closest]; - args.ModifySpeed(speed, speed); + + var ev = new ModifySlowOnDamageSpeedEvent(speed); + RaiseLocalEvent(uid, ref ev); + args.ModifySpeed(ev.Speed, ev.Speed); } } @@ -47,5 +58,37 @@ namespace Content.Shared.Damage _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(uid); } + + private void OnModifySpeed(Entity ent, ref InventoryRelayedEvent args) + { + var dif = 1 - args.Args.Speed; + if (dif <= 0) + return; + + // reduces the slowness modifier by the given coefficient + args.Args.Speed += dif * ent.Comp.Modifier; + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + var msg = Loc.GetString("slow-on-damage-modifier-examine", ("mod", (1 - ent.Comp.Modifier) * 100)); + args.PushMarkup(msg); + } + + private void OnGotEquipped(Entity ent, ref ClothingGotEquippedEvent args) + { + _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(args.Wearer); + } + + private void OnGotUnequipped(Entity ent, ref ClothingGotUnequippedEvent args) + { + _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(args.Wearer); + } + } + + [ByRefEvent] + public record struct ModifySlowOnDamageSpeedEvent(float Speed) : IInventoryRelayEvent + { + public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET; } } diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index bca9eb6cfa..f0bb73c192 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -34,6 +34,7 @@ public partial class InventorySystem // by-ref events SubscribeLocalEvent(RefRelayInventoryEvent); SubscribeLocalEvent(RefRelayInventoryEvent); + SubscribeLocalEvent(RefRelayInventoryEvent); // Eye/vision events SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Resources/Locale/en-US/damage/stamina.ftl b/Resources/Locale/en-US/damage/stamina.ftl index 0d14a52c1e..da817824aa 100644 --- a/Resources/Locale/en-US/damage/stamina.ftl +++ b/Resources/Locale/en-US/damage/stamina.ftl @@ -1 +1,2 @@ melee-stamina = Not enough stamina +slow-on-damage-modifier-examine = Slowness from injuries is reduced by [color=yellow]{$mod}%[/color] diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml index fddb5abb58..32fd118f1c 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml @@ -20,6 +20,8 @@ sprite: Clothing/Shoes/Boots/jackboots.rsi - type: Clothing sprite: Clothing/Shoes/Boots/jackboots.rsi + - type: ClothingSlowOnDamageModifier + modifier: 0.5 - type: entity parent: ClothingShoesBaseButcherable diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 685b0c784f..868fb1f7d2 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -993,7 +993,6 @@ id: SecurityShoes name: loadout-group-security-shoes loadouts: - - CombatBoots - JackBoots - SecurityWinterBoots