using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.StatusEffect { [RegisterComponent] [NetworkedComponent] [Access(typeof(StatusEffectsSystem))] public sealed class StatusEffectsComponent : Component { [ViewVariables] public Dictionary ActiveEffects = new(); /// /// A list of status effect IDs to be allowed /// [DataField("allowed", required: true), Access(typeof(StatusEffectsSystem), Other = AccessPermissions.ReadExecute)] public List AllowedEffects = default!; } [RegisterComponent] public sealed class ActiveStatusEffectsComponent : Component {} /// /// Holds information about an active status effect. /// [Serializable, NetSerializable] public sealed class StatusEffectState { /// /// The start and end times of the status effect. /// [ViewVariables] public (TimeSpan, TimeSpan) Cooldown; /// /// Specifies whether to refresh or accumulate the cooldown of the status effect. /// true - refresh time, false - accumulate time. /// [ViewVariables] public bool CooldownRefresh = true; /// /// The name of the relevant component that /// was added alongside the effect, if any. /// [ViewVariables] public string? RelevantComponent; public StatusEffectState((TimeSpan, TimeSpan) cooldown, bool refresh, string? relevantComponent=null) { Cooldown = cooldown; CooldownRefresh = refresh; RelevantComponent = relevantComponent; } public StatusEffectState(StatusEffectState toCopy) { Cooldown = (toCopy.Cooldown.Item1, toCopy.Cooldown.Item2); CooldownRefresh = toCopy.CooldownRefresh; RelevantComponent = toCopy.RelevantComponent; } } [Serializable, NetSerializable] public sealed class StatusEffectsComponentState : ComponentState { public Dictionary ActiveEffects; public List AllowedEffects; public StatusEffectsComponentState(Dictionary activeEffects, List allowedEffects) { ActiveEffects = activeEffects; AllowedEffects = allowedEffects; } } }