using System.Linq; using Content.Server.Atmos.Piping.Unary.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Atmos.Piping.Unary.Components; namespace Content.Server.Atmos.Piping.Unary.Components { [RegisterComponent] [Friend(typeof(GasVentScrubberSystem))] public sealed class GasVentScrubberComponent : Component { [ViewVariables(VVAccess.ReadWrite)] public bool Enabled { get; set; } = true; [ViewVariables] public bool IsDirty { get; set; } = false; [ViewVariables(VVAccess.ReadWrite)] public bool Welded { get; set; } = false; [ViewVariables(VVAccess.ReadWrite)] [DataField("outlet")] public string OutletName { get; set; } = "pipe"; [ViewVariables] public readonly HashSet FilterGases = GasVentScrubberData.DefaultFilterGases; [ViewVariables(VVAccess.ReadWrite)] public ScrubberPumpDirection PumpDirection { get; set; } = ScrubberPumpDirection.Scrubbing; /// /// Target volume to transfer. If is enabled, actual transfer rate will be much higher. /// [ViewVariables(VVAccess.ReadWrite)] public float TransferRate { get => _transferRate; set => _transferRate = Math.Clamp(value, 0f, MaxTransferRate); } private float _transferRate = Atmospherics.MaxTransferRate; [ViewVariables(VVAccess.ReadWrite)] [DataField("maxTransferRate")] public float MaxTransferRate = Atmospherics.MaxTransferRate; /// /// As pressure difference approaches this number, the effective volume rate may be smaller than /// [DataField("maxPressure")] public float MaxPressure = Atmospherics.MaxOutputPressure; [ViewVariables(VVAccess.ReadWrite)] public bool WideNet { get; set; } = false; public GasVentScrubberData ToAirAlarmData() { if (!IsDirty) return new GasVentScrubberData { Dirty = IsDirty }; return new GasVentScrubberData { Enabled = Enabled, Dirty = IsDirty, FilterGases = FilterGases, PumpDirection = PumpDirection, VolumeRate = TransferRate, WideNet = WideNet }; } public void FromAirAlarmData(GasVentScrubberData data) { Enabled = data.Enabled; IsDirty = data.Dirty; PumpDirection = (ScrubberPumpDirection) data.PumpDirection!; TransferRate = (float) data.VolumeRate!; WideNet = data.WideNet; if (!data.FilterGases!.SequenceEqual(FilterGases)) { FilterGases.Clear(); foreach (var gas in data.FilterGases!) FilterGases.Add(gas); } } } }