Add slowdown stun
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Content.Server.GameObjects.Components.Movement;
|
||||||
using Content.Server.GameObjects.EntitySystems;
|
using Content.Server.GameObjects.EntitySystems;
|
||||||
using Content.Server.Interfaces.GameObjects;
|
using Content.Server.Interfaces.GameObjects;
|
||||||
using Content.Server.Mobs;
|
using Content.Server.Mobs;
|
||||||
@@ -19,7 +20,7 @@ using Timer = Robust.Shared.Timers.Timer;
|
|||||||
namespace Content.Server.GameObjects.Components.Mobs
|
namespace Content.Server.GameObjects.Components.Mobs
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public class StunnableComponent : Component, IActionBlocker, IAttackHand
|
public class StunnableComponent : Component, IActionBlocker, IAttackHand, IMoveSpeedModifier
|
||||||
{
|
{
|
||||||
[Dependency] private IEntitySystemManager _entitySystemManager;
|
[Dependency] private IEntitySystemManager _entitySystemManager;
|
||||||
[Dependency] private ITimerManager _timerManager;
|
[Dependency] private ITimerManager _timerManager;
|
||||||
@@ -28,22 +29,39 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
|
|
||||||
private float _stunCap = 20f;
|
private float _stunCap = 20f;
|
||||||
private float _knockdownCap = 20f;
|
private float _knockdownCap = 20f;
|
||||||
|
private float _slowdownCap = 20f;
|
||||||
private float _helpKnockdownRemove = 1f;
|
private float _helpKnockdownRemove = 1f;
|
||||||
private float _helpInterval = 1f;
|
private float _helpInterval = 1f;
|
||||||
|
|
||||||
private float _stunnedTimer = 0f;
|
private float _stunnedTimer = 0f;
|
||||||
private float _knockdownTimer = 0f;
|
private float _knockdownTimer = 0f;
|
||||||
|
private float _slowdownTimer = 0f;
|
||||||
|
|
||||||
|
private float _walkModifierOverride = 0f;
|
||||||
|
private float _runModifierOverride = 0f;
|
||||||
|
|
||||||
public override string Name => "Stunnable";
|
public override string Name => "Stunnable";
|
||||||
|
|
||||||
[ViewVariables] public bool Stunned => _stunnedTimer > 0f;
|
[ViewVariables] public bool Stunned => _stunnedTimer > 0f;
|
||||||
[ViewVariables] public bool KnockedDown => _knockdownTimer > 0f;
|
[ViewVariables] public bool KnockedDown => _knockdownTimer > 0f;
|
||||||
|
[ViewVariables] public bool SlowedDown => _slowdownTimer > 0f;
|
||||||
|
[ViewVariables] public float StunCap => _stunCap;
|
||||||
|
[ViewVariables] public float KnockdownCap => _knockdownCap;
|
||||||
|
[ViewVariables] public float SlowdownCap => _slowdownCap;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
Timer.Spawn(1000, () => Slowdown(20f));
|
||||||
|
}
|
||||||
|
|
||||||
public override void ExposeData(ObjectSerializer serializer)
|
public override void ExposeData(ObjectSerializer serializer)
|
||||||
{
|
{
|
||||||
base.ExposeData(serializer);
|
base.ExposeData(serializer);
|
||||||
serializer.DataField(ref _stunCap, "stunCap", 20f);
|
serializer.DataField(ref _stunCap, "stunCap", 20f);
|
||||||
serializer.DataField(ref _knockdownCap, "knockdownCap", 20f);
|
serializer.DataField(ref _knockdownCap, "knockdownCap", 20f);
|
||||||
|
serializer.DataField(ref _slowdownCap, "slowdownCap", 20f);
|
||||||
serializer.DataField(ref _helpInterval, "helpInterval", 1f);
|
serializer.DataField(ref _helpInterval, "helpInterval", 1f);
|
||||||
serializer.DataField(ref _helpKnockdownRemove, "helpKnockdownRemove", 1f);
|
serializer.DataField(ref _helpKnockdownRemove, "helpKnockdownRemove", 1f);
|
||||||
}
|
}
|
||||||
@@ -72,6 +90,19 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
Knockdown(seconds);
|
Knockdown(seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Slowdown(float seconds, float walkModifierOverride = 0f, float runModifierOverride = 0f)
|
||||||
|
{
|
||||||
|
seconds = MathF.Min(_slowdownTimer + seconds, _slowdownCap);
|
||||||
|
|
||||||
|
_walkModifierOverride = walkModifierOverride;
|
||||||
|
_runModifierOverride = runModifierOverride;
|
||||||
|
|
||||||
|
_slowdownTimer = seconds;
|
||||||
|
|
||||||
|
if(Owner.TryGetComponent(out MovementSpeedModifierComponent movement))
|
||||||
|
movement.RefreshMovementSpeedModifiers();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used when
|
/// Used when
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -99,6 +130,16 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
|
|
||||||
public void Update(float delta)
|
public void Update(float delta)
|
||||||
{
|
{
|
||||||
|
if (Stunned)
|
||||||
|
{
|
||||||
|
_stunnedTimer -= delta;
|
||||||
|
|
||||||
|
if (_stunnedTimer <= 0)
|
||||||
|
{
|
||||||
|
_stunnedTimer = 0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (KnockedDown)
|
if (KnockedDown)
|
||||||
{
|
{
|
||||||
_knockdownTimer -= delta;
|
_knockdownTimer -= delta;
|
||||||
@@ -111,13 +152,16 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Stunned)
|
if (SlowedDown)
|
||||||
{
|
{
|
||||||
_stunnedTimer -= delta;
|
_slowdownTimer -= delta;
|
||||||
|
|
||||||
if (_stunnedTimer <= 0)
|
if (_slowdownTimer <= 0f)
|
||||||
{
|
{
|
||||||
_stunnedTimer = 0f;
|
_slowdownTimer = 0f;
|
||||||
|
|
||||||
|
if(Owner.TryGetComponent(out MovementSpeedModifierComponent movement))
|
||||||
|
movement.RefreshMovementSpeedModifiers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,5 +190,8 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
public bool CanUnequip() => (!Stunned);
|
public bool CanUnequip() => (!Stunned);
|
||||||
public bool CanChangeDirection() => true;
|
public bool CanChangeDirection() => true;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public float WalkSpeedModifier => (SlowedDown ? (_walkModifierOverride <= 0f ? 0.5f : _walkModifierOverride) : 1f);
|
||||||
|
public float SprintSpeedModifier => (SlowedDown ? (_runModifierOverride <= 0f ? 0.5f : _runModifierOverride) : 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user