public void StopRefuelEvent()
        {
            Events["StartRefuelEvent"].active = true;
            Events["StopRefuelEvent"].active  = false;

            Events["ShowSettings"].active = true;

            refuelingState = RefuelingState.RECOVERY;

            UpdateLEDs();
        }
        public void StartRefuelEvent()
        {
            UpdateEva();

            if (eva == null)
            {
                return;
            }

            if (!IsKerbalOnLadder())
            {
                ScreenMessages.PostScreenMessage(Localizer.GetStringByTag("#SuRePl_Error_Ladder"), 3.0f, ScreenMessageStyle.UPPER_CENTER).color = XKCDColors.Red;
                return;
            }

            Events["StartRefuelEvent"].active = false;
            Events["StopRefuelEvent"].active  = true;

            refuelingState = RefuelingState.INIT;
            UpdateLEDs();
        }
        void ProcessRefuel()
        {
            if ((eva != null) && !IsKerbalOnLadder() && refuelingState != RefuelingState.RECOVERY)
            {
                StopRefuelEvent();
                return;
            }

            if (refuelingState == RefuelingState.INIT)
            {
                foreach (var element in listGofr)
                {
                    Destroy(element);
                }

                foreach (var s in listSettings)
                {
                    s._stopped = false;
                    s._message = false;
                }

                listGofr.Clear();

                gofr = GameDatabase.Instance.GetModel("SuitRefuelPlugin/Parts/Gofr/model");
                gofr.SetActive(true);
                gofr.transform.parent = transform;
                //gofr.transform.localPosition = new Vector3(0, 0, 0);
                gofr.transform.position   = plug.position;
                gofr.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
                gofr.transform.rotation   = plug.rotation;

                listGofr.Add(gofr);

                refuelingState = RefuelingState.UNTWISTING;
            }
            else if (refuelingState == RefuelingState.UNTWISTING)
            {
                var node = Instantiate(gofr);
                node.SetActive(true);
                node.transform.parent     = transform;
                node.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

                if (listGofr.Count < 5)
                {
                    node.transform.rotation = gofr.transform.rotation;
                    node.transform.position = gofr.transform.position + gofr.transform.forward * GOFR_STEP;
                }
                else if (listGofr.Count < 10)
                {
                    node.transform.position = gofr.transform.position + gofr.transform.forward * GOFR_STEP;
                    Vector3 targetDir = eva.transform.position - node.transform.position;
                    Vector3 newDir    = Vector3.RotateTowards(gofr.transform.forward, targetDir, 0.03f, 0);
                    node.transform.rotation = Quaternion.LookRotation(newDir);
                }
                else if (listGofr.Count < 20)
                {
                    node.transform.position = gofr.transform.position + gofr.transform.forward * GOFR_STEP;
                    Vector3 targetDir = eva.transform.position - node.transform.position;
                    Vector3 newDir    = Vector3.RotateTowards(gofr.transform.forward, targetDir, 0.05f, 0);
                    node.transform.rotation = Quaternion.LookRotation(newDir);
                }
                else
                {
                    node.transform.position = gofr.transform.position + gofr.transform.forward * GOFR_STEP;

                    Vector3 targetDir = eva.transform.position - node.transform.position;
                    Vector3 newDir    = Vector3.RotateTowards(gofr.transform.forward, targetDir, 0.06f, 0);
                    node.transform.rotation = Quaternion.LookRotation(newDir);
                }

                gofr = node;
                listGofr.Add(gofr);

                if ((listGofr.Count > 150) || ((listGofr.Count > 70) && (Vector3.Distance(gofr.transform.position, eva.transform.position) < OK_DISTANCE_GOFR_TO_EVA)))
                {
                    refuelingState = RefuelingState.REFUELING;
                }
            }
            else if (refuelingState == RefuelingState.REFUELING)
            {
                if (KerbalIsOutOfGofr())
                {
                    StopRefuelEvent();
                    return;
                }

                float deltaTimeAmount = TimeWarp.fixedDeltaTime;

                bool stop = true;

                foreach (var s in listSettings)
                {
                    if ((s.pumping != PumpingMode.NONE) && (!s._stopped))
                    {
                        Part partFrom, partTo;
                        if (s.pumping == PumpingMode.IN)
                        {
                            partFrom = this.part;
                            partTo   = eva.Parts[0];
                        }
                        else
                        {
                            partFrom = eva.Parts[0];
                            partTo   = this.part;
                        }

                        bool good = true;

                        float take = (float)s.res.maxAmount / 5.0f * deltaTimeAmount;

                        int idResource = (s.res.resourceName.GetHashCode() == idEvaPropellant) ? idMonoPropellant : s.res.resourceName.GetHashCode();

                        float amount = partFrom.RequestResource(idResource, take);

                        if (amount <= part.resourceRequestRemainingThreshold)
                        {
                            if (s._message)
                            {
                                ShowRefuelEndedMessage(s.res.info.displayName, s.pumping, false);
                            }
                            good = false;
                        }
                        else
                        {
                            idResource = (s.res.resourceName.GetHashCode() == idEvaPropellant) ? idEvaPropellant : idResource;
                            float profit = partTo.RequestResource(idResource, -amount);

                            if (-profit < amount)
                            {
                                if (s._message)
                                {
                                    ShowRefuelEndedMessage(s.res.info.displayName, s.pumping, true);
                                }

                                good = false;

                                idResource = (s.res.resourceName.GetHashCode() == idEvaPropellant) ? idMonoPropellant : idResource;
                                partFrom.RequestResource(idResource, -amount - profit);
                            }

                            if (amount < (take / 10.0f))
                            {
                                if (s._message)
                                {
                                    ShowRefuelEndedMessage(s.res.info.displayName, s.pumping, false);
                                }
                                good = false;
                            }
                        }

                        if (!good)
                        {
                            s._stopped = true;
                        }
                        else
                        {
                            stop       = false;
                            s._message = true;
                        }
                    }
                }

                if (stop)
                {
                    StopRefuelEvent();
                    return;
                }
            }
            else if (refuelingState == RefuelingState.RECOVERY)
            {
                if (listGofr.Any())
                {
                    var g = listGofr.Last();
                    Destroy(g);
                    listGofr.Remove(g);
                }
                else
                {
                    refuelingState = RefuelingState.NONE;
                    UpdateLEDs();
                }
            }
        }