Проблема с TriggerBot

JUJIK

Новичок
Автор темы
10
0
В общем, я тупой человек, и пытаюсь освоить PluginSDK (что уже несовместимо чета)
Короче без чата гпт я не могу, но мы вдвоем не можем понять в чем проблема.
Проблема в том, что тригербот очень криво работает, а именно видит нужного педа по которому стрелять нужно только когда выхожу с прицела.
Так-же, возможно, не работает эмуляция выстрела, но я хз.
Вот код:


TriggerBot.cpp:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;


void MouseLeftClick() {
    INPUT input[2] = {};

    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

    SendInput(2, input, sizeof(INPUT));
}


void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    if (!player || !player->IsAlive()) return;

    CVector camPos = *TheCamera.GetGameCamPosition();
    CVector camFront = TheCamera.m_aCams[0].m_vecFront;
    camFront.Normalise();

    CVector targetPos = camPos + (camFront * 100.0f);

    CColPoint colPoint;
    CEntity* hitEntity = nullptr;

    bool hit = CWorld::ProcessLineOfSight(camPos, targetPos, colPoint, hitEntity,
        true,  // buildings
        true,  // vehicles
        true,  // peds <- исправлено
        false, // objects
        false, // dummies
        false, // seeThroughStuff
        false, // cameraObjects
        false  // unknownFlag
    );

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED && hitEntity != player) {
        CPed* ped = reinterpret_cast<CPed*>(hitEntity);
        if (ped && ped->IsAlive()) {
            MouseLeftClick();
            RefChat()->AddChatMessage("TRIGGERBOT", 0xFF0000FF, "Shooting at target...");
            return;
        }
    }
}


void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}

И да, я знаю что я говнокодер, так что можете не напоминать это.
 

mortergrand

Новичок
24
4
Дезинформация (недостоверные ответы, сгенерированные LLM)
Проблема довольно типичная. Дело в том, как ты получаешь направление взгляда камеры. TheCamera.m_aCams[0].m_vecFront не всегда указывает точно в центр экрана, особенно когда ты не целишься.
Триггер срабатывает криво, потому что он видит цель только в тот момент, когда состояние камеры меняется (тоесть при выходе из прицела), а не постоянно во время прицеливания.
Попробуй этот код, по идеи, должно заработать как надо.

Изменения:
Добавил проверку на то, зажата ли правая кнопка мыши (GetRightMouseDown). Теперь триггер будет работать только во время прицеливания.
Изменил способ получения векторов для трассировки. Вместо прямого доступа к вектору камеры используется TheCamera.Find3rdPersonCamTargetVector, что дает более точное направление "взгляда" из центра экрана.


C++:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;

void MouseLeftClick() {
    INPUT input[2] = {};
    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(2, input, sizeof(INPUT));
}

void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    // Проверяем, жив ли игрок и целится ли он (GetPad()->GetRightMouseJustDown() или GetPad()->GetRightMouseDown())
    if (!player || !player->IsAlive() || !player->GetPadFromPlayer()->GetRightMouseDown()) return;

    // Получаем позицию источника выстрела (камеры)
    CVector source;
    TheCamera.Find3rdPersonCamTargetVector(100.0f, player->GetPosition(), &source, nullptr);

    // Получаем позицию цели (куда смотрит камера)
    CVector target;
    TheCamera.Find3rdPersonCamTargetVector(0.0f, source, &source, &target);

    CColPoint colPoint;
    CEntity* hitEntity = nullptr;

    // Используем полученные векторы для трассировки линии
    bool hit = CWorld::ProcessLineOfSight(source, target, colPoint, hitEntity,
        true,  // buildings
        true,  // vehicles
        true,  // peds
        false, // objects
        false, // dummies
        false, // seeThroughStuff
        false, // cameraObjects
        false  // unknownFlag
    );

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED && hitEntity != player) {
        CPed* ped = reinterpret_cast<CPed*>(hitEntity);
        if (ped && ped->IsAlive()) {
                MouseLeftClick();
        }
    }
}

void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}
 

JUJIK

Новичок
Автор темы
10
0
Все круто, но при нажатии пкм с включеным тригером самп просто крашит с ошибкой

--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Runtime Error! Program: C:\kichiroCOMFORT [v2]\gta_sa.exe This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. --------------------------- ОК ---------------------------

Так-же небыло в CPad функции GetRightMouseDown, но я заменил проверкой переменной в том самом CPad
Нынешний код выглядит вот так, хз че делать, помогите
TriggerBot.cpp:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;

void MouseLeftClick() {
    INPUT input[2] = {};
    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(2, input, sizeof(INPUT));
}

