//server side initialization private IEnumerator ServerWaitForProvider() { while (Provider == null) { yield return(WaitFor.EndOfFrame); } canister = Provider.GetComponent <Canister>(); //init pressure dials InternalPressureDial.ServerSpinTo(Mathf.RoundToInt(gasContainer.ServerInternalPressure)); ReleasePressureDial.ServerSpinTo(Mathf.RoundToInt(gasContainer.ReleasePressure)); if (canister.HasContainerInserted) { GasContainer externalTank = canister.InsertedContainer.GetComponent <GasContainer>(); ExternalPressureDial.ServerSpinTo(Mathf.RoundToInt(externalTank.ServerInternalPressure)); } else { ExternalPressureDial.ServerSpinTo(0); } //init connection status canister.ServerOnConnectionStatusChange.AddListener(ServerUpdateConnectionStatus); ServerUpdateConnectionStatus(canister.IsConnected); //init external tank status canister.ServerOnExternalTankInserted.AddListener(ServerUpdateExternalTank); ServerUpdateExternalTank(canister.HasContainerInserted); //init wheel ReleasePressureWheel.SetValueServer(Mathf.RoundToInt(gasContainer.ReleasePressure).ToString()); StartCoroutine(ServerRefreshInternalPressure()); }
private void UpdateConnected() { ToolUtils.ServerPlayToolSound(interaction); RefreshOverlays(); objectBehaviour.ServerSetPushable(!IsConnected); ServerOnConnectionStatusChange.Invoke(IsConnected); // Will release gas if canister valve was not turned off before disconnecting from a connector, // or stop the release of gas if canister valve is open and is now connected. if (ValveIsOpen) { GasContainer.SetVent(!IsConnected); } }
public override void OnStartServer() { // Update gas mix manually, in case Canister component loads before GasContainer. // This ensures pressure indicator and canister tier are set correctly. GasContainer.UpdateGasMix(); SetCanisterTier(); // We push pressureIndicatorOverlay ourselves; if not, // SpriteHandler will do so but overwrite the current SO when it loads after this component. pressureIndicatorOverlay.PushTexture(); RefreshOverlays(); SetValve(valveIsInitiallyOpen); GasContainer.ServerContainerExplode += OnContainerExploded; }
/// <summary> /// Set the state of the canister's valve. Will release contents to environment if /// the canister is not attached to a connector. /// </summary> /// <param name="isOpen">If on, gas can be added or removed from the canister.</param> public void SetValve(bool isOpen) { ValveIsOpen = isOpen; if (!IsConnected) { GasContainer.SetVent(isOpen); } RefreshOverlays(); if (isOpen) { UpdateManager.Add(RefreshPressureIndicator, 1); } else { UpdateManager.Remove(CallbackType.PERIODIC_UPDATE, RefreshPressureIndicator); } }
/// <summary> /// Updates the displayed external tank /// </summary> private void ServerUpdateExternalTank(bool externalExists) { Canister canister = Provider.GetComponent <Canister>(); GameObject insertedContainer = canister.InsertedContainer; if (externalExists) { externalTankStatus.SetValueServer(insertedContainer.Item().InitialName); externalTankImage.SetValueServer("ExternalTankInserted@0"); GasContainer externalTank = insertedContainer.GetComponent <GasContainer>(); ExternalPressureDial.ServerSpinTo(Mathf.RoundToInt(externalTank.ServerInternalPressure)); } else { externalTankStatus.SetValueServer("No Tank Inserted"); externalTankImage.SetValueServer("ExternalTankEmpty@0"); ExternalPressureDial.ServerSpinTo(0); } }
/// <summary> /// switch the secondary valve between internals valve and external tank /// </summary> /// <param name="usingTank">Is the valve set to tank.</param> public void ServerToggleSecondary(bool usingTank) { tankValveOpen = usingTank; Canister canister = Provider.GetComponent <Canister>(); GasContainer canisterTank = canister.GetComponent <GasContainer>(); GasContainer externalTank = canister.InsertedContainer?.GetComponent <GasContainer>(); if (usingTank && externalTank != null) { GasMix canisterGas = canisterTank.GasMix; GasMix tankGas = externalTank.GasMix; float[] updatedCanisterGases = { 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f }; float[] updatedTankGases = { 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f }; float updatedTankMoles = 0f; GasMix totalGas = canisterGas + tankGas; float[] totalGases = totalGas.Gases; //while: canister has greater pressure than external tank AND tank isn't full while (canisterTank.ServerInternalPressure >= externalTank.ServerInternalPressure && updatedTankMoles <= externalTank.MaximumMoles) { //iterate through gases and distribute between the canister and external tank for (int i = 0; i < totalGases.Length; i++) { if (totalGases[i] > 0f && updatedTankMoles <= externalTank.MaximumMoles) { totalGases[i] -= 0.02f; updatedCanisterGases[i] += 0.01f; updatedTankGases[i] += 0.01f; updatedTankMoles += 0.01f; } } } //add remaining gases to the canister values for (int i = 0; i < totalGases.Length; i++) { if (totalGases[i] > 0f) { updatedCanisterGases[i] += totalGases[i]; totalGases[i] = 0f; //compensate for valve blowoff updatedCanisterGases[i] -= 0.02052f; } } //make sure we're not marginally increasing gas in the tank //due to float falloff bool accuracyCheck = true; for (int i = 0; i < canisterTank.Gases.Length; i++) { if (canisterTank.Gases[i] < updatedCanisterGases[i]) { accuracyCheck = false; } } if (accuracyCheck) { canisterTank.Gases = updatedCanisterGases; canisterTank.UpdateGasMix(); } externalTank.Gases = updatedTankGases; externalTank.UpdateGasMix(); ExternalPressureDial.ServerSpinTo(Mathf.RoundToInt(externalTank.ServerInternalPressure)); } else if (usingTank && externalTank == null) { StartCoroutine(DisplayFlashingText("Insert a tank before opening the valve!", 1F)); } }