Add slowdown stun

This commit is contained in:
zumorica
2020-05-13 22:35:23 +02:00
parent 4e843358bd
commit 390127924b

View File

@@ -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);
} }
} }