Untitled

 avatar
unknown
c_cpp
6 days ago
9.8 kB
7
Indexable
#pragma once
#include <Windows.h>
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <algorithm>
#include <Xinput.h>
#include <ViGEm/Client.h>

namespace ControllerAim {

    inline PVIGEM_CLIENT vigemClient = nullptr;
    inline PVIGEM_TARGET vigemTarget = nullptr;
    inline XUSB_REPORT controllerReport = { 0 };
    inline bool running = false;
    inline std::mutex controllerMutex;
    inline short aimbotRightStickX = 0;
    inline short aimbotRightStickY = 0;
    inline const float conversionFactor = 32767.0f / 127.0f;
    inline WORD extraButtons = 0;

    inline bool Initialize() {
        if (vigemClient != nullptr && vigemTarget != nullptr)
            return true;
        vigemClient = vigem_alloc();
        if (!vigemClient) {
            std::cerr << "Failed to allocate ViGEm client." << std::endl;
            return false;
        }
        VIGEM_ERROR ret = vigem_connect(vigemClient);
        if (!VIGEM_SUCCESS(ret)) {
            std::cerr << "Failed to connect ViGEm client. Error: " << ret << std::endl;
            vigem_free(vigemClient);
            vigemClient = nullptr;
            return false;
        }
        vigemTarget = vigem_target_x360_alloc();
        if (!vigemTarget) {
            std::cerr << "Failed to allocate virtual controller." << std::endl;
            vigem_disconnect(vigemClient);
            vigem_free(vigemClient);
            vigemClient = nullptr;
            return false;
        }
        ret = vigem_target_add(vigemClient, vigemTarget);
        if (!VIGEM_SUCCESS(ret)) {
            std::cerr << "Failed to add virtual controller. Error: " << ret << std::endl;
            vigem_target_free(vigemTarget);
            vigem_disconnect(vigemClient);
            vigem_free(vigemClient);
            vigemTarget = nullptr;
            vigemClient = nullptr;
            return false;
        }
        ZeroMemory(&controllerReport, sizeof(XUSB_REPORT));
        running = true;
        return true;
    }

    inline void Cleanup() {
        running = false;
        if (vigemClient && vigemTarget) {
            vigem_target_remove(vigemClient, vigemTarget);
            vigem_target_free(vigemTarget);
            vigemTarget = nullptr;
            vigem_disconnect(vigemClient);
            vigem_free(vigemClient);
            vigemClient = nullptr;
        }
    }

    inline void UpdateVirtualController() {
        VIGEM_ERROR ret = vigem_target_x360_update(vigemClient, vigemTarget, controllerReport);
        if (!VIGEM_SUCCESS(ret))
            std::cerr << "Failed to update virtual controller. Error: " << ret << std::endl;
    }

