using Content.Shared.Humanoid; using Content.Shared.Inventory; using Robust.Client.GameObjects; namespace Content.Client.Humanoid; public sealed class HideableHumanoidLayersSystem : SharedHideableHumanoidLayersSystem { [Dependency] private readonly SpriteSystem _sprite = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnHandleState); } private void OnComponentInit(Entity ent, ref ComponentInit args) { UpdateSprite(ent); } private void OnHandleState(Entity ent, ref AfterAutoHandleStateEvent args) { UpdateSprite(ent); } public override void SetLayerVisibility( Entity ent, HumanoidVisualLayers layer, bool visible, SlotFlags source) { base.SetLayerVisibility(ent, layer, visible, source); if (Resolve(ent, ref ent.Comp)) UpdateSprite((ent, ent.Comp)); } private void UpdateSprite(Entity ent) { foreach (var item in ent.Comp.LastHiddenLayers) { if (ent.Comp.HiddenLayers.ContainsKey(item)) continue; var evt = new HumanoidLayerVisibilityChangedEvent(item, true); RaiseLocalEvent(ent, ref evt); if (!_sprite.LayerMapTryGet(ent.Owner, item, out var index, true)) continue; _sprite.LayerSetVisible(ent.Owner, index, true); } foreach (var item in ent.Comp.HiddenLayers.Keys) { if (ent.Comp.LastHiddenLayers.Contains(item)) continue; var evt = new HumanoidLayerVisibilityChangedEvent(item, false); RaiseLocalEvent(ent, ref evt); if (!_sprite.LayerMapTryGet(ent.Owner, item, out var index, true)) continue; _sprite.LayerSetVisible(ent.Owner, index, false); } ent.Comp.LastHiddenLayers.Clear(); ent.Comp.LastHiddenLayers.UnionWith(ent.Comp.HiddenLayers.Keys); } }