private void Scrub(float timeDelta, GasVentScrubberComponent scrubber, GasMixture?tile, PipeNode outlet) { // Cannot scrub if tile is null or air-blocked. if (tile == null || outlet.Air.Pressure >= 50 * Atmospherics.OneAtmosphere) // Cannot scrub if pressure too high. { return; } // Take a gas sample. var ratio = MathF.Min(1f, timeDelta * scrubber.TransferRate / tile.Volume); var removed = tile.RemoveRatio(ratio); // Nothing left to remove from the tile. if (MathHelper.CloseToPercent(removed.TotalMoles, 0f)) { return; } if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing) { _atmosphereSystem.ScrubInto(removed, outlet.Air, scrubber.FilterGases); // Remix the gases. _atmosphereSystem.Merge(tile, removed); } else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning) { _atmosphereSystem.Merge(outlet.Air, removed); } }
/// <summary> /// True if we were able to scrub, false if we were not. /// </summary> public bool Scrub(float timeDelta, float transferRate, ScrubberPumpDirection mode, HashSet <Gas> filterGases, GasMixture?tile, GasMixture destination) { // Cannot scrub if tile is null or air-blocked. if (tile == null || destination.Pressure >= 50 * Atmospherics.OneAtmosphere) // Cannot scrub if pressure too high. { return(false); } // Take a gas sample. var ratio = MathF.Min(1f, timeDelta * transferRate / tile.Volume); var removed = tile.RemoveRatio(ratio); // Nothing left to remove from the tile. if (MathHelper.CloseToPercent(removed.TotalMoles, 0f)) { return(false); } if (mode == ScrubberPumpDirection.Scrubbing) { _atmosphereSystem.ScrubInto(removed, destination, filterGases); // Remix the gases. _atmosphereSystem.Merge(tile, removed); } else if (mode == ScrubberPumpDirection.Siphoning) { _atmosphereSystem.Merge(destination, removed); } return(true); }
private void Scrub(AtmosphereSystem atmosphereSystem, GasVentScrubberComponent scrubber, AppearanceComponent?appearance, GasMixture?tile, PipeNode outlet) { // Cannot scrub if tile is null or air-blocked. if (tile == null) { return; } // Cannot scrub if pressure too high. if (outlet.Air.Pressure >= 50 * Atmospherics.OneAtmosphere) { return; } if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing) { appearance?.SetData(ScrubberVisuals.State, scrubber.WideNet ? ScrubberState.WideScrub : ScrubberState.Scrub); var transferMoles = MathF.Min(1f, (scrubber.VolumeRate / tile.Volume) * tile.TotalMoles); // Take a gas sample. var removed = tile.Remove(transferMoles); // Nothing left to remove from the tile. if (MathHelper.CloseTo(removed.TotalMoles, 0f)) { return; } atmosphereSystem.ScrubInto(removed, outlet.Air, scrubber.FilterGases); // Remix the gases. atmosphereSystem.Merge(tile, removed); } else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning) { appearance?.SetData(ScrubberVisuals.State, ScrubberState.Siphon); var transferMoles = tile.TotalMoles * (scrubber.VolumeRate / tile.Volume); var removed = tile.Remove(transferMoles); outlet.AssumeAir(removed); } }