using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Stealth.Components; /// /// Add this component to an entity that you want to be cloaked. /// It overlays a shader on the entity to give them an invisibility cloaked effect. /// It also turns the entity invisible. /// Use other components (like StealthOnMove) to modify this component's visibility based on certain conditions. /// [RegisterComponent, NetworkedComponent] [Access(typeof(SharedStealthSystem))] public sealed partial class StealthComponent : Component { /// /// Whether or not the stealth effect should currently be applied. /// [DataField("enabled")] public bool Enabled = true; /// /// The creature will continue invisible at death. /// [DataField("enabledOnDeath")] public bool EnabledOnDeath = true; /// /// Whether or not the entity previously had an interaction outline prior to cloaking. /// [DataField("hadOutline")] public bool HadOutline; /// /// Minimum visibility before the entity becomes unexaminable (and thus no longer appears on context menus). /// [DataField("examineThreshold")] public float ExamineThreshold = 0.5f; /// /// Last set level of visibility. The visual effect ranges from 1 (fully visible) and -1 (fully hidden). Values /// outside of this range simply act as a buffer for the visual effect (i.e., a delay before turning invisible). To /// get the actual current visibility, use /// If you don't have anything else updating the stealth, this will just stay at a constant value, which can be useful. /// [DataField("lastVisibility")] [Access(typeof(SharedStealthSystem), Other = AccessPermissions.None)] public float LastVisibility = 1; /// /// Time at which was set. Null implies the entity is currently paused and not /// accumulating any visibility change. /// [DataField("lastUpdate", customTypeSerializer:typeof(TimeOffsetSerializer))] public TimeSpan? LastUpdated; /// /// Minimum visibility. Note that the visual effect caps out at -1, but this value is allowed to be larger or smaller. /// [DataField("minVisibility")] public float MinVisibility = -1f; /// /// Maximum visibility. Note that the visual effect caps out at +1, but this value is allowed to be larger or smaller. /// [DataField("maxVisibility")] public float MaxVisibility = 1.5f; /// /// Localization string for how you'd like to describe this effect. /// [DataField("examinedDesc")] public string ExaminedDesc = "stealth-visual-effect"; } [Serializable, NetSerializable] public sealed class StealthComponentState : ComponentState { public readonly float Visibility; public readonly TimeSpan? LastUpdated; public readonly bool Enabled; public StealthComponentState(float stealthLevel, TimeSpan? lastUpdated, bool enabled) { Visibility = stealthLevel; LastUpdated = lastUpdated; Enabled = enabled; } }