private static void UpdateOrbit(OrbitDriver driver, bool offset, ref bool ready, ref double fdtLast, ref bool isHyperbolic) { if (!ready) { return; } driver.lastMode = driver.updateMode; //Always call updateFromParameters so the vessel is positioned based on the orbital data if ((VesselPositionSystem.Singleton.VesselHavePositionUpdatesQueued(driver.vessel.id) && driver.updateMode == OrbitDriver.UpdateMode.TRACK_Phys) || driver.updateMode == OrbitDriver.UpdateMode.UPDATE) { driver.updateFromParameters(); if (driver.vessel) { driver.CheckDominantBody(driver.referenceBody.position + driver.pos); } } if (driver.vessel && driver.vessel.rootPart && driver.vessel.rootPart.rb) { if (!offset) { fdtLast = 0; } if (!driver.CheckDominantBody(driver.vessel.CoMD)) { driver.TrackRigidbody(driver.referenceBody, -fdtLast); } } fdtLast = (double)TimeWarp.fixedDeltaTime; if (isHyperbolic && driver.orbit.eccentricity < 1) { isHyperbolic = false; if (driver.vessel != null) { GameEvents.onVesselOrbitClosed.Fire(driver.vessel); } } if (!isHyperbolic && driver.orbit.eccentricity > 1) { isHyperbolic = true; if (driver.vessel != null) { GameEvents.onVesselOrbitEscaped.Fire(driver.vessel); } } if (driver.drawOrbit) { driver.orbit.DrawOrbit(); } }
private void MakeOrbit(OrbitDriver driver, CelestialBody reference) { Debug.Log("Jumping to " + partnerBody); CelestialBody oldBody = driver.referenceBody; FlightGlobals.overrideOrbit = true; FlightGlobals.fetch.Invoke("disableOverride", 2f); driver.vessel.Landed = false; driver.vessel.Splashed = false; driver.vessel.SetLandedAt(""); driver.vessel.KillPermanentGroundContact(); driver.vessel.ResetGroundContact(); FlightGlobals.currentMainBody = reference; OrbitPhysicsManager.SetDominantBody(reference); // Pack vessels foreach (Vessel vessel in FlightGlobals.Vessels) { if (!vessel.packed) { vessel.GoOnRails(); } } // Disable inverse rotation foreach (CelestialBody body in PSystemManager.Instance.localBodies) { body.inverseRotation = false; } driver.orbit.referenceBody = reference; driver.updateFromParameters(); // Finalize Vessel Movement CollisionEnhancer.bypass = true; FloatingOrigin.SetOffset(driver.vessel.transform.position); OrbitPhysicsManager.CheckReferenceFrame(); OrbitPhysicsManager.HoldVesselUnpack(10); if (reference != oldBody) { GameEvents.onVesselSOIChanged.Fire( new GameEvents.HostedFromToAction <Vessel, CelestialBody>(driver.vessel, oldBody, reference)); } driver.vessel.IgnoreGForces(20); }