Resolves StorageVisualizer is Obsolete (#13910)

This commit is contained in:
TemporalOroboros
2023-05-18 11:03:20 -07:00
committed by GitHub
parent a8b3dd8c87
commit f43683e3b9
20 changed files with 436 additions and 469 deletions

View File

@@ -0,0 +1,82 @@
using Content.Shared.Storage;
using Robust.Client.GameObjects;
namespace Content.Client.Storage.Visualizers;
public sealed class EntityStorageVisualizerSystem : VisualizerSystem<EntityStorageVisualsComponent>
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<EntityStorageVisualsComponent, ComponentInit>(OnComponentInit);
}
/// <summary>
/// Sets the base sprite to this layer. Exists to make the inheritance tree less boilerplate-y.
/// </summary>
private void OnComponentInit(EntityUid uid, EntityStorageVisualsComponent comp, ComponentInit args)
{
if (comp.StateBaseClosed == null)
return;
comp.StateBaseOpen ??= comp.StateBaseClosed;
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
sprite.LayerSetState(StorageVisualLayers.Base, comp.StateBaseClosed);
}
protected override void OnAppearanceChange(EntityUid uid, EntityStorageVisualsComponent comp, ref AppearanceChangeEvent args)
{
if (args.Sprite == null
|| !AppearanceSystem.TryGetData<bool>(uid, StorageVisuals.Open, out var open, args.Component))
return;
// Open/Closed state for the storage entity.
if (args.Sprite.LayerMapTryGet(StorageVisualLayers.Door, out _))
{
if (open)
{
args.Sprite.LayerSetVisible(StorageVisualLayers.Door, true);
if (comp.StateDoorOpen != null)
args.Sprite.LayerSetState(StorageVisualLayers.Door, comp.StateDoorOpen);
if (comp.StateBaseOpen != null)
args.Sprite.LayerSetState(StorageVisualLayers.Base, comp.StateBaseOpen);
}
else
{
if (comp.StateDoorClosed != null)
{
args.Sprite.LayerSetState(StorageVisualLayers.Door, comp.StateDoorClosed);
args.Sprite.LayerSetVisible(StorageVisualLayers.Door, true);
}
else
args.Sprite.LayerSetVisible(StorageVisualLayers.Door, false);
if (comp.StateBaseClosed != null)
args.Sprite.LayerSetState(StorageVisualLayers.Base, comp.StateBaseClosed);
}
}
// Lock state for the storage entity. TODO: Split into its own visualizer.
if (AppearanceSystem.TryGetData<bool>(uid, StorageVisuals.CanLock, out var canLock, args.Component) && canLock)
{
if (!AppearanceSystem.TryGetData<bool>(uid, StorageVisuals.Locked, out var locked, args.Component))
locked = true;
args.Sprite.LayerSetVisible(StorageVisualLayers.Lock, !open);
if (!open)
{
args.Sprite.LayerSetState(StorageVisualLayers.Lock, locked ? comp.StateLocked : comp.StateUnlocked);
}
}
}
}
public enum StorageVisualLayers : byte
{
Base,
Door,
Lock
}

View File

