Half-Life и Adrenaline Gamer форум

Всё об игре в Халф-Лайф и АГ
Текущее время: 17 ноя 2019, 04:26

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Вызов функции metamod плагина
СообщениеДобавлено: 08 ноя 2015, 02:05 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Добрый вечер. Как мне вызвать функцию 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);


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 08 ноя 2015, 17:21 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
Надо сделать её экспортируемой (EXPORT), как GiveFnptrsToDll, а потом получить адрес из амхх модуля через GetProcAddress.
Либо можно в модуле команду зарегистрировать, типа spawn_monster и через неё спавнить, параметры правда передавать будет не особо удобно.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 04:37 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
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. И как передать параметры?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 07:03 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
Не грузят они дважды одно и тоже, возвращают хэндл на уже загруженное.

Добавлено спустя 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);


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 19:58 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Получилось, спасибо.

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

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

_________________
Портал Half-Life DeathMatch


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 20:57 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
Не. MF_AmxExec - это для вызова функций в AMXX плагине, тех что public и native.
А что ты хочешь в самом АМХХ вызвать? В принципе, тут так же. Никакого кросс-апи между модулями нет, как и с ядром амхх.
Весь АМХХ и метамод строятся вокруг перехвата вызовов между движком и игровой дллкой.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 21:04 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
В самом AMXX хотел бы вызвать функции которые в amxmodx.cpp, например register_srvcmd (вместо REG_SVR_COMMAND).

_________________
Портал Half-Life DeathMatch


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 21:11 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
ImperNik писал(а):
например register_srvcmd
С каким умыслом?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 21:12 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Для саморазвития :oops:


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Вызов функции metamod плагина
СообщениеДобавлено: 09 ноя 2015, 21:13 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
Не, это плохая затея. хД
Команду может зарегать любой модуль сам по себе. Основано на перехвате посылки неизвестных движку команд в игровую дллку. Перехват этого может делать любой модуль.


Вернуться к началу
 Профиль 
  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB