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()); }
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); }