using Content.Client.Alerts; using Content.Client.Gameplay; using Content.Client.UserInterface.Systems.Alerts.Widgets; using Content.Client.UserInterface.Systems.Gameplay; using Content.Shared.Alert; using Robust.Client.GameObjects; using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; namespace Content.Client.UserInterface.Systems.Alerts; public sealed class AlertsUIController : UIController, IOnStateEntered, IOnSystemChanged { [Dependency] private readonly IPlayerManager _player = default!; [UISystemDependency] private readonly ClientAlertsSystem? _alertsSystem = default; private AlertsUI? UI => UIManager.GetActiveUIWidgetOrNull(); public override void Initialize() { base.Initialize(); var gameplayStateLoad = UIManager.GetUIController(); gameplayStateLoad.OnScreenLoad += OnScreenLoad; gameplayStateLoad.OnScreenUnload += OnScreenUnload; } private void OnScreenUnload() { var widget = UI; if (widget != null) widget.AlertPressed -= OnAlertPressed; } private void OnScreenLoad() { var widget = UI; if (widget != null) widget.AlertPressed += OnAlertPressed; SyncAlerts(); } private void OnAlertPressed(object? sender, AlertType e) { _alertsSystem?.AlertClicked(e); } private void SystemOnClearAlerts(object? sender, EventArgs e) { UI?.ClearAllControls(); } private void SystemOnSyncAlerts(object? sender, IReadOnlyDictionary e) { if (sender is ClientAlertsSystem system) { UI?.SyncControls(system, system.AlertOrder, e); } } public void OnSystemLoaded(ClientAlertsSystem system) { system.SyncAlerts += SystemOnSyncAlerts; system.ClearAlerts += SystemOnClearAlerts; } public void OnSystemUnloaded(ClientAlertsSystem system) { system.SyncAlerts -= SystemOnSyncAlerts; system.ClearAlerts -= SystemOnClearAlerts; } public void OnStateEntered(GameplayState state) { // initially populate the frame if system is available SyncAlerts(); } public void SyncAlerts() { var alerts = _alertsSystem?.ActiveAlerts; if (alerts != null) { SystemOnSyncAlerts(_alertsSystem, alerts); } } public void UpdateAlertSpriteEntity(EntityUid spriteViewEnt, AlertPrototype alert) { if (_player.LocalEntity is not { } player) return; if (!EntityManager.TryGetComponent(spriteViewEnt, out var sprite)) return; var ev = new UpdateAlertSpriteEvent((spriteViewEnt, sprite), alert); EntityManager.EventBus.RaiseLocalEvent(player, ref ev); } }