+++ /dev/null
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using JetBrains.Annotations;
-using Robust.Client.GameObjects;
-using Robust.Shared.GameObjects;
-using Robust.Shared.IoC;
-using Robust.Shared.Log;
-using Robust.Shared.Reflection;
-using Robust.Shared.Serialization;
-using Robust.Shared.Serialization.Manager.Attributes;
-
-namespace Content.Client.Visualizer
-{
- [UsedImplicitly]
- public sealed class GenericEnumVisualizer : AppearanceVisualizer, ISerializationHooks
- {
- public Enum Key { get; set; } = default!;
-
- public Dictionary<object, string> States { get; set; } = default!;
-
- [DataField("layer")]
- public int Layer { get; set; } = 0;
-
- [DataField("key", readOnly: true, required: true)]
- private string _keyRaw = default!;
-
- [DataField("states", readOnly: true, required: true)]
- private Dictionary<string, string> _statesRaw { get; set; } = default!;
-
- void ISerializationHooks.AfterDeserialization()
- {
- var reflectionManager = IoCManager.Resolve<IReflectionManager>();
-
- object ResolveRef(string raw)
- {
- if (reflectionManager.TryParseEnumReference(raw, out var @enum))
- {
- return @enum;
- }
- else
- {
- Logger.WarningS("c.c.v.genum", $"Unable to convert enum reference: {raw}");
- }
-
- return raw;
- }
-
- // It's important that this conversion be done here so that it may "fail-fast".
- Key = (Enum) ResolveRef(_keyRaw);
- States = _statesRaw.ToDictionary(kvp => ResolveRef(kvp.Key), kvp => kvp.Value);
- }
-
- [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;
- if (!component.TryGetData(Key, out object status)) return;
- if (!States.TryGetValue(status, out var val)) return;
- sprite.LayerSetState(Layer, val);
- }
- }
-}
layers:
- state: shell
sprite: Mobs/Silicon/drone.rsi
+ map: ["base"]
- type: MovementIgnoreGravity
- type: Fixtures
fixtures:
layer:
- SmallMobLayer
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.DroneVisuals.Status
- layer: 0
- states:
- enum.DroneStatus.Off: shell
- enum.DroneStatus.On: drone
+ enum.DroneVisuals.Status:
+ base:
+ Off: { state: shell }
+ On: { state: drone }
- type: ReplacementAccent
accent: silicon
- type: Repairable
drawdepth: SmallMobs # if mice can hide under tables, so can mousetraps
layers:
- state: mousetrap
+ map: ["base"]
- type: StepTrigger
intersectRatio: 0.2
requiredTriggeredSpeed: 0
- type: Item
sprite: Objects/Devices/mousetrap.rsi
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.MousetrapVisuals.Visual
- layer: 0
- states:
- enum.MousetrapVisuals.Armed: mousetraparmed
- enum.MousetrapVisuals.Unarmed: mousetrap
+ enum.MousetrapVisuals.Visual:
+ base:
+ Armed: { state: mousetraparmed }
+ Unarmed: { state: mousetrap }
- type: Physics
bodyType: Dynamic
- type: CollisionWake
- type: Sprite
sprite: Objects/Devices/payload.rsi
state: payload-empty
+ layers:
+ - state: payload-empty
+ map: ["base"]
- type: ChemicalPayload
beakerSlotA: &slotDef
whitelist:
swap: false
beakerSlotB: *slotDef
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.ChemicalPayloadVisuals.Slots
- states:
- enum.ChemicalPayloadFilledSlots.None: payload-empty
- enum.ChemicalPayloadFilledSlots.Left: payload-chemical-left
- enum.ChemicalPayloadFilledSlots.Right: payload-chemical-right
- enum.ChemicalPayloadFilledSlots.Both: payload-chemical-armed
+ enum.ChemicalPayloadVisuals.Slots:
+ base:
+ None: { state: payload-empty }
+ Left: { state: payload-chemical-left }
+ Right: { state: payload-chemical-right }
+ Both: { state: payload-chemical-armed }
- type: ItemSlots
- type: ContainerContainer
containers:
- state: pai-base
- state: pai-off-overlay
shader: unshaded
+ map: ["screen"]
- type: Input
context: "human"
- type: PAI
allowedStates:
- Alive
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.PAIVisuals.Status
- layer: 1
- states:
- enum.PAIStatus.Off: pai-off-overlay
- enum.PAIStatus.Searching: pai-searching-overlay
- enum.PAIStatus.On: pai-on-overlay
-
+ enum.PAIVisuals.Status:
+ screen:
+ Off: { state: pai-off-overlay }
+ Searching: { state: pai-searching-overlay }
+ On: { state: pai-on-overlay }
netsync: false
layers:
- state: tray-off
+ map: ["base"]
- type: TrayScanner
- type: Item
sprite: Objects/Tools/t-ray.rsi
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.TrayScannerVisual.Visual
- layer: 0
- states:
- enum.TrayScannerVisual.On: tray-on
- enum.TrayScannerVisual.Off: tray-off
+ enum.TrayScannerVisual.Visual:
+ base:
+ On: { state: tray-on }
+ Off: { state: tray-off }
- type: Tag
tags:
- DroneUsable
sprite: Objects/Weapons/Bombs/hot_potato.rsi
state: icon
netsync: false
+ layers:
+ - state: icon
+ map: ["base"]
- type: Item
sprite: Objects/Weapons/Bombs/hot_potato.rsi
size: 5
types:
Heat: 1
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.Trigger.TriggerVisuals.VisualState
- states:
- enum.Trigger.TriggerVisualState.Primed: activated
- enum.Trigger.TriggerVisualState.Unprimed: complete
+ enum.Trigger.TriggerVisuals.VisualState:
+ base:
+ Primed: { state: activated }
+ Unprimed: { state: complete }
- type: entity
id: HotPotatoEffect
parent: BaseItem
id: C4
components:
- - type: Sprite
- sprite: Objects/Weapons/Bombs/c4.rsi
- state: icon
- - type: Item
- sprite: Objects/Weapons/Bombs/c4.rsi
- size: 10
- - type: OnUseTimerTrigger
- delay: 10
- delayOptions: [10, 30, 60, 120, 300]
- initialBeepDelay: 0
- beepSound: /Audio/Machines/Nuke/general_beep.ogg
- startOnStick: true
- canToggleStartOnStick: true
- - type: TriggerOnSignal
- - type: DeviceLinkSink
- ports:
- - Trigger
- - type: Sticky
- stickDelay: 5
- unstickDelay: 5
- stickPopupStart: comp-sticky-start-stick-bomb
- stickPopupSuccess: comp-sticky-success-stick-bomb
- unstickPopupStart: comp-sticky-start-unstick-bomb
- unstickPopupSuccess: comp-sticky-success-unstick-bomb
- blacklist: # can't stick it to other items
- components:
- - Item
- - type: Explosive # Powerful explosion in a very small radius. Doesn't break underplating.
- explosionType: DemolitionCharge
- totalIntensity: 60
- intensitySlope: 5
- maxIntensity: 30
- canCreateVacuum: false
- - type: ExplodeOnTrigger
- - type: Damageable
- damageContainer: Inorganic
- - type: Destructible
- thresholds:
- - trigger:
- !type:DamageTrigger
- damage: 50
- behaviors:
- - !type:DoActsBehavior
- acts: ["Destruction"]
- - !type:ExplodeBehavior
- - type: StickyVisualizer
- - type: Appearance
- visuals:
- - type: GenericEnumVisualizer
- key: enum.Trigger.TriggerVisuals.VisualState
- states:
- enum.Trigger.TriggerVisualState.Primed: primed
- enum.Trigger.TriggerVisualState.Unprimed: complete
+ - type: Sprite
+ sprite: Objects/Weapons/Bombs/c4.rsi
+ state: icon
+ layers:
+ - state: icon
+ map: ["base"]
+ - type: Item
+ sprite: Objects/Weapons/Bombs/c4.rsi
+ size: 10
+ - type: OnUseTimerTrigger
+ delay: 10
+ delayOptions: [10, 30, 60, 120, 300]
+ initialBeepDelay: 0
+ beepSound: /Audio/Machines/Nuke/general_beep.ogg
+ startOnStick: true
+ canToggleStartOnStick: true
+ - type: TriggerOnSignal
+ - type: DeviceLinkSink
+ ports:
+ - Trigger
+ - type: Sticky
+ stickDelay: 5
+ unstickDelay: 5
+ stickPopupStart: comp-sticky-start-stick-bomb
+ stickPopupSuccess: comp-sticky-success-stick-bomb
+ unstickPopupStart: comp-sticky-start-unstick-bomb
+ unstickPopupSuccess: comp-sticky-success-unstick-bomb
+ blacklist: # can't stick it to other items
+ components:
+ - Item
+ - type: Explosive # Powerful explosion in a very small radius. Doesn't break underplating.
+ explosionType: DemolitionCharge
+ totalIntensity: 60
+ intensitySlope: 5
+ maxIntensity: 30
+ canCreateVacuum: false
+ - type: ExplodeOnTrigger
+ - type: Damageable
+ damageContainer: Inorganic
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:ExplodeBehavior
+ - type: StickyVisualizer
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.Trigger.TriggerVisuals.VisualState:
+ base:
+ Primed: { state: primed }
+ Unprimed: { state: complete }
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Appearance
- visuals:
- - type: GenericEnumVisualizer
- key: enum.Trigger.TriggerVisuals.VisualState
- states:
- enum.Trigger.TriggerVisualState.Primed: primed
- enum.Trigger.TriggerVisualState.Unprimed: complete
- type: GenericVisualizer
visuals:
enum.ConstructionVisuals.Key:
wiredCase: { state: wired }
caseWithTrigger: { state: no-payload }
grenade: { state: complete }
+ enum.Trigger.TriggerVisuals.VisualState:
+ enum.ConstructionVisuals.Layer:
+ Primed: { state: primed }
+ Unprimed: { state: complete }
- type: StaticPrice
price: 25
snapCardinals: true
layers:
- state: pod_0
+ map: ["base"]
- type: Physics
bodyType: Static
- type: Fixtures
- type: ApcPowerReceiver
powerLoad: 200 #Receives most of its power from the console
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.CloningPodVisuals.Status
- layer: 0
- states:
- enum.CloningPodStatus.Cloning: pod_1
- enum.CloningPodStatus.NoMind: pod_e
- enum.CloningPodStatus.Gore: pod_g
- enum.CloningPodStatus.Idle: pod_0
+ enum.CloningPodVisuals.Status:
+ base:
+ Cloning: { state: pod_1 }
+ NoMind: { state: pod_e }
+ Gore: { state: pod_g }
+ Idle: { state: pod_0 }
- type: Climbable
- type: StaticPrice
price: 1000
# temp to make clickmask work
sprite: Structures/meat_spike.rsi
state: spike
+ layers:
+ - state: spike
+ map: ["base"]
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
- type: Anchorable
- type: Pullable
- type: Appearance
+ - type: GenericVisualizer
visuals:
- - type: GenericEnumVisualizer
- key: enum.KitchenSpikeVisuals.Status
- layer: 0
- states:
- enum.KitchenSpikeStatus.Empty: spike
- enum.KitchenSpikeStatus.Bloody: spikebloody
+ enum.KitchenSpikeVisuals.Status:
+ base:
+ Empty: { state: spike }
+ Bloody: { state: spikebloody }
- type: Construction
graph: MeatSpike
node: MeatSpike