Показать сообщение отдельно

  #1  
Старый 23.08.2025, 17:11
routefleeder
Познающий
Регистрация: 23.11.2016
Сообщений: 42
С нами: 4983862

Репутация: 68
По умолчанию

Всем ку. Вторые сутки не могу решить одну проблему с кастомным коллбеком в серверном плагине. Наверняка на бластхаке найдутся шарящие за структуру работы плагинов. Так вот, ближе к сути. Ниже покажу код функции которая должна вызывать коллбек в 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 так же точно валидны, ведь я вижу вывод их в консоль сервера
 
Ответить с цитированием