public void UpdateVessel(Vessel vessel, comms.Vessel vesselUpdate) { // Check for vessel rename / type change if (vessel.vesselName != vesselUpdate.Name) { vessel.vesselName = vesselUpdate.Name; } if (vessel.vesselType != (VesselType)vesselUpdate.VesselType) { vessel.vesselType = (VesselType)vesselUpdate.VesselType; } vessel.latitude = vesselUpdate.Latitude; vessel.longitude = vesselUpdate.Longitude; // Vessels near the ground have a habit of exploding, so force them "on rails" const float OFF_RAILS_HEIGHT = 300.0f; var height = Math.Min(vessel.GetHeightFromTerrain(), (float)vessel.altitude); // Careful, GetHeightFromTerrain() returns -1 in high orbit if (height > 0.0f && height < OFF_RAILS_HEIGHT) { // Unfortunately GetHeightFromTerrain() doesn't get updated when on rails, so // we can't use it check when we should go back off rails. Instead we cheat and // send it across the wire. if (vesselUpdate.Height > 0.0f && vesselUpdate.Height < OFF_RAILS_HEIGHT) { // We're close the the ground, prevent impact vessel.GoOnRails(); return; } // We're now at a safe altitude vessel.GoOffRails(); // Sometimes the vessel can get stuck in the landed state, // most often when starting a new launch first thing after // starting the game. See issue #17. vessel.checkLanded(); } if (vessel.orbitDriver.updateMode == OrbitDriver.UpdateMode.UPDATE) { // Finally update the vessel's orbit from the network data var orbit = vesselUpdate.Orbit.GetKspOrbit(FlightGlobals.Bodies); vessel.orbit.UpdateFromOrbitAtUT(orbit, Planetarium.GetUniversalTime(), orbit.referenceBody); } else if (vessel.orbitDriver.updateMode == OrbitDriver.UpdateMode.TRACK_Phys) { // We don't want physics to be calculated vessel.orbitDriver.updateMode = OrbitDriver.UpdateMode.UPDATE; } }
public static void UpdateVessel(utils.MonoBehaviourExtended logger, comms.Vessel vesselUpdate) { var vessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vesselUpdate.Id); if (vessel != null) { GamePersistence.SaveGame(Startup.SAVEFILE, Startup.SAVEDIRECTORY, SaveMode.OVERWRITE); FlightDriver.StartAndFocusVessel(HighLogic.CurrentGame, FlightGlobals.Vessels.IndexOf(vessel)); return; } logger.LogDebug("Vessel {0} not found (vessel id {1}).", vesselUpdate.Name, vesselUpdate.Id); }