private void VesselResumeStage(Vessel data) { if (remoteStagingStatus == RemoteStagingState.WaitingFocus) { remoteStagingStatus = RemoteStagingState.FocusFinished; } }
public override void OnUpdate() { //Commenting this because now we support autostaging on non active vessels //if (!vessel.isActiveVessel) // return; //if autostage enabled, and if we've already staged at least once, and if there are stages left, //and if we are allowed to continue staging, and if we didn't just fire the previous stage if (waitingForFirstStaging || vessel.currentStage <= 0 || vessel.currentStage <= autostageLimit || vessel.currentStage <= autostageLimitInternal || vesselState.time - lastStageTime < autostagePostDelay) { return; } //don't decouple active or idle engines or tanks UpdateActiveModuleEngines(); UpdateBurnedResources(); if (InverseStageDecouplesActiveOrIdleEngineOrTank(vessel.currentStage - 1, vessel, burnedResources, activeModuleEngines)) { return; } // prevent staging when the current stage has active engines and the next stage has any engines (but not decouplers or clamps) if (hotStaging && InverseStageHasActiveEngines(vessel.currentStage, vessel) && InverseStageHasEngines(vessel.currentStage - 1, vessel) && !InverseStageFiresDecoupler(vessel.currentStage - 1, vessel) && !InverseStageReleasesClamps(vessel.currentStage - 1, vessel) && LastNonZeroDVStageBurnTime() > hotStagingLeadTime) { return; } //Don't fire a stage that will activate a parachute, unless that parachute gets decoupled: if (HasStayingChutes(vessel.currentStage - 1, vessel)) { return; } //Always drop deactivated engines or tanks if (!InverseStageDecouplesDeactivatedEngineOrTank(vessel.currentStage - 1, vessel)) { //only decouple fairings if the dynamic pressure, altitude, and aerothermal flux conditions are respected if ((core.vesselState.dynamicPressure > fairingMaxDynamicPressure || core.vesselState.altitudeASL < fairingMinAltitude || core.vesselState.freeMolecularAerothermalFlux > fairingMaxAerothermalFlux) && HasFairing(vessel.currentStage - 1, vessel)) { return; } //only release launch clamps if we're at nearly full thrust if (vesselState.thrustCurrent / vesselState.thrustAvailable < clampAutoStageThrustPct && InverseStageReleasesClamps(vessel.currentStage - 1, vessel)) { return; } } //When we find that we're allowed to stage, start a countdown (with a //length given by autostagePreDelay) and only stage once that countdown finishes, if (countingDown) { if (vesselState.time - stageCountdownStart > autostagePreDelay) { if (InverseStageFiresDecoupler(vessel.currentStage - 1, vessel)) { //if we decouple things, delay the next stage a bit to avoid exploding the debris lastStageTime = vesselState.time; } if (!this.vessel.isActiveVessel) { this.currentActiveVessel = FlightGlobals.ActiveVessel; Debug.Log($"Mechjeb Autostage: Switching from {FlightGlobals.ActiveVessel.name} to vessel {this.vessel.name} to stage"); this.remoteStagingStatus = RemoteStagingState.WaitingFocus; FlightGlobals.ForceSetActiveVessel(this.vessel); } else { Debug.Log($"Mechjeb Autostage: Executing next stage on {FlightGlobals.ActiveVessel.name}"); if (remoteStagingStatus == RemoteStagingState.Disabled) { StageManager.ActivateNextStage(); } else if (remoteStagingStatus == RemoteStagingState.FocusFinished) { StageManager.ActivateNextStage(); FlightGlobals.ForceSetActiveVessel(currentActiveVessel); Debug.Log($"Mechjeb Autostage: Has switching back to {FlightGlobals.ActiveVessel.name} "); this.remoteStagingStatus = RemoteStagingState.Disabled; } } countingDown = false; if (autostagingOnce) { users.Clear(); } } } else { countingDown = true; stageCountdownStart = vesselState.time; } }