diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs
index ea9772b0439..e1824e98a16 100644
--- a/Content.Shared/Movement/Systems/SharedMoverController.cs
+++ b/Content.Shared/Movement/Systems/SharedMoverController.cs
@@ -427,6 +427,13 @@ private bool TryGetSound(
var coordinates = xform.Coordinates;
var distanceNeeded = mover.Sprinting ? StepSoundMoveDistanceRunning : StepSoundMoveDistanceWalking;
+ if (_entities.TryGetComponent(uid, out FootstepVolumeModifierComponent? volumeModifier))
+ {
+ distanceNeeded *= mover.Sprinting
+ ? volumeModifier.SprintDistanceMultiplier
+ : volumeModifier.WalkDistanceMultiplier;
+ }
+
// Handle footsteps.
if (!weightless)
{
diff --git a/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs
index 3756ba4296f..8e0b33529ad 100644
--- a/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs
+++ b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs
@@ -19,4 +19,16 @@ public sealed partial class FootstepVolumeModifierComponent : Component
///
[DataField, AutoNetworkedField]
public float WalkingModifier { get; set; } = 0f;
+
+ ///
+ /// What to multiply the distance needed to hear sprinting by.
+ ///
+ [DataField, AutoNetworkedField]
+ public float SprintDistanceMultiplier { get; set; } = 1f;
+
+ ///
+ /// What to multiply the distance needed to hear walking by.
+ ///
+ [DataField, AutoNetworkedField]
+ public float WalkDistanceMultiplier { get; set; } = 1f;
}
diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml
index fa0228ceb4a..92aa664078c 100644
--- a/Resources/Prototypes/Traits/skills.yml
+++ b/Resources/Prototypes/Traits/skills.yml
@@ -40,3 +40,5 @@
- type: FootstepVolumeModifier
sprintingModifier: -10
walkingModifier: -10
+ sprintDistanceMultiplier: 0.85
+ walkDistanceMultiplier: 0.85