private static void MouseButtonUp(InputSimulator inputSimulator, SimulatedMouseButton mouseButton) { switch (mouseButton) { case SimulatedMouseButton.Left: inputSimulator.Mouse.LeftButtonUp(); break; case SimulatedMouseButton.Right: inputSimulator.Mouse.RightButtonUp(); break; case SimulatedMouseButton.XButton1: inputSimulator.Mouse.XButtonUp(XButton1); break; case SimulatedMouseButton.XButton2: inputSimulator.Mouse.XButtonUp(XButton2); break; default: Console.WriteLine($"Unrecognized mouse button {mouseButton}"); break; } }
private static void Main( UserIndex controllerIndex = UserIndex.One, SimulatedMouseButton mouseButton = SimulatedMouseButton.Left, int thresholdPercent = 70) { var settings = Settings.Default; if (thresholdPercent < 1 || thresholdPercent > 100) { Console.WriteLine(settings.ThresholdError); Console.ReadKey(); return; } Console.WriteLine(settings.Instructions); Console.WriteLine(); var controller = new Controller(controllerIndex); var isConnected = controller.IsConnected; if (!isConnected) { Console.WriteLine(settings.ControllerError); Console.ReadKey(); return; } Console.WriteLine(settings.Started); Console.WriteLine(); var cancellationTokenSource = new CancellationTokenSource(); Task.Run( () => { Console.ReadKey(); cancellationTokenSource.Cancel(); }); var controllerMod = new ControllerMod(); // Start always sprint modification controllerMod.AlwaysSprintAsync(controller, mouseButton, thresholdPercent, cancellationTokenSource.Token).Wait(); }
public async Task AlwaysSprintAsync( Controller controller, SimulatedMouseButton mouseButton, int thresholdPercent, CancellationToken cancellationToken) { try { var inputSimulator = new InputSimulator(); var sprintIndex = 0; var totalSprintDuration = new TimeSpan(); var sprintStarted = DateTime.Now; var settings = Settings.Default; var sprintActive = false; while (true) { if (cancellationToken.IsCancellationRequested) { return; } // Get current controller state var state = controller.GetState(); var gamepad = state.Gamepad; // Get thumbstick radius from the center var radius = GetRadius(gamepad.LeftThumbX, gamepad.LeftThumbY); // Sprint when thumbstick radius is more than 70% of max // Radius in X or Y direction is 32767, but in 45 degree angle it's over 37000...(?) // The difference is not that big, to calculate percentage value from "normal" max value var shouldSprint = radius >= thresholdPercent / 100f * short.MaxValue; if (shouldSprint && !sprintActive) { sprintActive = true; sprintStarted = DateTime.Now; var sprintIndexString = (++sprintIndex).ToString("N0", CultureInfo.InvariantCulture); Console.Write($"{settings.Sprint} #{sprintIndexString} {DateTime.Now:HH:mm:ss} >> "); // Simulate mouse button down MouseButtonDown(inputSimulator, mouseButton); } else if (!shouldSprint && sprintActive) { sprintActive = false; var sprintDuration = DateTime.Now - sprintStarted; totalSprintDuration = totalSprintDuration.Add(sprintDuration); var averageDuration = totalSprintDuration.TotalSeconds / sprintIndex; Console.WriteLine( $"{DateTime.Now:HH:mm:ss} {settings.Duration}={sprintDuration.TotalSeconds:F2}s ({settings.AverageDuration}={averageDuration:F2}s)"); // Simulate mouse button up MouseButtonUp(inputSimulator, mouseButton); } // Wait before getting controller state again await Task.Delay(ControllerPollInterval, cancellationToken).ConfigureAwait(false); } } catch (TaskCanceledException) { } }