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,
}
}
}

View File

@@ -35,6 +35,7 @@ namespace Content.Server.Entry
"AMEControllerVisuals",
"AMEShieldingVisuals",
"PipeColorVisuals",
"FireVisuals",
};
}
}

View File

@@ -727,10 +727,9 @@
Dead:
Base: dead
- type: Appearance
visuals:
- type: FireVisualizer
sprite: Mobs/Effects/onfire.rsi
normalState: Monkey_burning
- type: FireVisuals
sprite: Mobs/Effects/onfire.rsi
normalState: Monkey_burning
- type: Butcherable
butcheringType: Spike
spawned:

View File

@@ -125,9 +125,9 @@
- type: Appearance
visuals:
- type: BuckleVisualizer
- type: FireVisualizer
sprite: Mobs/Effects/onfire.rsi
normalState: Generic_mob_burning
- type: FireVisuals
sprite: Effects/fire.rsi
normalState: Generic_mob_burning
- type: Actions
- type: DoAfter
- type: Climbing

View File

@@ -256,11 +256,6 @@
visuals:
- type: RotationVisualizer
- type: BuckleVisualizer
- type: FireVisualizer
sprite: Mobs/Effects/onfire.rsi
normalState: Generic_mob_burning
alternateState: Standing
fireStackAlternateState: 3
- type: CreamPiedVisualizer
state: creampie_human
- type: DamageVisualizer
@@ -278,6 +273,11 @@
color: "#FF0000"
Burn:
sprite: Mobs/Effects/burn_damage.rsi
- type: FireVisuals
sprite: Mobs/Effects/onfire.rsi
normalState: Generic_mob_burning
alternateState: Standing
fireStackAlternateState: 3
- type: CombatMode
- type: Climbing
- type: Cuffable

View File

@@ -203,11 +203,6 @@
visuals:
- type: RotationVisualizer
- type: BuckleVisualizer
- type: FireVisualizer
sprite: Mobs/Effects/onfire.rsi
normalState: Generic_mob_burning
alternateState: Standing
fireStackAlternateState: 3
- type: CreamPiedVisualizer
state: creampie_human
- type: DamageVisualizer
@@ -225,6 +220,11 @@
color: "#8a8a8a"
Burn:
sprite: Mobs/Effects/burn_damage.rsi
- type: FireVisuals
sprite: Mobs/Effects/onfire.rsi
normalState: Generic_mob_burning
alternateState: Standing
fireStackAlternateState: 3
- type: CombatMode
canDisarm: true
- type: Climbing

View File

@@ -6,7 +6,9 @@
components:
- type: Sprite
sprite: Objects/Specific/Atmos/gasanalyzer.rsi
state: icon
layers:
- state: icon
map: ["analyzer"]
netsync: false
- type: GasAnalyzer
- type: ActivatableUI
@@ -16,10 +18,12 @@
- key: enum.GasAnalyzerUiKey.Key
type: GasAnalyzerBoundUserInterface
- type: Appearance
- type: GenericVisualizer
visuals:
- type: GasAnalyzerVisualizer
state_off: icon
state_working: working
enum.GasAnalyzerVisuals.VisualState:
analyzer:
Off: { state: icon }
Working: { state: working }
- type: Tag
tags:
- DroneUsable

View File

@@ -43,7 +43,7 @@
- type: Tool
qualities:
- Screwing
useSound:
useSound:
collection: Screwdriver
speed: 0.05
@@ -138,17 +138,14 @@
components:
- type: Sprite
sprite: Objects/Tools/Cowtools/milkalyzer.rsi
state: milkalyzer
layers:
- state: milkalyzer
- type: GasAnalyzer
- type: UserInterface
interfaces:
- key: enum.GasAnalyzerUiKey.Key
type: GasAnalyzerBoundUserInterface
- type: Appearance
visuals:
- type: GasAnalyzerVisualizer
state_off: milkalyzer
state_working: milkalyzer
- type: entity
name: cow toolbox

View File

@@ -11,18 +11,25 @@
- type: Sprite
netsync: false
sprite: Structures/Storage/canister.rsi
state: grey
layers:
- state: grey
- type: Appearance
- type: GenericVisualizer
visuals:
- type: GasPortableVisualizer
stateConnected: can-connector
- type: GasCanisterVisualizer
insertedTankState: can-open
pressureStates:
- can-o0
- can-o1
- can-o2
- can-o3
enum.GasPortableVisuals.ConnectedState:
connectedToPort:
False: { state: can-connector, visible: false }
True: { state: can-connector, visible: true }
enum.GasCanisterVisuals.TankInserted:
tankInserted:
False: { state: can-open, visible: false }
True: { state: can-open, visible: true }
enum.GasCanisterVisuals.PressureState:
pressureLight:
0: { state: can-o0, shader: "unshaded" }
1: { state: can-o1, shader: "unshaded" }
2: { state: can-o2, shader: "unshaded" }
3: { state: can-o3, shader: "unshaded" }
- type: UserInterface
interfaces:
- key: enum.GasCanisterUiKey.Key
@@ -80,7 +87,8 @@
name: storage canister
components:
- type: Sprite
state: yellow # Classic toxins canister
layers:
- state: yellow
- type: GasCanister
gasMixture:
volume: 1000
@@ -117,7 +125,8 @@
name: air canister
components:
- type: Sprite
state: grey
layers:
- state: grey
- type: GasCanister
gasMixture:
volume: 1000
@@ -148,7 +157,8 @@
name: oxygen canister
components:
- type: Sprite
state: blue
layers:
- state: blue
- type: GasCanister
gasMixture:
volume: 1000
@@ -178,7 +188,8 @@
name: nitrogen canister
components:
- type: Sprite
state: red
layers:
- state: red
- type: GasCanister
gasMixture:
volume: 1000
@@ -209,7 +220,8 @@
name: carbon dioxide canister
components:
- type: Sprite
state: black
layers:
- state: black
- type: GasCanister
gasMixture:
volume: 1000
@@ -241,7 +253,8 @@
name: plasma canister
components:
- type: Sprite
state: orange
layers:
- state: orange
- type: GasCanister
gasMixture:
volume: 1000
@@ -275,7 +288,8 @@
name: tritium canister
components:
- type: Sprite
state: green
layers:
- state: green
- type: GasCanister
gasMixture:
volume: 1000
@@ -309,7 +323,8 @@
name: water vapor canister
components:
- type: Sprite
state: water_vapor
layers:
- state: water_vapor
- type: GasCanister
gasMixture:
volume: 1000
@@ -344,7 +359,8 @@
name: miasma canister
components:
- type: Sprite
state: redws
layers:
- state: redws
- type: GasCanister
gasMixture:
volume: 1000

View File

@@ -13,5 +13,14 @@
layer:
- MidImpassable
- type: Sprite
state: atmosplaque
layers:
- state: atmosplaque
map: ["plaque"]
- type: Appearance
- type: GenericVisualizer
visuals:
enum.AtmosPlaqueVisuals.State:
plaque:
zumosplaque: { state: zumosplaque }
atmosplaque: { state: atmosplaque }
- type: AtmosPlaque

View File

@@ -45,9 +45,6 @@
types:
Heat: 1 #per second, scales with number of fire 'stacks'
- type: Appearance
visuals:
- type: FireVisualizer
sprite: Effects/fire.rsi
normalState: 1
Sprite:
drawdepth: Effects
- type: FireVisuals
sprite: Effects/fire.rsi
normalState: 1