protected override void Update() { //update state if (was_landed && !VSL.LandedOrSplashed) { stage = Stage.JustTookoff; GearTimer.Reset(); StopAction.Reset(); } else if (VSL.LandedOrSplashed && !was_landed) { stage = Stage.JustLanded1; } was_landed = VSL.LandedOrSplashed; switch (stage) { case Stage.JustLanded1: working(); srf_normal = Vector3.zero; CFG.HF.OnIfNot(HFlight.Level); VSL.BrakesOn(); LandedTimer.RunIf(() => stage = Stage.JustLanded2, VSL.HorizontalSpeed < C.MinHSpeed); break; case Stage.JustLanded2: if (ATC != null) { if (srf_normal.IsZero()) { RaycastHit hit; if (Physics.Raycast(VSL.Physics.wCoM, -VSL.Physics.Up, out hit, VSL.Geometry.D, Radar.RadarMask)) { if (hit.collider != null && !hit.normal.IsZero()) { srf_normal = -hit.normal; break; } } stage = Stage.Landed; break; } working(); CFG.HF.Off(); CFG.AT.OnIfNot(Attitude.Custom); ATC.SetThrustDirW(srf_normal); LandedTimer.RunIf(() => { stage = Stage.Landed; CFG.AT.Off(); }, VSL.Physics.NoRotation || VSL.Controls.AttitudeError < 1); break; } stage = Stage.Landed; break; case Stage.JustTookoff: working(); StopAction.Run(); GearTimer.RunIf(() => { VSL.BrakesOn(false); VSL.GearOn(false); stage = Stage.Flying; }, VSL.Altitude.Relative > 2 * VSL.Geometry.H); break; case Stage.Landed: if (CFG.VerticalCutoff <= 0) { working(false); } else { var avSqr = VSL.vessel.angularVelocity.sqrMagnitude; if (VSL.HorizontalSpeed < C.MaxHSpeed && avSqr > C.MinAngularVelocity) { working(); CFG.HF.OnIfNot(HFlight.Level); if (avSqr > C.GearOffAngularVelocity && VSL.OnPlanetParams.DTWR > C.MinDTWR) { VSL.GearOn(false); } } else { working(false); } } break; case Stage.Flying: working(false); if (!VSL.vessel.ActionGroups[KSPActionGroup.Gear]) { if (VSL.VerticalSpeed.Relative < 0 && VSL.HorizontalSpeed < C.GearOnMaxHSpeed && (!CFG.AT || !VSL.Altitude.AboveGround || VSL.Engines.Thrust.IsZero()) && VSL.Altitude.Relative + VSL.VerticalSpeed.Relative * (VSL.OnPlanetParams.GearDeployTime + C.GearOnTime) < C.GearOnAtH * VSL.Geometry.H) { VSL.GearOn(); VSL.BrakesOn(); } } else if (VSL.OnPlanetParams.GearDeploying) { if (VSC != null) { VSC.SetpointOverride = Utils.ClampH((C.GearOnAtH * VSL.Geometry.H - VSL.Altitude.Relative) / (VSL.OnPlanetParams.GearDeployTime + C.GearOnTime), 0); } } else { GearTimer.RunIf(() => { VSL.GearOn(false); VSL.BrakesOn(false); }, VSL.VerticalSpeed.Relative > 5 || VSL.HorizontalSpeed > C.GearOnMaxHSpeed || VSL.VerticalSpeed.Relative > 0 && VSL.Altitude.Relative > VSL.Geometry.H * 5); } break; } }
protected override void Update() { if (!IsActive) { return; } //update state if (last_state && !VSL.LandedOrSplashed) { tookoff = true; landed = false; GearTimer.Reset(); StopAction.Reset(); } else if (VSL.LandedOrSplashed && !last_state) { landed = true; tookoff = false; } last_state = VSL.LandedOrSplashed; //just landed if (landed) { working(); CFG.HF.OnIfNot(HFlight.Level); VSL.BrakesOn(); LandedTimer.RunIf(() => landed = false, VSL.HorizontalSpeed < TLA.MinHSpeed); } //just took off else if (tookoff) { working(); StopAction.Run(); GearTimer.RunIf(() => { VSL.BrakesOn(false); VSL.GearOn(false); tookoff = false; }, VSL.Altitude.Relative > TLA.GearOnAtH + VSL.Geometry.H); } //moving on the ground else if (VSL.LandedOrSplashed) { var avSqr = VSL.vessel.angularVelocity.sqrMagnitude; if (VSL.HorizontalSpeed < TLA.MaxHSpeed && avSqr > TLA.MinAngularVelocity) { working(); CFG.HF.OnIfNot(HFlight.Level); if (avSqr > TLA.GearOffAngularVelocity && VSL.OnPlanetParams.DTWR > TLA.MinDTWR) { VSL.GearOn(false); } } else { working(false); } } //if flying, check if trying to land and deploy the gear else { working(false); //if the gear is on, nothing to do; and autopilot takes precedence if (!VSL.vessel.ActionGroups[KSPActionGroup.Gear]) { //check boundary conditions GearTimer.RunIf(() => { VSL.GearOn(); VSL.BrakesOn(); }, VSL.VerticalSpeed.Relative < 0 && VSL.HorizontalSpeed < TLA.GearOnMaxHSpeed && VSL.Altitude.Relative + VSL.VerticalSpeed.Relative * (TLA.GearOnTime + TLA.GearTimer) < TLA.GearOnAtH * VSL.Geometry.H); } else { GearTimer.RunIf(() => { VSL.GearOn(false); VSL.BrakesOn(false); }, VSL.VerticalSpeed.Relative > 5 || VSL.HorizontalSpeed > TLA.GearOnMaxHSpeed || VSL.VerticalSpeed.Relative > 0 && VSL.Altitude.Relative > VSL.Geometry.H * 5); } } }