ShowHealthBarsSystem.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Content.Shared.Inventory.Events;
  2. using Content.Shared.Overlays;
  3. using Robust.Client.Graphics;
  4. using System.Linq;
  5. using Robust.Client.Player;
  6. using Robust.Shared.Prototypes;
  7. namespace Content.Client.Overlays;
  8. /// <summary>
  9. /// Adds a health bar overlay.
  10. /// </summary>
  11. public sealed class ShowHealthBarsSystem : EquipmentHudSystem<ShowHealthBarsComponent>
  12. {
  13. [Dependency] private readonly IOverlayManager _overlayMan = default!;
  14. [Dependency] private readonly IPrototypeManager _prototype = default!;
  15. private EntityHealthBarOverlay _overlay = default!;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. SubscribeLocalEvent<ShowHealthBarsComponent, AfterAutoHandleStateEvent>(OnHandleState);
  20. _overlay = new(EntityManager, _prototype);
  21. }
  22. private void OnHandleState(Entity<ShowHealthBarsComponent> ent, ref AfterAutoHandleStateEvent args)
  23. {
  24. RefreshOverlay();
  25. }
  26. protected override void UpdateInternal(RefreshEquipmentHudEvent<ShowHealthBarsComponent> component)
  27. {
  28. base.UpdateInternal(component);
  29. foreach (var comp in component.Components)
  30. {
  31. foreach (var damageContainerId in comp.DamageContainers)
  32. {
  33. _overlay.DamageContainers.Add(damageContainerId);
  34. }
  35. _overlay.StatusIcon = comp.HealthStatusIcon;
  36. }
  37. if (!_overlayMan.HasOverlay<EntityHealthBarOverlay>())
  38. {
  39. _overlayMan.AddOverlay(_overlay);
  40. }
  41. }
  42. protected override void DeactivateInternal()
  43. {
  44. base.DeactivateInternal();
  45. _overlay.DamageContainers.Clear();
  46. _overlayMan.RemoveOverlay(_overlay);
  47. }
  48. }