AlertsUIController.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using Content.Client.Alerts;
  2. using Content.Client.Gameplay;
  3. using Content.Client.UserInterface.Systems.Alerts.Widgets;
  4. using Content.Client.UserInterface.Systems.Gameplay;
  5. using Content.Shared.Alert;
  6. using Robust.Client.GameObjects;
  7. using Robust.Client.Player;
  8. using Robust.Client.UserInterface;
  9. using Robust.Client.UserInterface.Controllers;
  10. using Robust.Shared.Prototypes;
  11. namespace Content.Client.UserInterface.Systems.Alerts;
  12. public sealed class AlertsUIController : UIController, IOnStateEntered<GameplayState>, IOnSystemChanged<ClientAlertsSystem>
  13. {
  14. [Dependency] private readonly IPlayerManager _player = default!;
  15. [UISystemDependency] private readonly ClientAlertsSystem? _alertsSystem = default;
  16. private AlertsUI? UI => UIManager.GetActiveUIWidgetOrNull<AlertsUI>();
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. var gameplayStateLoad = UIManager.GetUIController<GameplayStateLoadController>();
  21. gameplayStateLoad.OnScreenLoad += OnScreenLoad;
  22. gameplayStateLoad.OnScreenUnload += OnScreenUnload;
  23. }
  24. private void OnScreenUnload()
  25. {
  26. var widget = UI;
  27. if (widget != null)
  28. widget.AlertPressed -= OnAlertPressed;
  29. }
  30. private void OnScreenLoad()
  31. {
  32. var widget = UI;
  33. if (widget != null)
  34. widget.AlertPressed += OnAlertPressed;
  35. SyncAlerts();
  36. }
  37. private void OnAlertPressed(object? sender, ProtoId<AlertPrototype> e)
  38. {
  39. _alertsSystem?.AlertClicked(e);
  40. }
  41. private void SystemOnClearAlerts(object? sender, EventArgs e)
  42. {
  43. UI?.ClearAllControls();
  44. }
  45. private void SystemOnSyncAlerts(object? sender, IReadOnlyDictionary<AlertKey, AlertState> e)
  46. {
  47. if (sender is ClientAlertsSystem system)
  48. {
  49. UI?.SyncControls(system, system.AlertOrder, e);
  50. }
  51. }
  52. public void OnSystemLoaded(ClientAlertsSystem system)
  53. {
  54. system.SyncAlerts += SystemOnSyncAlerts;
  55. system.ClearAlerts += SystemOnClearAlerts;
  56. }
  57. public void OnSystemUnloaded(ClientAlertsSystem system)
  58. {
  59. system.SyncAlerts -= SystemOnSyncAlerts;
  60. system.ClearAlerts -= SystemOnClearAlerts;
  61. }
  62. public void OnStateEntered(GameplayState state)
  63. {
  64. // initially populate the frame if system is available
  65. SyncAlerts();
  66. }
  67. public void SyncAlerts()
  68. {
  69. var alerts = _alertsSystem?.ActiveAlerts;
  70. if (alerts != null)
  71. {
  72. SystemOnSyncAlerts(_alertsSystem, alerts);
  73. }
  74. }
  75. public void UpdateAlertSpriteEntity(EntityUid spriteViewEnt, AlertPrototype alert)
  76. {
  77. if (_player.LocalEntity is not { } player)
  78. return;
  79. if (!EntityManager.TryGetComponent<SpriteComponent>(spriteViewEnt, out var sprite))
  80. return;
  81. var ev = new UpdateAlertSpriteEvent((spriteViewEnt, sprite), alert);
  82. EntityManager.EventBus.RaiseLocalEvent(player, ref ev);
  83. }
  84. }