Добрый вечер, профи, и не только)
Меня интересует такой вопрос: возможно ли вызвать нативную функцию a_samp из плагина не прибегая к помощи Invoke?
Вид для печати
Добрый вечер, профи, и не только)
Меня интересует такой вопрос: возможно ли вызвать нативную функцию a_samp из плагина не прибегая к помощи Invoke?
sampgdk или вызывать функцию по адресу.
Я бы советовал сделать встроенную функцию написанную внутри инклуда твоего,
чтобы стандартные функции вызывались только на сервере,
а потом уже какая инфа от них нужна передавать в плагин.
По адресу через amx_FindNative? А так будет работать?
Так немного не получится, потому что нужно при вызове отправлять одни данные, которые находятся в инклуде, и сверять их с данными, которые только в плагине.
Да и в Invoke я что-то не нашёл нужного натива
Если вам нужно вызвать нативную функцию без использования сторонних библиотек (gInvoke или SAMPGDK), можете попробовать вызвать её через функцию-посредника на Pawn (т.е. с помощью amx_Exec() вызвать в скрипте public-функцию, которая уже вызовет нужный вам натив) или же в таблице нативных функций скрипта найти нужный натив и вызвать напрямую по адресу (но тогда обязательно нужно, чтобы нативная функция использовалась где-нибудь в скрипте, чтобы она была в таблице нативок; для этого можно просто создать в скрипте пустую public-функцию, которая нигде не используется и вызывает нативную функцию с любыми аргументами).
Второй способ сложнее в реализации, но лучше в плане производительности. Сложность заключается в том, что при вызове AMXLoad ещё нельзя узнать адрес натива, т.к. скрипт загружен, но ещё не инициализирован. Единственный способ - создать в плагине ещё одну нативную функцию, которая будет вызываться скриптом из OnGameModeInit/OnFilterScriptInit (сделать перехват в инклуде), и при вызове этой вспомагательной функции уже из неё узнавать адрес нужной вам нативки.
Но плагин вызывает поиск адреса натива при определённом действии, когда всё уже загружено и, по идее, инициализировано..
И такой вопрос: макрос (к примеру, MAX_PLAYERS) можно перенести в плагин?
Воспользуйтесь этой модифицированной версией SDK, в ней добавлено несколько доп. функций и макросов (см. файл amx2.h). В частности, вам понадобится макрос GETENTRY.
Код должен получиться примерно такой:
PHP код:
int func_index;
if (amx_FindNative(amx, "<имя натива>", &func_index) != AMX_ERR_NONE)
{
// Ошибка: нативная функция не найдена.
}
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
AMX_FUNCSTUB *func_stub = GETENTRY(hdr, natives, func_index);
AMX_NATIVE func = func_stub->func;
Почему бы и нет? Просто передавайте эту константу из скрипта в качестве параметра нативной функции в вашем плагине. Или можете вызвать GetPlayerPoolSize непосредственно из плагина.
Слегка отредачил пост выше (UPD)
Но вот касаемо второго: мне нужно создать глобальный массив в самом плагине, думаю, это не подойдёт в качестве параметра функции)