void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    if (!player || !player->IsAlive() || CPad::NewMouseControllerState.rmb == 0) return;


    CVector source;
    TheCamera.Find3rdPersonCamTargetVector(100.0f, player->GetPosition(), &source, nullptr);

    CVector target;
    TheCamera.Find3rdPersonCamTargetVector(0.0f, source, &source, &target);

    CColPoint colPoint;
    CEntity* hitEntity = nullptr;

    bool hit = CWorld::ProcessLineOfSight(source, target, colPoint, hitEntity,
        true,  // buildings
        true,  // vehicles
        true,  // peds
        false, // objects
        false, // dummies
        false, // seeThroughStuff
        false, // cameraObjects
        false  // unknownFlag
    );

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED && hitEntity != player) {
        CPed* ped = reinterpret_cast<CPed*>(hitEntity);
        if (ped && ped->IsAlive()) {
            MouseLeftClick();
        }
    }
}

void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}
 

mortergrand

Новичок
24
4
Все круто, но при нажатии пкм с включеным тригером самп просто крашит с ошибкой



Так-же небыло в CPad функции GetRightMouseDown, но я заменил проверкой переменной в том самом CPad
Нынешний код выглядит вот так, хз че делать, помогите
TriggerBot.cpp:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;

void MouseLeftClick() {
    INPUT input[2] = {};
    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(2, input, sizeof(INPUT));
}

void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    if (!player || !player->IsAlive() || CPad::NewMouseControllerState.rmb == 0) return;


    CVector source;
    TheCamera.Find3rdPersonCamTargetVector(100.0f, player->GetPosition(), &source, nullptr);

    CVector target;
    TheCamera.Find3rdPersonCamTargetVector(0.0f, source, &source, &target);

    CColPoint colPoint;
    CEntity* hitEntity = nullptr;

    bool hit = CWorld::ProcessLineOfSight(source, target, colPoint, hitEntity,
        true,  // buildings
        true,  // vehicles
        true,  // peds
        false, // objects
        false, // dummies
        false, // seeThroughStuff
        false, // cameraObjects
        false  // unknownFlag
    );

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED && hitEntity != player) {
        CPed* ped = reinterpret_cast<CPed*>(hitEntity);
        if (ped && ped->IsAlive()) {
            MouseLeftClick();
        }
    }
}

void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}
Я нашел причину краша и несколько других моментов, которые я думаю что стоит улучшить.
Главная причина вылета кроется в том , что ты неправильно используешь функцию TheCamera.Find3rdPersonCamTargetVector. В первой строке ты передаешь nullptr в качестве одного из аргументов , и когда игра пытается записать туда данные , она вылетает.
И да , ты правильно заметил, что GetRightMouseDown может отсутствовать. Твоя замена была близка, но есть более надежный способ проверить, целится ли игрок , это CPad::GetPad(0)->GetAiming().
Ниже исправленный код , с внесенными улучшениями и исправленной ошибкой.


C++:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"
#include "sampapi/0.3.7-R1/CPlayerPool.h" // https://github.com/DarkP1xel/SAMP-API/blob/0d43a3603239f2f4bc65b8305ffc72177386cc29/src/0.3.7-R3-1/CPlayerPool.h#L26

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;

void MouseLeftClick() {
    INPUT input[2] = {};
    input[0].type = INPUT_MOUSE;
    input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    input[1].type = INPUT_MOUSE;
    input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(2, input, sizeof(INPUT));
}


void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    // юзаем надежную проверку на прицеливание. Если игрок не целится , выходим
    if (!player || !player->IsAlive() || !CPad::GetPad(0)->GetAiming()) {
        return;
    }

    CVector source, target;
    TheCamera.Find3rdPersonCamTargetVector(1.0f, player->GetPosition(), &source, &target);

    // делаем больше дистанцию луча для снайперских винтовок
    target = source + ((target - source) * 500.0f);


    CColPoint colPoint;
    CEntity* hitEntity = nullptr;

    bool hit = CWorld::ProcessLineOfSight(source, target, colPoint, hitEntity,
        true, true, true, false, false, false, false, false);

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED) {
        CPed* ped = reinterpret_cast<CPed*>(hitEntity);

        // проверяем , что это не мы и шо пед жив
        if (ped == player || !ped->IsAlive()) {
            return;
        }

        // проверяем , что это игрок , а не нпс
        if (RefPlayerPool()->GetId(ped) != -1) {
            MouseLeftClick();
        }
    }
}

void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}
 

JUJIK

Новичок
Автор темы
10
0
Стало ещё больше ошибок.
В общем ругается на все использования классов CPed, CEntity, мол это все не однозначные классы и нужно как-то юзать по своему
Так-же ругается что не видит функцию RefPlayerPool, но я думаю что это не сильно важная функция

В общем код сейчас такой


TriggerBot.cpp:
#include "TriggerBot.h"
#include "plugin.h"
#include "CPad.h"
#include "CPlayerPed.h"
#include "CWorld.h"
#include "CVector.h"
#include "CEntity.h"
#include "CColPoint.h"
#include "CCamera.h"
#include "CPools.h"

