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