using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Clothing; using Content.Shared.Inventory.Events; namespace Content.Server.Body.Systems; public sealed class LungSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmos = default!; [Dependency] private readonly InternalsSystem _internals = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; public static string LungSolutionName = "Lung"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnGotUnequipped); SubscribeLocalEvent(OnMaskToggled); } private void OnGotUnequipped(EntityUid uid, BreathToolComponent component, GotUnequippedEvent args) { _atmosphereSystem.DisconnectInternals(component); } private void OnGotEquipped(EntityUid uid, BreathToolComponent component, GotEquippedEvent args) { if ((args.SlotFlags & component.AllowedSlots) == 0) return; component.IsFunctional = true; if (TryComp(args.Equipee, out InternalsComponent? internals)) { component.ConnectedInternalsEntity = args.Equipee; _internals.ConnectBreathTool((args.Equipee, internals), uid); } } private void OnComponentInit(Entity entity, ref ComponentInit args) { var solution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.SolutionName); solution.MaxVolume = 100.0f; solution.CanReact = false; // No dexalin lungs } private void OnMaskToggled(Entity ent, ref ItemMaskToggledEvent args) { if (args.IsToggled || args.IsEquip) { _atmos.DisconnectInternals(ent.Comp); } else { ent.Comp.IsFunctional = true; if (TryComp(args.Wearer, out InternalsComponent? internals)) { ent.Comp.ConnectedInternalsEntity = args.Wearer; _internals.ConnectBreathTool((args.Wearer, internals), ent); } } } public void GasToReagent(EntityUid uid, LungComponent lung) { if (!_solutionContainerSystem.ResolveSolution(uid, lung.SolutionName, ref lung.Solution, out var solution)) return; foreach (var gas in Enum.GetValues()) { var i = (int) gas; var moles = lung.Air.Moles[i]; if (moles <= 0) continue; var reagent = _atmosphereSystem.GasReagents[i]; if (reagent == null) continue; var amount = moles * Atmospherics.BreathMolesToReagentMultiplier; solution.AddReagent(reagent, amount); // We don't remove the gas from the lung mix, // that's the responsibility of whatever gas is being metabolized. // Most things will just want to exhale again. } _solutionContainerSystem.UpdateChemicals(lung.Solution.Value); } }