#include "Triggerbot.hpp"
// SendInput вместо устаревшего mouse_event — надёжнее регистрируется игрой
void Core::Features::cTriggerbot::Shoot( int delay )
{
if ( delay > 0 )
std::this_thread::sleep_for( std::chrono::milliseconds( delay ) );
INPUT input[2] = {};
// MouseDown
input[0].type = INPUT_MOUSE;
input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
// MouseUp
input[1].type = INPUT_MOUSE;
input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput( 1, &input[0], sizeof( INPUT ) );
std::this_thread::sleep_for( std::chrono::milliseconds( 12 ) ); // достаточно для регистрации выстрела
SendInput( 1, &input[1], sizeof( INPUT ) );
}
void Core::Features::cTriggerbot::Start( )
{
auto lastShot = std::chrono::steady_clock::now( );
while ( true )
{
if ( g_Config.TriggerBot->Enabled
&& g_Config.TriggerBot->KeyBind
&& ( GetAsyncKeyState( g_Config.TriggerBot->KeyBind ) & 0x8000 )
&& GetForegroundWindow( ) != g_Variables.g_hCheatWindow )
{
// Кулдаун между выстрелами — чтобы не спамить быстрее чем стреляет оружие
auto now = std::chrono::steady_clock::now( );
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>( now - lastShot ).count( );
if ( elapsed < g_Config.TriggerBot->Cooldown ) // Cooldown в мс, например 150
{
std::this_thread::sleep_for( std::chrono::nanoseconds( 1 ) );
continue;
}
if ( !g_Config.TriggerBot->SmartTrigger )
{
CPed* Ped = Core::SDK::Game::GetClosestPed(
g_Config.TriggerBot->MaxDistance,
g_Config.TriggerBot->IgnoreNPCs,
g_Config.TriggerBot->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.TriggerBot->FOV )
{
Shoot( g_Config.TriggerBot->Delay );
lastShot = std::chrono::steady_clock::now( );
}
}
}
else
{
CPed* Ped = Mem.Read<CPed*>(
g_Offsets.m_AimCPedPatternResult
+ Mem.Read<int>( g_Offsets.m_AimCPedPatternResult + 3 )
+ 7 );
if ( !Ped )
{
std::this_thread::sleep_for( std::chrono::nanoseconds( 1 ) );
continue;
}
Shoot( g_Config.TriggerBot->Delay );
lastShot = std::chrono::steady_clock::now( );
}
}
std::this_thread::sleep_for( std::chrono::nanoseconds( 1 ) );
}
}