using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; namespace Content.Shared.Weather; [RegisterComponent, NetworkedComponent] public sealed class WeatherComponent : Component { /// /// Currently running weathers /// [ViewVariables, DataField("weather", customTypeSerializer:typeof(PrototypeIdDictionarySerializer))] public Dictionary Weather = new(); public static readonly TimeSpan StartupTime = TimeSpan.FromSeconds(15); public static readonly TimeSpan ShutdownTime = TimeSpan.FromSeconds(15); } [DataDefinition, Serializable, NetSerializable] public sealed class WeatherData { // Client audio stream. [NonSerialized] public IPlayingAudioStream? Stream; /// /// When the weather started if relevant. /// [ViewVariables, DataField("startTime", customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan StartTime = TimeSpan.Zero; /// /// When the applied weather will end. /// [ViewVariables(VVAccess.ReadWrite), DataField("endTime", customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan? EndTime; [ViewVariables] public TimeSpan Duration => EndTime == null ? TimeSpan.MaxValue : EndTime.Value - StartTime; [DataField("state")] public WeatherState State = WeatherState.Invalid; [ViewVariables, NonSerialized] public float LastAlpha; [ViewVariables, NonSerialized] public float LastOcclusion; } public enum WeatherState : byte { Invalid = 0, Starting, Running, Ending, }