diff --git a/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs new file mode 100644 index 0000000000..4aed944d92 --- /dev/null +++ b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Atmos.Monitor; + +namespace Content.Client.Atmos.Monitor; + +[RegisterComponent] +public sealed class AtmosAlarmableVisualsComponent : Component +{ + [DataField("layerMap")] + public string LayerMap { get; } = string.Empty; + + [DataField("alarmStates")] + public readonly Dictionary AlarmStates = new(); + + [DataField("hideOnDepowered")] + public readonly List? HideOnDepowered; + + // eh... + [DataField("setOnDepowered")] + public readonly Dictionary? SetOnDepowered; +} diff --git a/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs new file mode 100644 index 0000000000..4927efb1ad --- /dev/null +++ b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using Content.Shared.Atmos.Monitor; +using Content.Shared.Power; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Client.Atmos.Monitor; + +public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem +{ + [Obsolete("Subscribe to AppearanceChangeEvent instead.")] + protected override void OnAppearanceChange(EntityUid uid, AtmosAlarmableVisualsComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null || !args.Sprite.LayerMapTryGet(component.LayerMap, out int layer)) + return; + + if (args.AppearanceData.TryGetValue(PowerDeviceVisuals.Powered, out var poweredObject) + && poweredObject is bool powered) + { + if (component.HideOnDepowered != null) + foreach (var visLayer in component.HideOnDepowered) + if (args.Sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer)) + args.Sprite.LayerSetVisible(powerVisibilityLayer, powered); + + if (component.SetOnDepowered != null && !powered) + foreach (var (setLayer, powerState) in component.SetOnDepowered) + if (args.Sprite.LayerMapTryGet(setLayer, out int setStateLayer)) + args.Sprite.LayerSetState(setStateLayer, new RSI.StateId(powerState)); + + if (args.AppearanceData.TryGetValue(AtmosMonitorVisuals.AlarmType, out var alarmTypeObject) + && alarmTypeObject is AtmosMonitorAlarmType alarmType + && powered + && component.AlarmStates.TryGetValue(alarmType, out var state)) + args.Sprite.LayerSetState(layer, new RSI.StateId(state)); + } + } +} diff --git a/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs b/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs deleted file mode 100644 index 1ad8504988..0000000000 --- a/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.Atmos.Monitor; -using Content.Shared.Power; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Client.Atmos.Monitor; - -public sealed class AtmosMonitorVisualizer : AppearanceVisualizer -{ - [Dependency] IEntityManager _entityManager = default!; - [DataField("layerMap")] - private string _layerMap { get; } = string.Empty; - - [DataField("alarmStates")] - private readonly Dictionary _alarmStates = new(); - - [DataField("hideOnDepowered")] - private readonly List? _hideOnDepowered; - - // eh... - [DataField("setOnDepowered")] - private readonly Dictionary? _setOnDepowered; - - [Obsolete("Subscribe to your component being initialised instead.")] - public override void InitializeEntity(EntityUid entity) - { - base.InitializeEntity(entity); - - IoCManager.InjectDependencies(this); - } - - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - if (!_entityManager.TryGetComponent(component.Owner, out var sprite)) - return; - - if (!sprite.LayerMapTryGet(_layerMap, out int layer)) - return; - - if (component.TryGetData(PowerDeviceVisuals.Powered, out var powered)) - { - if (_hideOnDepowered != null) - foreach (var visLayer in _hideOnDepowered) - if (sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer)) - sprite.LayerSetVisible(powerVisibilityLayer, powered); - - if (_setOnDepowered != null && !powered) - foreach (var (setLayer, state) in _setOnDepowered) - if (sprite.LayerMapTryGet(setLayer, out int setStateLayer)) - sprite.LayerSetState(setStateLayer, new RSI.StateId(state)); - } - - if (component.TryGetData(AtmosMonitorVisuals.Offset, out Vector2 offset)) - { - sprite.Offset = offset; - } - - if (component.TryGetData(AtmosMonitorVisuals.AlarmType, out var alarmType) - && powered) - if (_alarmStates.TryGetValue(alarmType, out var state)) - sprite.LayerSetState(layer, new RSI.StateId(state)); - } -} diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index c0c807ffb4..5789d05db2 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -22,6 +22,14 @@ - AirSensor - GasVent - GasScrubber + - type: AtmosAlarmableVisuals + layerMap: "airAlarmBase" + alarmStates: + Normal: alarm0 + Warning: alarm2 + Danger: alarm1 + setOnDepowered: + airAlarmBase: alarmp - type: Tag tags: - AirAlarm @@ -41,15 +49,6 @@ - type: AccessReader access: [["Atmospherics"]] - type: Appearance - visuals: - - type: AtmosMonitorVisualizer - layerMap: "airAlarmBase" - alarmStates: - Normal: alarm0 - Warning: alarm2 - Danger: alarm1 - setOnDepowered: - airAlarmBase: alarmp - type: WiresVisuals - type: Sprite sprite: Structures/Wallmounts/air_monitors.rsi diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml index 96d3301b6b..57c67a409c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml @@ -25,6 +25,14 @@ - GasScrubber monitorAlertTypes: - Temperature + - type: AtmosAlarmableVisuals + layerMap: "fireAlarmState" + alarmStates: + Normal: fire_off + Warning: fire_off # shouldn't be alarming at a warning + Danger: fire_on + Emagged: fire_emagged + hideOnDepowered: [ "fireAlarmState" ] - type: Tag tags: - FireAlarm @@ -34,15 +42,6 @@ - type: AccessReader access: [ [ "Atmospherics" ] ] - type: Appearance - visuals: - - type: AtmosMonitorVisualizer - layerMap: "fireAlarmState" - alarmStates: - Normal: fire_off - Warning: fire_off # shouldn't be alarming at a warning - Danger: fire_on - Emagged: fire_emagged - hideOnDepowered: ["fireAlarmState"] - type: WiresVisuals - type: AlertLevelDisplay alertVisuals: