Resolves SmesVisualizer is Obsolete (#13899)

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
TemporalOroboros
2023-05-06 20:43:41 -07:00
committed by GitHub
parent 5628ee36dd
commit 6ff63a6ee7
8 changed files with 120 additions and 97 deletions

View File

@@ -0,0 +1,28 @@
namespace Content.Client.Power.SMES;
[RegisterComponent]
public sealed class SmesComponent : Component
{
/// <summary>
/// The prefix used for the RSI states of the sprite layers indicating the charge level of the SMES.
/// </summary>
[DataField("chargeOverlayPrefix")]
[ViewVariables(VVAccess.ReadWrite)]
public string ChargeOverlayPrefix = "smes-og";
/// <summary>
/// The prefix used for the RSI states of the sprite layers indicating the input state of the SMES.
/// Actually bundled together with the output indicator light.
/// </summary>
[DataField("inputOverlayPrefix")]
[ViewVariables(VVAccess.ReadWrite)]
public string InputOverlayPrefix = "smes-oc";
/// <summary>
/// The prefix used for the RSI states of the sprite layers indicating the output state of the SMES.
/// Actually bundled together with the input indicator light.
/// </summary>
[DataField("outputOverlayPrefix")]
[ViewVariables(VVAccess.ReadWrite)]
public string OutputOverlayPrefix = "smes-op";
}

View File

@@ -0,0 +1,50 @@
using Content.Shared.Power;
using Content.Shared.SMES;
using Robust.Client.GameObjects;
namespace Content.Client.Power.SMES;
public sealed class SmesVisualizerSystem : VisualizerSystem<SmesComponent>
{
protected override void OnAppearanceChange(EntityUid uid, SmesComponent comp, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (!AppearanceSystem.TryGetData<int>(uid, SmesVisuals.LastChargeLevel, out var level, args.Component) || level == 0)
{
args.Sprite.LayerSetVisible(SmesVisualLayers.Charge, false);
}
else
{
args.Sprite.LayerSetVisible(SmesVisualLayers.Charge, true);
args.Sprite.LayerSetState(SmesVisualLayers.Charge, $"{comp.ChargeOverlayPrefix}{level}");
}
if (!AppearanceSystem.TryGetData<ChargeState>(uid, SmesVisuals.LastChargeState, out var state, args.Component))
state = ChargeState.Still;
switch (state)
{
case ChargeState.Still:
args.Sprite.LayerSetState(SmesVisualLayers.Input, $"{comp.InputOverlayPrefix}0");
args.Sprite.LayerSetState(SmesVisualLayers.Output, $"{comp.OutputOverlayPrefix}1");
break;
case ChargeState.Charging:
args.Sprite.LayerSetState(SmesVisualLayers.Input, $"{comp.InputOverlayPrefix}1");
args.Sprite.LayerSetState(SmesVisualLayers.Output, $"{comp.OutputOverlayPrefix}1");
break;
case ChargeState.Discharging:
args.Sprite.LayerSetState(SmesVisualLayers.Input, $"{comp.InputOverlayPrefix}0");
args.Sprite.LayerSetState(SmesVisualLayers.Output, $"{comp.OutputOverlayPrefix}2");
break;
}
}
}
enum SmesVisualLayers : byte
{
Input,
Charge,
Output,
}

View File

@@ -1,77 +0,0 @@
using Content.Shared.Power;
using Content.Shared.SMES;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
namespace Content.Client.Power.SMES
{
[UsedImplicitly]
public sealed class SmesVisualizer : AppearanceVisualizer
{
[Obsolete("Subscribe to your component being initialised instead.")]
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<SpriteComponent>(entity);
sprite.LayerMapSet(Layers.Input, sprite.AddLayerState("smes-oc0"));
sprite.LayerSetShader(Layers.Input, "unshaded");
sprite.LayerMapSet(Layers.Charge, sprite.AddLayerState("smes-og1"));
sprite.LayerSetShader(Layers.Charge, "unshaded");
sprite.LayerSetVisible(Layers.Charge, false);
sprite.LayerMapSet(Layers.Output, sprite.AddLayerState("smes-op0"));
sprite.LayerSetShader(Layers.Output, "unshaded");
}
[Obsolete("Subscribe to AppearanceChangeEvent instead.")]
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<SpriteComponent>(component.Owner);
if (!component.TryGetData<int>(SmesVisuals.LastChargeLevel, out var level) || level == 0)
{
sprite.LayerSetVisible(Layers.Charge, false);
}
else
{
sprite.LayerSetVisible(Layers.Charge, true);
sprite.LayerSetState(Layers.Charge, $"smes-og{level}");
}
if (component.TryGetData<ChargeState>(SmesVisuals.LastChargeState, out var state))
{
switch (state)
{
case ChargeState.Still:
sprite.LayerSetState(Layers.Input, "smes-oc0");
sprite.LayerSetState(Layers.Output, "smes-op1");
break;
case ChargeState.Charging:
sprite.LayerSetState(Layers.Input, "smes-oc1");
sprite.LayerSetState(Layers.Output, "smes-op1");
break;
case ChargeState.Discharging:
sprite.LayerSetState(Layers.Input, "smes-oc0");
sprite.LayerSetState(Layers.Output, "smes-op2");
break;
}
}
else
{
sprite.LayerSetState(Layers.Input, "smes-oc0");
sprite.LayerSetState(Layers.Output, "smes-op1");
}
}
enum Layers : byte
{
Input,
Charge,
Output,
}
}
}

