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 /// [RegisterComponent, NetworkedComponent] [Access(typeof(SharedStealthSystem))] public sealed class StealthComponent : Component { /// /// Whether or not the entity previously had an interaction outline prior to cloaking. /// [DataField("hadOutline")] public bool HadOutline; /// /// Last set level of visibility. Ranges from 1 (fully visible) and -1 (fully hidden). To get the actual current /// visibility, use /// [DataField("lastVisibility")] [Access(typeof(SharedStealthSystem), Other = AccessPermissions.None)] public float LastVisibility; /// /// 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; /// /// Rate that effects how fast an entity's visibility passively changes. /// [DataField("passiveVisibilityRate")] public readonly float PassiveVisibilityRate = -0.15f; /// /// Rate for movement induced visibility changes. Scales with distance moved. /// [DataField("movementVisibilityRate")] public readonly float MovementVisibilityRate = 0.2f; } [Serializable, NetSerializable] public sealed class StealthComponentState : ComponentState { public float Visibility; public TimeSpan? LastUpdated; public StealthComponentState(float stealthLevel, TimeSpan? lastUpdated) { Visibility = stealthLevel; LastUpdated = lastUpdated; } }