public Vessel.State GoOnRails(CelestialBodyData initialPlanet, bool reCenter) { if (reCenter) { this.partsManager.ReCenter(); } Double3 getGlobalPosition = this.GetGlobalPosition; Double3 getGlobalVelocity = this.GetGlobalVelocity; this.partsManager.rb2d.bodyType = RigidbodyType2D.Static; foreach (EngineModule current in this.partsManager.engineModules) { current.nozzleMove.SetTargetTime(0f); current.UpdateEngineThrottle(this.throttle); } this.stationaryData.posToPlane = getGlobalPosition; this.stationaryData.planet = initialPlanet; if (Math.Abs(getGlobalVelocity.x) < 0.3 && Math.Abs(getGlobalVelocity.y) < 0.3) { this.orbits.Clear(); this.mapIcon.localPosition = (this.stationaryData.posToPlane / 10000.0).toVector3; return(Vessel.State.Stationary); } this.orbits = Orbit.CalculateOrbits(getGlobalPosition, getGlobalVelocity, initialPlanet); if (double.IsNaN(this.orbits[0].meanMotion)) { MonoBehaviour.print("Cannot orbit NaN, went stationary instead"); this.orbits.Clear(); this.mapIcon.localPosition = (this.stationaryData.posToPlane / 10000.0).toVector3; return(Vessel.State.Stationary); } this.CheckOrbitArchivments(this.orbits[0]); return(Vessel.State.OnRails); }
private static Vessel LoadVessel(GameSaving.VesselSave vesselToLoad) { List <Part> list = new List <Part>(GameSaving.LoadParts(vesselToLoad)); Part[] loadedParts = list.ToArray(); GameSaving.LoadPartsData(vesselToLoad, loadedParts); list.Remove(null); Orientation.ApplyOrientation(list[0].transform, list[0].orientation); Vessel vessel = Vessel.CreateVessel(list[0].GetComponent <Part>(), Vector2.zero, vesselToLoad.angularVelocity, vesselToLoad.throttle, vesselToLoad.vesselArchivments, Ref.map.mapRefs[Ref.GetPlanetByName(vesselToLoad.adress)].holder); for (int i = 0; i < vessel.partsManager.parts.Count; i++) { if (vessel.partsManager.parts[i] != null) { vessel.partsManager.parts[i].UpdateConnected(); } } vessel.partsManager.UpdateCenterOfMass(); vessel.partsManager.ReCenter(); vessel.transform.position = (vesselToLoad.globalPosition - Ref.positionOffset).toVector2; vessel.transform.eulerAngles = new Vector3(0f, 0f, vesselToLoad.rotation); if (vesselToLoad.state == Vessel.State.RealTime) { vessel.partsManager.rb2d.velocity = (vesselToLoad.globalVelocity - Ref.velocityOffset).toVector2; } else if (vesselToLoad.state == Vessel.State.OnRails || vesselToLoad.state == Vessel.State.OnRailsUnloaded) { vessel.orbits = Orbit.CalculateOrbits(vesselToLoad.globalPosition, vesselToLoad.globalVelocity, Ref.GetPlanetByName(vesselToLoad.adress)); vessel.partsManager.rb2d.bodyType = RigidbodyType2D.Static; vessel.state = Vessel.State.OnRails; if (vessel.state == Vessel.State.OnRailsUnloaded) { vessel.SetVesselState(Vessel.ToState.ToUnloaded); } if (double.IsNaN(vessel.orbits[0].meanMotion)) { MonoBehaviour.print("Cannot orbit NaN, went stationary instead"); vessel.orbits.Clear(); vessel.stationaryData.posToPlane = vesselToLoad.globalPosition; vessel.stationaryData.planet = Ref.GetPlanetByName(vesselToLoad.adress); vessel.state = Vessel.State.Stationary; vessel.SetVesselState(Vessel.ToState.ToUnloaded); vessel.mapIcon.localPosition = (vessel.stationaryData.posToPlane / 10000.0).toVector3; } } else { vessel.stationaryData.posToPlane = vesselToLoad.globalPosition; vessel.stationaryData.planet = Ref.GetPlanetByName(vesselToLoad.adress); vessel.state = Vessel.State.Stationary; if (vesselToLoad.state == Vessel.State.StationaryUnloaded) { vessel.SetVesselState(Vessel.ToState.ToUnloaded); } vessel.mapIcon.localPosition = (vessel.stationaryData.posToPlane / 10000.0).toVector3; } vessel.mapIcon.rotation = vessel.partsManager.parts[0].transform.rotation; vessel.RCS = vesselToLoad.RCS; return(vessel); }
public static List <Orbit> CalculateOrbits(Double3 posIn, Double3 velIn, CelestialBodyData initialPlanet) { List <Orbit> list = new List <Orbit>(); if (double.IsNaN(posIn.x * velIn.y - posIn.y * velIn.x)) { return(list); } list.Add(new Orbit(posIn, velIn, Ref.controller.globalTime, initialPlanet, null)); return(Orbit.CalculateOrbits(list)); }
private static Vessel LoadVessel(GameSaving.VesselSave vesselToLoad) { Part[] array = GameSaving.LoadParts(vesselToLoad); Vessel vessel = Vessel.CreateVessel(array[0].GetComponent <Part>(), Vector2.zero, vesselToLoad.angularVelocity, vesselToLoad.throttle, vesselToLoad.vesselArchivments, Ref.GetPlanetByName(vesselToLoad.adress).mapRefs.holder); vessel.partsManager.UpdateCenterOfMass(); vessel.partsManager.ReCenter(); vessel.transform.position = (vesselToLoad.globalPosition - Ref.positionOffset).toVector2; vessel.transform.eulerAngles = new Vector3(0f, 0f, vesselToLoad.rotation); if (vesselToLoad.state == Vessel.State.RealTime) { vessel.partsManager.rb2d.velocity = (vesselToLoad.globalVelocity - Ref.velocityOffset).toVector2; } else if (vesselToLoad.state == Vessel.State.OnRails || vesselToLoad.state == Vessel.State.OnRailsUnloaded) { vessel.orbits = Orbit.CalculateOrbits(vesselToLoad.globalPosition, vesselToLoad.globalVelocity, Ref.GetPlanetByName(vesselToLoad.adress)); vessel.partsManager.rb2d.bodyType = RigidbodyType2D.Static; vessel.state = Vessel.State.OnRails; if (vessel.state == Vessel.State.OnRailsUnloaded) { vessel.SetVesselState(Vessel.ToState.ToUnloaded); } if (double.IsNaN(vessel.orbits[0].meanMotion)) { MonoBehaviour.print("Cannot orbit NaN, went stationary instead"); vessel.orbits.Clear(); vessel.stationaryData.posToPlane = vesselToLoad.globalPosition; vessel.stationaryData.planet = Ref.GetPlanetByName(vesselToLoad.adress); vessel.state = Vessel.State.Stationary; vessel.SetVesselState(Vessel.ToState.ToUnloaded); vessel.mapIcon.localPosition = (vessel.stationaryData.posToPlane / 10000.0).toVector3; } } else { vessel.stationaryData.posToPlane = vesselToLoad.globalPosition; vessel.stationaryData.planet = Ref.GetPlanetByName(vesselToLoad.adress); vessel.state = Vessel.State.Stationary; if (vesselToLoad.state == Vessel.State.StationaryUnloaded) { vessel.SetVesselState(Vessel.ToState.ToUnloaded); } vessel.mapIcon.localPosition = (vessel.stationaryData.posToPlane / 10000.0).toVector3; } GameSaving.LoadPartsData(vesselToLoad, array); vessel.mapIcon.rotation = vessel.partsManager.parts[0].transform.rotation; return(vessel); }
private List <Orbit> GetVesselOrbits(Vessel vessel) { if (vessel == null) { return(new List <Orbit>()); } if (vessel.state == Vessel.State.RealTime) { Double3 velIn = Ref.velocityOffset + vessel.partsManager.rb2d.velocity; if (velIn.sqrMagnitude2d > 4.0) { return(Orbit.CalculateOrbits(vessel.GetGlobalPosition, velIn, Ref.controller.loadedPlanet)); } } return(vessel.orbits); }
private List <Orbit> UpdateRealtimeVesselOrbitLines(Vessel vessel) { if (vessel == null || vessel.partsManager.rb2d == null) { return(new List <Orbit>()); } Double3 velIn = Ref.velocityOffset + vessel.partsManager.rb2d.velocity; if (velIn.sqrMagnitude2d > 2.0) { List <Orbit> list = Orbit.CalculateOrbits(vessel.GetGlobalPosition, velIn, Ref.controller.loadedPlanet); this.UpdateVesselOrbitLines(list, false); return(list); } return(new List <Orbit>()); }
private void EnterNextOrbit() { if (this.orbits[0].orbitType == Orbit.Type.Escape) { this.AddArchivment("Escaped " + this.orbits[0].planet.bodyName + " sphere of influence."); } else if (this.orbits[0].orbitType == Orbit.Type.Encounter) { this.AddArchivment("Entered " + this.orbits[0].nextPlanet.bodyName + " sphere of influence."); } this.orbits.RemoveAt(0); this.orbits = Orbit.CalculateOrbits(this.orbits); Double3 posOut = this.orbits[0].GetPosOut(Ref.controller.globalTime); this.mapIcon.parent = Ref.map.mapRefs[this.orbits[0].planet].holder; if (Ref.mainVessel == this) { Ref.planetManager.SwitchLocation(this.orbits[0].planet, posOut, true, false, 0.0); } }
private void Update() { this.CheckLoadDistance(); Double3 @double = this.GetGlobalPosition; bool flag = this.state == Vessel.State.RealTime; if (flag) { @double = Ref.positionOffset + this.partsManager.rb2d.worldCenterOfMass; if (Time.time > this.archivmentCheckTime) { this.archivmentCheckTime = Time.time + 1f; this.CheckForArchivments(); this.CheckOrbitArchivments(new Orbit(@double, this.GetGlobalVelocity, Ref.controller.loadedPlanet)); } bool flag3 = this.OnSurface && !this.castedHook; if (flag3) { new MyVesselLandedHook(this, Ref.controller.loadedPlanet.parentBody).executeDefault(); this.castedHook = true; } else { bool flag4 = !this.OnSurface && this.castedHook; if (flag4) { this.castedHook = false; } } if (@double.sqrMagnitude2d > Ref.controller.loadedPlanet.orbitData.SOI * Ref.controller.loadedPlanet.orbitData.SOI) { this.AddArchivment("Escaped " + Ref.controller.loadedPlanet.bodyName + " sphere of influence"); CelestialBodyData parentBody = Ref.controller.loadedPlanet.parentBody; this.mapIcon.parent = Ref.map.mapRefs[parentBody].holder; if (Ref.mainVessel == this) { Ref.controller.EnterTimeWarpMode(); this.EnterNextOrbit(); Ref.controller.ExitTimeWarpMode(); @double = this.GetGlobalPosition; } else { this.partsManager.ReCenter(); Double3 posIn = Ref.controller.loadedPlanet.GetPosOut(Ref.controller.globalTime) + @double; Double3 velIn = Ref.controller.loadedPlanet.GetVelOut(Ref.controller.globalTime) + this.GetGlobalVelocity; this.partsManager.rb2d.bodyType = RigidbodyType2D.Static; this.partsManager.rb2d.gameObject.SetActive(false); this.orbits = Orbit.CalculateOrbits(posIn, velIn, parentBody); this.state = Vessel.State.OnRailsUnloaded; } } foreach (CelestialBodyData celestialBodyData in Ref.controller.loadedPlanet.satellites) { Double3 double2 = @double - celestialBodyData.GetPosOut(Ref.controller.globalTime); if (double2.sqrMagnitude2d < celestialBodyData.orbitData.SOI * celestialBodyData.orbitData.SOI) { this.AddArchivment("Entered " + celestialBodyData.bodyName + " sphere of influence"); this.mapIcon.parent = Ref.map.mapRefs[celestialBodyData].holder; Double3 posIn2 = double2; Double3 velIn2 = this.GetGlobalVelocity - celestialBodyData.GetVelOut(Ref.controller.globalTime); if (Ref.mainVessel == this) { Ref.controller.EnterTimeWarpMode(); this.EnterNextOrbit(); Ref.controller.ExitTimeWarpMode(); @double = this.GetGlobalPosition; } else { this.partsManager.ReCenter(); this.partsManager.rb2d.bodyType = RigidbodyType2D.Static; this.partsManager.rb2d.gameObject.SetActive(false); this.orbits = Orbit.CalculateOrbits(posIn2, velIn2, celestialBodyData); this.state = Vessel.State.OnRailsUnloaded; } } } if (Ref.mapView) { this.mapIcon.localPosition = (@double / 10000.0).toVector3; this.mapIcon.localRotation = this.partsManager.parts[0].transform.rotation; } } else if (this.state == Vessel.State.OnRails || this.state == Vessel.State.OnRailsUnloaded) { if (this.orbits[0].orbitEndTime < Ref.controller.globalTime) { this.EnterNextOrbit(); @double = this.GetGlobalPosition; } if (this.orbits[0].calculatePassesTime != double.PositiveInfinity && Ref.controller.globalTime > this.orbits[0].calculatePassesTime - this.orbits[0]._period * 0.9 && this.orbits[0].UpdatePass()) { this.orbits = Orbit.CalculateOrbits(this.orbits); } if (Ref.mapView) { this.mapIcon.localPosition = (@double / 10000.0).toVector3; } else if (this.state == Vessel.State.OnRails) { base.transform.position = (@double - Ref.positionOffset).toVector3; } if (Ref.mainVessel != this && @double.magnitude2d - this.orbits[0].planet.radius < this.orbits[0].planet.GetTerrainSampleAtAngle(Math.Atan2(@double.y, @double.x) * 57.2958)) { this.DestroyVessel(); } } }