Files
tbd-station-14/Content.Shared/Stunnable/StunnableComponent.cs
Vera Aguilera Puerto 6eee256b11 Refactors stunnable to be ECS. (#4819)
Also cleans up StandingStatesystem.
2021-10-10 12:47:26 +02:00

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