View File

@@ -1,16 +1,12 @@
using Content.Server.Power.Components;
using Content.Shared.Power;
using Content.Shared.Rounding;
using Content.Shared.SMES;
using Robust.Server.GameObjects;
using Robust.Shared.Timing;
namespace Content.Server.Power.SMES;
/// <summary>
/// Handles the "user-facing" side of the actual SMES object.
/// This is operations that are specific to the SMES, like UI and visuals.
/// Logic is handled in <see cref="PowerSmesSystem"/>
/// Logic is handled in <see cref="SmesSystem"/>
/// Code interfacing with the powernet is handled in <see cref="BatteryStorageComponent"/> and <see cref="BatteryDischargerComponent"/>.
/// </summary>
[RegisterComponent, Access(typeof(SmesSystem))]
@@ -26,4 +22,23 @@ public sealed class SmesComponent : Component
public TimeSpan LastChargeLevelTime;
[ViewVariables]
public TimeSpan VisualsChangeDelay = TimeSpan.FromSeconds(1);
/// <summary>
/// The number of distinct charge levels a SMES has.
/// 0 is empty max is full.
/// </summary>
[DataField("numChargeLevels")]
public int NumChargeLevels = 6;
/// <summary>
/// The charge level of the SMES as of the most recent update.
/// </summary>
[ViewVariables]
public int ChargeLevel = 0;
/// <summary>
/// Whether the SMES is being charged/discharged/neither.
/// </summary>
[ViewVariables]
public ChargeState ChargeState = ChargeState.Still;
}

View File

@@ -57,7 +57,7 @@ internal sealed class SmesSystem : EntitySystem
private int CalcChargeLevel(EntityUid uid, BatteryComponent? battery = null)
{
if (!Resolve<BatteryComponent>(uid, ref battery))
if (!Resolve(uid, ref battery))
return 0;
return ContentHelpers.RoundToLevels(battery.CurrentCharge, battery.MaxCharge, 6);
@@ -65,7 +65,7 @@ internal sealed class SmesSystem : EntitySystem
private ChargeState CalcChargeState(EntityUid uid, PowerNetworkBatteryComponent? netBattery = null)
{
if (!Resolve<PowerNetworkBatteryComponent>(uid, ref netBattery))
if (!Resolve(uid, ref netBattery))
return ChargeState.Still;
return (netBattery.CurrentSupply - netBattery.CurrentReceiving) switch

View File

@@ -3,11 +3,11 @@
namespace Content.Shared.Power
{
[Serializable, NetSerializable]
public enum ChargeState
public enum ChargeState : byte
{
Still,
Charging,
Discharging,
Still = 0,
Charging = 1,
Discharging = 2,
}
[Serializable, NetSerializable]

View File

@@ -1,11 +1,10 @@
using Robust.Shared.Serialization;
namespace Content.Shared.SMES
namespace Content.Shared.SMES;
[Serializable, NetSerializable]
public enum SmesVisuals
{
[Serializable, NetSerializable]
public enum SmesVisuals
{
LastChargeState,
LastChargeLevel,
}
LastChargeState,
LastChargeLevel,
}

View File

@@ -19,13 +19,21 @@
snapCardinals: true
layers:
- state: smes
- map: ["enum.SmesVisualLayers.Charge"]
state: "smes-og1" # -og0 does not exist
shader: unshaded
visible: false
- map: ["enum.SmesVisualLayers.Input"]
state: "smes-oc0"
shader: unshaded
- map: ["enum.SmesVisualLayers.Output"]
state: "smes-op1"
shader: unshaded
- type: Smes
- type: UpgradeBattery
maxChargeMultiplier: 2
baseMaxCharge: 8000000
- type: Appearance
visuals:
- type: SmesVisualizer
- type: Battery
startingCharge: 0
- type: ExaminableBattery