Esempio n. 1
0
        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;
        }
Esempio n. 2
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));
            }
        }