Вечер в хату, часик в радость, чифир в сладость!
Здеся мы будем говорить от RakNek хуках. Hook в переводе с английского означает перехват.
Эта информация может исходить как от игрока, так и от сервера.
Гайд рассчитан на людей имеющих хотя бы небольшой опыт работы с SF.
Приступим к регистрации нашего хука:
Данная функция регистрирует RakNet хук. Она принимает 2 аргумента: первый - тип хука, второй - функция в которой будет происходить его обработка
Вот все существующие типы RakNet хуков:
В данном случае я буду работать с приходящим от сервера RPC.
Создаём функцию обрабатывающую хук:
Все RPC с их параметрами вы найдёте там: https://github.com/BrunoBM16/samp-packet-list/wiki/RPC-List
Компилируем, заходим в игру и проверяем:
Сообщение придёт быстрее, чем сам текст.
Потому что хук срабатывает до получения сообщения клиентом.
Вот полный код, который у нас получился:
Поправляйте меня в комментариях <3
Здеся мы будем говорить от RakNek хуках. Hook в переводе с английского означает перехват.
Вообщем с помощью хуком мы можем перехватить и модифицировать нужную нам информацию.Перехват (англ. hooking) — технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы.
Эта информация может исходить как от игрока, так и от сервера.
Гайд рассчитан на людей имеющих хотя бы небольшой опыт работы с SF.
Приступим к регистрации нашего хука:
C++:
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::ТИП_ХУКА, hook_function);
Вот все существующие типы RakNet хуков:
Регистрация должна происходить в mainloop после инициализации игры:RAKHOOK_TYPE_INCOMING_PACKET – Перехватывает приходящие от сервера пакеты.
RAKHOOK_TYPE_INCOMING_RPC – Перехватывает приходящие от сервера RPC.
RAKHOOK_TYPE_OUTCOMING_PACKET – Перехватывает исходящие от игрока пакеты.
RAKHOOK_TYPE_OUTCOMING_RPC – Перехватывает исходящие от игрока RPC.
В данном случае я буду работать с приходящим от сервера 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;
}
Компилируем, заходим в игру и проверяем:
Сообщение придёт быстрее, чем сам текст.
Потому что хук срабатывает до получения сообщения клиентом.
Вот полный код, который у нас получился:
Поправляйте меня в комментариях <3