public string SetLandingBurnEngines()
        {
            List <ModuleEngines> activeEngines = KSPUtils.GetActiveEngines(vessel);
            // get string
            List <string> s   = new List <string>();
            int           num = 0;

            foreach (var engine in KSPUtils.GetAllEngines(vessel))
            {
                if (activeEngines.Contains(engine))
                {
                    s.Add("1");
                    num++;
                }
                else
                {
                    s.Add("0");
                }
            }
            landingBurnEngines = String.Join(",", s.ToArray());
            Debug.Log("[BoosterGuidance] landingBurnEngines=" + landingBurnEngines);
            if (controller != null)
            {
                controller.SetLandingBurnEnginesFromString(landingBurnEngines);
            }
            return(num.ToString());
        }
예제 #2
0
 public static void SetActiveEngines(Vessel vessel, List <ModuleEngines> active)
 {
     foreach (var engine in KSPUtils.GetAllEngines(vessel))
     {
         if (active.Contains(engine))
         {
             if (!engine.isOperational)
             {
                 engine.Activate();
             }
         }
         else
         {
             if (engine.isOperational)
             {
                 engine.Shutdown();
             }
         }
     }
 }
 public void SetLandingBurnEnginesFromString(string s)
 {
     if (vessel == null)
     {
         return;
     }
     if (s == "current")
     {
         landingBurnEngines = null;
     }
     else
     {
         string[]             flags   = s.Split(',');
         List <ModuleEngines> engines = KSPUtils.GetAllEngines(vessel);
         if (flags.Length != engines.Count)
         {
             Debug.Log("[BoosterGuidance] Vessel " + vessel.name + " has " + engines.Count + " but landing burn engines list has length " + flags.Length);
             landingBurnEngines    = null;
             setLandingEnginesDone = false;
             return;
         }
         landingBurnEngines = new List <ModuleEngines>();
         for (int i = 0; i < flags.Length; i++)
         {
             if (flags[i] == "1")
             {
                 landingBurnEngines.Add(engines[i]);
             }
             else if (flags[i] != "0")
             {
                 Debug.Log("[BoosterGuidance] Found invalid string '" + s + "' for landingBurnEngines. Expected a boolean list of active engines. e.g. 0,0,1,1,0 or current");
             }
         }
     }
     setLandingEnginesDone = false;
 }
        public void Fly(FlightCtrlState state)
        {
            double   throttle = last_throttle;
            Vector3d steer    = last_steer;
            double   minThrust;
            double   maxThrust;

            KSPUtils.ComputeMinMaxThrust(vessel, out minThrust, out maxThrust);

            Vector3d tgt_r = vessel.mainBody.GetWorldSurfacePosition(tgtLatitude, tgtLongitude, tgtAlt);

            bool   landingGear        = false;
            bool   bailOutLandingBurn = true; // cut thrust if near ground and have too much thrust to reach ground
            double dt  = vessel.missionTime - last_t;
            string msg = "";

            if ((dt > 0.1) || (vessel.altitude < tgtAlt + 500))
            {
                msg = controller.GetControlOutputs(vessel, vessel.GetTotalMass(), vessel.GetWorldPos3D() - vessel.mainBody.position, vessel.GetObtVelocity(), vessel.transform.up, minThrust, maxThrust,
                                                   controller.vessel.missionTime, vessel.mainBody, false, out throttle, out steer, out landingGear, bailOutLandingBurn, debug);
                last_throttle = throttle;
                last_steer    = steer;
                last_t        = vessel.missionTime;
            }

            if ((landingGear) && (!reportedLandingGear))
            {
                KSPUtils.DeployLandingGear(vessel);
                if (vessel == FlightGlobals.ActiveVessel)
                {
                    GuiUtils.ScreenMessage(Localizer.Format("#BoosterGuidance_DeployingLandingGear"));
                }
            }

            if ((msg != "") && (vessel == FlightGlobals.ActiveVessel))
            {
                GuiUtils.ScreenMessage(msg);
            }

            if (vessel.checkLanded())
            {
                DisableGuidance();
                state.mainThrottle = 0;
                return;
            }

            // Set active engines in landing burn
            if (controller.phase == BLControllerPhase.LandingBurn)
            {
                if (controller.landingBurnEngines != null)
                {
                    foreach (ModuleEngines engine in KSPUtils.GetAllEngines(vessel))
                    {
                        if (controller.landingBurnEngines.Contains(engine))
                        {
                            if (!engine.isOperational)
                            {
                                engine.Activate();
                            }
                        }
                        else
                        {
                            if (engine.isOperational)
                            {
                                engine.Shutdown();
                            }
                        }
                    }
                }
            }

            // Draw predicted position if controlling that vessel
            if (vessel == FlightGlobals.ActiveVessel)
            {
                double lat, lon, alt;
                // prediction is for position of planet at current time compensating for
                // planet rotation
                vessel.mainBody.GetLatLonAlt(controller.predBodyRelPos + controller.vessel.mainBody.position, out lat, out lon, out alt);
                alt = vessel.mainBody.TerrainAltitude(lat, lon);              // Make on surface
                Targets.RedrawPrediction(vessel.mainBody, lat, lon, alt + 1); // 1m above ground

                Targets.DrawSteer(vessel.vesselSize.x * Vector3d.Normalize(steer), null, Color.green);
            }
            state.mainThrottle = (float)throttle;
            vessel.Autopilot.SAS.lockedMode = false;
            vessel.Autopilot.SAS.SetTargetOrientation(steer, false);
        }