// регистрируем CALLBACK в mainloop
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
bool __stdcall incomingRPC(stRakNetHookParams* params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
UINT16 wDialogID;
UINT8 bDialogStyle;
UINT8 bTitleLength, bButton1Len, bButton2Len;
char szTitle[256], szButton1[256], szButton2[256];
char szInfo[4096];
// читаем данные диалога
params->bitStream->ResetReadPointer();
params->bitStream->Read(wDialogID); // ID диалога
params->bitStream->Read(bDialogStyle); // стиль диалога
params->bitStream->Read(bTitleLength); // длинна заголовка
params->bitStream->Read(szTitle, bTitleLength); // заголовок
szTitle[bTitleLength] = NULL;
params->bitStream->Read(bButton1Len); // длинна текста 1 кнопки
params->bitStream->Read(szButton1, bButton1Len); // текст 1 кнопки
szButton1[bButton1Len] = NULL;
params->bitStream->Read(bButton2Len); // длинна текста 2 кнопки
params->bitStream->Read(szButton2, bButton2Len); // текст 2 кнопки
szButton2[bButton2Len] = NULL;
SF->getRakNet()->DecodeString(szInfo, 4096, params->bitStream); // текст диалога
// делаем проверки, меняем данные
std::string new_title = "HOOKED | " + std::string(szTitle); // к примеру добавим в начало заголовка "HOOKED | "
strcpy_s(szTitle, new_title.c_str());
// обратно записываем данные
params->bitStream->ResetWritePointer();
params->bitStream->Write(wDialogID); // ID диалога
params->bitStream->Write(bDialogStyle); // стиль диалога
params->bitStream->Write((UINT8)strlen(szTitle)); // длинна заголовка
params->bitStream->Write(szTitle, strlen(szTitle)); // заголовок
params->bitStream->Write((UINT8)strlen(szButton1)); // длинна текста 1 кнопки
params->bitStream->Write(szButton1, strlen(szButton1)); // текст 1 кнопки
params->bitStream->Write((UINT8)strlen(szButton2)); // длинна текста 2 кнопки
params->bitStream->Write(szButton2, strlen(szButton2)); // текст 2 кнопки
SF->getRakNet()->EncodeString(szInfo, 4096, params->bitStream); // текст диалога
}
return true;
}