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

    Всего на сайте: 1
    Гостей: 0
    Пользователи: - отсутствуют
    Роботы: crawl Bot

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

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

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 3-09-2011, 17:26 Просмотров: 26153

    set_task Вызывает другую функцию через требуемое время.

    Все видели плагины где есть обратные отсчеты(таймеры) или секундомеры и много подобного связанное с временем в игровом мире.
    Большая часть из них не могла бы существовать если бы не было этой замечательно функции. У меня в папке с исходниками около 180 файлов и из них 80 используют данную функцию.

    Инфо из amxmodx.inc:
    /* Calls function on specified time.
    * Flags:
    * "a" - repeat.
    * "b" - loop task.
    * "c" - do task on time after a map timeleft.
    * "d" - do task on time before a map timelimit. */
    native set_task(Float:time,const function[],id = 0,const parameter[]="",len = 0,const flags[]="", repeat = 0);


    Синтаксис:
    set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 )

    • Float:time - Время в секундах, через какое вызовется функция (Внимание, указывается дробное число, минимальное 0.1 секунды)
    • const function[] - Имя функции
    • id = 0 - Уникальный идентификатор к задаче. ( если у вас одновременно запущенно их 10, что бы с каждым можно было работать отдельно и ни чего не спуталось)
    • parameter[]="" - Массив с данными, который передается функции.
    • len = 0 - Максимальная длина передаваемого массива
    • flags[]="" - Флаги функции:
      • a - Повторение задачи
      • b - Выполнение задачи бесконечно количество раз
      • c - Выполнение задачи через определенное время после старта сервера
      • d - Выполнение задачи до смены карты

    • repeat = 0 - Если установлен фалаг "a", сколько раз повторить задачу.


    Пример:

    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "Set task all flags"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new counter
    new counter_flag_b
    new arg[1]

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        register_concmd("task_no_flag","task")
        register_concmd("task_flag_a","task_a")
        register_concmd("task_flag_b","task_b")
        register_concmd("task_flag_c","task_c")
        register_concmd("task_flag_d","task_d")
        
    }
    //Без флагов
    public task(){
        arg[0] = 1
        set_task(5.0, "exec_funciton", 1,arg,1)
        
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")
    }
    //Флаг A
    public task_a(){
        arg[0] = 2
        set_task(5.0, "exec_funciton", 2, arg, 1, "a", 2)
        
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")
    }
    //Флаг B
    public task_b(){
        arg[0] = 3
        set_task(5.0, "exec_funciton", 3, arg, 1, "b")
        
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")
    }
    //Флаг C
    public task_c(){
        arg[0] = 4
        set_task(60.0, "exec_funciton", 4, arg, 1, "c")
        
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")
    }
    //Флаг D
    public task_d(){
        arg[0] = 5
        set_task(60.0, "exec_funciton", 5, arg, 1, "d")
        
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")
    }
    //Вызываемая функция
    public exec_funciton(arg[],id){//id - это айди задачи, а не игрока
        
        if(arg[0] == 1)
            server_print("[Set task] No flag is ok")
            
        if(arg[0] == 2)
            server_print("[Set task] Flag A is ok")
        
        if(arg[0] == 3){
            counter_flag_b++
            server_print("[Set task] Flag B is ok")
            if(counter_flag_b >= 3)
                remove_task(3)
                
        }
            
        if(arg[0] == 4)
            server_print("[Set task] Flag C is ok")
            
        if(arg[0] == 5)
            server_print("[Set task] Flag D is ok")
            
        remove_task(0)
    }
    //Функция секундомера
    public timer(){
        counter++
        server_print("[Set task] Time left %d sec",counter)
    }


    Описание:
    Функция Set_task, только на первый взгляд сложна в использовании, на самом деле все просто и сейчас вы в этом сами убедитесь.
    Так как функция работает с другими функциями, а не id игрока, то будем все эксперименты проводить в консоли сервера.

    Всего есть 5 вариантов использования set_task, для каждого из них будет своя консольная команда:
    • task_no_flag - Без использования флагов
    • task_flag_a - С флагом A
    • task_flag_b - С флагом B
    • task_flag_c - С флагом C
    • task_flag_d - С флагом D

    Для каждой команды есть своя функция, в каждой из них, по мимо основного задания присутствует еще и вот этот код:
        counter = 1
        set_task(1.0,"timer",0,_,_,"b")


    Это задание для вызова timer функции, что бы нам было нагляднее наблюдать за процессом работы.

    Теперь подробнее о каждом варианте:
    1. Вариант (No Flag): Мы не устанавливали ни каких флагов и в результате наша функция exec_funciton выполнится через 5 секунд.
      так же мы передали параметр arg[0] = 1, этот параметр мы передаем в каждой из функций, что бы в исполняемой функции знать, какое задание выполнялось и какой результат выводить.

      В результате мы получаем вот такую картину в консоли:
      [Set task] Time left 2 sec
      [Set task] Time left 3 sec
      [Set task] Time left 4 sec
      [Set task] Time left 5 sec
      [Set task] No flag is ok


      Заметили что время указывается со второй секунды? на самом деле все так и должно быть.
      Так как функция секундомера( таймера) запускается через 1, т.е. после нашей команды, 1 секунда уже прошла.
      А в нашем задании мы ставили что бы функция выполнилась через 5 секунд, это четко видно: Сначала 5 сек, затем сразу результат.

    2. Вариант (Flag A): Все тоже самое, но мы поставили флаг A и значение repeat 2, что значит что задание должно выполниться 2 раза, каждое через 5 секунд ( одно за одним)Результат:

      [Set task] Time left 2 sec
      [Set task] Time left 3 sec
      [Set task] Time left 4 sec
      [Set task] Time left 5 sec
      [Set task] Flag A is ok
      [Set task] Flag A is ok


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

    3. Вариант (Flag B): Все повторяется из предыдущих пунктов, результат:
      [Set task] Time left 2 sec
      [Set task] Time left 3 sec
      [Set task] Time left 4 sec
      [Set task] Time left 5 sec
      [Set task] Flag B is ok
      [Set task] Flag B is ok
      [Set task] Flag B is ok

      Но мы поставили же флаг B должно же все работать бесконечно, но что бы этого не происходило, с помощью функции remove_task(id)
      МЫ отключили наше задание номер 3 ( смотри синтаксис) вот для этого и нужен этот параметр, что бы остановить бесконечность.

    4. Вариант (Flag C) и (Flag D):Результат думаю выкладывать не имеет особого смысла, думаю что вы уже догадались что будет все тоже самое,только от отсчет времени начинается не от нашей команды, а от смены карты или до ее смены
    Надеюсь вы быстро освоите эту функцию и сможете сами писать себе таймеры,секундомеры или просто назначать необходимые вам задания.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    set_task Вызывает другую функцию через требуемое время.
    bestnamebest

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

    Можете пояснить, когда и при каких условиях в скобках publiс nazvanie_fynkcuu() что-либо ставится ?

    public timer(){
        counter++
        server_print("[Set task] Time left %d sec",counter)
    }


    Почему в скобках public timer() мы не пишем id ? И можно ли сделать вот так:

    public timer(){
        counter++
        client_print(id,print_center,"Через %d сек. выполнится функция ",counter)
    }


    И еще один вопрос. Почему мы в функции

    public timer(){
        counter++
        server_print("[Set task] Time left %d sec",counter)
    }


    Пишем counter++ Два плюса, что означают ?
    Admin

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

    Прочитай эту статью на счет айди и когда что получается передается в функциях
    urok-4-kakie-byvayut-funkcii-tipy-funkciy.html

    Если ты там напишешь id то работать не будет, так как в функция работает не с айди игрока.

    Плюс плюс ++ это все равно что
    1+1=2
    в следующий раз
    2+1=3

    то есть ++ это все равно что прибавить 1 к любому числу.
    --------------------
    bestnamebest

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

    Я понял, спасибо )

    Скажите, что тут не правильно ? Отнимается по 2 секунды.. Я не пойму...

    #include <amxmodx>
    #include <amxmisc>
    #include <fun>

    #define PLUGIN "grena"
    #define VERSION "1.0"
    #define AUTHOR "admin"

    new timer;

    public plugin_init()
    {
        register_plugin(PLUGIN, VERSION, AUTHOR)
    }

    public client_putinserver(id)
    {
        timer = 10;
        
        set_task(1.0,"grena",id,_,_,"a",10&a
    mp;#
    41;
    }

    public grena(id)
    {
        client_print(id, print_center, "grena 4epe3 %d sec", timer)
        if(timer <= 0){
        remove_task(id)
        give_item(id, "weapon_hegrenade")
        }
        timer--
    }
    Admin

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

    Потому что id таска = id игрока.
    видимо где то дважды вызывается, вот и происходит в два раза быстрее.

    set_task(1.0,"grena",id
    Это не айди игрока!!!!! запомни это!
    Это айди таска он может быть хоть 893242934.
    --------------------
    HoLLyWooD

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

    bestnamebest,
    У тебя флаг "a" стоит с повторениями
    bestnamebest

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

    Admin,
    set_task(1.0,"grena",id
    Это не айди игрока!!!!! запомни это!
    Это айди таска он может быть хоть 893242934.


    Так а как написать ? Так что ли:

    set_task(1.0,"grena",2323,_,_,"b")

    Любое число ? Теперь вообще нет отсчета.. Почему у вас в статье написан "0" ? Извините за "тупость".. Хочу просто понять )

    HoLLyWooD,
    Уже понял..
    Admin

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

    Внимательно перечитай статью и изучи пример.
    Там все описано и повторять это в комментариях не имеет смысла.
    --------------------
    Essy

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

    А не проще было бы сделать какую-нибудь команду типа sleep или delay, а не set_task? Так привычнее)
    Admin

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

    Не проще, потому что речь идет о конкретной функции, а не способе.
    --------------------
    Essy

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

    А каким образом можно сделать посекундный таймер?

    Информация

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

Реклама