From 73980ad0959af961f889196e1079cb89edc9fc05 Mon Sep 17 00:00:00 2001 From: TemporalOroboros Date: Fri, 28 Apr 2023 21:34:48 -0700 Subject: [PATCH] Resolves PowerChargerVisualizer is Obsolete (#13901) Co-authored-by: metalgearsloth --- .../PowerCell/PowerChargerVisualizer.cs | 79 ------------------- .../PowerChargerVisualizerComponent.cs | 39 +++++++++ .../PowerCell/PowerChargerVisualizerSystem.cs | 41 ++++++++++ .../Entities/Structures/Power/chargers.yml | 9 ++- 4 files changed, 87 insertions(+), 81 deletions(-) delete mode 100644 Content.Client/PowerCell/PowerChargerVisualizer.cs create mode 100644 Content.Client/PowerCell/PowerChargerVisualizerComponent.cs create mode 100644 Content.Client/PowerCell/PowerChargerVisualizerSystem.cs diff --git a/Content.Client/PowerCell/PowerChargerVisualizer.cs b/Content.Client/PowerCell/PowerChargerVisualizer.cs deleted file mode 100644 index 42791ed39e..0000000000 --- a/Content.Client/PowerCell/PowerChargerVisualizer.cs +++ /dev/null @@ -1,79 +0,0 @@ -using Content.Shared.Power; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; - -namespace Content.Client.PowerCell -{ - [UsedImplicitly] - public sealed class PowerChargerVisualizer : AppearanceVisualizer - { - [Obsolete("Subscribe to your component being initialised instead.")] - public override void InitializeEntity(EntityUid entity) - { - base.InitializeEntity(entity); - - var sprite = IoCManager.Resolve().GetComponent(entity); - - // Base item - sprite.LayerMapSet(Layers.Base, sprite.AddLayerState("empty")); - - // Light - sprite.LayerMapSet(Layers.Light, sprite.AddLayerState("light-off")); - sprite.LayerSetShader(Layers.Light, "unshaded"); - } - - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - - var sprite = IoCManager.Resolve().GetComponent(component.Owner); - - // Update base item - if (component.TryGetData(CellVisual.Occupied, out bool occupied)) - { - // TODO: don't throw if it doesn't have a full state - sprite.LayerSetState(Layers.Base, occupied ? "full" : "empty"); - } - else - { - sprite.LayerSetState(Layers.Base, "empty"); - } - - // Update lighting - if (component.TryGetData(CellVisual.Light, out CellChargerStatus status)) - { - switch (status) - { - case CellChargerStatus.Off: - sprite.LayerSetState(Layers.Light, "light-off"); - break; - case CellChargerStatus.Empty: - sprite.LayerSetState(Layers.Light, "light-empty"); - break; - case CellChargerStatus.Charging: - sprite.LayerSetState(Layers.Light, "light-charging"); - break; - case CellChargerStatus.Charged: - sprite.LayerSetState(Layers.Light, "light-charged"); - break; - default: - sprite.LayerSetState(Layers.Light, "light-off"); - break; - } - } - else - { - sprite.LayerSetState(Layers.Light, "light-off"); - } - } - - enum Layers : byte - { - Base, - Light, - } - } -} diff --git a/Content.Client/PowerCell/PowerChargerVisualizerComponent.cs b/Content.Client/PowerCell/PowerChargerVisualizerComponent.cs new file mode 100644 index 0000000000..bc86cf751c --- /dev/null +++ b/Content.Client/PowerCell/PowerChargerVisualizerComponent.cs @@ -0,0 +1,39 @@ +using Content.Shared.Power; + +namespace Content.Client.PowerCell; + +[RegisterComponent] +[Access(typeof(PowerChargerVisualizerSystem))] +public sealed class PowerChargerVisualsComponent : Component +{ + /// + /// The base sprite state used if the power cell charger does not contain a power cell. + /// + [DataField("emptyState")] + [ViewVariables(VVAccess.ReadWrite)] + public string EmptyState = "empty"; + + /// + /// The base sprite state used if the power cell charger contains a power cell. + /// + [DataField("occupiedState")] + [ViewVariables(VVAccess.ReadWrite)] + public string OccupiedState = "full"; + + /// + /// A mapping of the indicator light overlays for the power cell charger. + /// Maps to the state used when the charger is out of power/disabled. + /// Maps to the state used when the charger does not contain a power cell. + /// Maps to the state used when the charger is charging a power cell. + /// Maps to the state used when the charger contains a fully charged power cell. + /// + [DataField("lightStates")] + [ViewVariables(VVAccess.ReadWrite)] + public readonly Dictionary LightStates = new() + { + [CellChargerStatus.Off] = "light-off", + [CellChargerStatus.Empty] = "light-empty", + [CellChargerStatus.Charging] = "light-charging", + [CellChargerStatus.Charged] = "light-charged", + }; +} diff --git a/Content.Client/PowerCell/PowerChargerVisualizerSystem.cs b/Content.Client/PowerCell/PowerChargerVisualizerSystem.cs new file mode 100644 index 0000000000..236a7f287d --- /dev/null +++ b/Content.Client/PowerCell/PowerChargerVisualizerSystem.cs @@ -0,0 +1,41 @@ +using Content.Shared.Power; +using Robust.Client.GameObjects; + +namespace Content.Client.PowerCell; + +public sealed class PowerChargerVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, PowerChargerVisualsComponent comp, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + // Update base item + if (AppearanceSystem.TryGetData(uid, CellVisual.Occupied, out var occupied, args.Component) && occupied) + { + // TODO: don't throw if it doesn't have a full state + args.Sprite.LayerSetState(PowerChargerVisualLayers.Base, comp.OccupiedState); + } + else + { + args.Sprite.LayerSetState(PowerChargerVisualLayers.Base, comp.EmptyState); + } + + // Update lighting + if (AppearanceSystem.TryGetData(uid, CellVisual.Light, out var status, args.Component) + && comp.LightStates.TryGetValue(status, out var lightState)) + { + args.Sprite.LayerSetState(PowerChargerVisualLayers.Light, lightState); + args.Sprite.LayerSetVisible(PowerChargerVisualLayers.Light, true); + } + else + // + args.Sprite.LayerSetVisible(PowerChargerVisualLayers.Light, false); + } +} + +enum PowerChargerVisualLayers : byte +{ + Base, + Light, +} diff --git a/Resources/Prototypes/Entities/Structures/Power/chargers.yml b/Resources/Prototypes/Entities/Structures/Power/chargers.yml index d2d7ce4b67..2147bba095 100644 --- a/Resources/Prototypes/Entities/Structures/Power/chargers.yml +++ b/Resources/Prototypes/Entities/Structures/Power/chargers.yml @@ -11,13 +11,18 @@ sprite: Structures/Power/cell_recharger.rsi drawdepth: SmallObjects snapCardinals: true + layers: + - map: ["enum.PowerChargerVisualLayers.Base"] + state: "empty" + - map: ["enum.PowerChargerVisualLayers.Light"] + state: "light-off" + shader: "unshaded" - type: Charger slotId: charger_slot - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: Appearance - visuals: - - type: PowerChargerVisualizer + - type: PowerChargerVisuals - type: Anchorable - type: Pullable - type: Clickable -- 2.51.2