    inline void RunVirtualController() {
        if (!Initialize()) {
            std::cerr << "Virtual controller initialization failed." << std::endl;
            return;
        }
        std::cout << "Virtual controller thread running." << std::endl;
        XINPUT_STATE state;
        while (running) {
            ZeroMemory(&state, sizeof(XINPUT_STATE));
            DWORD result = XInputGetState(0, &state);
            int phys_RX = 0, phys_RY = 0;
            {
                std::lock_guard<std::mutex> lock(controllerMutex);
                if (result == ERROR_SUCCESS) {
                    const XINPUT_GAMEPAD& gamepad = state.Gamepad;
                    controllerReport.wButtons = gamepad.wButtons;
                    controllerReport.bLeftTrigger = gamepad.bLeftTrigger;
                    controllerReport.bRightTrigger = gamepad.bRightTrigger;
                    controllerReport.sThumbLX = gamepad.sThumbLX;
                    controllerReport.sThumbLY = gamepad.sThumbLY;
                    phys_RX = gamepad.sThumbRX;
                    phys_RY = gamepad.sThumbRY;
                }
                else {
                    controllerReport.wButtons = 0;
                    controllerReport.bLeftTrigger = 0;
                    controllerReport.bRightTrigger = 0;
                    controllerReport.sThumbLX = 0;
                    controllerReport.sThumbLY = 0;
                }
                int merged_RX = phys_RX + aimbotRightStickX;
                int merged_RY = phys_RY + aimbotRightStickY;
                controllerReport.sThumbRX = static_cast<short>(std::clamp(merged_RX, -32768, 32767));
                controllerReport.sThumbRY = static_cast<short>(std::clamp(merged_RY, -32768, 32767));

                std::cout << "[XINPUT_GAMEPAD] Physical RX=" << phys_RX
                    << ", Physical RY=" << phys_RY
                    << " | Merged RX=" << controllerReport.sThumbRX
                    << ", Merged RY=" << controllerReport.sThumbRY << std::endl;
            }
            VIGEM_ERROR ret = vigem_target_x360_update(vigemClient, vigemTarget, controllerReport);
            if (!VIGEM_SUCCESS(ret))
                std::cerr << "Failed to update virtual controller. Error: " << ret << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
        Cleanup();
    }

    /*inline void RunVirtualController() {
        if (!Initialize()) {
            std::cerr << "Virtual controller initialization failed." << std::endl;
            return;
        }
        std::cout << "Virtual controller thread running." << std::endl;
        XINPUT_STATE state;
        while (running) {
            ZeroMemory(&state, sizeof(XINPUT_STATE));
            DWORD result = XInputGetState(0, &state);
            int physButtons = 0;
            {
                std::lock_guard<std::mutex> lock(controllerMutex);
                if (result == ERROR_SUCCESS) {
                    const XINPUT_GAMEPAD& gamepad = state.Gamepad;
                    physButtons = gamepad.wButtons;
                    controllerReport.bLeftTrigger = gamepad.bLeftTrigger;
                    controllerReport.bRightTrigger = gamepad.bRightTrigger;
                    controllerReport.sThumbLX = gamepad.sThumbLX;
                    controllerReport.sThumbLY = gamepad.sThumbLY;
                    controllerReport.sThumbRX = gamepad.sThumbRX;
                    controllerReport.sThumbRY = gamepad.sThumbRY;
                }
                else {
                    controllerReport.bLeftTrigger = 0;
                    controllerReport.bRightTrigger = 0;
                    controllerReport.sThumbLX = 0;
                    controllerReport.sThumbLY = 0;
                    controllerReport.sThumbRX = 0;
                    controllerReport.sThumbRY = 0;
                }
                controllerReport.wButtons = static_cast<WORD>(physButtons | extraButtons);
            }
            VIGEM_ERROR ret = vigem_target_x360_update(vigemClient, vigemTarget, controllerReport);
            if (!VIGEM_SUCCESS(ret))
                std::cerr << "Failed to update virtual controller. Error: " << ret << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
        Cleanup();
    }

    inline void PressA() {
        while (running) {
            {
                std::lock_guard<std::mutex> lock(controllerMutex);
                extraButtons |= XINPUT_GAMEPAD_A;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
            {
                std::lock_guard<std::mutex> lock(controllerMutex);
                extraButtons &= ~XINPUT_GAMEPAD_A;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(900));
        }
    }*/


    inline std::thread LaunchVirtualController() {
        return std::thread(RunVirtualController);
    }

    inline void controller_move(float tarx, float tary, float screenX, float screenY, int smooth) {
        float centerX = screenX / 2.0f;
        float centerY = screenY / 2.0f;
        float deltaX = (tarx - centerX) / smooth;
        float deltaY = (tary - centerY) / smooth;
        // deltaY = -deltaY;

        const int min_mouse = -127;
        const int max_mouse = 127;
        int mouseDeltaX = static_cast<int>(std::clamp(deltaX, (float)min_mouse, (float)max_mouse));
        int mouseDeltaY = static_cast<int>(std::clamp(deltaY, (float)min_mouse, (float)max_mouse));
        const int min_xinput = -32768;
        const int max_xinput = 32767;
        const int deadzone = static_cast<int>(max_xinput * 0.1f);

        float scale = (max_xinput - deadzone) / static_cast<float>(max_mouse);

        int newRX, newRY;
        if (mouseDeltaX > 0) {
            newRX = static_cast<int>(mouseDeltaX * scale) + deadzone;
        }
        else if (mouseDeltaX < 0) {
            newRX = static_cast<int>(mouseDeltaX * scale) - deadzone;
        }
        else {
            newRX = 0;
        }
        if (mouseDeltaY > 0) {
            newRY = static_cast<int>(mouseDeltaY * scale) + deadzone;
        }
        else if (mouseDeltaY < 0) {
            newRY = static_cast<int>(mouseDeltaY * scale) - deadzone;
        }
        else {
            newRY = 0;
        }

        newRX = std::clamp(newRX, min_xinput, max_xinput);
        newRY = std::clamp(newRY, min_xinput, max_xinput);

        {
            std::lock_guard<std::mutex> lock(controllerMutex);
            aimbotRightStickX = static_cast<short>(newRX);
            aimbotRightStickY = static_cast<short>(newRY);
        }
        //std::cout << "[ControllerAim] Set Aimbot RS: tarx=" << tarx << ", tary=" << tary
            //<< " | Delta=(" << deltaX << ", " << deltaY << ")"
            //<< " -> newRX=" << newRX << ", newRY=" << newRY << std::endl;
        UpdateVirtualController();
    }

}
Editor is loading...
Leave a Comment