using Content.Client._Sunrise.BloodCult; using Content.Shared._Sunrise.Abilities.Milira; using Content.Shared._Sunrise.Mood; using Robust.Client.GameObjects; using Robust.Shared.Utility; namespace Content.Client._Sunrise.Mood; /// /// Обрабатывает отображение эффектов настроения на сущностях с компонентом настроения. /// public sealed class MoodVisualizerSystem : VisualizerSystem { [Dependency] private readonly SpriteSystem _spriteSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnShutdown); } private void OnShutdown(Entity ent, ref ComponentShutdown args) { if (!TryComp(ent.Owner, out var sprite)) return; if (_spriteSystem.LayerMapTryGet((ent.Owner, sprite), MoodVisualLayers.Mood, out var layer, false)) _spriteSystem.RemoveLayer((ent.Owner, sprite), layer); } private void OnComponentInit(Entity ent, ref ComponentInit args) { if (!TryComp(ent.Owner, out var sprite)) return; _spriteSystem.LayerMapReserve((ent.Owner, sprite), MoodVisualLayers.Mood); _spriteSystem.LayerSetVisible((ent.Owner, sprite), MoodVisualLayers.Mood, false); sprite.LayerSetShader(MoodVisualLayers.Mood, "unshaded"); if (ent.Comp.Sprite != null) _spriteSystem.LayerSetSprite((ent.Owner, sprite), MoodVisualLayers.Mood, ent.Comp.Sprite); if (TryComp(ent.Owner, out var appearance)) UpdateAppearance(ent, sprite, appearance); } protected override void OnAppearanceChange(EntityUid uid, MoodVisualsComponent component, ref AppearanceChangeEvent args) { if (args.Sprite != null) UpdateAppearance((uid, component), args.Sprite, args.Component); } private bool ShouldHideMoodVisuals(Entity ent) { return HasComp(ent) && HasComp(ent); } private void UpdateAppearance(Entity ent, SpriteComponent sprite, AppearanceComponent appearance) { if (!_spriteSystem.LayerMapTryGet((ent, sprite), MoodVisualLayers.Mood, out var index, false)) return; if (ShouldHideMoodVisuals(ent)) { _spriteSystem.LayerSetVisible((ent, sprite), index, false); return; } if (!_appearanceSystem.TryGetData(ent.Owner, MoodVisuals.CurrentMoodThreshold, out var moodThreshold, appearance)) { _spriteSystem.LayerSetVisible((ent.Owner, sprite), index, false); return; } // Проверяем, есть ли состояние спрайта для этого порога настроения if (!ent.Comp.MoodStates.TryGetValue(moodThreshold, out var state)) { _spriteSystem.LayerSetVisible((ent.Owner, sprite), index, false); return; } // Показываем слой спрайта и устанавливаем состояние _spriteSystem.LayerSetVisible((ent.Owner, sprite), index, true); _spriteSystem.LayerSetRsiState((ent.Owner, sprite), index, state); } } public enum MoodVisualLayers : byte { Mood }