#include "sampapi/sampapi.h"
#include "sampapi/0.3.7-R1/CChat.h"
#include "sampapi/0.3.7-R1/CPlayerPool.h"

using namespace sampapi::v037r1;

bool JK_TriggerIsEnable = false;

void SimulateLeftClick() {
    CPad::NewMouseControllerState.lmb = 255;
    Sleep(10);
    CPad::NewMouseControllerState.lmb = 0;
}



void TriggerBot::Update() {
    if (!JK_TriggerIsEnable) return;

    CPlayerPed* player = FindPlayerPed();
    if (!player || !player->IsAlive() || CPad::NewMouseControllerState.rmb == 0) return;

    CVector source, target;
    TheCamera.Find3rdPersonCamTargetVector(1.0f, player->GetPosition(), &source, &target);

    target = source + ((target - source) * 500.0f);


    CColPoint colPoint;
    ::CEntity * hitEntity = nullptr;

    bool hit = CWorld::ProcessLineOfSight(source, target, colPoint, hitEntity,
        true, true, true, false, false, false, false, false);

    if (hit && hitEntity && hitEntity->m_nType == ENTITY_TYPE_PED) {
        ::CPed* ped = reinterpret_cast<::CPed*>(hitEntity);

        if (ped == player || !ped->IsAlive()) {
            return;
        }

        SimulateLeftClick();
    }
}

void TriggerBot::RenderUI()
{
    ImGui::Checkbox("TriggerBot", &JK_TriggerIsEnable);
}
И проблема все та же, не крашит теперь но когда целюсь - ничего не происходит
Кстати функции GetAiming() тоже не существует
 

rhjossss

Новичок
3
0
Вот минимальный код триггербота
c++:
void CAimbot::Triggerbot()
{
    if (g_Config.g_Aimbot.bTriggerbot && g_Config.g_Aimbot.bAimbotEnabled[pSAMP->getPlayers()->pLocalPlayer->byteCurrentWeapon] && bCrosshair)
    {
        static ULONGLONG iTick = GetTickCount64();
        if (g_Config.g_Aimbot.bTriggerDelay && GetTickCount64() - iTick < (ULONGLONG)g_Config.g_Aimbot.iTriggerDelay)
            return;

        if (g_Config.g_Aimbot.bTriggerSync)
        {
            // Режим синхронизации с Silent Aim - стреляет если цель уже найдена
            if (g_Config.g_Aimbot.bSilent && g_Config.g_Aimbot.bAimbot && iTargetPlayer != -1)
            {
                pKeyHook->g_GameKeyState[BUTTON_CIRCLE] = { 0xFF, true };
                iTick = GetTickCount64();
            }
        }
        else
        {
            // Обычный режим - raycast от камеры
            CVector vecCamera, vecOrigin, vecTarget;
            if (pSAMP->getPlayers()->pLocalPlayer->byteCurrentWeapon != 34)
            {
                // Обычное оружие
                Utils::getBonePosition(FindPlayerPed(), BONE_RIGHTWRIST, &vecOrigin);
                TheCamera.Find3rdPersonCamTargetVector(100.f, vecOrigin, &vecCamera, &vecTarget);
            }
            else
            {
                // Снайперка - луч из центра экрана
                CVector vecFront = TheCamera.m_aCams[0].m_vecFront;
                vecFront.Normalise();
                vecCamera = *TheCamera.GetGameCamPosition();
                vecCamera += (vecFront * 2.0f);
                vecTarget = vecCamera + (vecFront * 100.f);
            }

            // Проверка попадания луча
            CColPoint pCollision; CEntity* pCollisionEntity = NULL;
            bool bCollision = CWorld::ProcessLineOfSight(vecCamera, vecTarget, pCollision, pCollisionEntity,
                !g_Config.g_Aimbot.bLockThroughObjects, !g_Config.g_Aimbot.bLockThroughObjects,
                true, true, true, true, false, true);
          
            if (bCollision && pCollisionEntity && pCollisionEntity->m_nType == ENTITY_TYPE_PED)
            {
                for (int i = 0; i < SAMP_MAX_PLAYERS; i++)
                {
                    if (!pSAMP->isPlayerStreamed(i))
                        continue;

                    CPed* pPed = CPools::GetPed(pSAMP->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->ulGTAEntityHandle);
                    if (!pPed || pPed == FindPlayerPed() || pCollisionEntity != pPed || !pPed->IsAlive())
                        continue;

                    // Защита тиммейтов
                    if (g_Config.g_Aimbot.bTeamProtect && pSAMP->getPlayerColor(i) == pSAMP->getPlayerColor(pSAMP->getPlayers()->sLocalPlayerID))
                        continue;

                    // Фильтры
                    if (!g_Config.g_Aimbot.bIgnoreEverything)
                    {
                        if (g_Config.g_Aimbot.bIgnoreAFK && pSAMP->getPlayers()->pRemotePlayer[i]->pPlayerData->iAFKState == 2)
                            continue;

                        float fDistanceFromEnemy = Math::vect3_dist(
                            &pSAMP->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped->base.matrix[12],
                            &pSAMP->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->base.matrix[12]);
                        if (!g_Config.g_Aimbot.bIgnoreMaxDistance && fDistanceFromEnemy > fWeaponRange[pSAMP->getPlayers()->pLocalPlayer->byteCurrentWeapon])
                            continue;
                    }

                    // Выстрел
                    pKeyHook->g_GameKeyState[BUTTON_CIRCLE] = { 0xFF, true };
                    iTick = GetTickCount64();
                    break;
                }
            }
        }
    }
}
Необходимые зависимости:
bCrosshair — проверка что прицел активен (режим камеры 53 или 7)
pKeyHook->g_GameKeyState[BUTTON_CIRCLE] — симуляция нажатия кнопки стрельбы
CWorld::ProcessLineOfSight — raycast из GTA SA
Utils::getBonePosition — получение позиции кости
TheCamera — глобальный объект камеры GTA
pSAMP — обёртка над SAMP

