From f43683e3b996633cd3e2614e09fe55ade24b606c Mon Sep 17 00:00:00 2001 From: TemporalOroboros Date: Thu, 18 May 2023 11:03:20 -0700 Subject: [PATCH] Resolves StorageVisualizer is Obsolete (#13910) --- .../EntityStorageVisualizerSystem.cs | 82 +++++++ .../EntityStorageVisualsComponent.cs | 48 ++++ .../Storage/Visualizers/StorageVisualizer.cs | 111 --------- .../EntitySystems/EntityStorageSystem.cs | 4 +- Content.Shared/Lock/LockSystem.cs | 1 + .../SharedEntityStorageSystem.cs | 12 +- .../Consumable/Food/Containers/box.yml | 8 +- .../Objects/Specific/Medical/morgue.yml | 7 +- .../Xenoarchaeology/artifact_equipment.yml | 26 +- .../Structures/Machines/fatextractor.yml | 1 + .../Closets/Lockers/base_structurelockers.yml | 1 + .../Storage/Closets/Lockers/lockers.yml | 231 ++++++++---------- .../Storage/Closets/base_structureclosets.yml | 21 +- .../Structures/Storage/Closets/big_boxes.yml | 10 +- .../Structures/Storage/Closets/closets.yml | 90 +++---- .../Storage/Closets/wall_lockers.yml | 126 +++++----- .../Structures/Storage/Closets/wardrobe.yml | 99 ++++---- .../Storage/Crates/base_structurecrates.yml | 8 +- .../Structures/Storage/Crates/crates.yml | 8 +- .../Entities/Structures/Storage/morgue.yml | 11 +- 20 files changed, 436 insertions(+), 469 deletions(-) create mode 100644 Content.Client/Storage/Visualizers/EntityStorageVisualizerSystem.cs create mode 100644 Content.Client/Storage/Visualizers/EntityStorageVisualsComponent.cs delete mode 100644 Content.Client/Storage/Visualizers/StorageVisualizer.cs diff --git a/Content.Client/Storage/Visualizers/EntityStorageVisualizerSystem.cs b/Content.Client/Storage/Visualizers/EntityStorageVisualizerSystem.cs new file mode 100644 index 0000000000..39a8f3d932 --- /dev/null +++ b/Content.Client/Storage/Visualizers/EntityStorageVisualizerSystem.cs @@ -0,0 +1,82 @@ +using Content.Shared.Storage; +using Robust.Client.GameObjects; + +namespace Content.Client.Storage.Visualizers; + +public sealed class EntityStorageVisualizerSystem : VisualizerSystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnComponentInit); + } + + /// + /// Sets the base sprite to this layer. Exists to make the inheritance tree less boilerplate-y. + /// + private void OnComponentInit(EntityUid uid, EntityStorageVisualsComponent comp, ComponentInit args) + { + if (comp.StateBaseClosed == null) + return; + + comp.StateBaseOpen ??= comp.StateBaseClosed; + if (!TryComp(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(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(uid, StorageVisuals.CanLock, out var canLock, args.Component) && canLock) + { + if (!AppearanceSystem.TryGetData(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 +} diff --git a/Content.Client/Storage/Visualizers/EntityStorageVisualsComponent.cs b/Content.Client/Storage/Visualizers/EntityStorageVisualsComponent.cs new file mode 100644 index 0000000000..c3e8e5da9f --- /dev/null +++ b/Content.Client/Storage/Visualizers/EntityStorageVisualsComponent.cs @@ -0,0 +1,48 @@ +namespace Content.Client.Storage.Visualizers; + +[RegisterComponent] +[Access(typeof(EntityStorageVisualizerSystem))] +public sealed class EntityStorageVisualsComponent : Component +{ + /// + /// The RSI state used for the base layer of the storage entity sprite while the storage is closed. + /// + [DataField("stateBaseClosed")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateBaseClosed; + + /// + /// The RSI state used for the base layer of the storage entity sprite while the storage is open. + /// + [DataField("stateBaseOpen")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateBaseOpen; + + /// + /// The RSI state used for the door/lid while the storage is open. + /// + [DataField("stateDoorOpen")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateDoorOpen; + + /// + /// The RSI state used for the door/lid while the storage is closed. + /// + [DataField("stateDoorClosed")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateDoorClosed; + + /// + /// The RSI state used for the lock indicator while the storage is locked. + /// + [DataField("stateLocked")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateLocked = "locked"; + + /// + /// The RSI state used for the lock indicator while the storage is unlocked. + /// + [DataField("stateUnlocked")] + [ViewVariables(VVAccess.ReadWrite)] + public string? StateUnlocked = "unlocked"; +} diff --git a/Content.Client/Storage/Visualizers/StorageVisualizer.cs b/Content.Client/Storage/Visualizers/StorageVisualizer.cs deleted file mode 100644 index 44fe3526bb..0000000000 --- a/Content.Client/Storage/Visualizers/StorageVisualizer.cs +++ /dev/null @@ -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 - { - /// - /// Sets the base sprite to this layer. Exists to make the inheritance tree less boilerplate-y. - /// - [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().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(); - 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 - } -} diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index 509dec8a3d..a9866e73a2 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -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(uid, out var construction)) _construction.AddContainer(uid, ContainerName, construction); diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 79a0e26fbd..3c0f6560da 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -62,6 +62,7 @@ public sealed class LockSystem : EntitySystem private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) { _appearanceSystem.SetData(uid, StorageVisuals.CanLock, true); + _appearanceSystem.SetData(uid, StorageVisuals.Locked, lockComp.Locked); } private void OnActivated(EntityUid uid, LockComponent lockComp, ActivateInWorldEvent args) diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index 7b17cf4b7e..abcaec6cb6 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -43,8 +43,9 @@ public abstract class SharedEntityStorageSystem : EntitySystem /// public override void Initialize() { - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnInteract, after: new[]{typeof(LockSystem)}); + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentStartup); + SubscribeLocalEvent(OnInteract, after: new[] { typeof(LockSystem) }); SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnDestruction); SubscribeLocalEvent>(AddToggleOpenVerb); @@ -76,13 +77,18 @@ public abstract class SharedEntityStorageSystem : EntitySystem 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(uid, ContainerName); component.Contents.ShowContents = component.ShowContents; 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) { if (args.Handled) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index 2a52127b3b..4982eb8e2d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -203,6 +203,7 @@ drawdepth: SmallObjects layers: - state: box + map: ["enum.StorageVisualLayers.Base"] - state: box-open map: ["enum.StorageVisualLayers.Door"] netsync: false @@ -216,10 +217,9 @@ sprite: Objects/Consumable/Food/Baked/pizza.rsi heldPrefix: box - type: Appearance - visuals: - - type: StorageVisualizer - state_open: box-open - state_closed: box + - type: EntityStorageVisuals + stateDoorOpen: box-open + stateDoorClosed: box - type: StaticPrice price: 0 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index a4b6ea9929..74d53e078f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -12,7 +12,7 @@ sprite: Objects/Specific/Medical/Morgue/bodybags.rsi layers: - state: bag - map: ["unfoldedLayer"] + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] - state: bag_folded map: ["foldedLayer"] visible: false @@ -58,9 +58,8 @@ components: - Paper - type: Appearance - visuals: - - type: StorageVisualizer - state_open: open_overlay + - type: EntityStorageVisuals + stateDoorOpen: open_overlay - type: GenericVisualizer visuals: enum.PaperLabelVisuals.HasLabel: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index 6b06a0be90..0b0e4e265c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -11,15 +11,16 @@ drawdepth: Objects sprite: Structures/Storage/Crates/artifact.rsi layers: - - state: artifact_container - - state: artifact_container_door - map: ["enum.StorageVisualLayers.Door"] - - state: welded - visible: false - map: ["enum.WeldableLayers.BaseWelded"] - - state: locked - map: ["enum.StorageVisualLayers.Lock"] - shader: unshaded + - state: artifact_container + map: ["enum.StorageVisualLayers.Base"] + - state: artifact_container_door + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - state: locked + map: ["enum.StorageVisualLayers.Lock"] + shader: unshaded - type: InteractionOutline - type: Physics - type: Fixtures @@ -64,10 +65,9 @@ components: - Paper - type: Appearance - visuals: - - type: StorageVisualizer - state_open: artifact_container_open - state_closed: artifact_container_door + - type: EntityStorageVisuals + stateDoorOpen: artifact_container_open + stateDoorClosed: artifact_container_door - type: ItemSlots - type: ContainerContainer containers: diff --git a/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml b/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml index 3914f5e5e2..aeaedb0f6b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml @@ -16,6 +16,7 @@ snapCardinals: true layers: - state: fat + map: ["enum.StorageVisualLayers.Base"] - state: fat_door_off map: ["enum.StorageVisualLayers.Door"] - state: fat_red diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml index 5266cc8ae0..145a587208 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml @@ -11,6 +11,7 @@ noRot: true layers: - state: generic + map: ["enum.StorageVisualLayers.Base"] - state: generic_door map: ["enum.StorageVisualLayers.Door"] - state: locked diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index bc6e056e25..0a9037499a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -5,11 +5,10 @@ description: This is where the bartender keeps the booze. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: cabinet - state_open: cabinet_open - state_closed: cabinet_door + - type: EntityStorageVisuals + stateBaseClosed: cabinet + stateDoorOpen: cabinet_open + stateDoorClosed: cabinet_door - type: AccessReader access: [["Bar"]] @@ -26,11 +25,10 @@ name: quartermaster's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: qm - state_open: qm_open - state_closed: qm_door + - type: EntityStorageVisuals + stateBaseClosed: qm + stateDoorOpen: qm_open + stateDoorClosed: qm_door - type: AccessReader access: [["Quartermaster"]] @@ -41,11 +39,10 @@ description: Nevermind the pickaxe. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: mining - state_open: mining_open - state_closed: mining_door + - type: EntityStorageVisuals + stateBaseClosed: mining + stateDoorOpen: mining_open + stateDoorClosed: mining_door - type: AccessReader access: [["Salvage"]] @@ -56,11 +53,10 @@ name: captain's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: cap - state_open: cap_open - state_closed: cap_door + - type: EntityStorageVisuals + stateBaseClosed: cap + stateDoorOpen: cap_open + stateDoorClosed: cap_door - type: AccessReader access: [["Captain"]] @@ -70,11 +66,10 @@ name: head of personnel's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: hop - state_open: hop_open - state_closed: hop_door + - type: EntityStorageVisuals + stateBaseClosed: hop + stateDoorOpen: hop_open + stateDoorClosed: hop_door - type: AccessReader access: [["HeadOfPersonnel"]] @@ -85,11 +80,10 @@ name: chief engineer's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: ce - state_open: ce_open - state_closed: ce_door + - type: EntityStorageVisuals + stateBaseClosed: ce + stateDoorOpen: ce_open + stateDoorClosed: ce_door - type: AccessReader access: [ [ "ChiefEngineer" ] ] @@ -100,11 +94,10 @@ name: electrical supplies locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: eng - state_open: eng_open - state_closed: eng_elec_door + - type: EntityStorageVisuals + stateBaseClosed: eng + stateDoorOpen: eng_open + stateDoorClosed: eng_elec_door - type: AccessReader access: [ [ "Engineering" ] ] @@ -115,11 +108,10 @@ name: welding supplies locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: eng - state_open: eng_open - state_closed: eng_weld_door + - type: EntityStorageVisuals + stateBaseClosed: eng + stateDoorOpen: eng_open + stateDoorClosed: eng_weld_door - type: AccessReader access: [ [ "Engineering" ] ] @@ -130,11 +122,10 @@ name: atmospheric technician's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: atmos - state_open: atmos_open - state_closed: atmos_door + - type: EntityStorageVisuals + stateBaseClosed: atmos + stateDoorOpen: atmos_open + stateDoorClosed: atmos_door - type: AccessReader access: [ [ "Atmospherics" ] ] @@ -145,11 +136,10 @@ name: engineer's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: eng_secure - state_open: eng_secure_open - state_closed: eng_secure_door + - type: EntityStorageVisuals + stateBaseClosed: eng_secure + stateDoorOpen: eng_secure_open + stateDoorClosed: eng_secure_door - type: AccessReader access: [ [ "Engineering" ] ] @@ -160,11 +150,10 @@ name: freezer components: - type: Appearance - visuals: - - type: StorageVisualizer - state: freezer - state_open: freezer_open - state_closed: freezer_door + - type: EntityStorageVisuals + stateBaseClosed: freezer + stateDoorOpen: freezer_open + stateDoorClosed: freezer_door - type: AccessReader access: [ [ "Kitchen" ] ] - type: ExplosionResistance @@ -178,11 +167,10 @@ name: botanist's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: hydro - state_open: hydro_open - state_closed: hydro_door + - type: EntityStorageVisuals + stateBaseClosed: hydro + stateDoorOpen: hydro_open + stateDoorClosed: hydro_door - type: AccessReader access: [ [ "Hydroponics" ] ] @@ -194,11 +182,10 @@ description: Filled to the brim with medical junk. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: med - state_open: med_open - state_closed: med_door + - type: EntityStorageVisuals + stateBaseClosed: med + stateDoorOpen: med_open + stateDoorClosed: med_door - type: AccessReader access: [ [ "Medical" ] ] @@ -209,11 +196,10 @@ name: medical doctor's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: med_secure - state_open: med_secure_open - state_closed: med_secure_door + - type: EntityStorageVisuals + stateBaseClosed: med_secure + stateDoorOpen: med_secure_open + stateDoorClosed: med_secure_door - type: AccessReader access: [ [ "Medical" ] ] @@ -224,11 +210,10 @@ name: paramedic's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: paramed - state_open: paramed_open - state_closed: paramed_door + - type: EntityStorageVisuals + stateBaseClosed: paramed + stateDoorOpen: paramed_open + stateDoorClosed: paramed_door - type: AccessReader access: [ [ "Medical" ] ] @@ -240,11 +225,10 @@ name: chemical locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: med - state_open: med_open - state_closed: chemical_door + - type: EntityStorageVisuals + stateBaseClosed: med + stateDoorOpen: med_open + stateDoorClosed: chemical_door - type: AccessReader access: [ [ "Chemistry" ] ] @@ -255,11 +239,10 @@ name: chief medical officer's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: cmo - state_open: cmo_open - state_closed: cmo_door + - type: EntityStorageVisuals + stateBaseClosed: cmo + stateDoorOpen: cmo_open + stateDoorClosed: cmo_door - type: AccessReader access: [ [ "ChiefMedicalOfficer" ] ] @@ -270,11 +253,10 @@ name: research director's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: rd - state_open: rd_open - state_closed: rd_door + - type: EntityStorageVisuals + stateBaseClosed: rd + stateDoorOpen: rd_open + stateDoorClosed: rd_door - type: AccessReader access: [ [ "ResearchDirector" ] ] @@ -283,14 +265,13 @@ parent: LockerBase name: scientist's locker components: - - type: Appearance - visuals: - - type: StorageVisualizer - state: science - state_open: science_open - state_closed: science_door - - type: AccessReader - access: [ [ "Research" ] ] + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: science + stateDoorOpen: science_open + stateDoorClosed: science_door + - type: AccessReader + access: [ [ "Research" ] ] # HoS - type: entity @@ -299,11 +280,10 @@ name: head of security's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: hos - state_open: hos_open - state_closed: hos_door + - type: EntityStorageVisuals + stateBaseClosed: hos + stateDoorOpen: hos_open + stateDoorClosed: hos_door - type: AccessReader access: [["HeadOfSecurity"]] @@ -314,11 +294,10 @@ name: warden's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: warden - state_open: warden_open - state_closed: warden_door + - type: EntityStorageVisuals + stateBaseClosed: warden + stateDoorOpen: warden_open + stateDoorClosed: warden_door - type: AccessReader access: [["Armory"]] @@ -329,11 +308,10 @@ name: brigmedic locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: brigmedic - state_open: armory_open - state_closed: brigmedic_door + - type: EntityStorageVisuals + stateBaseClosed: brigmedic + stateDoorOpen: armory_open + stateDoorClosed: brigmedic_door - type: AccessReader access: [["Medical"]] @@ -344,11 +322,10 @@ name: security officer's locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: sec - state_open: sec_open - state_closed: sec_door + - type: EntityStorageVisuals + stateBaseClosed: sec + stateDoorOpen: sec_open + stateDoorClosed: sec_door - type: AccessReader access: [["Security"]] @@ -358,11 +335,10 @@ name: gun safe components: - type: Appearance - visuals: - - type: StorageVisualizer - state: shotguncase - state_open: shotguncase_open - state_closed: shotguncase_door + - type: EntityStorageVisuals + stateBaseClosed: shotguncase + stateDoorOpen: shotguncase_open + stateDoorClosed: shotguncase_door - type: AccessReader access: [["Armory"]] @@ -393,11 +369,10 @@ description: It's a personal storage unit for operative gear. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: syndicate - state_open: syndicate_open - state_closed: syndicate_door + - type: EntityStorageVisuals + stateBaseClosed: syndicate + stateDoorOpen: syndicate_open + stateDoorClosed: syndicate_door # Bluespace - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 326572a3af..3ed6aa27dc 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -13,6 +13,7 @@ sprite: Structures/Storage/closet.rsi layers: - state: generic + map: ["enum.StorageVisualLayers.Base"] - state: generic_door map: ["enum.StorageVisualLayers.Door"] - state: welded @@ -81,11 +82,10 @@ min: 1 max: 1 - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: generic_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: generic_door #Wall Closet - type: entity @@ -113,6 +113,7 @@ sprite: Structures/Storage/wall_locker.rsi layers: - state: generic + map: ["enum.StorageVisualLayers.Base"] - state: generic_door map: ["enum.StorageVisualLayers.Door"] - state: welded @@ -168,6 +169,7 @@ sprite: Structures/Storage/wall_locker.rsi layers: - state: generic + map: ["enum.StorageVisualLayers.Base"] - state: generic_door map: ["enum.StorageVisualLayers.Door"] - state: locked @@ -255,8 +257,7 @@ min: 1 max: 1 - type: Appearance - visuals: - - type: StorageVisualizer - state: base - state_open: base - state_closed: closed + - type: EntityStorageVisuals + stateBase: base + stateDoorOpen: base + stateDoorClosed: closed diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml index 25d7b946e0..b22288627e 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml @@ -41,13 +41,13 @@ sprite: Structures/Storage/closet.rsi layers: - state: cardboard + map: ["enum.StorageVisualLayers.Base"] - state: cardboard_open map: ["enum.StorageVisualLayers.Door"] - type: Appearance - visuals: - - type: StorageVisualizer - state: cardboard - state_open: cardboard_open + - type: EntityStorageVisuals + stateBaseClosed: cardboard + stateDoorOpen: cardboard_open - type: Tag tags: - DoorBumpOpener @@ -124,7 +124,7 @@ noRot: true netsync: false layers: - - state: "cardboard_special" + - state: "cardboard_special" - type: TimedDespawn lifetime: 1 - type: Tag diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml index 18b2a1ed3a..c8136546ee 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/closets.yml @@ -6,11 +6,10 @@ description: It's a storage unit for tools. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: eng - state_open: eng_open - state_closed: eng_tool_door + - type: EntityStorageVisuals + stateBaseClosed: eng + stateDoorOpen: eng_open + stateDoorClosed: eng_tool_door # Radiation suit closet - type: entity @@ -20,11 +19,10 @@ description: "More comfortable than radiation poisioning." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: eng - state_open: eng_open - state_closed: eng_rad_door + - type: EntityStorageVisuals + stateBaseClosed: eng + stateDoorOpen: eng_open + stateDoorClosed: eng_rad_door # Emergency closet - type: entity @@ -34,11 +32,10 @@ description: It's a storage unit for emergency breath masks and O2 tanks. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: emergency - state_open: emergency_open - state_closed: emergency_door + - type: EntityStorageVisuals + stateBaseClosed: emergency + stateDoorOpen: emergency_open + stateDoorClosed: emergency_door # Fire safety closet - type: entity @@ -48,11 +45,10 @@ description: It's a storage unit for fire-fighting supplies. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: fire - state_open: fire_open - state_closed: fire_door + - type: EntityStorageVisuals + stateBaseClosed: fire + stateDoorOpen: fire_open + stateDoorClosed: fire_door # EOD closet - type: entity @@ -62,11 +58,10 @@ description: It's a storage unit for explosion-protective suits. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: bomb - state_open: bomb_open - state_closed: bomb_door + - type: EntityStorageVisuals + stateBaseClosed: bomb + stateDoorOpen: bomb_open + stateDoorClosed: bomb_door # Biohazard @@ -78,11 +73,10 @@ description: It's a storage unit for level 3 biohazard gear. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: bio - state_open: bio_open - state_closed: bio_door + - type: EntityStorageVisuals + stateBaseClosed: bio + stateDoorOpen: bio_open + stateDoorClosed: bio_door # Virology variant - type: entity @@ -90,11 +84,10 @@ parent: ClosetL3 components: - type: Appearance - visuals: - - type: StorageVisualizer - state: bio_viro - state_open: bio_viro_open - state_closed: bio_viro_door + - type: EntityStorageVisuals + stateBaseClosed: bio_viro + stateDoorOpen: bio_viro_open + stateDoorClosed: bio_viro_door # Security variant - type: entity @@ -102,11 +95,10 @@ parent: ClosetL3 components: - type: Appearance - visuals: - - type: StorageVisualizer - state: bio_sec - state_open: bio_sec_open - state_closed: bio_sec_door + - type: EntityStorageVisuals + stateBaseClosed: bio_sec + stateDoorOpen: bio_sec_open + stateDoorClosed: bio_sec_door # Janitor variant - type: entity @@ -114,11 +106,10 @@ parent: ClosetL3 components: - type: Appearance - visuals: - - type: StorageVisualizer - state: bio_jan - state_open: bio_jan_open - state_closed: bio_jan_door + - type: EntityStorageVisuals + stateBaseClosed: bio_jan + stateDoorOpen: bio_jan_open + stateDoorClosed: bio_jan_door # Maintenance closet - type: entity @@ -127,11 +118,10 @@ parent: ClosetBase description: It's a storage unit. components: - - type: Appearance - visuals: - - type: StorageVisualizer - state_open: generic_open - state_closed: generic_door + - type: Appearance + - type: EntityStorageVisuals + stateDoorOpen: generic_open + stateDoorClosed: generic_door # Bluespace closet - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml index 4000430b5e..4280b960b4 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml @@ -5,11 +5,10 @@ description: It's a storage unit. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: generic_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: generic_door - type: entity id: ClosetWallEmergency @@ -18,11 +17,10 @@ description: It's a storage unit for emergency breath masks and O2 tanks. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: emergency - state_open: emergency_open - state_closed: emergency_door + - type: EntityStorageVisuals + stateBaseClosed: emergency + stateDoorOpen: emergency_open + stateDoorClosed: emergency_door - type: entity id: ClosetWallFire @@ -31,11 +29,10 @@ description: It's a storage unit for fire-fighting supplies. components: - type: Appearance - visuals: - - type: StorageVisualizer - state: fire - state_open: fire_open - state_closed: fire_door + - type: EntityStorageVisuals + stateBaseClosed: fire + stateDoorOpen: fire_open + stateDoorClosed: fire_door - type: entity id: ClosetWallBlue @@ -44,11 +41,10 @@ description: "A wardrobe packed with stylish blue clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: blue_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: blue_door - type: entity id: ClosetWallPink @@ -57,11 +53,10 @@ description: "A wardrobe packed with fabulous pink clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: pink_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: pink_door - type: entity id: ClosetWallBlack @@ -70,11 +65,10 @@ description: "A wardrobe packed with stylish black clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: black_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: black_door - type: entity id: ClosetWallGreen @@ -83,11 +77,10 @@ description: "A wardrobe packed with stylish green clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: green_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: green_door - type: entity id: ClosetWallOrange @@ -95,11 +88,10 @@ name: prison wall closet components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: orange_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: orange_door - type: entity id: ClosetWallYellow @@ -108,11 +100,10 @@ description: "A wardrobe packed with stylish yellow clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: yellow_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: yellow_door - type: entity id: ClosetWallWhite @@ -121,11 +112,10 @@ description: "A wardrobe packed with stylish white clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: white_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: white_door - type: entity id: ClosetWallGrey @@ -134,11 +124,10 @@ description: "A wardrobe packed with a tide of grey clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: gray_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: gray_door - type: entity id: ClosetWallMixed @@ -147,11 +136,10 @@ description: "A wardrobe packed with a mix of colorful clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: mixed_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: mixed_door - type: entity id: ClosetWallAtmospherics @@ -159,11 +147,10 @@ name: atmospherics wall closet components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: atmos_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: atmos_door - type: entity id: LockerWallMedical @@ -171,10 +158,9 @@ name: medical wall locker components: - type: Appearance - visuals: - - type: StorageVisualizer - state: med - state_open: med_open - state_closed: med_door + - type: EntityStorageVisuals + stateBaseClosed: med + stateDoorOpen: med_open + stateDoorClosed: med_door - type: AccessReader access: [["Medical"]] \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/wardrobe.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/wardrobe.yml index e58d55547d..01e8749d9f 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/wardrobe.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/wardrobe.yml @@ -15,11 +15,10 @@ description: "A wardrobe packed with stylish blue clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: blue_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: blue_door # Pink wardrobe - type: entity @@ -29,11 +28,10 @@ description: "A wardrobe packed with fabulous pink clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: pink_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: pink_door # Black wardrobe - type: entity @@ -43,11 +41,10 @@ description: "A wardrobe packed with stylish black clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: black_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: black_door # Green wardrobe - type: entity @@ -57,11 +54,10 @@ description: "A wardrobe packed with stylish green clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: green_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: green_door # Prison wardrobe - type: entity @@ -70,11 +66,10 @@ name: prison wardrobe components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: orange_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: orange_door # Yellow wardrobe - type: entity @@ -84,11 +79,10 @@ description: "A wardrobe packed with stylish yellow clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: yellow_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: yellow_door # White wardrobe - type: entity @@ -98,11 +92,10 @@ description: "A wardrobe packed with stylish white clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: white_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: white_door # Grey wardrobe - type: entity @@ -112,11 +105,10 @@ description: "A wardrobe packed with a tide of grey clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: grey_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: grey_door # Mixed wardrobe - type: entity @@ -126,11 +118,10 @@ description: "A wardrobe packed with a mix of colorful clothing." components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: mixed_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: mixed_door # Jobs @@ -140,11 +131,10 @@ name: security wardrobe components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: red_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: red_door - type: entity id: WardrobeAtmospherics @@ -152,11 +142,10 @@ name: atmospherics wardrobe components: - type: Appearance - visuals: - - type: StorageVisualizer - state: generic - state_open: generic_open - state_closed: atmos_wardrobe_door + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: atmos_wardrobe_door - type: entity id: ClosetJanitor diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml index 1f253fe6f1..e943b7e219 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml @@ -16,6 +16,7 @@ sprite: Structures/Storage/Crates/generic.rsi layers: - state: base + map: ["enum.StorageVisualLayers.Base"] - state: closed map: ["enum.StorageVisualLayers.Door"] - state: welded @@ -50,10 +51,9 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Appearance - visuals: - - type: StorageVisualizer - state_open: open - state_closed: closed + - type: EntityStorageVisuals + stateDoorOpen: open + stateDoorClosed: closed - type: PaperLabel labelSlot: insertVerbText: Attach Label diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index 671ca28ee3..e2065ee23f 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -359,6 +359,7 @@ sprite: Structures/Storage/Crates/piratechest.rsi layers: - state: crate + map: ["enum.StorageVisualLayers.Base"] - state: crate_door map: ["enum.StorageVisualLayers.Door"] - state: welded @@ -368,7 +369,6 @@ sprite: Structures/Storage/Crates/piratechest.rsi state: crate_icon - type: Appearance - visuals: - - type: StorageVisualizer - state_open: crate_open - state_closed: crate_door + - type: EntityStorageVisuals + stateDoorOpen: crate_open + stateDoorClosed: crate_door diff --git a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml index f082615106..7052ffa815 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml @@ -85,7 +85,7 @@ sprite: Structures/Storage/morgue.rsi layers: - state: crema_closed - map: ["enum.CrematoriumVisualLayers.Base"] + map: ["enum.CrematoriumVisualLayers.Base", "enum.StorageVisualLayers.Base"] - state: crema_tray offset: 0, -1 map: ["enum.StorageVisualLayers.Door"] @@ -127,11 +127,10 @@ containers: entity_storage: !type:Container - type: Appearance - visuals: - - type: StorageVisualizer - state: crema_closed - state_alt: crema_open - state_open: crema_tray + - type: EntityStorageVisuals + stateBaseClosed: crema_closed + stateBaseOpen: crema_open + stateDoorOpen: crema_tray - type: GenericVisualizer visuals: enum.CrematoriumVisuals.Burning: