 |
|

27.07.2025, 22:46
|
|
Познавший АНТИЧАТ
Регистрация: 01.04.2018
Сообщений: 1,710
С нами:
4272230
Репутация:
183
|
|
Сообщение от Smeruxa
Вот такой вариант попробовал, он работает в случае, если играют анимации, откуда этот эффект взялся - я без понятия, случайно выявил (прыгал и забирался по стенке)
Т.е. рисует треугольник, видимо есть какой-то случай, вызывающий это
C++:
Код:
CPlayerPed
*
l
=
static_cast
(
FindPlayerPed
(
)
)
;
l
->
m_pPlayerTargettedPed
=
CPools
::
GetPed
(
sampapi
::
v037r1
::
RefNetGame
(
)
->
GetPlayerPool
(
)
->
GetAt
(
nearId
)
->
m_pPlayer
->
m_pPed
->
m_handle
)
;
l
->
DrawTriangleForMouseRecruitPed
(
)
;
Может чего-то не хватает, какого-то флага/стейта
Нет никакого флага или стейта, таргетный пед сразу чистится по адресам 0x609EE3 и 0x60BA52, если ты не в прицеле.
|
|
|

02.08.2025, 19:34
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Вопрос по поводу RakClient.h
Как правильно работать с Receive? То-есть, как правильно получать пакеты исходящие от сервера?
Вопрос в том, где это делать? В игровом цикле? Нужна ли какая-то задержка?
RakNet:
Код:
virtual
Packet
*
Receive
(
void
)
;
P.S. Прикол в том, что когда я использую Receive, то как будто я перехватываю пакет, и дальше уже никакие пакеты от клиента на сервер не идут.
|
|
|

02.08.2025, 20:26
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от daun.daunovich.01
Вопрос по поводу RakClient.h
Как правильно работать с Receive? То-есть, как правильно получать пакеты исходящие от сервера?
Вопрос в том, где это делать? В игровом цикле? Нужна ли какая-то задержка?
RakNet:
Код:
virtual
Packet
*
Receive
(
void
)
;
P.S. Прикол в том, что когда я использую Receive, то как будто я перехватываю пакет, и дальше уже никакие пакеты от клиента на сервер не идут.
Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?
Если второй вариант, то тебе надо хукать вызов RakClient::Receive - вызывать оригинал, сохранять результат (полученный пакет), обрабатывать его, если это нужный тебе пакет и уже в зависимости от нужд возвращать из Хука либо nullptr (самп его не прочитает), либо результат вызова оригинала
|
|
|

02.08.2025, 20:57
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от вайега52
Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?
Если второй вариант, то тебе надо хукать вызов RakClient::Receive - вызывать оригинал, сохранять результат (полученный пакет), обрабатывать его, если это нужный тебе пакет и уже в зависимости от нужд возвращать из Хука либо nullptr (самп его не прочитает), либо результат вызова оригинала
P.S. Я это делал в своём самп-клиенте.
Спасибо. Я так и думал, что нужно хукать вызов RakClient::Receive.
А теперь вопрос, как правильно хукать вызов RakClient::Receive?
Посмотрел в IDA PRO (sampr3.idb)
Я так понимаю, там нужно мутить что-то с RakClientInterface_vtbl?
Получать указатель на RakClientInterface, а потом с помощью оффсетов хукать функцию Receive?
|
|
|

02.08.2025, 21:32
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от daun.daunovich.01
P.S. Я это делал в своём самп-клиенте.
Спасибо. Я так и думал, что нужно хукать вызов RakClient::Receive.
А теперь вопрос, как правильно хукать вызов RakClient::Receive?
Посмотрел в IDA PRO (sampr3.idb)
Я так понимаю, там нужно мутить что-то с RakClientInterface_vtbl?
Получать указатель на RakClientInterface, а потом с помощью оффсетов хукать функцию Receive?
в структуре CNetGame есть указатель на RakClientInterface (pNetGame + 0x2C на R3), можешь от туда его получить и изменять указатель на метод внутри самой вмт. Либо же можешь найти адрес самой функции и хукать ее (samp.dll + 0x34AC0 на R3)
|
|
|

