Данная функция регистрирует RakNetхук. Она принимает 2 аргумента: первый - тип хука, второй - функция в которой будет происходить его обработка
Вот все существующие типы RakNet хуков:
Цитата:
RAKHOOK_TYPE_INCOMING_PACKET– Перехватывает приходящие от сервера пакеты. RAKHOOK_TYPE_INCOMING_RPC– Перехватывает приходящие от сервера RPC. RAKHOOK_TYPE_OUTCOMING_PACKET– Перехватывает исходящие от игрока пакеты. RAKHOOK_TYPE_OUTCOMING_RPC – Перехватывает исходящие от игрока RPC.
Регистрация должна происходить в mainloop после инициализации игры:
В данном случае я буду работать с приходящим от сервера RPC.
Создаём функцию обрабатывающую хук:
C++:
Код:
bool
__stdcall
hook_function
(
stRakNetHookParams
*
params
)
// Функция хука всегда принимает один параметр, это stRakNetHookParams
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
// RPC_ScrClientMessage это ID RPC. Можно использовать ScriptRPCEnumeration либо сразу указать ID RPC.
{
// Каждый RPC имеет свой список параметров
// В нашем случае RPC_ScrClientMessage имеет параметры: UINT32 dColor, UINT32 dMessageLength, char[] Message
DWORD color
;
// UINT32 dColor // Цвет сообщения
DWORD strlen
;
// UINT32 dMessageLength // Длина сообщения
char
string
[
144
]
;
// char[] Message // Текст сообщения
params
->
bitStream
->
ResetReadPointer
(
)
;
// Сбрасываем указатель чтения
params
->
bitStream
->
Read
(
color
)
;
// Получаем цвет сообщения из битстрима
params
->
bitStream
->
Read
(
strlen
)
;
// Получаем длину сообщения из битстрима
params
->
bitStream
->
Read
(
string
,
strlen
)
;
// Получаем текст и указываем длину сообщения
string
[
strlen
]
=
'\0'
;
// Ну и сверим наше сообщение с каким-нибудь текстом для примера
if
(
!
strcmp
(
string
,
"TestMessage_9812"
)
)
{
// Если вернётся true, то отправим сообщение в чат
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
0xFFFFAAAA
,
"> Доброе утро, славяне."
)
;
}
}
return
true
;
}