Проблема с TriggerBot

JUJIK

Новичок
Автор темы
6
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

Новичок
20
1
Проблема довольно типичная. Дело в том, как ты получаешь направление взгляда камеры. 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);
}