Большая часть из них не могла бы существовать если бы не было этой замечательно функции. У меня в папке с исходниками около 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 - Выполнение задачи до смены карты
- a - Повторение задачи
- 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 функции, что бы нам было нагляднее наблюдать за процессом работы.
Теперь подробнее о каждом варианте:
- Вариант (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 сек, затем сразу результат. - Вариант (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 секунд. - Вариант (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 ( смотри синтаксис) вот для этого и нужен этот параметр, что бы остановить бесконечность. - Вариант (Flag C) и (Flag D):Результат думаю выкладывать не имеет особого смысла, думаю что вы уже догадались что будет все тоже самое,только от отсчет времени начинается не от нашей команды, а от смены карты или до ее смены
Почему в скобках public timer() мы не пишем id ? И можно ли сделать вот так:
И еще один вопрос. Почему мы в функции
Пишем counter++ Два плюса, что означают ?