ClientAlertsSystem.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System.Linq;
  2. using Content.Shared.Alert;
  3. using JetBrains.Annotations;
  4. using Robust.Client.Player;
  5. using Robust.Shared.GameStates;
  6. using Robust.Shared.Player;
  7. using Robust.Shared.Prototypes;
  8. namespace Content.Client.Alerts;
  9. [UsedImplicitly]
  10. public sealed class ClientAlertsSystem : AlertsSystem
  11. {
  12. public AlertOrderPrototype? AlertOrder { get; set; }
  13. [Dependency] private readonly IPlayerManager _playerManager = default!;
  14. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  15. public event EventHandler? ClearAlerts;
  16. public event EventHandler<IReadOnlyDictionary<AlertKey, AlertState>>? SyncAlerts;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<AlertsComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
  21. SubscribeLocalEvent<AlertsComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
  22. SubscribeLocalEvent<AlertsComponent, ComponentHandleState>(OnHandleState);
  23. }
  24. protected override void LoadPrototypes()
  25. {
  26. base.LoadPrototypes();
  27. AlertOrder = _prototypeManager.EnumeratePrototypes<AlertOrderPrototype>().FirstOrDefault();
  28. if (AlertOrder == null)
  29. Log.Error("No alertOrder prototype found, alerts will be in random order");
  30. }
  31. public IReadOnlyDictionary<AlertKey, AlertState>? ActiveAlerts
  32. {
  33. get
  34. {
  35. var ent = _playerManager.LocalEntity;
  36. return ent is not null
  37. ? GetActiveAlerts(ent.Value)
  38. : null;
  39. }
  40. }
  41. private void OnHandleState(Entity<AlertsComponent> alerts, ref ComponentHandleState args)
  42. {
  43. if (args.Current is not AlertComponentState cast)
  44. return;
  45. alerts.Comp.Alerts = cast.Alerts;
  46. UpdateHud(alerts);
  47. }
  48. protected override void AfterShowAlert(Entity<AlertsComponent> alerts)
  49. {
  50. UpdateHud(alerts);
  51. }
  52. protected override void AfterClearAlert(Entity<AlertsComponent> alerts)
  53. {
  54. UpdateHud(alerts);
  55. }
  56. private void UpdateHud(Entity<AlertsComponent> entity)
  57. {
  58. if (_playerManager.LocalEntity == entity.Owner)
  59. SyncAlerts?.Invoke(this, entity.Comp.Alerts);
  60. }
  61. private void OnPlayerAttached(EntityUid uid, AlertsComponent component, LocalPlayerAttachedEvent args)
  62. {
  63. if (_playerManager.LocalEntity != uid)
  64. return;
  65. SyncAlerts?.Invoke(this, component.Alerts);
  66. }
  67. protected override void HandleComponentShutdown(EntityUid uid, AlertsComponent component, ComponentShutdown args)
  68. {
  69. base.HandleComponentShutdown(uid, component, args);
  70. if (_playerManager.LocalEntity != uid)
  71. return;
  72. ClearAlerts?.Invoke(this, EventArgs.Empty);
  73. }
  74. private void OnPlayerDetached(EntityUid uid, AlertsComponent component, LocalPlayerDetachedEvent args)
  75. {
  76. ClearAlerts?.Invoke(this, EventArgs.Empty);
  77. }
  78. public void AlertClicked(ProtoId<AlertPrototype> alertType)
  79. {
  80. RaisePredictiveEvent(new ClickAlertEvent(alertType));
  81. }
  82. }