Загрузка данных


#include "Aimbot.hpp"

#ifdef USE_VMPROTECT
#include "VMProtectSDK.h"
#endif

__declspec(noinline) float GetSmoothStep(float SmoothFactor) {
    if (SmoothFactor > 0) {
        if (SmoothFactor >= 98 && SmoothFactor <= 100) return 0.5f / SmoothFactor;
        if (SmoothFactor >= 80 && SmoothFactor < 98)  return 1.8f / SmoothFactor;
        if (SmoothFactor >= 60 && SmoothFactor < 80)  return 2.0f / SmoothFactor;
        if (SmoothFactor >= 40 && SmoothFactor < 60)  return 2.2f / SmoothFactor;
        if (SmoothFactor >= 20 && SmoothFactor < 40)  return 2.5f / SmoothFactor;
        return 3.0f / SmoothFactor;
    }
    return 1.0f;
}

// Возвращает указатель на АКТИВНУЮ камеру (работает и в ADS, и без)
uintptr_t Core::Features::cAimbot::GetActiveCamera()
{
    // +0x2C0 — CFollowPedCamera (обычная, от 3-го лица)
    // +0x2D8 — ADS / прицельная камера (в большинстве версий GTA5)
    // +0x220 — указатель на текущую активную камеру в некоторых сборках
    //
    // Логика: пробуем прочитать ADS-камеру; если она валидна — используем её,
    // иначе падаем на обычную follow-камеру.

    uintptr_t base = Core::SDK::Pointers::pCamGamePlayDirector;

    // Читаем оба указателя
    uintptr_t FollowCam = Mem.Read<uintptr_t>(base + 0x2C0);
    uintptr_t ADSCam    = Mem.Read<uintptr_t>(base + 0x2D8); // ADS-камера

    if (ADSCam) {
        // Проверяем, что позиция ADS-камеры ненулевая (камера активна)
        D3DXVECTOR3 ADSPos = Mem.Read<D3DXVECTOR3>(ADSCam + 0x60);
        if (ADSPos.x != 0.0f || ADSPos.y != 0.0f || ADSPos.z != 0.0f)
            return ADSCam;
    }

    return FollowCam;
}

void Core::Features::cAimbot::SetViewAngles(CPed* Ped, D3DXVECTOR3 BonePos)
{
#ifdef USE_VMPROTECT
    VMProtectBeginMutation("SetViewAngles");
#endif

    // --- ФИКС: используем активную камеру вместо хардкоженного +0x2C0 ---
    uintptr_t ActiveCam = GetActiveCamera();
    if (!ActiveCam) return;

    D3DXVECTOR3 CamPos           = Mem.Read<D3DXVECTOR3>(ActiveCam + 0x60);
    D3DXVECTOR3 CurrentViewAngles = Mem.Read<D3DXVECTOR3>(ActiveCam + 0x40);
    D3DXVECTOR3 TargetViewAngles  = BonePos - CamPos;

    D3DXVec3Normalize(&TargetViewAngles, &TargetViewAngles);

    float SmoothFactor = std::clamp(static_cast<float>(g_Config.Aimbot->AimbotSpeed), 0.0f, 100.0f);
    volatile float LocalSmoothStep = GetSmoothStep(SmoothFactor);

    D3DXVECTOR3 FinalAngles;
    FinalAngles.x = CurrentViewAngles.x + (TargetViewAngles.x - CurrentViewAngles.x) * LocalSmoothStep;
    FinalAngles.y = CurrentViewAngles.y + (TargetViewAngles.y - CurrentViewAngles.y) * LocalSmoothStep;
    FinalAngles.z = CurrentViewAngles.z + (TargetViewAngles.z - CurrentViewAngles.z) * LocalSmoothStep;

    D3DXVec3Normalize(&FinalAngles, &FinalAngles);

    // Пишем в активную камеру
    Mem.Write<D3DXVECTOR3>(ActiveCam + 0x40,  FinalAngles);
    Mem.Write<D3DXVECTOR3>(ActiveCam + 0x3D0, FinalAngles);

#ifdef USE_VMPROTECT
    VMProtectEnd();
#endif
}

void Core::Features::cAimbot::Start()
{
#ifdef USE_VMPROTECT
    VMProtectBeginMutation("AimbotLoop");
#endif

    while (true)
    {
        if (g_Config.Aimbot->Enabled
            && g_Config.Aimbot->KeyBind
            && (GetAsyncKeyState(g_Config.Aimbot->KeyBind) & 0x8000)
            && GetForegroundWindow() != g_Variables.g_hCheatWindow)
        {
            CPed* Ped = Core::SDK::Game::GetClosestPed(
                g_Config.Aimbot->MaxDistance,
                g_Config.Aimbot->IgnoreNPCs,
                g_Config.Aimbot->OnlyVisible);

            if (!Ped) {
                std::this_thread::sleep_for(std::chrono::nanoseconds(1));
                continue;
            }

            D3DXVECTOR3 HeadPos       = Ped->GetBonePosDefault(0 /*Head*/);
            D3DXVECTOR2 ScreenHeadPos = Core::SDK::Game::WorldToScreen(HeadPos);

            if (Core::SDK::Game::IsOnScreen(ScreenHeadPos))
            {
                int Fov = std::hypot(
                    ScreenHeadPos.x - g_Variables.g_vGameWindowCenter.x,
                    ScreenHeadPos.y - g_Variables.g_vGameWindowCenter.y);

                if (Fov < g_Config.Aimbot->FOV)
                {
                    SetViewAngles(Ped, HeadPos + D3DXVECTOR3(0, 0, 0.08f));
                }
            }
        }

        std::this_thread::sleep_for(std::chrono::nanoseconds(1));
    }

#ifdef USE_VMPROTECT
    VMProtectEnd();
#endif
}