public void VentContents() { var metaDataLayer = MatrixManager.AtPoint(Vector3Int.RoundToInt(transform.position), true).MetaDataLayer; Vector3Int localPosition = transform.localPosition.RoundToInt(); MetaDataNode node = metaDataLayer.Get(localPosition, false); float deltaPressure = Mathf.Min(GasMix.Pressure, ReleasePressure) - node.GasMix.Pressure; if (deltaPressure > 0) { float ratio = deltaPressure * Time.deltaTime; GasMix.TransferGas(node.GasMix, GasMix, ratio); metaDataLayer.UpdateSystemsAt(localPosition, SystemType.AtmosSystem); Volume = GasMix.Volume; Temperature = GasMix.Temperature; foreach (Gas gas in Gas.All) { Gases[gas] = GasMix.Gases[gas]; } } }
public void SpillContent(Tuple <ReagentMix, GasMix> ToSpill) { if (pipeNode == null && MonoPipe == null) { return; } Vector3Int ZeroedLocation = Vector3Int.zero; if (pipeNode != null) { ZeroedLocation = pipeNode.NodeLocation; } else { ZeroedLocation = MonoPipe.MatrixPos; } ZeroedLocation.z = 0; var tileWorldPosition = MatrixManager.LocalToWorld(ZeroedLocation, matrix).RoundToInt(); MatrixManager.ReagentReact(ToSpill.Item1, tileWorldPosition); MetaDataLayer metaDataLayer = MatrixManager.AtPoint(tileWorldPosition, true).MetaDataLayer; if (pipeNode != null) { GasMix.TransferGas(pipeNode.IsOn.GasMix, ToSpill.Item2, ToSpill.Item2.Moles); } else { GasMix.TransferGas(matrix.GetMetaDataNode(ZeroedLocation).GasMix, ToSpill.Item2, ToSpill.Item2.Moles); } metaDataLayer.UpdateSystemsAt(ZeroedLocation, SystemType.AtmosSystem); }
private void CheckAtmos() { // FIXME I'm just handling the exception here, I'm no atmos nerd so I don't know what's happening. // maybe it is just an initialization order problem? if (metaNode == null) { Logger.LogError("Scrubber found metadaNode to be null. Returning with no op.", Category.Atmos); return; } if (SelfSufficient == false) { var pressureDensity = pipeData.mixAndVolume.Density(); if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure) { return; } } else { if (metaNode.GasMix.Pressure < MMinimumPressure) { return; } } if (metaNode.GasMix.Pressure == 0) { return; } float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles; if (available < 0) { return; } if (MaxTransferMoles < available) { available = MaxTransferMoles; } var gasOnNode = metaNode.GasMix; GasMix pipeMix; if (SelfSufficient) { pipeMix = GasMix.NewGasMix(GasMixes.Air); //TODO: get some immutable gasmix to avoid GC } else { pipeMix = pipeData.mixAndVolume.GetGasMix(); } GasMix.TransferGas(pipeMix, gasOnNode, available); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }
private void ReleaseContentsInstantly() { MetaDataLayer metaDataLayer = MatrixManager.AtPoint(WorldPosition, true).MetaDataLayer; MetaDataNode node = metaDataLayer.Get(LocalPosition, false); GasMix.TransferGas(node.GasMix, GasMix, GasMix.Moles); metaDataLayer.UpdateSystemsAt(LocalPosition, SystemType.AtmosSystem); }
private void TransferGas(GasMix pipeMix, float molesTransferred) { if (molesTransferred > pipeMix.Moles) { molesTransferred = pipeMix.Moles; } GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred); }
public override void TickUpdate() { pipeData.mixAndVolume.EqualiseWithOutputs(pipeData.Outputs); if (isOperating) { GasMix.TransferGas(targetMix, sourceMix, molesRate * Effectiveness); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); } }
private void CheckAtmos() { if (SelfSufficient == false) { var pressureDensity = pipeData.mixAndVolume.Density(); if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure) { return; } } else { if (metaNode.GasMix.Pressure < MMinimumPressure) { return; } } if (metaNode.GasMix.Pressure == 0) { return; } float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles; if (available < 0) { return; } if (MaxTransferMoles < available) { available = MaxTransferMoles; } var gasOnNode = metaNode.GasMix; GasMix pipeMix; if (SelfSufficient) { pipeMix = GasMix.NewGasMix(GasMixes.Air); //TODO: get some immutable gasmix to avoid GC } else { pipeMix = pipeData.mixAndVolume.GetGasMix(); } GasMix.TransferGas(pipeMix, gasOnNode, available); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }
private void CheckAtmos() { // FIXME I'm just handling the exception here, I'm no atmos nerd so I don't know what's happening. // maybe it is just an initialization order problem? if (metaNode == null) { Logger.LogError("Airvent found metadaNode to be null. Returning with no op.", Category.Atmos); return; } //metaNode.GasMix = pipeData.mixAndVolume.EqualiseWithExternal(metaNode.GasMix); if (metaNode.GasMix.Pressure > MaxOutletPressure) { return; } float molesTransferred; if (metaNode.GasMix.Pressure != 0) { molesTransferred = ((MaxOutletPressure / metaNode.GasMix.Pressure) * metaNode.GasMix.Moles) - metaNode.GasMix.Moles; if (MaxTransferMoles < molesTransferred) { molesTransferred = MaxTransferMoles; } } else { molesTransferred = MaxTransferMoles; } GasMix pipeMix; if (SelfSufficient) { pipeMix = GasMix.NewGasMix(GasMixes.Air); //TODO: get some immutable gasmix to avoid GC if (molesTransferred > GasMixes.Air.Moles) { molesTransferred = GasMixes.Air.Moles; } } else { pipeMix = pipeData.mixAndVolume.GetGasMix(); if (molesTransferred > pipeMix.Moles) { molesTransferred = pipeMix.Moles; } } GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }
private void ModeSiphon() { float moles = metaNode.GasMix.Moles * (IsExpandedRange ? 0.40f : 0.05f) * Effectiveness; // siphon a portion moles = moles.Clamp(0, nominalMolesTransferCap); if (moles.Approx(0)) { return; } GasMix.TransferGas(pipeMix, metaNode.GasMix, moles); }
private void CheckAtmos() { if (SelfSufficient == false) { var pressureDensity = pipeData.mixAndVolume.Density(); if (pressureDensity.y > MaxInternalPressure || metaNode.GasMix.Pressure < MMinimumPressure) { return; } } else { if (metaNode.GasMix.Pressure < MMinimumPressure) { return; } } if (metaNode.GasMix.Pressure == 0) { return; } float available = MMinimumPressure / metaNode.GasMix.Pressure * metaNode.GasMix.Moles; if (available < 0) { return; } if (MaxTransferMoles < available) { available = MaxTransferMoles; } var gasOnNode = metaNode.GasMix; if (SelfSufficient) { GasMix.TransferGas(selfSufficientGas, gasOnNode, available); selfSufficientGas.Copy(GasMixes.BaseAirMix); } else { var pipeMix = pipeData.mixAndVolume.GetGasMix(); GasMix.TransferGas(pipeMix, gasOnNode, available); } metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }
private void Operate() { GasMix sourceGasMix = pipeMix; GasMix targetGasMix = metaNode.GasMix; if (OperatingMode == Mode.In) { sourceGasMix = metaNode.GasMix; targetGasMix = pipeMix; } GasMix.TransferGas(targetGasMix, sourceGasMix, GetTransferableMoles(sourceGasMix)); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }
private void OperateAirPump() { MetaDataLayer metadata = registerObject.Matrix.MetaDataLayer; GasMix tileMix = metadata.Get(registerObject.LocalPositionServer, false).GasMix; // TODO: add voltage multiplier when bins are powered var molesToTransfer = (tileMix.Moles - (tileMix.Moles * (CHARGED_PRESSURE / gasContainer.GasMix.Pressure))) * -1; molesToTransfer *= 0.5f; GasMix.TransferGas(gasContainer.GasMix, tileMix, molesToTransfer.Clamp(0, 8)); metadata.UpdateSystemsAt(registerObject.LocalPositionServer, SystemType.AtmosSystem); chargePressure = gasContainer.GasMix.Pressure; }
public override void TickUpdate() { pipeData.mixAndVolume.EqualiseWithOutputs(pipeData.Outputs); if (isOperating) { if (operatingMode == Mode.Extracting && pipeData.mixAndVolume.Density().y > MaxInternalPressure) { return; } GasMix.TransferGas(targetMix, sourceMix, molesRate * Effectiveness); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); } }
private void CheckAtmos() { //metaNode.GasMix = pipeData.mixAndVolume.EqualiseWithExternal(metaNode.GasMix); if (metaNode.GasMix.Pressure > MaxOutletPressure) { return; } float molesTransferred; if (metaNode.GasMix.Pressure != 0) { molesTransferred = ((MaxOutletPressure / metaNode.GasMix.Pressure) * metaNode.GasMix.Moles) - metaNode.GasMix.Moles; if (MaxTransferMoles < molesTransferred) { molesTransferred = MaxTransferMoles; } } else { molesTransferred = MaxTransferMoles; } GasMix pipeMix; if (SelfSufficient) { pipeMix = GasMix.NewGasMix(GasMixes.Air); //TODO: get some immutable gasmix to avoid GC if (molesTransferred > GasMixes.Air.Moles) { molesTransferred = GasMixes.Air.Moles; } } else { pipeMix = pipeData.mixAndVolume.GetGasMix(); if (molesTransferred > pipeMix.Moles) { molesTransferred = pipeMix.Moles; } } GasMix.TransferGas(metaNode.GasMix, pipeMix, molesTransferred); metaDataLayer.UpdateSystemsAt(registerTile.LocalPositionServer, SystemType.AtmosSystem); }