- 35
- 22
Всем ку. Вторые сутки не могу решить одну проблему с кастомным коллбеком в серверном плагине. Наверняка на бластхаке найдутся шарящие за структуру работы плагинов. Так вот, ближе к сути. Ниже покажу код функции которая должна вызывать коллбек в amx'е и то как я получаю указатель на него. Вероятно проблема как раз-таки с невалидностью указателя AMX*, у меня просто крашит сервер в момент выполнения OnPlayerPressKey. Буду премного благодарен, если кто-то сможет помочь.
получаем указатель и вызываем функцию:
Custom Amx Callback:
#include "sampgdk.h"
#include "Callbacks.h" // тут есть инклуд CGameMode.h со структурой
cell PluginCallbacks::OnPlayerPressKey(CGameMode* gamemode, int key, int playerid)
{
if(!gamemode->m_bInitialised) return 0;
int amx_id = 0;
cell retval = 0; // Amx-Callback return value
if(!amx_FindPublic(&gamemode->m_amx, "OnPlayerPressKey", &amx_id))
{
amx_Push(&gamemode->m_amx, key);
amx_Push(&gamemode->m_amx, playerid);
amx_Exec(&gamemode->m_amx, &retval, amx_id);
}
return retval;
}
получаем указатель и вызываем функцию:
Call callback-function:
CNetGame* netgame_ptr = PluginPointers::GetCNetGamePointer(); // я на сто процентов уверен, что получаю валидный глобальный указатель на CNetGame, потому что он прекрасно работает в других местах кода
CGameMode* gm_ptrr = netgame_ptr->m_pGameMode;
PluginCallbacks::OnPlayerPressKey(gm_ptrr, key, playerid); // параметры key и playerid так же точно валидны, ведь я вижу вывод их в консоль сервера