Показать сообщение отдельно

  #5  
Старый 02.08.2025, 01:19
mortergrand
Новичок
Регистрация: 22.07.2023
Сообщений: 23
С нами: 1481537

Репутация: 3
По умолчанию

Цитата:
Сообщение от JUJIK  

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

Так-же небыло в 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(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

(
hitEntity
)
;
// проверяем , что это не мы и шо пед жив
if
(
ped
==
player
||
!
ped
->
IsAlive
(
)
)
{
return
;
}
// проверяем , что это игрок , а не нпс
if
(
RefPlayerPool
(
)
->
GetId
(
ped
)
!=
-
1
)
{
MouseLeftClick
(
)
;
}
}
}
void
TriggerBot
::
RenderUI
(
)
{
ImGui
::
Checkbox
(
"TriggerBot"
,
&
JK_TriggerIsEnable
)
;
}
 
Ответить с цитированием