private void doWeld(Part otherPort, SSTUWeldingDockingPort otherPortModule, Part otherWeld) { Part weld = getBasePart(); if (otherPort == null || otherPortModule == null || otherWeld == null || weld == null) { return; } AttachNode thisNode = weld.FindAttachNodeByPart(part); AttachNode otherNode = otherWeld.FindAttachNodeByPart(otherPort); decoupleFromBase(); otherPortModule.decoupleFromBase(); weld.Couple(otherWeld); setupPartAttachNodes(weld, otherWeld, thisNode, otherNode); //cleanup global data from all the changing of parts/etc FlightGlobals.ForceSetActiveVessel(weld.vessel); //if you don't de-activate the GUI it will null-ref because the active window belongs to one of the exploding parts below. UIPartActionController.Instance.Deactivate(); //but then we need to re-activate it to make sure that part-right clicking/etc doesn't break UIPartActionController.Instance.Activate(); //remove the welding docking ports //TODO find non-explosive way to do this? selfDestruct(); otherPortModule.selfDestruct(); }
/// <summary> /// Switch to the vessel /// </summary> private static IEnumerator SwitchToVessel() { if (VesselToSwitchTo != null) { var tries = 0; var zoom = FlightCamera.fetch.Distance; OrbitPhysicsManager.HoldVesselUnpack(); while (!VesselToSwitchTo.loaded && tries < 100) { tries++; yield return(new WaitForFixedUpdate()); } LunaLog.Log($"Tries: {tries} Loaded: {VesselToSwitchTo.loaded}"); if (!VesselToSwitchTo.loaded) { tries = 0; //Vessels still didn't loaded after 100 fixued update frames, let's wait for 1 more second... while (!VesselToSwitchTo.loaded && tries < 10) { tries++; yield return(new WaitForSeconds(0.1f)); } } FlightGlobals.ForceSetActiveVessel(VesselToSwitchTo); FlightCamera.fetch.SetDistance(zoom); VesselToSwitchTo = null; } }
private void FireHoD() { var wmPart = FlightGlobals.ActiveVessel.FindPartModuleImplementing <MissileFire>(); team = wmPart.team; playerVessel = FlightGlobals.ActiveVessel.id; var SatCount = 0; foreach (Vessel v in FlightGlobals.Vessels) { if (!v.HoldPhysics && v.atmDensity <= 0.000005) { var HoD = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleHammerOfDawn>(); if (HoD != null) { if (HoD.myTeam == team && SatCount == 0) { SatCount += 1; playerVessel = FlightGlobals.ActiveVessel.id; HoD.Fire(); HoD.fireLaser = true; BDArmorySetup.Instance.showVSGUI = true; FlightGlobals.ForceSetActiveVessel(v); FlightInputHandler.ResumeVesselCtrlState(v); StartCoroutine(FocusSwitchRoutine()); } } } } }
private static void SwitchVesselIfSpectating(Vessel killVessel) { if (FlightGlobals.ActiveVessel?.id == killVessel.id) { //Try to switch to a nearby loaded vessel... var otherVessel = FlightGlobals.VesselsLoaded.FirstOrDefault(v => v.id != killVessel.id); //No nearby vessel detected... Get a random vessel and switch to it if exists, otherwise go to spacecenter if (otherVessel == null) { otherVessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id != killVessel.id); } if (otherVessel != null) { FlightGlobals.ForceSetActiveVessel(otherVessel); } else { HighLogic.LoadScene(GameScenes.SPACECENTER); } LunaScreenMsg.PostScreenMessage(LocalizationContainer.ScreenText.SpectatingRemoved, 10f, ScreenMessageStyle.UPPER_CENTER); } }
private void CheckForMine() { var navalMine = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleEnemyMine_Naval>(); var landMine = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleEnemyMine_Land>(); if (navalMine != null || landMine != null) { count = 0.0f; foreach (Vessel v in FlightGlobals.Vessels) { if (!v.HoldPhysics) { double targetDistance = Vector3d.Distance(FlightGlobals.ActiveVessel.GetWorldPos3D(), v.GetWorldPos3D()); if (targetDistance <= 2500 && count <= 1) { count += 1; FlightGlobals.ActiveVessel.DiscoveryInfo.SetLevel(DiscoveryLevels.Unowned); FlightGlobals.ForceSetActiveVessel(v); FlightInputHandler.ResumeVesselCtrlState(v); return; } } } } }
/// <summary>Handles vessel selection logic.</summary> void HandleVesselSelection() { // Highlight focused vessel. SetHoveredVessel(Mouse.HoveredPart? Mouse.HoveredPart.vessel : null); // Select vessel if clicked. if (Mouse.GetAllMouseButtonsDown() == _switchMouseButton && _hoveredVessel != null && !_hoveredVessel.isActiveVessel) { if (_hoveredVessel.DiscoveryInfo.Level != DiscoveryLevels.Owned) { // Cannot switch to unowned vessel. Invoke standard "soft" switch to have error message // triggered. FlightGlobals.SetActiveVessel(_hoveredVessel); } else { // Use forced version since "soft" switch blocks on many normal situations (e.g. "on // ladder" or "in atmosphere"). var vesselToSelect = _hoveredVessel; // Save hovered vessel as it'll be reset on blur. SetHoveredVessel(null); _evsSwitchAction = true; FlightGlobals.ForceSetActiveVessel(vesselToSelect); } } }
public void TryRestoreVessel(StoredVessel stored_vessel) { if (!can_restore()) { return; } ScreenMessager.showMessage(string.Format("Launching {0}...", stored_vessel.vessel.vesselName), 3); //clean up stored_vessels.Remove(stored_vessel.vessel.vesselID); //switch hangar state hangar_state = HangarState.Inactive; //transfer resources transferResources(stored_vessel); //set restored vessel orbit GetLaunchTransform(); position_vessel(stored_vessel); //restore vessel stored_vessel.Load(); //get restored vessel from the world launched_vessel = stored_vessel.vessel.vesselRef; //transfer crew back to the launched vessel List <ProtoCrewMember> crew_to_transfer = CrewTransfer.delCrew(vessel, stored_vessel.crew); //change volume and mass change_part_params(stored_vessel.metric, -1f); //switch to restored vessel FlightGlobals.ForceSetActiveVessel(launched_vessel); SetupVessel(new LaunchedVessel(stored_vessel, launched_vessel, crew_to_transfer, part.flightID)); }
public void SwitchToPayload() { if (payload != null && FlightGlobals.ActiveVessel != payload) { FlightGlobals.ForceSetActiveVessel(payload); } }
public float RecycleKerbal(ProtoCrewMember crew, Part part) { // idea and numbers taken from Kethane if (crew.isBadass && part != null) { part.explosionPotential = 10000; FlightGlobals.ForceSetActiveVessel(this.vessel); } string message = crew.name + " was mulched"; ScreenMessages.PostScreenMessage(message, 30.0f, ScreenMessageStyle.UPPER_CENTER); if (part != null) { FlightLogger.eventLog.Add("[" + FormatTime(part.vessel.missionTime) + "] " + message); part.explode(); } float mass = 0; mass += ReclaimResource("Kethane", 150, crew.name); if (ExLaunchPad.kethane_present) { mass += ReclaimResource("Metal", 1, crew.name); } else { mass += ReclaimResource("RocketParts", 1, crew.name); } return(mass); }
private IEnumerator PlaceSpawnedVessel(Vessel v, bool moveVessel) { loadingCraft = true; v.isPersistent = true; v.Landed = false; v.situation = Vessel.Situations.FLYING; while (v.packed) { yield return null; } v.SetWorldVelocity(Vector3d.zero); yield return null; FlightGlobals.ForceSetActiveVessel(v); yield return null; v.Landed = true; v.situation = Vessel.Situations.PRELAUNCH; v.GoOffRails(); v.IgnoreGForces(240); //Staging.beginFlight(); StageManager.BeginFlight(); if (moveVessel) { VesselMove.Instance.StartMove(v, false); VesselMove.Instance.MoveHeight = 35; yield return null; if (VesselMove.Instance.MovingVessel == v) { v.Landed = false; } } loadingCraft = false; }
public void RemoveVessel(Guid vesselId, bool isDockingUpdate, string dockingPlayer) { var vessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vesselId); if (vessel == null) { return; } if (isDockingUpdate) { if (FlightGlobals.ActiveVessel?.id == vessel.id) { var dockingPlayerVessel = FlightGlobals.Vessels .FirstOrDefault(v => LockSystem.Singleton.LockOwner("control-" + v.id) == dockingPlayer); if (dockingPlayerVessel != null) { FlightGlobals.ForceSetActiveVessel(dockingPlayerVessel); } else { HighLogic.LoadScene(GameScenes.TRACKSTATION); ScreenMessages.PostScreenMessage("Kicked to tracking station, a player docked with you but they were not loaded into the game."); } } Debug.Log($"[LMP]: Removing docked vessel: {vesselId}"); System.KillVessel(vessel, true); } else { Debug.Log($"[LMP]: Removing vessel: {vesselId}"); System.KillVessel(vessel, true); } }
internal void BuildAndLaunchCraft() { // build craft ShipConstruct nship = new ShipConstruct(); nship.LoadShip(craftConfig); string landedAt = "External Launchpad"; string flag = flagname; Game game = FlightDriver.FlightStateCache; VesselCrewManifest crew = new VesselCrewManifest(); Box vessel_bounds = GetVesselBox(nship); launchTransform = builder.PlaceShip(nship, vessel_bounds); EnableExtendingLaunchClamps(nship); ShipConstruction.AssembleForLaunch(nship, landedAt, landedAt, flag, game, crew); var FlightVessels = FlightGlobals.Vessels; craftVessel = FlightVessels[FlightVessels.Count - 1]; FlightGlobals.ForceSetActiveVessel(craftVessel); if (builder.capture) { craftVessel.Splashed = craftVessel.Landed = false; } else { bool loaded = craftVessel.loaded; bool packed = craftVessel.packed; craftVessel.loaded = true; craftVessel.packed = false; craftVessel.GetHeightFromTerrain(); Debug.LogFormat("[EL] hft {0}", craftVessel.heightFromTerrain); craftVessel.loaded = loaded; craftVessel.packed = packed; } Vector3 offset = craftVessel.transform.position - launchTransform.position; craftOffset = launchTransform.InverseTransformDirection(offset); SetupCraftResources(craftVessel); KSP.UI.Screens.StageManager.BeginFlight(); if (builder.capture) { FlightGlobals.overrideOrbit = true; (builder as PartModule).StartCoroutine(CaptureCraft()); } else { state = State.Idle; } }
public void ForceSetActiveVessel(VesselTarget vesselTarget) { Vessel vessel = vesselTarget.Vessel; if (!vessel.isActiveVessel) { FlightGlobals.ForceSetActiveVessel(vessel); } }
public static void CoupleParts(Part srcPart, Part trgPart, AttachNode sourceNode, AttachNode targetNode = null) { Vessel srcVessel = srcPart.vessel; Vessel trgVessel = trgPart.vessel; DockedVesselInfo vesselInfo = new DockedVesselInfo(); vesselInfo.name = srcVessel.vesselName; vesselInfo.vesselType = srcVessel.vesselType; vesselInfo.rootPartUId = srcVessel.rootPart.flightID; GameEvents.onActiveJointNeedUpdate.Fire(srcVessel); GameEvents.onActiveJointNeedUpdate.Fire(trgVessel); sourceNode.attachedPart = trgPart; sourceNode.attachedPartId = trgPart.flightID; if (sourceNode.id != "srfAttach") { srcPart.attachMode = AttachModes.STACK; if (targetNode != null) { targetNode.attachedPart = srcPart; } else { log.warning("Target node is null."); } } else { srcPart.attachMode = AttachModes.SRF_ATTACH; } srcPart.Couple(trgPart); // Depending on how active vessel has updated do either force active or make active. Note, that // active vessel can be EVA kerbal, in which case nothing needs to be adjusted. // FYI: This logic was taken from ModuleDockingNode.DockToVessel. if (srcVessel == FlightGlobals.ActiveVessel) { FlightGlobals.ForceSetActiveVessel(sourceNode.owner.vessel); // Use actual vessel. } else if (sourceNode.owner.vessel == FlightGlobals.ActiveVessel) { sourceNode.owner.vessel.MakeActive(); } GameEvents.onVesselWasModified.Fire(sourceNode.owner.vessel); ModuleDockingNode sourcePort, targetPort; if (hasDockingPort(sourceNode, out sourcePort)) { CoupleDockingPortWithPart(sourcePort); } if (hasDockingPort(targetNode, out targetPort)) { CoupleDockingPortWithPart(targetPort); } }
void AsteroidGUI(int windowID) { double asteroidPrice = 0; GUILayout.BeginVertical(); scrollPos = GUILayout.BeginScrollView(scrollPos, HighLogic.Skin.scrollView); foreach (Vessel vessels in FlightGlobals.Vessels) { if (vessels.vesselType == VesselType.SpaceObject && vessels.loaded == true) { if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.A) { asteroidPrice = 5000; } if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.B) { asteroidPrice = 10000; } if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.C) { asteroidPrice = 20000; } if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.D) { asteroidPrice = 35000; } if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.E) { asteroidPrice = 50000; } if (GUILayout.Button("name: " + vessels.vesselName + "\n" + "type: " + vessels.DiscoveryInfo.objectSize + "\n price: " + asteroidPrice, HighLogic.Skin.button)) { if (vessels.parts.Count >= 1) { FlightGlobals.ForceSetActiveVessel(part.vessel); Funding.Instance.AddFunds(asteroidPrice, TransactionReasons.VesselRecovery); vessels.Die(); ScreenMessages.PostScreenMessage("Asteroid Selled", 5.0f, ScreenMessageStyle.UPPER_CENTER); } else { ScreenMessages.PostScreenMessage("There is still a ship on the asteroid", 5.0f, ScreenMessageStyle.UPPER_CENTER); } } } } GUILayout.EndScrollView(); if (GUILayout.Button("close", HighLogic.Skin.button)) { asteroidGUI = false; MainMenu.menuWindow = true; } GUILayout.EndVertical(); }
private void DrawVessel(ProtoCrewMember kerbal) { if (GUILayout.Button(vessel != null ? vessel.GetName() : "Not in a vessel", STYLE_LOCATION_LABEL)) { if (vessel != null && HighLogic.LoadedSceneIsFlight) { FlightGlobals.ForceSetActiveVessel(vessel); } } }
// Extracted method, so we dont have to call these two lines everywhere private void ForceSwitchVessel(Vessel v) { if (BDArmorySettings.MULTIPLAYER_ACTIVE) { return; } FlightGlobals.ForceSetActiveVessel(v); FlightInputHandler.ResumeVesselCtrlState(v); }
/// <summary> /// Switch to the vessel /// </summary> private static IEnumerator SwitchToVessel() { if (VesselToSwitchTo != null) { FlightGlobals.ForceSetActiveVessel(VesselToSwitchTo); yield return(0); VesselToSwitchTo = null; } }
public void ReleaseVessel() { TransferResources(); craftRoot.Undock(vesselInfo); var vesselCount = FlightGlobals.Vessels.Count; Vessel vsl = FlightGlobals.Vessels[vesselCount - 1]; FlightGlobals.ForceSetActiveVessel(vsl); //builder.part.StartCoroutine (FixAirstreamShielding (vsl)); CleanupAfterRelease(); }
private void SwitchToPreviousVessel() { if (_wmgrsB.Count > 0) { for (var i = _wmgrsB.Count - 1; i >= 0; i--) { if (_wmgrsB[i].vessel.isActiveVessel) { if (i > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsB[i - 1].vessel); return; } else if (_wmgrsA.Count > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsA[_wmgrsA.Count - 1].vessel); return; } else if (_wmgrsB.Count > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsB[_wmgrsB.Count - 1].vessel); return; } } } } if (_wmgrsA.Count > 0) { for (var i = _wmgrsA.Count - 1; i >= 0; i--) { if (_wmgrsA[i].vessel.isActiveVessel) { if (i > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsA[i - 1].vessel); return; } else if (_wmgrsB.Count > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsB[_wmgrsB.Count - 1].vessel); return; } else if (_wmgrsA.Count > 0) { FlightGlobals.ForceSetActiveVessel(_wmgrsA[_wmgrsA.Count - 1].vessel); return; } } } } }
public void CollectParts(Part part) { if (FlightGlobals.ActiveVessel == part.vessel) { FlightGlobals.ForceSetActiveVessel(recycler.vessel); } recycle_parts.Clear(); foreach (var p in part.vessel.parts) { recycle_parts.Add(p.flightID); } recycler.StartCoroutine(WaitAndCouple(part)); }
IEnumerator FocusSwitchRoutine() { yield return(new WaitForSeconds(2)); foreach (Vessel v in FlightGlobals.Vessels) { if (v.id == playerVessel) { FlightGlobals.ForceSetActiveVessel(v); FlightInputHandler.ResumeVesselCtrlState(v); } } }
private void CoupleWithCraft(Vessel craftVessel) { craftRoot = craftVessel.rootPart; vesselInfo = new DockedVesselInfo(); vesselInfo.name = craftVessel.vesselName; vesselInfo.vesselType = craftVessel.vesselType; vesselInfo.rootPartUId = craftRoot.flightID; craftRoot.Couple(builder.part); if (builder.vessel != FlightGlobals.ActiveVessel) { FlightGlobals.ForceSetActiveVessel(builder.vessel); } }
//store vessel void store_vessel(Vessel vsl, bool perform_checks = true) { StoredVessel stored_vessel = new StoredVessel(); if (perform_checks) //for normal operation { //check momentary states if (!can_store(vsl)) { return; } //check if the vessel can be stored, if unknown, try to store bool storable; if (!probed_ids.TryGetValue(vsl.id, out storable)) { stored_vessel = try_store(vsl); storable = stored_vessel != null; probed_ids.Add(vsl.id, storable); } if (!storable) { return; } } else //for storing packed constructs upon hangar launch { stored_vessel = new StoredVessel(vsl); stored_vessels.ForceAdd(stored_vessel); } //get vessel crew on board List <ProtoCrewMember> _crew = new List <ProtoCrewMember>(stored_vessel.crew); CrewTransfer.delCrew(vsl, _crew); vsl.DespawnCrew(); //first of, add crew to the hangar if there's a place CrewTransfer.addCrew(part, _crew); //then add to other vessel parts if needed CrewTransfer.addCrew(vessel, _crew); //recalculate volume and mass change_part_params(stored_vessel.metric); //switch to hangar vessel before storing if (FlightGlobals.ActiveVessel.id == vsl.id) { FlightGlobals.ForceSetActiveVessel(vessel); } //destroy vessel vsl.Die(); ScreenMessager.showMessage("Vessel has been docked inside the hangar", 3); }
public void ReleaseVessel() { if (craftRoot != null) { craftRoot.Undock(vesselInfo); var vesselCount = FlightGlobals.Vessels.Count; Vessel vsl = FlightGlobals.Vessels[vesselCount - 1]; FlightGlobals.ForceSetActiveVessel(vsl); } craftConfig = null; vesselInfo = null; buildCost = null; builtStuff = null; state = State.Idle; }
/// <inheritdoc/> public Part CoupleParts(AttachNode sourceNode, AttachNode targetNode, bool toDominantVessel = false) { if (toDominantVessel) { var dominantVessel = Vessel.GetDominantVessel(sourceNode.owner.vessel, targetNode.owner.vessel); if (dominantVessel != targetNode.owner.vessel) { var tmp = sourceNode; sourceNode = targetNode; targetNode = tmp; } } DebugEx.Fine("Couple {0} to {1}", KASAPI.AttachNodesUtils.NodeId(sourceNode), KASAPI.AttachNodesUtils.NodeId(targetNode)); var srcPart = sourceNode.owner; var srcVessel = srcPart.vessel; KASAPI.AttachNodesUtils.AddNode(srcPart, sourceNode); var tgtPart = targetNode.owner; var tgtVessel = tgtPart.vessel; KASAPI.AttachNodesUtils.AddNode(tgtPart, targetNode); sourceNode.attachedPart = tgtPart; sourceNode.attachedPartId = tgtPart.flightID; targetNode.attachedPart = srcPart; targetNode.attachedPartId = srcPart.flightID; tgtPart.attachMode = AttachModes.STACK; srcPart.Couple(tgtPart); // Depending on how active vessel has updated do either force active or make active. Note, that // active vessel can be EVA kerbal, in which case nothing needs to be adjusted. // FYI: This logic was taken from ModuleDockingNode.DockToVessel. if (srcVessel == FlightGlobals.ActiveVessel) { FlightGlobals.ForceSetActiveVessel(sourceNode.owner.vessel); // Use actual vessel. FlightInputHandler.SetNeutralControls(); } else if (sourceNode.owner.vessel == FlightGlobals.ActiveVessel) { sourceNode.owner.vessel.MakeActive(); FlightInputHandler.SetNeutralControls(); } return(srcPart); }
public void ConsumeKerbal() { var vessel = FlightGlobals.ActiveVessel; if (!vessel.isEVA) { return; } if (vessel.GetVesselCrew()[0].isBadass) { vessel.rootPart.explosionPotential = 10000; } FlightGlobals.ForceSetActiveVessel(this.vessel); vessel.rootPart.explode(); this.part.RequestResource("Kethane", -150); }
private static void AfterCouplingEvent() { if (_activeVesselIsWeakVessel) { if (_dominantVessel) { FlightGlobals.ForceSetActiveVessel(_dominantVessel); FlightInputHandler.SetNeutralControls(); } } if (_activeVesselIsDominantVessel) { _dominantVessel.MakeActive(); FlightInputHandler.SetNeutralControls(); } }
private void BuildAndLaunchCraft() { // build craft ShipConstruct nship = ShipConstruction.LoadShip(uis.craftfile); Vector3 offset = nship.Parts[0].transform.localPosition; nship.Parts[0].transform.Translate(-offset); string landedAt = "External Launchpad"; string flag = uis.flagname; Game state = FlightDriver.FlightStateCache; VesselCrewManifest crew = new VesselCrewManifest(); ShipConstruction.CreateBackup(nship); ShipConstruction.PutShipToGround(nship, GetLanchTransform()); ShipConstruction.AssembleForLaunch(nship, landedAt, flag, state, crew); Vessel vsl = FlightGlobals.Vessels[FlightGlobals.Vessels.Count - 1]; FlightGlobals.ForceSetActiveVessel(vsl); vsl.Landed = false; if (kethane_present && !DebugPad) { UseResources(vsl); } if (vessel.situation == Vessel.Situations.ORBITING) { HackStruts(vsl); uis.vesselInfo = new DockedVesselInfo(); uis.vesselInfo.name = vsl.vesselName; uis.vesselInfo.vesselType = vsl.vesselType; uis.vesselInfo.rootPartUId = vsl.rootPart.flightID; vsl.rootPart.Couple(part); FlightGlobals.ForceSetActiveVessel(vessel); } else { uis.timer = 3.0f; uis.launchee = vsl; } Staging.beginFlight(); }
private void BuildCraft() { // build craft ShipConstruct nship = ShipConstruction.LoadShip(uifs.craftfile); Transform launchtransform = GetLaunchTransform(); Vector3 offset = nship.Parts[0].transform.localPosition; nship.Parts[0].transform.Translate(-offset); Game state = FlightDriver.FlightStateCache; VesselCrewManifest crew = new VesselCrewManifest(); ShipConstruction.CreateBackup(nship); ShipConstruction.PutShipToGround(nship, launchtransform); ShipConstruction.AssembleForLaunch(nship, uifs.LaunchSiteName, uifs.flagname, state, crew); Vessel vsl = FlightGlobals.Vessels[FlightGlobals.Vessels.Count - 1]; FlightGlobals.ForceSetActiveVessel(vsl); vsl.Landed = false; HackStruts(vsl); uifs.vesselInfo = new DockedVesselInfo(); uifs.vesselInfo.name = vsl.vesselName; uifs.vesselInfo.vesselType = vsl.vesselType; uifs.vesselInfo.rootPartUId = vsl.rootPart.uid; uifs.vesselFlightID = vsl.rootPart.flightID; FlightDriver.flightStarted = true; FlightDriver.newShipFlagURL = uifs.flagname; FlightDriver.newShipManifest = crew; vsl.state = Vessel.State.ACTIVE; vsl.situation = Vessel.Situations.ORBITING; Staging.beginFlight(); vsl.ResumeStaging(); Staging.GenerateStagingSequence(vsl.rootPart); Staging.RecalculateVesselStaging(vsl); FlightGlobals.ForceSetActiveVessel(vessel); vsl.rootPart.Couple(part); vessel.ResumeStaging(); Staging.GenerateStagingSequence(vessel.rootPart); Staging.RecalculateVesselStaging(vessel); Events[("DecoupleVessel")].active = true; }