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

  #3  
Старый 31.07.2025, 20:12
mortergrand
Новичок
Регистрация: 22.07.2023
Сообщений: 23
С нами: 1481537

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

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

(
hitEntity
)
;
if
(
ped
&&
ped
->
IsAlive
(
)
)
{
MouseLeftClick
(
)
;
}
}
}
void
TriggerBot
::
RenderUI
(
)
{
ImGui
::
Checkbox
(
"TriggerBot"
,
&
JK_TriggerIsEnable
)
;
}
 
Ответить с цитированием