Загрузка данных
#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
}