02.08.2025, 21:33
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от tanksoftik
как полностью отключить pause mune ( esc )? пробовал отключить рендер по итогу при esc экран черный и выйти из esc не получалось
Из самого простого - хукнуть WNDPROC и не пропускать сообщение для VK_ESCAPE
|
|
|

02.08.2025, 22:08
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от вайега52
в структуре CNetGame есть указатель на RakClientInterface (pNetGame + 0x2C на R3), можешь от туда его получить и изменять указатель на метод внутри самой вмт. Либо же можешь найти адрес самой функции и хукать ее (samp.dll + 0x34AC0 на R3)
Вот, смотри, я сделал вот так:
C++:
[CODE]
bool
Hooks
::
HookReceive
(
)
{
void
*
*
vtable
=
reinterpret_cast
(
AVSSync
::
getRakClientIntf
(
)
)
;
if
(
!
vtable
)
{
return
false
;
}
void
*
receiveAddr
=
vtable
[
9
]
;
MH_STATUS createStatus
=
MH_CreateHook
(
receiveAddr
,
&
HookedReceive
,
reinterpret_cast
(
&
originalReceive
)
)
;
if
(
createStatus
!=
MH_OK
)
{
return
false
;
}
MH_STATUS enableStatus
=
MH_EnableHook
(
receiveAddr
)
;
if
(
enableStatus
!=
MH_OK
)
{
return
false
;
}
std
::
cout
Это правильно? getRakClientIntf() возвращает указатель на RakClientInterface*
|
|
|

02.08.2025, 22:15
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
[QUOTE="daun.daunovich.01"]
Вот, смотри, я сделал вот так:
C++:
[CODE]
bool
Hooks
::
HookReceive
(
)
{
void
*
*
vtable
=
reinterpret_cast
(
AVSSync
::
getRakClientIntf
(
)
)
;
if
(
!
vtable
)
{
return
false
;
}
void
*
receiveAddr
=
vtable
[
9
]
;
MH_STATUS createStatus
=
MH_CreateHook
(
receiveAddr
,
&
HookedReceive
,
reinterpret_cast
(
&
originalReceive
)
)
;
if
(
createStatus
!=
MH_OK
)
{
return
false
;
}
MH_STATUS enableStatus
=
MH_EnableHook
(
receiveAddr
)
;
if
(
enableStatus
!=
MH_OK
)
{
return
false
;
}
std
::
cout
|
|
|

02.08.2025, 22:32
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Во, сделал так:
И хук заработал, только как теперь работать с пакетами, когда я пытаюсь получить что-то из пакета, происходит краш.
C++:
[CODE]
bool
Hooks
::
HookReceive
(
)
{
Packet
*
__fastcall
HookedReceive
(
RakClientInterface__vtable
*
thisPtr
,
void
*
edx
)
{
Packet
*
packet
=
originalReceive
(
thisPtr
)
;
return
packet
;
}
HMODULE sampModule
=
GetModuleHandleA
(
"samp.dll"
)
;
if
(
!
sampModule
)
{
return
false
;
}
// Получаем указатель на рак клиент
RakClientInterface
*
*
rakclient
=
reinterpret_cast
(
AVSSync
::
getRakClientIntf
(
)
)
;
if
(
!
rakclient
)
{
return
false
;
}
DWORD
*
vTable
=
*
reinterpret_cast
(
rakclient
)
;
LPVOID target
=
reinterpret_cast
(
vTable
[
8
]
)
;
MH_STATUS createStatus
=
MH_CreateHook
(
target
,
&
HookedReceive
,
reinterpret_cast
(
&
originalReceive
)
)
;
if
(
createStatus
!=
MH_OK
)
{
return
false
;
}
MH_STATUS enableStatus
=
MH_EnableHook
(
target
)
;
if
(
enableStatus
!=
MH_OK
)
{
return
false
;
}
std
::
cout
Сообщение от вайега52
Ты на какой версии сампа? Если р3, то receiveAddr - samp.dll должен совпадать 0x34AC0
На R3, но нет, не совпадает: 0x5CAF637A
|
|
|

02.08.2025, 22:41
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|