97 lines
3.6 KiB
C#
97 lines
3.6 KiB
C#
using System;
|
|
using Content.Shared.Movement.Components;
|
|
using Content.Shared.Sound;
|
|
using Robust.Shared.Analyzers;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.GameStates;
|
|
using Robust.Shared.Serialization;
|
|
using Robust.Shared.Serialization.Manager.Attributes;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Shared.Stunnable
|
|
{
|
|
[Friend(typeof(SharedStunSystem))]
|
|
[RegisterComponent, NetworkedComponent]
|
|
public sealed class StunnableComponent : Component, IMoveSpeedModifier
|
|
{
|
|
public sealed override string Name => "Stunnable";
|
|
|
|
public (TimeSpan Start, TimeSpan End)? StunnedTimer { get; set; }
|
|
public (TimeSpan Start, TimeSpan End)? KnockdownTimer { get; set; }
|
|
public (TimeSpan Start, TimeSpan End)? SlowdownTimer { get; set; }
|
|
|
|
[ViewVariables]
|
|
public float StunnedSeconds =>
|
|
StunnedTimer == null ? 0f : (float)(StunnedTimer.Value.End - StunnedTimer.Value.Start).TotalSeconds;
|
|
|
|
[ViewVariables]
|
|
public float KnockdownSeconds =>
|
|
KnockdownTimer == null ? 0f : (float)(KnockdownTimer.Value.End - KnockdownTimer.Value.Start).TotalSeconds;
|
|
|
|
[ViewVariables]
|
|
public float SlowdownSeconds =>
|
|
SlowdownTimer == null ? 0f : (float)(SlowdownTimer.Value.End - SlowdownTimer.Value.Start).TotalSeconds;
|
|
|
|
[ViewVariables]
|
|
public bool AnyStunActive => Stunned || KnockedDown || SlowedDown;
|
|
|
|
[ViewVariables]
|
|
public bool Stunned => StunnedTimer != null;
|
|
|
|
[ViewVariables]
|
|
public bool KnockedDown => KnockdownTimer != null;
|
|
|
|
[ViewVariables]
|
|
public bool SlowedDown => SlowdownTimer != null;
|
|
|
|
[DataField("stunCap")]
|
|
public float StunCap { get; set; } = 20f;
|
|
|
|
[DataField("knockdownCap")]
|
|
public float KnockdownCap { get; set; } = 20f;
|
|
|
|
[DataField("slowdownCap")]
|
|
public float SlowdownCap { get; set; } = 20f;
|
|
|
|
[DataField("helpInterval")]
|
|
public float HelpInterval { get; set; } = 1f;
|
|
|
|
[DataField("stunAttemptSound")]
|
|
public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg");
|
|
|
|
[ViewVariables]
|
|
public float HelpTimer { get; set; } = 0f;
|
|
|
|
[ViewVariables]
|
|
public float WalkSpeedMultiplier { get; set; } = 0f;
|
|
[ViewVariables]
|
|
public float RunSpeedMultiplier { get; set; } = 0f;
|
|
|
|
[ViewVariables]
|
|
public float WalkSpeedModifier => (SlowedDown ? (WalkSpeedMultiplier <= 0f ? 0.5f : WalkSpeedMultiplier) : 1f);
|
|
[ViewVariables]
|
|
public float SprintSpeedModifier => (SlowedDown ? (RunSpeedMultiplier <= 0f ? 0.5f : RunSpeedMultiplier) : 1f);
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class StunnableComponentState : ComponentState
|
|
{
|
|
public (TimeSpan Start, TimeSpan End)? StunnedTimer { get; }
|
|
public (TimeSpan Start, TimeSpan End)? KnockdownTimer { get; }
|
|
public (TimeSpan Start, TimeSpan End)? SlowdownTimer { get; }
|
|
public float WalkSpeedMultiplier { get; }
|
|
public float RunSpeedMultiplier { get; }
|
|
|
|
public StunnableComponentState(
|
|
(TimeSpan Start, TimeSpan End)? stunnedTimer, (TimeSpan Start, TimeSpan End)? knockdownTimer,
|
|
(TimeSpan Start, TimeSpan End)? slowdownTimer, float walkSpeedMultiplier, float runSpeedMultiplier)
|
|
{
|
|
StunnedTimer = stunnedTimer;
|
|
KnockdownTimer = knockdownTimer;
|
|
SlowdownTimer = slowdownTimer;
|
|
WalkSpeedMultiplier = walkSpeedMultiplier;
|
|
RunSpeedMultiplier = runSpeedMultiplier;
|
|
}
|
|
}
|
|
}
|