using Content.Shared.Damage; using Content.Shared.Inventory.Events; using Content.Shared.Overlays; using Content.Shared.StatusIcon; using Content.Shared.StatusIcon.Components; using Robust.Shared.Prototypes; using System.Linq; namespace Content.Client.Overlays; /// /// Shows a healthy icon on mobs. /// public sealed class ShowHealthIconsSystem : EquipmentHudSystem { [Dependency] private readonly IPrototypeManager _prototypeMan = default!; public HashSet DamageContainers = new(); [ValidatePrototypeId] private const string HealthIconFine = "HealthIconFine"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnGetStatusIconsEvent); } protected override void UpdateInternal(RefreshEquipmentHudEvent component) { base.UpdateInternal(component); foreach (var damageContainerId in component.Components.SelectMany(x => x.DamageContainers)) { DamageContainers.Add(damageContainerId); } } protected override void DeactivateInternal() { base.DeactivateInternal(); DamageContainers.Clear(); } private void OnGetStatusIconsEvent(EntityUid uid, DamageableComponent damageableComponent, ref GetStatusIconsEvent args) { if (!IsActive || args.InContainer) return; var healthIcons = DecideHealthIcons(damageableComponent); args.StatusIcons.AddRange(healthIcons); } private IReadOnlyList DecideHealthIcons(DamageableComponent damageableComponent) { if (damageableComponent.DamageContainerID == null || !DamageContainers.Contains(damageableComponent.DamageContainerID)) { return Array.Empty(); } var result = new List(); // Here you could check health status, diseases, mind status, etc. and pick a good icon, or multiple depending on whatever. if (damageableComponent?.DamageContainerID == "Biological" && _prototypeMan.TryIndex(HealthIconFine, out var healthyIcon)) { result.Add(healthyIcon); } return result; } }