Ejemplo n.º 1
0
        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;
            }
        }