diff --git a/Content.Client/Smoking/BurnStateVisualizer.cs b/Content.Client/Smoking/BurnStateVisualizer.cs deleted file mode 100644 index a67f156dde..0000000000 --- a/Content.Client/Smoking/BurnStateVisualizer.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Shared.Smoking; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Client.Smoking -{ - [UsedImplicitly] - public sealed class BurnStateVisualizer : AppearanceVisualizer, ISerializationHooks - { - [Dependency] private readonly IEntityManager _entMan = default!; - - [DataField("burntIcon")] - private string _burntIcon = "burnt-icon"; - [DataField("litIcon")] - private string _litIcon = "lit-icon"; - [DataField("unlitIcon")] - private string _unlitIcon = "icon"; - - void ISerializationHooks.AfterDeserialization() - { - IoCManager.InjectDependencies(this); - } - - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - - if (!_entMan.TryGetComponent(component.Owner, out SpriteComponent? sprite)) - return; - - if (!component.TryGetData(SmokingVisuals.Smoking, out var burnState)) - return; - - var state = burnState switch - { - SmokableState.Lit => _litIcon, - SmokableState.Burnt => _burntIcon, - _ => _unlitIcon - }; - - sprite.LayerSetState(0, state); - } - } -} diff --git a/Content.Client/Smoking/BurnStateVisualizerSystem.cs b/Content.Client/Smoking/BurnStateVisualizerSystem.cs new file mode 100644 index 0000000000..d0aa9a4bcd --- /dev/null +++ b/Content.Client/Smoking/BurnStateVisualizerSystem.cs @@ -0,0 +1,25 @@ +using Robust.Client.GameObjects; +using Content.Shared.Smoking; + +namespace Content.Client.Smoking; + +public sealed class BurnStateVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, BurnStateVisualsComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + if (!args.AppearanceData.TryGetValue(SmokingVisuals.Smoking, out var burnState)) + return; + + var state = burnState switch + { + SmokableState.Lit => component.LitIcon, + SmokableState.Burnt => component.BurntIcon, + _ => component.UnlitIcon + }; + + args.Sprite.LayerSetState(0, state); + } +} + diff --git a/Content.Client/Smoking/BurnStateVisualsComponent.cs b/Content.Client/Smoking/BurnStateVisualsComponent.cs new file mode 100644 index 0000000000..42eb026785 --- /dev/null +++ b/Content.Client/Smoking/BurnStateVisualsComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Client.Smoking; + +[RegisterComponent] +public sealed class BurnStateVisualsComponent : Component +{ + [DataField("burntIcon")] + public string BurntIcon = "burnt-icon"; + [DataField("litIcon")] + public string LitIcon = "lit-icon"; + [DataField("unlitIcon")] + public string UnlitIcon = "icon"; +} + diff --git a/Content.Shared/Smoking/SmokableState.cs b/Content.Shared/Smoking/SmokableState.cs index 3206acb15b..016dc587c0 100644 --- a/Content.Shared/Smoking/SmokableState.cs +++ b/Content.Shared/Smoking/SmokableState.cs @@ -1,4 +1,4 @@ -using Robust.Shared.Serialization; +using Robust.Shared.Serialization; namespace Content.Shared.Smoking { diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Pipes/pipe.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Pipes/pipe.yml index 171fb87478..009bc9880c 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Pipes/pipe.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Pipes/pipe.yml @@ -16,9 +16,8 @@ size: 3 sprite: Objects/Consumable/Smokeables/Pipes/pipe.rsi - type: Appearance - visuals: - - type: BurnStateVisualizer - unlitIcon: unlit-icon + - type: BurnStateVisuals + unlitIcon: unlit-icon - type: entity id: SmokingPipeFilledTobacco @@ -31,15 +30,15 @@ bowl_slot: !type:ContainerSlot - type: ItemSlots - type: SmokingPipe - bowl_slot: + bowl_slot: name: Bowl startingItem: GroundTobacco whitelist: tags: - Smokable - insertSound: + insertSound: path: /Audio/Weapons/Guns/Empty/empty.ogg - ejectSound: + ejectSound: path: /Audio/Weapons/Guns/Empty/empty.ogg - type: entity @@ -53,13 +52,13 @@ bowl_slot: !type:ContainerSlot - type: ItemSlots - type: SmokingPipe - bowl_slot: + bowl_slot: name: Bowl startingItem: GroundCannabis whitelist: tags: - Smokable - insertSound: + insertSound: + path: /Audio/Weapons/Guns/Empty/empty.ogg + ejectSound: path: /Audio/Weapons/Guns/Empty/empty.ogg - ejectSound: - path: /Audio/Weapons/Guns/Empty/empty.ogg \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/base_smokeables.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/base_smokeables.yml index c534b73094..419ab76391 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/base_smokeables.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/base_smokeables.yml @@ -8,8 +8,7 @@ - type: Sprite netsync: false - type: Appearance - visuals: - - type: BurnStateVisualizer + - type: BurnStateVisuals - type: Tag tags: - Trash diff --git a/Resources/Prototypes/Entities/Objects/Tools/matches.yml b/Resources/Prototypes/Entities/Objects/Tools/matches.yml index 3700a1bfb1..d7ece96c7d 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/matches.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/matches.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: SmallboxItem parent: BaseStorageItem abstract: true @@ -37,11 +37,10 @@ radius: 1.1 color: darkorange - type: Appearance - visuals: - - type: BurnStateVisualizer - unlitIcon: match_unlit - litIcon: match_lit - burntIcon: match_burnt + - type: BurnStateVisuals + unlitIcon: match_unlit + litIcon: match_lit + burntIcon: match_burnt - type: entity parent: Matchstick