Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 8
    Гостей: 4
    Пользователи: - отсутствуют
    Роботы: The Python Robot, Google Bot, robot Bot, Yandex Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 16-02-2012, 01:59 Просмотров: 12897

    Урок 12. Получение данных из другого плагина с помощью native функции

    Учитывая последние тенденции к развитию различных модов для Counter-Strike, необходимость взаимодействия основного мода и небольших легко заменяемых модулей просто необходима. Но как же плагины взаимодействую между собой? На первый взгляд может показаться немного сложно, но на самом деле все просто, есть два основных способа, каждый способ для разных ситуаций, а именно:
    1. Способ для получения каких то данных из основного мода ( native )
    2. Способ для определения событий основного мода ( forward )
    В данном уроке пойдет речь о native функциях,как сделать собственные функции и как с ними работать.

    Хочу сразу предупредить, что если автор не предусмотрел в своем моде готовых 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
    там мы тоже вызываем функцию в основном плагине, но уже ни чего не получаем, а в главном плагине происходят изменения.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Vergil-san

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Спс большое автору, очень помогло! bully
    Valer4

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Дополню как передать строку.
    Плагин А
    #include <amxmodx>

    public plugin_init()
    {
        register_plugin("1","1","1"&
    amp;
    amp;
    amp;
    amp;
    #41;
    }
            
    public plugin_natives()
    {
        register_native("komanda", "native_komanda")
    }
            
    public native_komanda()
    {
        new dlina = get_param(2)
        set_string(1, "stroka", dlina)
        return 1
    }

    Плагин Б
    #include <amxmodx>

    public plugin_init()
    {
        register_plugin("2", "2", "2");
        register_clcmd("say qwerty", "pokazat")
    }
            
    native komanda(slovo[], nomer)
            
    public pokazat()
    {
        new zapis[32]
        komanda(zapis, charsmax(zapis))
        client_print(0, print_chat, "%s", zapis)
    }

    Взято с www.amx-x.ru, я упростил чуть-чуть.
    Ссылка: www.amx-x.ru/viewtopic.php?f=8&&t=10699&sid=36b4a3886a2172c278278cacc1acd5ef&sta
    rt=10
    Спасибо mazdan`у!
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    А если нужно передать значение массива?

    Плагин А
    #include <test>

    new bool:test[33]

    public plugin_natives()
    {
        register_native("test", "native_test")
    }
    public client_connect(id)
    {
        test[id] = true
    }
    public client_disconnect(id)
    {
        test[id] = false
    }
    public native_test(id)
    {
        return test[id]
    }


    Плагин Б
    #include <test>

    public client_PreThink(id)
    {
        new bool:test[33] = get_my_info(test[id])
        
        if(test[id]) client_print(id,print_centr,"test = true")
        else client_print(id,print_centr,"test = false")
    }



    test.inc
    native test(test[id])


    Так?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    артист,
    1) строка/массив/учимся читать
    2)в плагине bla - я расцениваю как мат.

    Если ты продолжишь вести себя по хамски и писать всякий бред/мат и прочее... - я буду вынужден тебя забанить.

    Еще азы перечитай, раз ты не понимаешь что функция возвращает...

    test[id] = 0 OR test[id] = 1
    То есть функция
    return test[id]
    возвращает 1 или 0
    А не массив... двоечник, зато опечатки искать мастер... тьфу...


    Valer4, в твоем варианте это уже не просто натив, а использование других функций, точнее set_string.
    С таким же успехом можно использовать и другое место хранения, тот же SQL,файл и т.п. я правда не разбирался с этой функцией.
    Но пример есть в офф документации:

    This can only be used in a dynamic native function registered with style 0 (default). Arguments start at 1.

    Copies a string back into a buffer specified in a parameter. For example:
    public mynative(id, numParams) 

       set_string(1, "Yams", 4)
    }
    public test()

       new str[5]
       mynative(str)
    }


    Will copy the word "Yams" into the array given as parameter 1.

    --------------------
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Да не мат это))
    "bla-bla" с английского - что-то вроде: говори - говори...

    1) строка/массив/учимся читать

    Дак здесь нет ничего про массивы.

    Как передать переменную понятно.

    Еще азы перечитай, раз ты не понимаешь что функция возвращает...

    Так я их вообще не читал)).Потому как незнаю где...
    И бред пишу потому,что не знаю...
    Я не понимаю как возврат в конец функции может,что-то передавать..
    Для чего вообще нужны коментарии?
    Чтобы в них писали: "О, то ,что нужно,спасибо!"
    Или для дополнений к статье более-менее опытными скриптёрами?

    Я всего лишь спросил...
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    артист,
    Не все знают разговорный и уж тем более сленговый английский, и часть может воспринимать данные слова как мат.
    Выражайся не двусмысленно

    Учи азы, не желание их найти и прочесть - твои проблемы, все твое не понимание этой темы - только в твоей лени.

    Комментарии должны касаться темы, а не всего подряд.

    З.ы. далее играть в слова и объяснять тебе ни чего не буду.
    Сочту нарушением - получишь бан.
    Надоело сюсюкаться.
    --------------------
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Плагин А

    #include <connect>

    new bool:connect[33]

    public plugin_natives()
    {
        register_native("test", "native_test")
    }
    public client_connect(id)
    {
        connect[id] = true
    }
    public client_disconnect(id)
    {
        connect[id] = false
    }
    public native_test(id)
    {
        connect[id]
        
        return 1
    }


    Плагин Б

    #include <connect>

    public client_PreThink(id)
    {
        new bool:connect[33] = test(const connect[id])
        
        if(test[id]) client_print(id,print_centr,"connect = true")
        else client_print(id,print_centr,"connect = false")
    }


    connect.inc

    native test(id)


    Так, что ли?
    sergey6661313

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Здравствуйте, решил сделать плагин модульным, и у меня встал такой вопрос:
    возможно ли вызвать одну и туже функцию в двух разных плагинах?
    Я сделал 2 фаила с одной и тойже native функции и при вызове функции запускалась только одна(та что первее в plugins.ini прописана). Чтобы Функции заработали я дал функциям разные имена, но появилась другая проблемма. Я не могу заранее знать как будет называться функция в конкретном модуле. Я сделал вызов 10 функции которые назвал
    test1();
    test2();
    test3();
    но если я удалю плегин в котором test3() то не срабатывают test1 и test2
    Я хочу чтобы была возможность удалить модуль и при этом сработали плегин всё равно работал бы.
    Valer4

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Поподробней и куски кода в студию, раскинем внутричерепным содержимым)))
    sergey6661313

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    1) вариант:
    http://pastecode.ru/30280/
    Если так сделать то в при say /test в чате напишеться только fail B OK
    "fail C OK" - не напишеться

    2) вариант
    http://pastecode.ru/e1067/
    При таком варианте при /test выплывут обе надписи, но если удалить один из фаилов B или C то не выплывет ни одна надпись.

    Хотелось бы реализовать что-то вроде
    Если есть и фаил B и фаил C то вызывать в начале каждого раунда поочереди то из одного то из другого фаила.
    иначе
    если есть фаил B то вызывать на каждом раунде функцию из B
    если есть фаил C то вызывать на каждом раунде функцию из C
    ну и если удалены и фаил B и фаил C то просто продолжать работу плагина.


    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама