private void DecideNewState(EngineIgnitionState oldState)
        {
            if (_engine.EngineIgnited)
            {
                Log.Info("DecidenewState, oldState: " + oldState + ", _engine.requestedThrottle: " + _engine.requestedThrottle +
                         ", _engine.EngineIgnited: " + _engine.EngineIgnited + ", _engine.allowShutdown: " + _engine.allowShutdown);
            }

            if ((_engine.requestedThrottle <= 0.0f && !MultiModeEngine) || _engine.flameout || (_engine.EngineIgnited == false && _engine.allowShutdown))
            {
                if (_engine.part.temperature >= AutoIgnitionTemperature)
                {
                    _engineState = EngineIgnitionState.HIGH_TEMP;
                }
                else
                {
                    _engineState = EngineIgnitionState.NOT_IGNITED;
                }
            }
            else
            {
                if (oldState != EngineIgnitionState.IGNITED)
                {
                    //When changing from not-ignited to ignited, we must ensure that the throttle is non-zero or locked (SRBs)
                    if (vessel.ctrlState.mainThrottle > 0.0f || _engine.throttleLocked)
                    {
                        _engineState = EngineIgnitionState.IGNITED;
                        autoShutdown = false;
                    }
                    else
                    {
                        _engineState = EngineIgnitionState.NOT_IGNITED;
                    }
                }
            }
        }
        private bool IgnitionProcess(EngineIgnitionState oldState, bool isExternal) //, List<OnboardIgnitorResource> aaa)
        {
            Log.Info("IgnitionProcess, oldState: " + oldState + ", _engineState: " + _engineState + ",   isExternal: " + isExternal);

            if (DontUseIgnitorIfMultiModeOn && OtherEngineModeActive())
            {
                _engineState = EngineIgnitionState.IGNITED;
                autoShutdown = false;
                Log.Info("IgnitionProcess, engine already ignited");
                return(true);
            }
            if (oldState == EngineIgnitionState.NOT_IGNITED && _engineState == EngineIgnitionState.IGNITED)
            {
                if (isExternal)
                {
                    return(true);
                }
                Log.Info("IgnitionProcess, IgnitionsRemained: " + IgnitionsRemained + ",  ECforIgnition: " + ECforIgnition +
                         ", MultiModeEngine: " + MultiModeEngine + ", CurrentActiveMode: " + CurrentActiveMode());
                if (!MultiModeEngine || (MultiModeEngine && !OtherEngineModeActive()) || CurrentActiveMode() == EngineIndex)
                {
                    if (IgnitionsRemained > 0 || IgnitionsRemained == -1)
                    {
                        double ec = 0;
                        if (EnoughECforIgnition())
                        {
                            ec = part.RequestResource(ecId, (double)ECforIgnition);
                            if (ec != ECforIgnition)
                            {
                                ScreenMessages.PostScreenMessage("Do not have enough Electrical Charge", 3f, ScreenMessageStyle.UPPER_CENTER);
                                _engineState = EngineIgnitionState.NOT_IGNITED;
                                return(false);
                            }
                        }

                        IgnitionsRemained--;
                    }
                    else
                    {
                        _engineState = EngineIgnitionState.NOT_IGNITED;
                        return(false);
                    }
                }

                float minPotential = 1.0f;
                if (UseUllageSimulation)
                {
                    minPotential *= _oldFuelFlowStability;
                    var chance  = UnityEngine.Random.Range(0.0f, 1.0f);
                    var attempt = chance <= minPotential;
                    Debug.Log("EngineIgnitor: minPotential: " + minPotential.ToString() + ", chance: " + chance.ToString());
                    ScreenMessages.PostScreenMessage("Chance of ignition success: " + minPotential + ", Random: " + chance.ToString(), 5, ScreenMessageStyle.UPPER_CENTER);
                    if (!attempt)
                    {
                        ScreenMessages.PostScreenMessage("Ignition failed due to fuel flow instability", 3f, ScreenMessageStyle.UPPER_CENTER);
                        _engineState = EngineIgnitionState.NOT_IGNITED;
                        return(false);
                    }
                }
            }
            if (oldState == EngineIgnitionState.HIGH_TEMP && _engineState == EngineIgnitionState.IGNITED)
            {
                _engineState = EngineIgnitionState.IGNITED;
                autoShutdown = false;
                return(true);
            }

            return(true);
        }
        private void FixedUpdate()
        {
            if (_engine == null)
            {
                Log.Info("ModuleEngineIgnitor.Update, _engine == null");
            }
            else
            {
                Log.Info("ModuleEngineIgnitor.Update, _engine.allowShutdown: " + _engine.allowShutdown);
            }
            if (!HighLogic.LoadedSceneIsFlight || _engine == null || !_engine.allowShutdown)
            {
                return;
            }

            if (vessel.Landed)
            {
                IsExternal = CheckExternalIgnitor();
                if (IsExternal)
                {
                    IgnitionsAvailableString = "Provided from Ground" + " : [ " + IgnitionsRemained + "/" + IgnitionsAvailable + " ]";
                }
                else
                {
                    if (IgnitionsRemained != -1)
                    {
                        IgnitionsAvailableString = IgnitorType + " : [ " + IgnitionsRemained + "/" + IgnitionsAvailable + " ]";
                    }
                    else
                    {
                        IgnitionsAvailableString = "Unlimited";
                    }
                }
            }
            else
            {
                IsExternal = false;
                if (IgnitionsRemained != -1)
                {
                    IgnitionsAvailableString = IgnitorType + " : [ " + IgnitionsRemained + "/" + IgnitionsAvailable + " ]";
                }
                else
                {
                    IgnitionsAvailableString = "Unlimited";
                }
            }


            if (part != null)
            {
                AutoIgnitionState = part.temperature.ToString("F1") + "/" + AutoIgnitionTemperature.ToString("F1");
            }
            else
            {
                AutoIgnitionState = "?/" + AutoIgnitionTemperature.ToString("F1");
            }



            if (FlightGlobals.ActiveVessel != null)
            {
                Events["ReloadIgnitor"].guiActiveUnfocused = FlightGlobals.ActiveVessel.isEVA;
                Events["ReloadIgnitor"].guiName            = "Reload Ignitor (" + IgnitionsAvailableString + ")";
            }

            var oldState = _engineState;

            DecideNewState(oldState);

            Log.Info("oldEngineThrottle: " + oldEngineThrottle + ", autoShutdown: " + autoShutdown);
            if (_engine.requestedThrottle > 0.0f)
            {
                autoShutdown = false;
            }
            else
            {
                if (!autoShutdown)
                {
                    _engineState = EngineIgnitionState.NOT_IGNITED;
                    autoShutdown = true;
                }
            }

            _oldFuelFlowStability = _fuelFlowStability;
            CheckUllageState();

            var isIgnited = IgnitionProcess(oldState, IsExternal); //, totalRes);

            IgnitionResult(IsExternal, isIgnited);
        }