atmos alarmable visuals

This commit is contained in:
vulppine
2022-08-23 15:00:52 -07:00
parent dd01189a6e
commit 9dedb29bce
5 changed files with 77 additions and 87 deletions

View File

@@ -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<AtmosMonitorAlarmType, string> AlarmStates = new();
[DataField("hideOnDepowered")]
public readonly List<string>? HideOnDepowered;
// eh...
[DataField("setOnDepowered")]
public readonly Dictionary<string, string>? SetOnDepowered;
}

View File

@@ -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<AtmosAlarmableVisualsComponent>
{
[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));
}
}
}

View File

@@ -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<AtmosMonitorAlarmType, string> _alarmStates = new();
[DataField("hideOnDepowered")]
private readonly List<string>? _hideOnDepowered;
// eh...
[DataField("setOnDepowered")]
private readonly Dictionary<string, string>? _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<SpriteComponent>(component.Owner, out var sprite))
return;
if (!sprite.LayerMapTryGet(_layerMap, out int layer))
return;
if (component.TryGetData<bool>(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<Vector2>(AtmosMonitorVisuals.Offset, out Vector2 offset))
{
sprite.Offset = offset;
}
if (component.TryGetData<AtmosMonitorAlarmType>(AtmosMonitorVisuals.AlarmType, out var alarmType)
&& powered)
if (_alarmStates.TryGetValue(alarmType, out var state))
sprite.LayerSetState(layer, new RSI.StateId(state));
}
}

View File

@@ -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

View File

@@ -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: