using Content.Shared.Atmos.Monitor; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; namespace Content.Server.Atmos.Monitor.Components { // AtmosAlarmables are entities that can be alarmed // by a linked AtmosMonitor (alarmer?) if a threshold // is passed in some way. The intended use is to // do something in case something dangerous happens, // e.g., activate firelocks in case a temperature // threshold is reached // // It goes: // // AtmosMonitor -> AtmosDeviceUpdateEvent // -> Threshold calculation // -> AtmosMonitorAlarmEvent // -> Everything linked to that monitor (targetted) /// /// A component to add to device network devices if you want them to be alarmed /// by an atmospheric alarmer. This will store every single alert received, and /// calculate the highest alert based on the alerts received. Equally, if you /// link other alarmables to this, it will store the alerts from them to /// calculate the highest network alert. /// [RegisterComponent] public sealed class AtmosAlarmableComponent : Component { [ViewVariables] public readonly Dictionary NetworkAlarmStates = new(); [ViewVariables] public AtmosMonitorAlarmType LastAlarmState = AtmosMonitorAlarmType.Normal; [ViewVariables] public bool IgnoreAlarms { get; set; } = false; [DataField("alarmSound")] public SoundSpecifier AlarmSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/alarm.ogg"); [DataField("alarmVolume")] public float AlarmVolume { get; set; } = -10; /// /// List of tags to check for when synchronizing alarms. /// [DataField("syncWith", customTypeSerializer: typeof(PrototypeIdHashSetSerializer))] public HashSet SyncWithTags { get; } = new(); /// /// If this device should receive only. If it can only /// receive, that means that attempting to sync outwards /// will result in nothing happening. /// [DataField("receiveOnly")] public bool ReceiveOnly { get; } } }