Добрый вечер, профи, и не только)
Меня интересует такой вопрос: возможно ли вызвать нативную функцию a_samp из плагина не прибегая к помощи Invoke?
Добрый вечер, профи, и не только)
Меня интересует такой вопрос: возможно ли вызвать нативную функцию a_samp из плагина не прибегая к помощи Invoke?
sampgdk или вызывать функцию по адресу.
Я бы советовал сделать встроенную функцию написанную внутри инклуда твоего,
чтобы стандартные функции вызывались только на сервере,
а потом уже какая инфа от них нужна передавать в плагин.
[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
Если вам нужно вызвать нативную функцию без использования сторонних библиотек (gInvoke или SAMPGDK), можете попробовать вызвать её через функцию-посредника на Pawn (т.е. с помощью amx_Exec() вызвать в скрипте public-функцию, которая уже вызовет нужный вам натив) или же в таблице нативных функций скрипта найти нужный натив и вызвать напрямую по адресу (но тогда обязательно нужно, чтобы нативная функция использовалась где-нибудь в скрипте, чтобы она была в таблице нативок; для этого можно просто создать в скрипте пустую public-функцию, которая нигде не используется и вызывает нативную функцию с любыми аргументами).
Второй способ сложнее в реализации, но лучше в плане производительности. Сложность заключается в том, что при вызове AMXLoad ещё нельзя узнать адрес натива, т.к. скрипт загружен, но ещё не инициализирован. Единственный способ - создать в плагине ещё одну нативную функцию, которая будет вызываться скриптом из OnGameModeInit/OnFilterScriptInit (сделать перехват в инклуде), и при вызове этой вспомагательной функции уже из неё узнавать адрес нужной вам нативки.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Но плагин вызывает поиск адреса натива при определённом действии, когда всё уже загружено и, по идее, инициализировано..
И такой вопрос: макрос (к примеру, MAX_PLAYERS) можно перенести в плагин?
Последний раз редактировалось SpecFree; 23.02.2017 в 13:54.
Воспользуйтесь этой модифицированной версией 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 непосредственно из плагина.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Слегка отредачил пост выше (UPD)
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Но вот касаемо второго: мне нужно создать глобальный массив в самом плагине, думаю, это не подойдёт в качестве параметра функции)
Последний раз редактировалось SpecFree; 23.02.2017 в 14:35.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)