cell* amx_GetParamStart(AMX* amx)
{
unsigned char* data = amx->data != NULL
? amx->data
: amx->base + ((AMX_HEADER*)amx->base)->dat;
return (cell*)(data + amx->stk);
}
void amx_GetParamValue(AMX* amx, int index, cell* param)
{
*param = amx_GetParamStart(amx)[index];
}
subhook_t amx_Exec_hook;
void amx_Exec_func(AMX* amx, cell* retval, int index)
{
subhook_remove(amx_Exec_hook);
logprintf("Public-function index: %d", index);
if (index == 10) // У меня 10 = индексу OnPlayerText
{
int playerid;
char text[145];
int len;
cell* addr;
amx_GetParamValue(amx, 0, &playerid);
amx_GetAddr(amx, amx_GetParamStart(amx)[1], &addr); // [1] - это номер параметра, как и 0 на строку выше
amx_StrLen(addr, &len);
amx_GetString(text, addr, NULL, len + 1);
logprintf("%d | %s", playerid, text);
}
amx_Exec(amx, retval, index);
subhook_install(amx_Exec_hook);;
}
PLUGIN_EXPORT bool PLUGIN_CALL Load(void** ppData)
{
#ifndef WIN32_
amx_Exec_hook = subhook_new((void*)0x401C90, (void*)amx_Exec_func, {}); // Адрес для Виндовс
#else
amx_Exec_hook = subhook_new((void*)0x8096780, (void*)amx_Exec_func, {}); // Адрес для Линукс
#endif
subhook_install(amx_Exec_hook);
return true;
}