Half-Life и Adrenaline Gamer форум
http://aghl.ru/forum/

Вызов функции metamod плагина
http://aghl.ru/forum/viewtopic.php?f=38&t=2314
Страница 1 из 1

Автор:  ImperNik [ 08 ноя 2015, 02:05 ]
Заголовок сообщения:  Вызов функции metamod плагина

Добрый вечер. Как мне вызвать функцию metamod плагина из amxmodx модуля?

Есть функция в metamod плагине:
Код:
bool spawn_monster(int monster_type, Vector origin, float angle, int respawn_index) 
{
...
}

Мне бы её вызвать из amxmodx модуля. Естественно следующий вариант не сработает:
Код:
bool spawn_monster(int monster_type, Vector origin, float angle, int respawn_index);
...
spawn_monster(7, Vector(2001, 182, 65), 0, -1);

Автор:  Lev [ 08 ноя 2015, 17:21 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Надо сделать её экспортируемой (EXPORT), как GiveFnptrsToDll, а потом получить адрес из амхх модуля через GetProcAddress.
Либо можно в модуле команду зарегистрировать, типа spawn_monster и через неё спавнить, параметры правда передавать будет не особо удобно.

Автор:  ImperNik [ 09 ноя 2015, 04:37 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

GetProcAddress под винду, насколько знаю. Под Linux, если правильно понял нужно использовать dlsym.
А где handle взять? dlopen? Как-то неправильно :scratch:

Добавлено спустя 19 минут 31 секунду:
В osdep.h для этого нашел хороший велосипед: DLLEXPORT, DLOPEN, DLSYM.

Получается как-то так:

Metamod плагин:
Код:
DLLEXPORT bool spawn_monster(int monster_type, Vector origin, float angle, int respawn_index, int attack_player_index)
{
...
}

Amx модуль:
Код:
DLHANDLE moduleHandle = DLOPEN("monster_plugin.so");
DLFUNC func = DLSYM(moduleHandle, "spawn_monter");
(func);

Но, как я понял monter_plugin.so будет загружен повторно, этого не нужно. Нужно как-то узнать handle уже загруженного плагина Metamod. И как передать параметры?

Автор:  Lev [ 09 ноя 2015, 07:03 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Не грузят они дважды одно и тоже, возвращают хэндл на уже загруженное.

Добавлено спустя 8 минут 5 секунд:
ImperNik писал(а):
И как передать параметры?
Скастовать указатель на функцию к типу функции.
Код:
typedef bool spawn_monster_sig(int monster_type, Vector origin, float angle, int respawn_index, int attack_player_index);
spawn_monster_sig* spawn_monster_func;
spawn_monster_func = (spawn_monster_sig*)dlsym(...);
spawn_monster_func(monster_type, origin, angle, respawn_index, attack_player_index);

Автор:  ImperNik [ 09 ноя 2015, 19:58 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Получилось, спасибо.

Ещё один вопрос. Как вызвать amxmodx native функцию или функцию другого модуля из модуля amxmodx?

Если правильно понимаю, то для этого есть MF_AmxExec(), но в параметрах он требует структуру AMX, а способа получить её иначе как через MF_GetScriptAmx() я не вижу.

Автор:  Lev [ 09 ноя 2015, 20:57 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Не. MF_AmxExec - это для вызова функций в AMXX плагине, тех что public и native.
А что ты хочешь в самом АМХХ вызвать? В принципе, тут так же. Никакого кросс-апи между модулями нет, как и с ядром амхх.
Весь АМХХ и метамод строятся вокруг перехвата вызовов между движком и игровой дллкой.

Автор:  ImperNik [ 09 ноя 2015, 21:04 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

В самом AMXX хотел бы вызвать функции которые в amxmodx.cpp, например register_srvcmd (вместо REG_SVR_COMMAND).

Автор:  Lev [ 09 ноя 2015, 21:11 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

ImperNik писал(а):
например register_srvcmd
С каким умыслом?

Автор:  ImperNik [ 09 ноя 2015, 21:12 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Для саморазвития :oops:

Автор:  Lev [ 09 ноя 2015, 21:13 ]
Заголовок сообщения:  Re: Вызов функции metamod плагина

Не, это плохая затея. хД
Команду может зарегать любой модуль сам по себе. Основано на перехвате посылки неизвестных движку команд в игровую дллку. Перехват этого может делать любой модуль.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/