для компиляции тебе надо
plugin-sdk

plugin-sdk:
// Камера
CCamera TheCamera;                          // 0xB6F028
TheCamera.m_aCams[0].m_nMode               // режим камеры
TheCamera.m_aCams[0].m_vecFront            // направление камеры
TheCamera.GetGameCamPosition()             // позиция камеры
TheCamera.Find3rdPersonCamTargetVector()   // вектор прицеливания

// Мир
CWorld::ProcessLineOfSight()               // raycast

// Игрок
FindPlayerPed()                            // локальный пед
CPed, CEntity                              // структуры
CPools::GetPed()                           // получить пед по хендлу


SAMP SDK:
// Структуры SAMP
stSAMP* pSAMP;
pSAMP->getPlayers()->pLocalPlayer          // локальный игрок
pSAMP->getPlayers()->pRemotePlayer[i]      // удалённые игроки
pSAMP->isPlayerStreamed(i)                 // проверка стрима
pSAMP->getPlayerColor(i)                   // цвет игрока (для тимчека)

// Данные игрока
byteCurrentWeapon                          // текущее оружие
pPlayerData->pSAMP_Actor->ulGTAEntityHandle // хендл педа
pPlayerData->iAFKState                     // AFK статус


Утилиты (можно написать свои):
// Получить позицию кости
void getBonePosition(CPed* pPed, ePedBones bone, CVector* out) {
    RwV3d rwPos;
    pPed->GetBonePosition(rwPos, bone, false);
    out->x = rwPos.x; out->y = rwPos.y; out->z = rwPos.z;
}

// Дистанция между векторами
float vect3_dist(float* v1, float* v2) {
    float dx = v1[0] - v2[0];
    float dy = v1[1] - v2[1];
    float dz = v1[2] - v2[2];
    return sqrtf(dx*dx + dy*dy + dz*dz);
}



4. Симуляция нажатия клавиш:
// Вариант 1: Хук на ввод 
pKeyHook->g_GameKeyState[BUTTON_CIRCLE] = { 0xFF, true };

// Вариант 2: Напрямую в память GTA
*(BYTE*)0xB73458 = 255; // fire key state

// Вариант 3: SendInput / mouse_event
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);



5. Массив дальности оружия:
float fWeaponRange[47] = {
    0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,  // 0-9 (melee)
    0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,  // 10-19
    0.f, 0.f, 35.f, 35.f, 35.f, 35.f, 35.f, 35.f, 35.f, 35.f, // 20-29 (pistols, smg)
    45.f, 45.f, 35.f, 100.f, 300.f, 0.f, 0.f, 0.f, 0.f, 0.f,  // 30-39 (rifles, sniper)
    // ...
};



Минимальный standalone пример::
void Triggerbot() {
    // Проверка прицела
    int mode = *(int*)(0xB6F028 + 0x174); // TheCamera.m_aCams[0].m_nMode
    if (mode != 53 && mode != 7) return;
  
    // Raycast
    CVector camPos = *(CVector*)(0xB6F028 + 0x190);
    CVector camFront = *(CVector*)(0xB6F028 + 0x140);
    CVector target = camPos + camFront * 100.f;
  
    CColPoint col;
    CEntity* entity = nullptr;
    if (CWorld::ProcessLineOfSight(camPos, target, col, entity, true, true, true, true, true, true, false, true)) {
        if (entity && entity->m_nType == 3) { // ENTITY_TYPE_PED
            // Проверить что это враг через SAMP...
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }
    }
}
 
Последнее редактирование: