public void Main(string argument, UpdateType updateSource) { timeSinceLastUpdate += Runtime.TimeSinceLastRun; if (isFirstUpdate || !updateFinished || timeSinceLastUpdate > TimeSpan.FromSeconds(10)) { try { this.Update(); } catch (Exception e) { Echo("Error: " + e.Message); } timeSinceLastUpdate = TimeSpan.FromSeconds(0); return; } Echo("Script running, next update: " + (10 - (uint)timeSinceLastUpdate.TotalSeconds).ToString()); Echo("Current Mode: " + mode); Echo("Precision Aim: " + (enablePrecisionAim ? "enabled" : "disabled")); Echo("Lateral Override: " + (enableLateralOverride ? "enabled" : "disabled")); if (IsValidMode(argument)) { SwitchToMode(argument); } else if (argument == "toggle_manual") { SwitchToMode(mode == "manual" ? "flight" : "manual"); } else if (argument == "toggle_landing") { SwitchToMode(mode == "landing" ? "flight" : "landing"); } else if (argument == "toggle_shutdown") { SwitchToMode(mode == "shutdown" ? "flight" : "shutdown"); } else if (argument == "toggle_standby") { SwitchToMode(mode == "standby" ? "flight" : "standby"); } else if (argument == "toggle_precision") { enablePrecisionAim = !enablePrecisionAim; } else if (argument == "toggle_lateral_dampening") { enableLateralOverride = !enableLateralOverride; } else if (argument == "toggle_lateral_override") { enableLateralOverride = !enableLateralOverride; } else if (argument == "update") { updateFinished = false; return; } var wasd = controller.MoveIndicator; var mouse = new Vector3(controller.RotationIndicator, controller.RollIndicator * 9); var dampeningRotation = gyroController.CalculatePitchRollToAchiveVelocity(Vector3.Zero); var autoStop = controller.DampenersOverride; if (enablePrecisionAim) { mouse *= 1 / precisionAimFactor; } else { mouse *= mouseSpeed; } switch (mode) { case "flight": { var pitch = wasd.Z * maxFlightPitch * degToRad; var roll = wasd.X * maxFlightRoll * degToRad; dampeningRotation = Vector2.Min(dampeningRotation, new Vector2(maxFlightRoll, maxFlightPitch) * degToRad); if ((autoStop || enableLateralOverride) && IsEqual(0, roll)) { roll = MinAbs(dampeningRotation.X, maxFlightRoll * degToRad); } if (autoStop && IsEqual(0, pitch)) { pitch = MinAbs(dampeningRotation.Y, maxFlightPitch * degToRad); } gyroController.SetAngularVelocity(gyroController.CalculateVelocityToAlign(pitch, roll) + mouse); thrustController.SetYAxisThrust(wasd.Y != 0 ? 0 : thrustController.CalculateThrustToHover()); break; } case "landing": { var pitch = wasd.Z * maxLandingPitch * degToRad; var roll = wasd.X * maxLandingRoll * degToRad; dampeningRotation = Vector2.Min(dampeningRotation, new Vector2(maxLandingRoll, maxLandingPitch) * degToRad); if ((autoStop || enableLateralOverride) && IsEqual(0, roll)) { roll = MinAbs(dampeningRotation.X, maxLandingRoll); } if (autoStop && IsEqual(0, pitch)) { pitch = MinAbs(dampeningRotation.Y, maxLandingPitch); } gyroController.SetAngularVelocity(gyroController.CalculateVelocityToAlign(pitch, roll) + mouse); thrustController.SetYAxisThrust(wasd.Y != 0 ? 0 : thrustController.CalculateThrustToHover()); break; } case "manual": gyroController.SetAngularVelocity(mouse); thrustController.SetYAxisThrust(wasd.Y != 0 ? 0 : thrustController.CalculateThrustToHover()); break; case "shutdown": break; case "standby": break; } }