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