EquipmentHudSystem.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using Content.Shared.GameTicking;
  2. using Content.Shared.Inventory;
  3. using Content.Shared.Inventory.Events;
  4. using Robust.Client.Player;
  5. using Robust.Shared.Player;
  6. namespace Content.Client.Overlays;
  7. /// <summary>
  8. /// This is a base system to make it easier to enable or disabling UI elements based on whether or not the player has
  9. /// some component, either on their controlled entity on some worn piece of equipment.
  10. /// </summary>
  11. public abstract class EquipmentHudSystem<T> : EntitySystem where T : IComponent
  12. {
  13. [Dependency] private readonly IPlayerManager _player = default!;
  14. [ViewVariables]
  15. protected bool IsActive;
  16. protected virtual SlotFlags TargetSlots => ~SlotFlags.POCKET;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<T, ComponentStartup>(OnStartup);
  21. SubscribeLocalEvent<T, ComponentRemove>(OnRemove);
  22. SubscribeLocalEvent<LocalPlayerAttachedEvent>(OnPlayerAttached);
  23. SubscribeLocalEvent<LocalPlayerDetachedEvent>(OnPlayerDetached);
  24. SubscribeLocalEvent<T, GotEquippedEvent>(OnCompEquip);
  25. SubscribeLocalEvent<T, GotUnequippedEvent>(OnCompUnequip);
  26. SubscribeLocalEvent<T, RefreshEquipmentHudEvent<T>>(OnRefreshComponentHud);
  27. SubscribeLocalEvent<T, InventoryRelayedEvent<RefreshEquipmentHudEvent<T>>>(OnRefreshEquipmentHud);
  28. SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart);
  29. }
  30. private void Update(RefreshEquipmentHudEvent<T> ev)
  31. {
  32. IsActive = true;
  33. UpdateInternal(ev);
  34. }
  35. public void Deactivate()
  36. {
  37. if (!IsActive)
  38. return;
  39. IsActive = false;
  40. DeactivateInternal();
  41. }
  42. protected virtual void UpdateInternal(RefreshEquipmentHudEvent<T> args) { }
  43. protected virtual void DeactivateInternal() { }
  44. private void OnStartup(Entity<T> ent, ref ComponentStartup args)
  45. {
  46. RefreshOverlay();
  47. }
  48. private void OnRemove(Entity<T> ent, ref ComponentRemove args)
  49. {
  50. RefreshOverlay();
  51. }
  52. private void OnPlayerAttached(LocalPlayerAttachedEvent args)
  53. {
  54. RefreshOverlay();
  55. }
  56. private void OnPlayerDetached(LocalPlayerDetachedEvent args)
  57. {
  58. if (_player.LocalSession?.AttachedEntity is null)
  59. Deactivate();
  60. }
  61. private void OnCompEquip(Entity<T> ent, ref GotEquippedEvent args)
  62. {
  63. RefreshOverlay();
  64. }
  65. private void OnCompUnequip(Entity<T> ent, ref GotUnequippedEvent args)
  66. {
  67. RefreshOverlay();
  68. }
  69. private void OnRoundRestart(RoundRestartCleanupEvent args)
  70. {
  71. Deactivate();
  72. }
  73. protected virtual void OnRefreshEquipmentHud(Entity<T> ent, ref InventoryRelayedEvent<RefreshEquipmentHudEvent<T>> args)
  74. {
  75. OnRefreshComponentHud(ent, ref args.Args);
  76. }
  77. protected virtual void OnRefreshComponentHud(Entity<T> ent, ref RefreshEquipmentHudEvent<T> args)
  78. {
  79. args.Active = true;
  80. args.Components.Add(ent.Comp);
  81. }
  82. protected void RefreshOverlay()
  83. {
  84. if (_player.LocalSession?.AttachedEntity is not { } entity)
  85. return;
  86. var ev = new RefreshEquipmentHudEvent<T>(TargetSlots);
  87. RaiseLocalEvent(entity, ref ev);
  88. if (ev.Active)
  89. Update(ev);
  90. else
  91. Deactivate();
  92. }
  93. }