using Content.Shared.Atmos.Rotting; using Content.Shared.Damage; using Content.Shared.Inventory.Events; using Content.Shared.Mobs.Components; 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(); 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(Entity entity, ref GetStatusIconsEvent args) { if (!IsActive || args.InContainer) return; var healthIcons = DecideHealthIcons(entity); args.StatusIcons.AddRange(healthIcons); } private IReadOnlyList DecideHealthIcons(Entity entity) { var damageableComponent = entity.Comp; 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") { if (TryComp(entity, out var state)) { // Since there is no MobState for a rotting mob, we have to deal with this case first. if (HasComp(entity) && _prototypeMan.TryIndex(damageableComponent.RottingIcon, out var rottingIcon)) result.Add(rottingIcon); else if (damageableComponent.HealthIcons.TryGetValue(state.CurrentState, out var value) && _prototypeMan.TryIndex(value, out var icon)) result.Add(icon); } } return result; } }