Convert Remaining Atmos Appearance Visualizers (#9582)

* Convert atmos plaque to generic visualizer

Use generic visualizer for atmos plaque. Also enables zumos plaque to
appear.

* Convert gas canister connecters

* Remove manual layer creation

* Remove gas canister visualizer

* Convert gas analyzers to generic visualizers

* Convert fire visualizer

* Fix layers on plasma and air canisters

* Remove commented out fire visualizer in barricades

* Add documentation for fire visuals component

* Remove redundant visualizer for milkalyzer

* Remove rogue item group
This commit is contained in:
TekuNut
2022-07-10 07:51:34 +01:00
committed by GitHub
parent b6d81c395f
commit 73b094c6ad
17 changed files with 156 additions and 313 deletions

View File

@@ -0,0 +1,21 @@
namespace Content.Client.Atmos.Components;
/// <summary>
/// Sets which sprite RSI is used for displaying the fire visuals and what state to use based on the fire stacks
/// accumulated.
/// </summary>
[RegisterComponent]
public sealed class FireVisualsComponent : Component
{
[DataField("fireStackAlternateState")]
public int FireStackAlternateState = 3;
[DataField("normalState")]
public string? NormalState;
[DataField("alternateState")]
public string? AlternateState;
[DataField("sprite")]
public string? Sprite;
}

View File

@@ -0,0 +1,59 @@
using Content.Client.Atmos.Components;
using Content.Shared.Atmos;
using Robust.Client.GameObjects;
namespace Content.Client.Atmos.EntitySystems;
/// <summary>
/// This handles the display of fire effects on flammable entities.
/// </summary>
public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent>
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FireVisualsComponent, ComponentInit>(OnComponentInit);
}
private void OnComponentInit(EntityUid uid, FireVisualsComponent component, ComponentInit args)
{
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
sprite.LayerMapReserveBlank(FireVisualLayers.Fire);
sprite.LayerSetVisible(FireVisualLayers.Fire, false);
sprite.LayerSetShader(FireVisualLayers.Fire, "unshaded");
}
protected override void OnAppearanceChange(EntityUid uid, FireVisualsComponent component, ref AppearanceChangeEvent args)
{
if (!args.Component.TryGetData(FireVisuals.OnFire, out bool onFire) ||
!TryComp<SpriteComponent>(component.Owner, out var sprite))
return;
var fireStacks = 0f;
if (args.Component.TryGetData(FireVisuals.FireStacks, out float stacks))
fireStacks = stacks;
SetOnFire(sprite, args.Component, component, onFire, fireStacks);
}
private void SetOnFire(SpriteComponent sprite, AppearanceComponent appearance, FireVisualsComponent component, bool onFire, float fireStacks)
{
if (component.Sprite != null)
sprite.LayerSetRSI(FireVisualLayers.Fire, component.Sprite);
sprite.LayerSetVisible(FireVisualLayers.Fire, onFire);
if(fireStacks > component.FireStackAlternateState && !string.IsNullOrEmpty(component.AlternateState))
sprite.LayerSetState(FireVisualLayers.Fire, component.AlternateState);
else
sprite.LayerSetState(FireVisualLayers.Fire, component.NormalState);
}
}
public enum FireVisualLayers : byte
{
Fire
}

View File

@@ -1,38 +0,0 @@
using Content.Shared.Atmos.Visuals;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public sealed class AtmosPlaqueVisualizer : AppearanceVisualizer
{
[DataField("layer")]
private int Layer { get; }
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
IoCManager.Resolve<IEntityManager>().GetComponentOrNull<SpriteComponent>(entity);
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
if (!IoCManager.Resolve<IEntityManager>().TryGetComponent(component.Owner, out SpriteComponent? sprite))
{
return;
}
if (!component.TryGetData(AtmosPlaqueVisuals.State, out string state))
{
sprite.LayerSetState(Layer, state);
}
}
}
}

View File

