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

    Всего на сайте: 17
    Гостей: 9
    Пользователи: - отсутствуют
    Роботы: Google AdSense, Yandex Bot, Yandex Bot, Yandex Bot, crawl Bot, robot Bot, Yandex Bot, Yandex Bot

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

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

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 14-03-2012, 11:44 Просмотров: 5374

    Урок 15. Создание собственной multi forward функции и работа с ней в других плагинах.

    Цель данного урока научить вас создавать свою forward функцию, то есть функцию, которая вызывается не по требованию, а всегда при наступлении какого то события, при этом эту функцию можно будет использовать в любом другом плагине. Простым примером может послужить Зомби мод, где большая часть игровых событий имеют подобные функции, что дает возможность писать небольшие дополнения вне самого мода. Вот например функция:
    /**
    * Called when a player becomes the last zombie.
    * Note: This is called for the first zombie too.
    * @param id        Player index.
    */
    forward zp_user_last_zombie(id)
    Она вызывается каждый раз когда остается последний зомби и передает его айди. Другие функции можно посмотреть в соответствующих плагину файлах в папке include и с расширением inc. Надеюсь, вы поняли о чем речь и можно переходить к конкретной практике.

    Для создания forward функции необходимо знать две функции:
    CreateMultiForward
    ExecuteForward
    Изучили? Замечательно, поехали дальше.
    Что бы не выдумывать и не запутывать вас лишний раз, возьму пример из выше приведенных функций:

    Это будет первый плагин(основной):
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[amxmodx.inc] ExecuteForward"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new g_fwd_first

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        g_fwd_first = CreateMultiForward("my_first_multi_forward", ET_CONTINUE, FP_CELL,FP_CELL)
        server_print("Forward[%d]",g_fwd_first)
    }
    public client_connect(id){

        new num = 5
        new ret
        ExecuteForward(g_fwd_first,ret,id,num)
        
        //Результат будет 98 (далее вы поймете почему)
        //Второго плагина с функцией my_first_multi_forward
        server_print("ret[%d]",ret)
    }


    Далее необходимо создать файл который будет рассказывать другим плагинам что за функцию волшебную мы придумали и назовем его new_forwards.inc, не забыли в какую папку его необходимо сохранить? Вижу, правильно думаете в папку include.

    После чего в него помещаем информацию о нашей функции:
     /*
    * Тестовая функция, вызывается каждый раз
    * Когда заходит игрок
    * Параметры:
    * id - айди игрока
    * num - какое то число
    */
    forward my_first_multi_forward(id,num)
    Разумеется данный пример не имеет ни какого смысла, так как создаваемый форвард дублирует уже существующий client_connect, но сейчас наша задача научиться работать с форвардами, а не придумывать их.

    Далее необходим второй плагин, где бы использовалась данная функция:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>
    //Подключение библиотеки, которая расскажет скрипту о функции
    #include <new_forwards>

    #define PLUGIN "[amxmodx.inc] Multi Forward`s"
    #define VERSION "1.0"
    #define AUTHOR "Admin"


    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
    }
    //Мы же регистрировали форвард, а как вы помните
    //форвард функция вызывается при каком то событии
    //А в библиотеке мы описали что за данные придут в не
    public my_first_multi_forward(id,num){

        //Для подтверждения что все прошло удачно
        //Выводим в консоль инфу об айди игрока и числа
        //Из первого плагина
        server_print("id[%d],num[%d]",id,num)
        
        //Возвращаем какое то значение в первый плагин
        return 98
    }


    Ну как, поняли о чем речь?
    Сейчас очень популярен стал мод DeathRun, вот и попробуйте написать два плагина.
    • Где будет отслеживаться что остался один CT и создайте форвард по этому событию и передайте id игрока и его здоровье.
    • Плагин который будет использовать данную функцию, например давать этому CT какое то оружие или здоровье, ну или просто HUD сообщение.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    arwel

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

    Спасибо. Очень полезно. Я как раз хотел в zombie plague лезть, чтобы узнать, как можно остановить форвард с помощью возвращаемого значения.

    Admin

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

    Спасибо )
    --------------------
    kykyiiikuh

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

    Спасибо за статью.
    Хотелось бы узнать как передать данное значение "2013-02-12" .
    Вместо нужного результата выдает следующие:
    L 12/29/2013 - 18:25:56: id[1], DateTime[L 12/29/2013 - 18:25:56:

    т.е пишет сегодняшнюю дату и время вместо "2013-02-12" .
    Admin

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

    kykyiiikuh,
    1) научись передавать переменную ( любое число)
    2) Эту дату 2013-02-12 надо конвертировать в число секунд (см как комы время сичтают) и передать это число другому плагину.

    Конвертер времени онлайн:
    http://onlineconversion.com/unix_time.htm
    --------------------
    kykyiiikuh

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

    Цитата: Admin
    kykyiiikuh,
    1) научись передавать переменную ( любое число)
    2) Эту дату 2013-02-12 надо конвертировать в число секунд (см как комы время сичтают) и передать это число другому плагину.

    Конвертер времени онлайн:
    http://onlineconversion.com/unix_time.htm


    спасибо.
    артист

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

    А возможно так подменить флаг доступа?

    Первый плагин, игрок должен иметь флаг d
    #include <amxmodx>
    #include <amxmisc>

    public plugin_init()
    {
        register_clcmd("say /eee", "function", ADMIN_BAN, "opisanie")
    }
    public function(id, level, cid)
    {
        if(!cmd_access(id, level, cid, 1))
        {
            client_print(id, print_chat, "False")
            return PLUGIN_HANDLED
        }
        client_print(id, print_chat, "True")
        return PLUGIN_HANDLED
    }


    И второй плагин, игрок имеет флаг m
    #include <amxmodx>
    #include <amxmisc>

    new g_id

    public plugin_init()
    {
        register_clcmd("say /", "mu_mu")
        g_id = CreateMultiForward("function", ET_STOP, FP_CELL, FP_CELL)
    }
    public mu_mu(id)
    {
        client_print(id, print_chat, "create miltiforwad")
        static rezult; ExecuteForward(g_id, rezult, id, ADMIN_LEVEL_A)
    }


    Не знай только, что будет, если у игрока с флагом а , будет ещё и m...
    Admin

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

    Не понимаю зачем это тебе и до конца что ты хочешь.
    Функция cmd_access проверят флаги игрока, а не то что ты ей передаешь.

    Напиши свою cmd_access_new. взяв за основу оригинал и добавь в нее функционал проверки данных по передаваемым значениями.

    Ну или как вариант можно перед вызовом форварда менять флаги игроку и потом обратно - но это бред.
    --------------------
    артист

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

    Хотел сделать чтобы игрок с флагом "m" ADMIN_LEVEL_A мог например забанить.
    Но не хотел переделывать стандартный вотебан ))

    На практике работало, но работали оба варианта, хотя в user.ini стояла только одна буква m.

    Наверное это потому, что я проверял на локальном сервере, походу игрок там всегда админ...

    register_clcmd("say /eee", "function", ADMIN_BAN, "opisanie")

    Передаст для cmd_access флаг ADMIN_BAN

    А ExecuteForward(g_id, rezult, id, ADMIN_LEVEL_A)

    Передаст флаг ADMIN_LEVEL_A что и является правдой.

    Правильно?
    Admin

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

    артист, смотри функцию cmd_access
    --------------------

    Информация

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

Реклама