HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #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 так же точно валидны, ведь я вижу вывод их в консоль сервера
 
Ответить с цитированием

  #2  
Старый 24.08.2025, 00:54
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

Использовал когда-нибудь samp-ptl?

Никаких указателей не надо, сделано всё за тебя
 
Ответить с цитированием

  #3  
Старый 24.08.2025, 13:51
routefleeder
Познающий
Регистрация: 23.11.2016
Сообщений: 42
С нами: 4983862

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

Цитата:
Сообщение от daun.daunovich.01  

Использовал когда-нибудь samp-ptl?
Никаких указателей не надо, сделано всё за тебя
Ну я sampgdk юзаю, там всё как в samp-ptl, да и с samp-ptl оригинальным тоже игрался. В общем я принял решение хукать OnGameModeInit и OnFilterscriptInit для получения валидного указателя
 
Ответить с цитированием

  #4  
Старый 24.08.2025, 16:23
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Вот пример с samp-ptl:

C++:





Код:
#include "ptl.h"
class
Script
:
public
ptl
::
AbstractScript

{
private
:
std
::
shared_ptr

onTest_
;
public
:
// враппер для вызова каллбека из amx
void
OnTest
(
std
::
uint32_t
playerId
)
{
if
(
onTest_
&&
onTest_
->
Exists
(
)
)
{
onTest_
->
Exec
(
playerId
)
;
}
}
bool
OnLoad
(
)
{
int
numPublics
{
}
;
amx_
->
NumPublics
(
&
numPublics
)
;
for
(
int
index
{
}
;
index

{
private
:
public
:
const
char
*
Name
(
)
;
bool
OnLoad
(
)
;
}
;
// А также вызовы:
PLUGIN_EXPORT
void
PLUGIN_CALL
AmxLoad
(
AMX
*
amx
)
{
Plugin
::
DoAmxLoad
(
amx
)
;
}
PLUGIN_EXPORT
unsigned
int
PLUGIN_CALL
Supports
(
)
{
return
SUPPORTS_VERSION
|
SUPPORTS_AMX_NATIVES
;
}
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.