@@ -0,0 +1,48 @@
namespace Content.Client.Storage.Visualizers;
[RegisterComponent]
[Access(typeof(EntityStorageVisualizerSystem))]
public sealed class EntityStorageVisualsComponent : Component
{
/// <summary>
/// The RSI state used for the base layer of the storage entity sprite while the storage is closed.
/// </summary>
[DataField("stateBaseClosed")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateBaseClosed;
/// <summary>
/// The RSI state used for the base layer of the storage entity sprite while the storage is open.
/// </summary>
[DataField("stateBaseOpen")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateBaseOpen;
/// <summary>
/// The RSI state used for the door/lid while the storage is open.
/// </summary>
[DataField("stateDoorOpen")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateDoorOpen;
/// <summary>
/// The RSI state used for the door/lid while the storage is closed.
/// </summary>
[DataField("stateDoorClosed")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateDoorClosed;
/// <summary>
/// The RSI state used for the lock indicator while the storage is locked.
/// </summary>
[DataField("stateLocked")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateLocked = "locked";
/// <summary>
/// The RSI state used for the lock indicator while the storage is unlocked.
/// </summary>
[DataField("stateUnlocked")]
[ViewVariables(VVAccess.ReadWrite)]
public string? StateUnlocked = "unlocked";
}

View File

@@ -1,111 +0,0 @@
using Content.Shared.Storage;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Storage.Visualizers
{
[UsedImplicitly]
public sealed class StorageVisualizer : AppearanceVisualizer
{
/// <summary>
/// Sets the base sprite to this layer. Exists to make the inheritance tree less boilerplate-y.
/// </summary>
[DataField("state")]
private string? _stateBase;
[DataField("state_alt")]
private string? _stateBaseAlt;
[DataField("state_open")]
private string? _stateOpen;
[DataField("state_closed")]
private string? _stateClosed;
[Obsolete("Subscribe to your component being initialised instead.")]
public override void InitializeEntity(EntityUid entity)
{
if (!IoCManager.Resolve<IEntityManager>().TryGetComponent(entity, out SpriteComponent? sprite))
{
return;
}
if (_stateBase != null)
{
sprite.LayerSetState(0, _stateBase);
}
if (_stateBaseAlt == null)
{
_stateBaseAlt = _stateBase;
}
}
[Obsolete("Subscribe to AppearanceChangeEvent instead.")]
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent(component.Owner, out SpriteComponent? sprite))
{
return;
}
component.TryGetData(StorageVisuals.Open, out bool open);
if (sprite.LayerMapTryGet(StorageVisualLayers.Door, out _))
{
sprite.LayerSetVisible(StorageVisualLayers.Door, true);
if (open)
{
if (_stateOpen != null)
{
sprite.LayerSetState(StorageVisualLayers.Door, _stateOpen);
sprite.LayerSetVisible(StorageVisualLayers.Door, true);
}
if (_stateBaseAlt != null)
sprite.LayerSetState(0, _stateBaseAlt);
}
else if (!open)
{
if (_stateClosed != null)
sprite.LayerSetState(StorageVisualLayers.Door, _stateClosed);
else
{
sprite.LayerSetVisible(StorageVisualLayers.Door, false);
}
if (_stateBase != null)
sprite.LayerSetState(0, _stateBase);
}
else
{
sprite.LayerSetVisible(StorageVisualLayers.Door, false);
}
}
if (component.TryGetData(StorageVisuals.CanLock, out bool canLock) && canLock)
{
if (!component.TryGetData(StorageVisuals.Locked, out bool locked))
{
locked = true;
}
sprite.LayerSetVisible(StorageVisualLayers.Lock, !open);
if (!open)
{
sprite.LayerSetState(StorageVisualLayers.Lock, locked ? "locked" : "unlocked");
}
}
}
}
public enum StorageVisualLayers : byte
{
Door,
Lock
}
}

View File

@@ -41,9 +41,9 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem
} }
} }
protected override void OnInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args) protected override void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args)
{ {
base.OnInit(uid, component, args); base.OnComponentInit(uid, component, args);
if (TryComp<ConstructionComponent>(uid, out var construction)) if (TryComp<ConstructionComponent>(uid, out var construction))
_construction.AddContainer(uid, ContainerName, construction); _construction.AddContainer(uid, ContainerName, construction);

View File

@@ -62,6 +62,7 @@ public sealed class LockSystem : EntitySystem
private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args)
{ {
_appearanceSystem.SetData(uid, StorageVisuals.CanLock, true); _appearanceSystem.SetData(uid, StorageVisuals.CanLock, true);
_appearanceSystem.SetData(uid, StorageVisuals.Locked, lockComp.Locked);
} }
private void OnActivated(EntityUid uid, LockComponent lockComp, ActivateInWorldEvent args) private void OnActivated(EntityUid uid, LockComponent lockComp, ActivateInWorldEvent args)

View File

@@ -43,8 +43,9 @@ public abstract class SharedEntityStorageSystem : EntitySystem
/// <inheritdoc/> /// <inheritdoc/>
public override void Initialize() public override void Initialize()
{ {
SubscribeLocalEvent<SharedEntityStorageComponent, ComponentInit>(OnInit); SubscribeLocalEvent<SharedEntityStorageComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<SharedEntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[]{typeof(LockSystem)}); SubscribeLocalEvent<SharedEntityStorageComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<SharedEntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) });
SubscribeLocalEvent<SharedEntityStorageComponent, LockToggleAttemptEvent>(OnLockToggleAttempt); SubscribeLocalEvent<SharedEntityStorageComponent, LockToggleAttemptEvent>(OnLockToggleAttempt);
SubscribeLocalEvent<SharedEntityStorageComponent, DestructionEventArgs>(OnDestruction); SubscribeLocalEvent<SharedEntityStorageComponent, DestructionEventArgs>(OnDestruction);
SubscribeLocalEvent<SharedEntityStorageComponent, GetVerbsEvent<InteractionVerb>>(AddToggleOpenVerb); SubscribeLocalEvent<SharedEntityStorageComponent, GetVerbsEvent<InteractionVerb>>(AddToggleOpenVerb);
@@ -76,13 +77,18 @@ public abstract class SharedEntityStorageSystem : EntitySystem
component.IsWeldedShut = state.IsWeldedShut; component.IsWeldedShut = state.IsWeldedShut;
} }
protected virtual void OnInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args) protected virtual void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args)
{ {
component.Contents = _container.EnsureContainer<Container>(uid, ContainerName); component.Contents = _container.EnsureContainer<Container>(uid, ContainerName);
component.Contents.ShowContents = component.ShowContents; component.Contents.ShowContents = component.ShowContents;
component.Contents.OccludesLight = component.OccludesLight; component.Contents.OccludesLight = component.OccludesLight;
} }
protected virtual void OnComponentStartup(EntityUid uid, SharedEntityStorageComponent component, ComponentStartup args)
{
_appearance.SetData(uid, StorageVisuals.Open, component.Open);
}
private void OnInteract(EntityUid uid, SharedEntityStorageComponent component, ActivateInWorldEvent args) private void OnInteract(EntityUid uid, SharedEntityStorageComponent component, ActivateInWorldEvent args)
{ {
if (args.Handled) if (args.Handled)

View File

@@ -203,6 +203,7 @@
drawdepth: SmallObjects drawdepth: SmallObjects
layers: layers:
- state: box - state: box
map: ["enum.StorageVisualLayers.Base"]
- state: box-open - state: box-open
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
netsync: false netsync: false
@@ -216,10 +217,9 @@
sprite: Objects/Consumable/Food/Baked/pizza.rsi sprite: Objects/Consumable/Food/Baked/pizza.rsi
heldPrefix: box heldPrefix: box
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: box-open
state_open: box-open stateDoorClosed: box
state_closed: box
- type: StaticPrice - type: StaticPrice
price: 0 price: 0

View File

@@ -12,7 +12,7 @@
sprite: Objects/Specific/Medical/Morgue/bodybags.rsi sprite: Objects/Specific/Medical/Morgue/bodybags.rsi
layers: layers:
- state: bag - state: bag
map: ["unfoldedLayer"] map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"]
- state: bag_folded - state: bag_folded
map: ["foldedLayer"] map: ["foldedLayer"]
visible: false visible: false
@@ -58,9 +58,8 @@
components: components:
- Paper - Paper
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: open_overlay
state_open: open_overlay
- type: GenericVisualizer - type: GenericVisualizer
visuals: visuals:
enum.PaperLabelVisuals.HasLabel: enum.PaperLabelVisuals.HasLabel:

View File

@@ -11,15 +11,16 @@
drawdepth: Objects drawdepth: Objects
sprite: Structures/Storage/Crates/artifact.rsi sprite: Structures/Storage/Crates/artifact.rsi
layers: layers:
- state: artifact_container - state: artifact_container
- state: artifact_container_door map: ["enum.StorageVisualLayers.Base"]
map: ["enum.StorageVisualLayers.Door"] - state: artifact_container_door
- state: welded map: ["enum.StorageVisualLayers.Door"]
visible: false - state: welded
map: ["enum.WeldableLayers.BaseWelded"] visible: false
- state: locked map: ["enum.WeldableLayers.BaseWelded"]
map: ["enum.StorageVisualLayers.Lock"] - state: locked
shader: unshaded map: ["enum.StorageVisualLayers.Lock"]
shader: unshaded
- type: InteractionOutline - type: InteractionOutline
- type: Physics - type: Physics
- type: Fixtures - type: Fixtures
@@ -64,10 +65,9 @@
components: components:
- Paper - Paper
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: artifact_container_open
state_open: artifact_container_open stateDoorClosed: artifact_container_door
state_closed: artifact_container_door
- type: ItemSlots - type: ItemSlots
- type: ContainerContainer - type: ContainerContainer
containers: containers:

View File

@@ -16,6 +16,7 @@
snapCardinals: true snapCardinals: true
layers: layers:
- state: fat - state: fat
map: ["enum.StorageVisualLayers.Base"]
- state: fat_door_off - state: fat_door_off
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: fat_red - state: fat_red

View File

@@ -11,6 +11,7 @@
noRot: true noRot: true
layers: layers:
- state: generic - state: generic
map: ["enum.StorageVisualLayers.Base"]
- state: generic_door - state: generic_door
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: locked - state: locked

View File

@@ -5,11 +5,10 @@
description: This is where the bartender keeps the booze. description: This is where the bartender keeps the booze.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: cabinet
state: cabinet stateDoorOpen: cabinet_open
state_open: cabinet_open stateDoorClosed: cabinet_door
state_closed: cabinet_door
- type: AccessReader - type: AccessReader
access: [["Bar"]] access: [["Bar"]]
@@ -26,11 +25,10 @@
name: quartermaster's locker name: quartermaster's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: qm
state: qm stateDoorOpen: qm_open
state_open: qm_open stateDoorClosed: qm_door
state_closed: qm_door
- type: AccessReader - type: AccessReader
access: [["Quartermaster"]] access: [["Quartermaster"]]
@@ -41,11 +39,10 @@
description: Nevermind the pickaxe. description: Nevermind the pickaxe.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: mining
state: mining stateDoorOpen: mining_open
state_open: mining_open stateDoorClosed: mining_door
state_closed: mining_door
- type: AccessReader - type: AccessReader
access: [["Salvage"]] access: [["Salvage"]]
@@ -56,11 +53,10 @@
name: captain's locker name: captain's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: cap
state: cap stateDoorOpen: cap_open
state_open: cap_open stateDoorClosed: cap_door
state_closed: cap_door
- type: AccessReader - type: AccessReader
access: [["Captain"]] access: [["Captain"]]
@@ -70,11 +66,10 @@
name: head of personnel's locker name: head of personnel's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: hop
state: hop stateDoorOpen: hop_open
state_open: hop_open stateDoorClosed: hop_door
state_closed: hop_door
- type: AccessReader - type: AccessReader
access: [["HeadOfPersonnel"]] access: [["HeadOfPersonnel"]]
@@ -85,11 +80,10 @@
name: chief engineer's locker name: chief engineer's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: ce
state: ce stateDoorOpen: ce_open
state_open: ce_open stateDoorClosed: ce_door
state_closed: ce_door
- type: AccessReader - type: AccessReader
access: [ [ "ChiefEngineer" ] ] access: [ [ "ChiefEngineer" ] ]
@@ -100,11 +94,10 @@
name: electrical supplies locker name: electrical supplies locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: eng
state: eng stateDoorOpen: eng_open
state_open: eng_open stateDoorClosed: eng_elec_door
state_closed: eng_elec_door
- type: AccessReader - type: AccessReader
access: [ [ "Engineering" ] ] access: [ [ "Engineering" ] ]
@@ -115,11 +108,10 @@
name: welding supplies locker name: welding supplies locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: eng
state: eng stateDoorOpen: eng_open
state_open: eng_open stateDoorClosed: eng_weld_door
state_closed: eng_weld_door
- type: AccessReader - type: AccessReader
access: [ [ "Engineering" ] ] access: [ [ "Engineering" ] ]
@@ -130,11 +122,10 @@
name: atmospheric technician's locker name: atmospheric technician's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: atmos
state: atmos stateDoorOpen: atmos_open
state_open: atmos_open stateDoorClosed: atmos_door
state_closed: atmos_door
- type: AccessReader - type: AccessReader
access: [ [ "Atmospherics" ] ] access: [ [ "Atmospherics" ] ]
@@ -145,11 +136,10 @@
name: engineer's locker name: engineer's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: eng_secure
state: eng_secure stateDoorOpen: eng_secure_open
state_open: eng_secure_open stateDoorClosed: eng_secure_door
state_closed: eng_secure_door
- type: AccessReader - type: AccessReader
access: [ [ "Engineering" ] ] access: [ [ "Engineering" ] ]
@@ -160,11 +150,10 @@
name: freezer name: freezer
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: freezer
state: freezer stateDoorOpen: freezer_open
state_open: freezer_open stateDoorClosed: freezer_door
state_closed: freezer_door
- type: AccessReader - type: AccessReader
access: [ [ "Kitchen" ] ] access: [ [ "Kitchen" ] ]
- type: ExplosionResistance - type: ExplosionResistance
@@ -178,11 +167,10 @@
name: botanist's locker name: botanist's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: hydro
state: hydro stateDoorOpen: hydro_open
state_open: hydro_open stateDoorClosed: hydro_door
state_closed: hydro_door
- type: AccessReader - type: AccessReader
access: [ [ "Hydroponics" ] ] access: [ [ "Hydroponics" ] ]
@@ -194,11 +182,10 @@
description: Filled to the brim with medical junk. description: Filled to the brim with medical junk.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: med
state: med stateDoorOpen: med_open
state_open: med_open stateDoorClosed: med_door
state_closed: med_door
- type: AccessReader - type: AccessReader
access: [ [ "Medical" ] ] access: [ [ "Medical" ] ]
@@ -209,11 +196,10 @@
name: medical doctor's locker name: medical doctor's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: med_secure
state: med_secure stateDoorOpen: med_secure_open
state_open: med_secure_open stateDoorClosed: med_secure_door
state_closed: med_secure_door
- type: AccessReader - type: AccessReader
access: [ [ "Medical" ] ] access: [ [ "Medical" ] ]
@@ -224,11 +210,10 @@
name: paramedic's locker name: paramedic's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: paramed
state: paramed stateDoorOpen: paramed_open
state_open: paramed_open stateDoorClosed: paramed_door
state_closed: paramed_door
- type: AccessReader - type: AccessReader
access: [ [ "Medical" ] ] access: [ [ "Medical" ] ]
@@ -240,11 +225,10 @@
name: chemical locker name: chemical locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: med
state: med stateDoorOpen: med_open
state_open: med_open stateDoorClosed: chemical_door
state_closed: chemical_door
- type: AccessReader - type: AccessReader
access: [ [ "Chemistry" ] ] access: [ [ "Chemistry" ] ]
@@ -255,11 +239,10 @@
name: chief medical officer's locker name: chief medical officer's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: cmo
state: cmo stateDoorOpen: cmo_open
state_open: cmo_open stateDoorClosed: cmo_door
state_closed: cmo_door
- type: AccessReader - type: AccessReader
access: [ [ "ChiefMedicalOfficer" ] ] access: [ [ "ChiefMedicalOfficer" ] ]
@@ -270,11 +253,10 @@
name: research director's locker name: research director's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: rd
state: rd stateDoorOpen: rd_open
state_open: rd_open stateDoorClosed: rd_door
state_closed: rd_door
- type: AccessReader - type: AccessReader
access: [ [ "ResearchDirector" ] ] access: [ [ "ResearchDirector" ] ]
@@ -283,14 +265,13 @@
parent: LockerBase parent: LockerBase
name: scientist's locker name: scientist's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: science
state: science stateDoorOpen: science_open
state_open: science_open stateDoorClosed: science_door
state_closed: science_door - type: AccessReader
- type: AccessReader access: [ [ "Research" ] ]
access: [ [ "Research" ] ]
# HoS # HoS
- type: entity - type: entity
@@ -299,11 +280,10 @@
name: head of security's locker name: head of security's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: hos
state: hos stateDoorOpen: hos_open
state_open: hos_open stateDoorClosed: hos_door
state_closed: hos_door
- type: AccessReader - type: AccessReader
access: [["HeadOfSecurity"]] access: [["HeadOfSecurity"]]
@@ -314,11 +294,10 @@
name: warden's locker name: warden's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: warden
state: warden stateDoorOpen: warden_open
state_open: warden_open stateDoorClosed: warden_door
state_closed: warden_door
- type: AccessReader - type: AccessReader
access: [["Armory"]] access: [["Armory"]]
@@ -329,11 +308,10 @@
name: brigmedic locker name: brigmedic locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: brigmedic
state: brigmedic stateDoorOpen: armory_open
state_open: armory_open stateDoorClosed: brigmedic_door
state_closed: brigmedic_door
- type: AccessReader - type: AccessReader
access: [["Medical"]] access: [["Medical"]]
@@ -344,11 +322,10 @@
name: security officer's locker name: security officer's locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: sec
state: sec stateDoorOpen: sec_open
state_open: sec_open stateDoorClosed: sec_door
state_closed: sec_door
- type: AccessReader - type: AccessReader
access: [["Security"]] access: [["Security"]]
@@ -358,11 +335,10 @@
name: gun safe name: gun safe
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: shotguncase
state: shotguncase stateDoorOpen: shotguncase_open
state_open: shotguncase_open stateDoorClosed: shotguncase_door
state_closed: shotguncase_door
- type: AccessReader - type: AccessReader
access: [["Armory"]] access: [["Armory"]]
@@ -393,11 +369,10 @@
description: It's a personal storage unit for operative gear. description: It's a personal storage unit for operative gear.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: syndicate
state: syndicate stateDoorOpen: syndicate_open
state_open: syndicate_open stateDoorClosed: syndicate_door
state_closed: syndicate_door
# Bluespace # Bluespace
- type: entity - type: entity

View File

@@ -13,6 +13,7 @@
sprite: Structures/Storage/closet.rsi sprite: Structures/Storage/closet.rsi
layers: layers:
- state: generic - state: generic
map: ["enum.StorageVisualLayers.Base"]
- state: generic_door - state: generic_door
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: welded - state: welded
@@ -81,11 +82,10 @@
min: 1 min: 1
max: 1 max: 1
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: generic_door
state_closed: generic_door
#Wall Closet #Wall Closet
- type: entity - type: entity
@@ -113,6 +113,7 @@
sprite: Structures/Storage/wall_locker.rsi sprite: Structures/Storage/wall_locker.rsi
layers: layers:
- state: generic - state: generic
map: ["enum.StorageVisualLayers.Base"]
- state: generic_door - state: generic_door
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: welded - state: welded
@@ -168,6 +169,7 @@
sprite: Structures/Storage/wall_locker.rsi sprite: Structures/Storage/wall_locker.rsi
layers: layers:
- state: generic - state: generic
map: ["enum.StorageVisualLayers.Base"]
- state: generic_door - state: generic_door
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: locked - state: locked
@@ -255,8 +257,7 @@
min: 1 min: 1
max: 1 max: 1
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBase: base
state: base stateDoorOpen: base
state_open: base stateDoorClosed: closed
state_closed: closed

View File

@@ -41,13 +41,13 @@
sprite: Structures/Storage/closet.rsi sprite: Structures/Storage/closet.rsi
layers: layers:
- state: cardboard - state: cardboard
map: ["enum.StorageVisualLayers.Base"]
- state: cardboard_open - state: cardboard_open
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: cardboard
state: cardboard stateDoorOpen: cardboard_open
state_open: cardboard_open
- type: Tag - type: Tag
tags: tags:
- DoorBumpOpener - DoorBumpOpener
@@ -124,7 +124,7 @@
noRot: true noRot: true
netsync: false netsync: false
layers: layers:
- state: "cardboard_special" - state: "cardboard_special"
- type: TimedDespawn - type: TimedDespawn
lifetime: 1 lifetime: 1
- type: Tag - type: Tag

View File

@@ -6,11 +6,10 @@
description: It's a storage unit for tools. description: It's a storage unit for tools.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: eng
state: eng stateDoorOpen: eng_open
state_open: eng_open stateDoorClosed: eng_tool_door
state_closed: eng_tool_door
# Radiation suit closet # Radiation suit closet
- type: entity - type: entity
@@ -20,11 +19,10 @@
description: "More comfortable than radiation poisioning." description: "More comfortable than radiation poisioning."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: eng
state: eng stateDoorOpen: eng_open
state_open: eng_open stateDoorClosed: eng_rad_door
state_closed: eng_rad_door
# Emergency closet # Emergency closet
- type: entity - type: entity
@@ -34,11 +32,10 @@
description: It's a storage unit for emergency breath masks and O2 tanks. description: It's a storage unit for emergency breath masks and O2 tanks.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: emergency
state: emergency stateDoorOpen: emergency_open
state_open: emergency_open stateDoorClosed: emergency_door
state_closed: emergency_door
# Fire safety closet # Fire safety closet
- type: entity - type: entity
@@ -48,11 +45,10 @@
description: It's a storage unit for fire-fighting supplies. description: It's a storage unit for fire-fighting supplies.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: fire
state: fire stateDoorOpen: fire_open
state_open: fire_open stateDoorClosed: fire_door
state_closed: fire_door
# EOD closet # EOD closet
- type: entity - type: entity
@@ -62,11 +58,10 @@
description: It's a storage unit for explosion-protective suits. description: It's a storage unit for explosion-protective suits.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: bomb
state: bomb stateDoorOpen: bomb_open
state_open: bomb_open stateDoorClosed: bomb_door
state_closed: bomb_door
# Biohazard # Biohazard
@@ -78,11 +73,10 @@
description: It's a storage unit for level 3 biohazard gear. description: It's a storage unit for level 3 biohazard gear.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: bio
state: bio stateDoorOpen: bio_open
state_open: bio_open stateDoorClosed: bio_door
state_closed: bio_door
# Virology variant # Virology variant
- type: entity - type: entity
@@ -90,11 +84,10 @@
parent: ClosetL3 parent: ClosetL3
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: bio_viro
state: bio_viro stateDoorOpen: bio_viro_open
state_open: bio_viro_open stateDoorClosed: bio_viro_door
state_closed: bio_viro_door
# Security variant # Security variant
- type: entity - type: entity
@@ -102,11 +95,10 @@
parent: ClosetL3 parent: ClosetL3
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: bio_sec
state: bio_sec stateDoorOpen: bio_sec_open
state_open: bio_sec_open stateDoorClosed: bio_sec_door
state_closed: bio_sec_door
# Janitor variant # Janitor variant
- type: entity - type: entity
@@ -114,11 +106,10 @@
parent: ClosetL3 parent: ClosetL3
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: bio_jan
state: bio_jan stateDoorOpen: bio_jan_open
state_open: bio_jan_open stateDoorClosed: bio_jan_door
state_closed: bio_jan_door
# Maintenance closet # Maintenance closet
- type: entity - type: entity
@@ -127,11 +118,10 @@
parent: ClosetBase parent: ClosetBase
description: It's a storage unit. description: It's a storage unit.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: generic_door
state_closed: generic_door
# Bluespace closet # Bluespace closet
- type: entity - type: entity

View File

@@ -5,11 +5,10 @@
description: It's a storage unit. description: It's a storage unit.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: generic_door
state_closed: generic_door
- type: entity - type: entity
id: ClosetWallEmergency id: ClosetWallEmergency
@@ -18,11 +17,10 @@
description: It's a storage unit for emergency breath masks and O2 tanks. description: It's a storage unit for emergency breath masks and O2 tanks.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: emergency
state: emergency stateDoorOpen: emergency_open
state_open: emergency_open stateDoorClosed: emergency_door
state_closed: emergency_door
- type: entity - type: entity
id: ClosetWallFire id: ClosetWallFire
@@ -31,11 +29,10 @@
description: It's a storage unit for fire-fighting supplies. description: It's a storage unit for fire-fighting supplies.
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: fire
state: fire stateDoorOpen: fire_open
state_open: fire_open stateDoorClosed: fire_door
state_closed: fire_door
- type: entity - type: entity
id: ClosetWallBlue id: ClosetWallBlue
@@ -44,11 +41,10 @@
description: "A wardrobe packed with stylish blue clothing." description: "A wardrobe packed with stylish blue clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: blue_door
state_closed: blue_door
- type: entity - type: entity
id: ClosetWallPink id: ClosetWallPink
@@ -57,11 +53,10 @@
description: "A wardrobe packed with fabulous pink clothing." description: "A wardrobe packed with fabulous pink clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: pink_door
state_closed: pink_door
- type: entity - type: entity
id: ClosetWallBlack id: ClosetWallBlack
@@ -70,11 +65,10 @@
description: "A wardrobe packed with stylish black clothing." description: "A wardrobe packed with stylish black clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: black_door
state_closed: black_door
- type: entity - type: entity
id: ClosetWallGreen id: ClosetWallGreen
@@ -83,11 +77,10 @@
description: "A wardrobe packed with stylish green clothing." description: "A wardrobe packed with stylish green clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: green_door
state_closed: green_door
- type: entity - type: entity
id: ClosetWallOrange id: ClosetWallOrange
@@ -95,11 +88,10 @@
name: prison wall closet name: prison wall closet
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: orange_door
state_closed: orange_door
- type: entity - type: entity
id: ClosetWallYellow id: ClosetWallYellow
@@ -108,11 +100,10 @@
description: "A wardrobe packed with stylish yellow clothing." description: "A wardrobe packed with stylish yellow clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: yellow_door
state_closed: yellow_door
- type: entity - type: entity
id: ClosetWallWhite id: ClosetWallWhite
@@ -121,11 +112,10 @@
description: "A wardrobe packed with stylish white clothing." description: "A wardrobe packed with stylish white clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: white_door
state_closed: white_door
- type: entity - type: entity
id: ClosetWallGrey id: ClosetWallGrey
@@ -134,11 +124,10 @@
description: "A wardrobe packed with a tide of grey clothing." description: "A wardrobe packed with a tide of grey clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: gray_door
state_closed: gray_door
- type: entity - type: entity
id: ClosetWallMixed id: ClosetWallMixed
@@ -147,11 +136,10 @@
description: "A wardrobe packed with a mix of colorful clothing." description: "A wardrobe packed with a mix of colorful clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: mixed_door
state_closed: mixed_door
- type: entity - type: entity
id: ClosetWallAtmospherics id: ClosetWallAtmospherics
@@ -159,11 +147,10 @@
name: atmospherics wall closet name: atmospherics wall closet
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: atmos_door
state_closed: atmos_door
- type: entity - type: entity
id: LockerWallMedical id: LockerWallMedical
@@ -171,10 +158,9 @@
name: medical wall locker name: medical wall locker
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: med
state: med stateDoorOpen: med_open
state_open: med_open stateDoorClosed: med_door
state_closed: med_door
- type: AccessReader - type: AccessReader
access: [["Medical"]] access: [["Medical"]]

View File

@@ -15,11 +15,10 @@
description: "A wardrobe packed with stylish blue clothing." description: "A wardrobe packed with stylish blue clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: blue_door
state_closed: blue_door
# Pink wardrobe # Pink wardrobe
- type: entity - type: entity
@@ -29,11 +28,10 @@
description: "A wardrobe packed with fabulous pink clothing." description: "A wardrobe packed with fabulous pink clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: pink_door
state_closed: pink_door
# Black wardrobe # Black wardrobe
- type: entity - type: entity
@@ -43,11 +41,10 @@
description: "A wardrobe packed with stylish black clothing." description: "A wardrobe packed with stylish black clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: black_door
state_closed: black_door
# Green wardrobe # Green wardrobe
- type: entity - type: entity
@@ -57,11 +54,10 @@
description: "A wardrobe packed with stylish green clothing." description: "A wardrobe packed with stylish green clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: green_door
state_closed: green_door
# Prison wardrobe # Prison wardrobe
- type: entity - type: entity
@@ -70,11 +66,10 @@
name: prison wardrobe name: prison wardrobe
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: orange_door
state_closed: orange_door
# Yellow wardrobe # Yellow wardrobe
- type: entity - type: entity
@@ -84,11 +79,10 @@
description: "A wardrobe packed with stylish yellow clothing." description: "A wardrobe packed with stylish yellow clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: yellow_door
state_closed: yellow_door
# White wardrobe # White wardrobe
- type: entity - type: entity
@@ -98,11 +92,10 @@
description: "A wardrobe packed with stylish white clothing." description: "A wardrobe packed with stylish white clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: white_door
state_closed: white_door
# Grey wardrobe # Grey wardrobe
- type: entity - type: entity
@@ -112,11 +105,10 @@
description: "A wardrobe packed with a tide of grey clothing." description: "A wardrobe packed with a tide of grey clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: grey_door
state_closed: grey_door
# Mixed wardrobe # Mixed wardrobe
- type: entity - type: entity
@@ -126,11 +118,10 @@
description: "A wardrobe packed with a mix of colorful clothing." description: "A wardrobe packed with a mix of colorful clothing."
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: mixed_door
state_closed: mixed_door
# Jobs # Jobs
@@ -140,11 +131,10 @@
name: security wardrobe name: security wardrobe
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: red_door
state_closed: red_door
- type: entity - type: entity
id: WardrobeAtmospherics id: WardrobeAtmospherics
@@ -152,11 +142,10 @@
name: atmospherics wardrobe name: atmospherics wardrobe
components: components:
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: generic
state: generic stateDoorOpen: generic_open
state_open: generic_open stateDoorClosed: atmos_wardrobe_door
state_closed: atmos_wardrobe_door
- type: entity - type: entity
id: ClosetJanitor id: ClosetJanitor

View File

@@ -16,6 +16,7 @@
sprite: Structures/Storage/Crates/generic.rsi sprite: Structures/Storage/Crates/generic.rsi
layers: layers:
- state: base - state: base
map: ["enum.StorageVisualLayers.Base"]
- state: closed - state: closed
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: welded - state: welded
@@ -50,10 +51,9 @@
- !type:DoActsBehavior - !type:DoActsBehavior
acts: ["Destruction"] acts: ["Destruction"]
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: open
state_open: open stateDoorClosed: closed
state_closed: closed
- type: PaperLabel - type: PaperLabel
labelSlot: labelSlot:
insertVerbText: Attach Label insertVerbText: Attach Label

View File

@@ -359,6 +359,7 @@
sprite: Structures/Storage/Crates/piratechest.rsi sprite: Structures/Storage/Crates/piratechest.rsi
layers: layers:
- state: crate - state: crate
map: ["enum.StorageVisualLayers.Base"]
- state: crate_door - state: crate_door
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
- state: welded - state: welded
@@ -368,7 +369,6 @@
sprite: Structures/Storage/Crates/piratechest.rsi sprite: Structures/Storage/Crates/piratechest.rsi
state: crate_icon state: crate_icon
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateDoorOpen: crate_open
state_open: crate_open stateDoorClosed: crate_door
state_closed: crate_door

View File

@@ -85,7 +85,7 @@
sprite: Structures/Storage/morgue.rsi sprite: Structures/Storage/morgue.rsi
layers: layers:
- state: crema_closed - state: crema_closed
map: ["enum.CrematoriumVisualLayers.Base"] map: ["enum.CrematoriumVisualLayers.Base", "enum.StorageVisualLayers.Base"]
- state: crema_tray - state: crema_tray
offset: 0, -1 offset: 0, -1
map: ["enum.StorageVisualLayers.Door"] map: ["enum.StorageVisualLayers.Door"]
@@ -127,11 +127,10 @@
containers: containers:
entity_storage: !type:Container entity_storage: !type:Container
- type: Appearance - type: Appearance
visuals: - type: EntityStorageVisuals
- type: StorageVisualizer stateBaseClosed: crema_closed
state: crema_closed stateBaseOpen: crema_open
state_alt: crema_open stateDoorOpen: crema_tray
state_open: crema_tray
- type: GenericVisualizer - type: GenericVisualizer
visuals: visuals:
enum.CrematoriumVisuals.Burning: enum.CrematoriumVisuals.Burning: