using Content.Shared.Silicons.StationAi; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; namespace Content.Client.Silicons.StationAi; public sealed partial class StationAiSystem : SharedStationAiSystem { [Dependency] private readonly IOverlayManager _overlayMgr = default!; [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SpriteSystem _sprite = default!; private StationAiOverlay? _overlay; public override void Initialize() { base.Initialize(); InitializeAirlock(); InitializePowerToggle(); SubscribeLocalEvent(OnAiAttached); SubscribeLocalEvent(OnAiDetached); SubscribeLocalEvent(OnAiOverlayInit); SubscribeLocalEvent(OnAiOverlayRemove); SubscribeLocalEvent(OnAppearanceChange); } private void OnAiOverlayInit(Entity ent, ref ComponentInit args) { var attachedEnt = _player.LocalEntity; if (attachedEnt != ent.Owner) return; AddOverlay(); } private void OnAiOverlayRemove(Entity ent, ref ComponentRemove args) { var attachedEnt = _player.LocalEntity; if (attachedEnt != ent.Owner) return; RemoveOverlay(); } private void AddOverlay() { if (_overlay != null) return; _overlay = new StationAiOverlay(); _overlayMgr.AddOverlay(_overlay); } private void RemoveOverlay() { if (_overlay == null) return; _overlayMgr.RemoveOverlay(_overlay); _overlay = null; } private void OnAiAttached(Entity ent, ref LocalPlayerAttachedEvent args) { AddOverlay(); } private void OnAiDetached(Entity ent, ref LocalPlayerDetachedEvent args) { RemoveOverlay(); } private void OnAppearanceChange(Entity entity, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; if (_appearance.TryGetData(entity.Owner, StationAiVisualState.Key, out var layerData, args.Component)) _sprite.LayerSetData((entity.Owner, args.Sprite), StationAiVisualState.Key, layerData); _sprite.LayerSetVisible((entity.Owner, args.Sprite), StationAiVisualState.Key, layerData != null); } public override void Shutdown() { base.Shutdown(); _overlayMgr.RemoveOverlay(); } }