@@ -1,73 +0,0 @@
using Content.Shared.Atmos;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public sealed class FireVisualizer : AppearanceVisualizer
{
[DataField("fireStackAlternateState")]
private int _fireStackAlternateState = 3;
[DataField("normalState")]
private string? _normalState;
[DataField("alternateState")]
private string? _alternateState;
[DataField("sprite")]
private string? _sprite;
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<ISpriteComponent>(entity);
sprite.LayerMapReserveBlank(FireVisualLayers.Fire);
sprite.LayerSetVisible(FireVisualLayers.Fire, false);
sprite.LayerSetShader(FireVisualLayers.Fire, "unshaded");
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
if (component.TryGetData(FireVisuals.OnFire, out bool onFire))
{
var fireStacks = 0f;
if (component.TryGetData(FireVisuals.FireStacks, out float stacks))
fireStacks = stacks;
SetOnFire(component, onFire, fireStacks);
}
}
private void SetOnFire(AppearanceComponent component, bool onFire, float fireStacks)
{
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<ISpriteComponent>(component.Owner);
if (_sprite != null)
{
sprite.LayerSetRSI(FireVisualLayers.Fire, _sprite);
}
sprite.LayerSetVisible(FireVisualLayers.Fire, onFire);
if(fireStacks > _fireStackAlternateState && !string.IsNullOrEmpty(_alternateState))
sprite.LayerSetState(FireVisualLayers.Fire, _alternateState);
else
sprite.LayerSetState(FireVisualLayers.Fire, _normalState);
}
}
public enum FireVisualLayers : byte
{
Fire
}
}

View File

@@ -1,42 +0,0 @@
using Content.Shared.Atmos.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public sealed class GasAnalyzerVisualizer : AppearanceVisualizer
{
[DataField("state_off")]
private string? _stateOff;
[DataField("state_working")]
private string? _stateWorking;
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent(component.Owner, out ISpriteComponent? sprite))
{
return;
}
if (component.TryGetData(GasAnalyzerVisuals.VisualState, out GasAnalyzerVisualState visualState))
{
switch (visualState)
{
case GasAnalyzerVisualState.Off:
sprite.LayerSetState(0, _stateOff);
break;
case GasAnalyzerVisualState.Working:
sprite.LayerSetState(0, _stateWorking);
break;
}
}
}
}
}

View File

@@ -1,56 +0,0 @@
using Content.Shared.Atmos.Piping.Binary.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public sealed class GasCanisterVisualizer : AppearanceVisualizer
{
[DataField("pressureStates")]
private readonly string[] _statePressure = {"", "", "", ""};
[DataField("insertedTankState")]
private readonly string _insertedTankState = string.Empty;
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<ISpriteComponent>(entity);
sprite.LayerMapSet(Layers.PressureLight, sprite.AddLayerState(_statePressure[0]));
sprite.LayerSetShader(Layers.PressureLight, "unshaded");
sprite.LayerMapSet(Layers.TankInserted, sprite.AddLayerState(_insertedTankState));
sprite.LayerSetVisible(Layers.TankInserted, false);
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent(component.Owner, out ISpriteComponent? sprite))
{
return;
}
// Update the canister lights
if (component.TryGetData(GasCanisterVisuals.PressureState, out int pressureState))
if ((pressureState >= 0) && (pressureState < _statePressure.Length))
sprite.LayerSetState(Layers.PressureLight, _statePressure[pressureState]);
if(component.TryGetData(GasCanisterVisuals.TankInserted, out bool inserted))
sprite.LayerSetVisible(Layers.TankInserted, inserted);
}
private enum Layers
{
PressureLight,
TankInserted,
}
}
}

View File

@@ -1,51 +0,0 @@
using Content.Shared.Atmos.Piping.Unary.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public sealed class GasPortableVisualizer : AppearanceVisualizer
{
[DataField("stateConnected")]
private string? _stateConnected;
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<ISpriteComponent>(entity);
if (_stateConnected != null)
{
sprite.LayerMapSet(Layers.ConnectedToPort, sprite.AddLayerState(_stateConnected));
sprite.LayerSetVisible(Layers.ConnectedToPort, false);
}
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent(component.Owner, out ISpriteComponent? sprite))
{
return;
}
// Update the visuals : Is the canister connected to a port or not
if (component.TryGetData(GasPortableVisuals.ConnectedState, out bool isConnected))
{
sprite.LayerSetVisible(Layers.ConnectedToPort, isConnected);
}
}
private enum Layers : byte
{
ConnectedToPort,
}
}
}