- Способ для получения каких то данных из основного мода ( native )
- Способ для определения событий основного мода ( forward )
Хочу сразу предупредить, что если автор не предусмотрел в своем моде готовых native и forward функций, то при выходе следующей версии мода и если вы захотите обновить версию, то придется заново проделывать операции по регистрации собственных функций. Это я к тому, что чудес не бывает и легкий путь не даст вам ожидаемых результатов, так что приготовьтесь к трудностям и их успешному преодолению.
Для того что бы понять данный урок, вам необходимо изучить синтаксис функций:
register_native
plugin_natives
Будем считать что вы прочитали о них и двинемся дальше.
Для начала поставим себе символическую задачу передать из плагина А в плагин Б какое то число,оно например может быть идентификатором выключенного режима на DeathRun сервере,хотя там немного другая технология используется.
Приступим к созданию плагина А:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
//Можно обойтись и без инклюда, но тогда придется вписывать
//в каждый дополнительный плагин инфо о native функции
#include <testnative>
#define PLUGIN "[amxmodx.inc] main plugin A "
#define VERSION "1.0"
#define AUTHOR "Admin"
//Это число будем передавать в другой плагин
new chislo = 999
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
}
//Смотри синтакисис функций
public plugin_natives ( ){
register_native("get_my_info", "native_get_my_info", 1)
}
//это сама функция для взаимодействия плагинов, которая возвращает наше число
public native_get_my_info(param){
return chislo
}
Теперь плагин B:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <testnative>
#define PLUGIN "[amxmodx.inc] main plugin B"
#define VERSION "1.0"
#define AUTHOR "Admin"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /native","get_chislo")
}
public get_chislo(id){
//получение числа из основного плагина
new chislo = get_my_info(chislo)
client_print(0,print_chat,"You chislo:%d",chislo)
}
Содержание файла testnative.inc:
native get_my_info(chislo)
Всего то навсего одна строчка, но посмотрите пример скажем от Zombie Plague, в каждый мини плагин для этого мода, вписывать все нативы будет не просто не удобно, а даже не знаю как назвать.
И так, мы во втором плагине вызовем функцию get_my_info, которую создали в первом плагине и "сказали" ей возвращать значение переменной chislo, то разумеется мы получаем необходимое число.
То есть мы сами в основном плагине пишем функцию, которая будет что либо делать и вызвать ее можно будет из других плагинов.
При этом можно не только получить какие то данные, но и изменить их в основном плагине. Все зависит только от начинки функции:
public native_get_my_info(param){
return chislo
}
Что бы это сделать, давайте добавим еще одну функцию, изменяющую переменную chislo
Плагин A
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <testnative>
#define PLUGIN "[amxmodx.inc] main plugin A "
#define VERSION "1.0"
#define AUTHOR "Admin"
new chislo = 999
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
}
public plugin_natives ( ){
register_native("get_my_info", "native_get_my_info", 1)
register_native("set_my_info", "native_set_my_info", 1)
}
public native_get_my_info(param){
return chislo
}
//Новая функция, в ней будет изменяться переменная
//Эта функция будет вызвана из второго плагина
public native_set_my_info(id,param){
chislo = param
new name[32]
get_user_name(id,name,31)
client_print(id,print_chat,"%s set chislo to %d",name,param)
}
Плагин B
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <testnative>
#define PLUGIN "[amxmodx.inc] main plugin B"
#define VERSION "1.0"
#define AUTHOR "Admin"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /native","get_chislo")
register_clcmd("say /set_native","set_chislo")
}
public get_chislo(id){
new chislo = get_my_info(chislo)
client_print(0,print_chat,"You chislo:%d",chislo)
}
public set_chislo(id){
new new_chislo = 777
// вызов функции в основном плагине
set_my_info(id,new_chislo)
}
Не забываем про testnative.inc:
native get_my_info(chislo)
//id игрока
//chislo переменная содержащая передаваемое число
native set_my_info(id,chislo)
Проследите в коде что происходит в функции которую вызывает команда say /set_native
там мы тоже вызываем функцию в основном плагине, но уже ни чего не получаем, а в главном плагине происходят изменения.