public double getAltitude() { var box = Vessel.BoundingBox(refFrame); double x = Math.Abs(box.Item1.Item1 - box.Item2.Item1); double y = Math.Abs(box.Item1.Item2 - box.Item2.Item2); double z = Math.Abs(box.Item1.Item3 - box.Item2.Item3); double maxbound = Math.Max(Math.Max(x, y), z) * 0.5; return(Flight.SurfaceAltitude - maxbound); }
public static void Land(this Vessel vessel) { var srfFlight = vessel.Flight(vessel.Orbit.Body.ReferenceFrame); while (srfFlight.VerticalSpeed > -2) { System.Threading.Thread.Sleep(100); } vessel.Control.SAS = true; vessel.Control.Gear = true; vessel.Control.Brakes = vessel.Orbit.Body.HasAtmosphere; while (!(vessel.Control.SASMode == SASMode.Retrograde && vessel.Control.RCS)) { vessel.Control.SASMode = SASMode.Retrograde; vessel.Control.RCS = true; } bool shouldThrust = false; double comOffset = Math.Abs(vessel.BoundingBox(vessel.ReferenceFrame).Item1.Item2); double distanceToGround = vessel.Flight().SurfaceAltitude - comOffset; double srfGrav = vessel.Orbit.Body.SurfaceGravity; while (distanceToGround > 0.5) { double initialSpeedSquared = Math.Pow(srfFlight.Speed, 2); float acc = (float)(((3 + initialSpeedSquared) / (2 * distanceToGround)) + srfGrav); float thrustRequired = vessel.Mass * acc; float throttle = thrustRequired / (vessel.AvailableThrust); if (throttle > 0.98) { shouldThrust = true; } if (throttle < 0.1) { shouldThrust = false; } if (shouldThrust) { vessel.Accelerate(acc); } vessel.Control.SASMode = srfFlight.Speed < 20 ? SASMode.StabilityAssist : SASMode.Retrograde; comOffset = Math.Abs(vessel.BoundingBox(vessel.ReferenceFrame).Item1.Item2); distanceToGround = vessel.Flight().SurfaceAltitude - comOffset; } while (!(vessel.Situation == VesselSituation.Landed || vessel.Situation == VesselSituation.Splashed)) { vessel.Accelerate(1); } vessel.Accelerate(0); }