diff --git a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs index 9890cb8a38..5ca35b0a6e 100644 --- a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs @@ -91,7 +91,10 @@ namespace Content.Server.GameObjects.Components.Mobs /// How many seconds the mob will stay stunned public void Stun(float seconds) { - seconds = Math.Min(seconds + _stunnedTimer, _stunCap); + seconds = Math.Min(_stunnedTimer + (seconds * StunTimeModifier), _stunCap); + + if (seconds <= 0f) + return; StandingStateHelper.DropAllItemsInHands(Owner); @@ -105,7 +108,10 @@ namespace Content.Server.GameObjects.Components.Mobs /// How many seconds the mob will stay on the ground public void Knockdown(float seconds) { - seconds = MathF.Min(_knockdownTimer + seconds, _knockdownCap); + seconds = MathF.Min(_knockdownTimer + (seconds * KnockdownTimeModifier), _knockdownCap); + + if (seconds <= 0f) + return; StandingStateHelper.Down(Owner); @@ -131,7 +137,10 @@ namespace Content.Server.GameObjects.Components.Mobs /// Run speed modifier. Set to 0 or negative for default value. (0.5f) public void Slowdown(float seconds, float walkModifierOverride = 0f, float runModifierOverride = 0f) { - seconds = MathF.Min(_slowdownTimer + seconds, _slowdownCap); + seconds = MathF.Min(_slowdownTimer + (seconds * SlowdownTimeModifier), _slowdownCap); + + if (seconds <= 0f) + return; _walkModifierOverride = walkModifierOverride; _runModifierOverride = runModifierOverride; @@ -259,7 +268,65 @@ namespace Content.Server.GameObjects.Components.Mobs public bool CanChangeDirection() => true; #endregion + public float StunTimeModifier + { + get + { + var modifier = 1.0f; + var components = Owner.GetAllComponents(); + + foreach (var component in components) + { + modifier *= component.StunTimeModifier; + } + + return modifier; + } + } + + public float KnockdownTimeModifier + { + get + { + var modifier = 1.0f; + var components = Owner.GetAllComponents(); + + foreach (var component in components) + { + modifier *= component.KnockdownTimeModifier; + } + + return modifier; + } + } + + public float SlowdownTimeModifier + { + get + { + var modifier = 1.0f; + var components = Owner.GetAllComponents(); + + foreach (var component in components) + { + modifier *= component.SlowdownTimeModifier; + } + + return modifier; + } + } + public float WalkSpeedModifier => (SlowedDown ? (_walkModifierOverride <= 0f ? 0.5f : _walkModifierOverride) : 1f); public float SprintSpeedModifier => (SlowedDown ? (_runModifierOverride <= 0f ? 0.5f : _runModifierOverride) : 1f); } + + /// + /// This interface allows components to multiply the time in seconds of various stuns by a number. + /// + public interface IStunModifier + { + float StunTimeModifier => 1.0f; + float KnockdownTimeModifier => 1.0f; + float SlowdownTimeModifier => 1.0f; + } }