using Content.Client.Light.Components; using Content.Shared.Light.Components; using Robust.Client.GameObjects; using Robust.Shared.Audio.Systems; namespace Content.Client.Light.EntitySystems; public sealed class ExpendableLightSystem : VisualizerSystem { [Dependency] private readonly PointLightSystem _pointLightSystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly LightBehaviorSystem _lightBehavior = default!; [Dependency] private readonly SpriteSystem _sprite = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnLightShutdown); } private void OnLightShutdown(EntityUid uid, ExpendableLightComponent component, ComponentShutdown args) { component.PlayingStream = _audioSystem.Stop(component.PlayingStream); } protected override void OnAppearanceChange(EntityUid uid, ExpendableLightComponent comp, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; if (AppearanceSystem.TryGetData(uid, ExpendableLightVisuals.Behavior, out var lightBehaviourID, args.Component) && TryComp(uid, out var lightBehaviour)) { _lightBehavior.StopLightBehaviour((uid, lightBehaviour)); if (!string.IsNullOrEmpty(lightBehaviourID)) { _lightBehavior.StartLightBehaviour((uid, lightBehaviour), lightBehaviourID); } else if (TryComp(uid, out var light)) { _pointLightSystem.SetEnabled(uid, false, light); } } if (!AppearanceSystem.TryGetData(uid, ExpendableLightVisuals.State, out var state, args.Component)) return; switch (state) { case ExpendableLightState.Lit: _audioSystem.Stop(comp.PlayingStream); comp.PlayingStream = _audioSystem.PlayPvs( comp.LoopedSound, uid)?.Entity; if (_sprite.LayerMapTryGet((uid, args.Sprite), ExpendableLightVisualLayers.Overlay, out var layerIdx, true)) { if (!string.IsNullOrWhiteSpace(comp.IconStateLit)) _sprite.LayerSetRsiState((uid, args.Sprite), layerIdx, comp.IconStateLit); if (!string.IsNullOrWhiteSpace(comp.SpriteShaderLit)) args.Sprite.LayerSetShader(layerIdx, comp.SpriteShaderLit); else args.Sprite.LayerSetShader(layerIdx, null, null); if (comp.GlowColorLit.HasValue) _sprite.LayerSetColor((uid, args.Sprite), layerIdx, comp.GlowColorLit.Value); _sprite.LayerSetVisible((uid, args.Sprite), layerIdx, true); } if (comp.GlowColorLit.HasValue) _sprite.LayerSetColor((uid, args.Sprite), ExpendableLightVisualLayers.Glow, comp.GlowColorLit.Value); _sprite.LayerSetVisible((uid, args.Sprite), ExpendableLightVisualLayers.Glow, true); break; case ExpendableLightState.Dead: comp.PlayingStream = _audioSystem.Stop(comp.PlayingStream); if (_sprite.LayerMapTryGet((uid, args.Sprite), ExpendableLightVisualLayers.Overlay, out layerIdx, true)) { if (!string.IsNullOrWhiteSpace(comp.IconStateSpent)) _sprite.LayerSetRsiState((uid, args.Sprite), layerIdx, comp.IconStateSpent); if (!string.IsNullOrWhiteSpace(comp.SpriteShaderSpent)) args.Sprite.LayerSetShader(layerIdx, comp.SpriteShaderSpent); else args.Sprite.LayerSetShader(layerIdx, null, null); } _sprite.LayerSetVisible((uid, args.Sprite), ExpendableLightVisualLayers.Glow, false); break; } } }