using System.Threading; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Timing { /// /// Timer that creates a cooldown each time an object is activated/used /// [RegisterComponent] [NetworkedComponent] public sealed class UseDelayComponent : Component { public TimeSpan LastUseTime; public TimeSpan? DelayEndTime; [DataField("delay")] [ViewVariables(VVAccess.ReadWrite)] public TimeSpan Delay = TimeSpan.FromSeconds(1); /// /// Stores remaining delay pausing (and eventually, serialization). /// [DataField("remainingDelay")] public TimeSpan? RemainingDelay; public CancellationTokenSource? CancellationTokenSource; public bool ActiveDelay => CancellationTokenSource is { Token: { IsCancellationRequested: false } }; } [Serializable, NetSerializable] public sealed class UseDelayComponentState : ComponentState { public readonly TimeSpan LastUseTime; public readonly TimeSpan Delay; public readonly TimeSpan? DelayEndTime; public UseDelayComponentState(TimeSpan lastUseTime, TimeSpan delay, TimeSpan? delayEndTime) { LastUseTime = lastUseTime; Delay = delay; DelayEndTime = delayEndTime; } } }