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


#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 ) );
    }
}