Работа с таймерами

Автор: Brullek

Данная статья основывается на статье Скриптинг в JMC.

Таймеры - крайне полезная штука для мадов. Каждые 5 минут бафать себя, каждве 60 минут организовывать поиск артефактов в мире, каждые 5 секунд перемещать чара по миру, что бы он автоматически бегал по зоне, та все что угодно :)

Немного теории из JMC, которой обладаю я:

В JMC существет метод jmc.SetTimer(id, second) - метод по запуску таймера. Уникальность таймеров определяется его id, а время через которое он должен срабатывать вторым параметром second.

Что бы навесить что-то на сработанный таймер, следует привязать событие срабатывания таймеров к какой-то функции:

// Функция регистрации событий
eJMC.RegisterHandler = function(event, handler){
	jmc.RegisterHandler(event , "eJMC." + handler + "()");
};

// Регистрируем событие "Timer" с привязкой его обработки к eJMC.OnTimer()
eJMC.RegisterHandler("Timer",		"OnTimer");

// Обработчик для всех событий типа Timer
eJMC.OnTimer = function(){
	
	// Запоминаем id таймера, который сработал. Таймеров может быть много, и нужно отличать, какой их них сработал
	id_timer = jmc.Event;
	
	// По хорошему для каждого id таймера нужно зарегестрировать свою callback функцию, но я передаю все
	// исполнение в TimerExec, реализация которого описана ниже
	eJMC.Timers.TimerExec(id_timer);
	
}

Попробую описать, как я работаю с таймерами в рамках моего eJMC. Существует файл lib/OnTimer/eJMC.Timers.js с следующим содержимым:

eJMC.Timers = {};
//#eJMC.Timers.SetTimer(97,320)

// Регистрируем таймеры, которыми сы часто пользуемся
eJMC.Timers.Id = {
		"kill_all_timer": 100,
		"music": 99,
		"reconnect": 98,
		"grimuar": 97,
		"go_random":96,
		"bash":95,
		"heal":94,
		"kill_nej":93,
		"detect":92,
		"sanca": 91
		
}

// Объявление таймера
eJMC.Timers.SetTimer = function(id, second){
	if (id==null){
		
		eJMC.Showme("Данная команда имеет два параметр: ID таймера, в виде константы, или в виде числа 1-100");
		eJMC.Showme("И количество секунд, по истечению которых будет срабатывать этот таймер");
		return 0;
	}
	
	if (id==second){
		
		eJMC.Showme("Данная команда имеет два параметр: ID таймера, в виде константы, или в виде числа 1-100");
		eJMC.Showme("И количество секунд, по истечению которых будет срабатывать этот таймер");
		return 0;
	}


	if (typeof(id)=="string"){
	  // Запуск таймера по названию
		jmc.SetTimer(eJMC.Timers.Id[id], second*10);
	} else {
		if (typeof(id)=="number")
		// Запуск таймера по id
		jmc.SetTimer(id, second*10);
	}

}

/**
 * Здесь можно было бы написать функцию для запуска произвольного таймера, и обработчика, вроде
 * eJMC.Timers.Run('id_timer', 'second','callback_function'), но мне она не понадобиалсь при геймплее
 */

// Алиас для eJMC.Timers.SetTimer
eJMC.Timers.Set = function(id, second){
	eJMC.Timers.SetTimer(id, second)
}

// Остановка таймера по id или названию
eJMC.Timers.KillTimer = function(id){
	if (typeof(id)=="string"){
		jmc.KillTimer(eJMC.Timers.Id[id]);
	} else {
		if (typeof(id)=="number")
		jmc.KillTimer(id);
	}
}

// Алиас для eJMC.Timers.KillTimer
eJMC.Timers.Kill = function(id){
	eJMC.Timers.KillTimer(id);
}

// Остановка всех таймеров. Я ограничился 100 таймерами для себя.
eJMC.Timers.KillAllTimer = function(){
	//jmc.SetTimer(id, second*10);
	for (var i = 0; i <= 100; i++) {
		eJMC.Timers.KillTimer(i);
	}
}

// У меня нет для каждого таймера при срабатывание callback функкции.
// Весь код исполняется здесь, основываясь на id таймера
eJMC.Timers.TimerExec = function(id_timer){
//	eJMC.Showme("Timer " + id_timer + " work!");
	
	if (id_timer==eJMC.Timers.Id["music"]){
		eJMC.MusicPlayer.Play(eJMC.MusicPlayer.Track.Name);
	}
	
	if (id_timer==eJMC.Timers.Id["go_random"]){
		var id = eJMC.Random(5);
		eJMC.Bots.Skill.Taiga.GoRandom(id);
	}
	
	if (id_timer==eJMC.Timers.Id["reconnect"]){
		
		eJMC.Parse("#connect balderdash.ru 9000");
	}
	
	if (id_timer==eJMC.Timers.Id["heal"]){
		
		eJMC.Parse("к зам; к \"изгнать добро\"");
	}
	
	if (id_timer==eJMC.Timers.Id["grimuar"]){
		eJMC.Parse("гримуар 2.фля; к брон; к плащ");
	}
	
	if (id_timer==eJMC.Timers.Id["kill_nej"]){
		eJMC.Parse("к обрат 1.дух");
	}
	
	if (id_timer==eJMC.Timers.Id["detect"]){
		eJMC.Parse("к \"обнаружить невидимое\"");
		eJMC.Parse("к \"обнаружить скрытое\"");
	}
	
	if (id_timer==eJMC.Timers.Id["sanca"]){
		eJMC.Parse("к \"защита храма\"");
		eJMC.Parse("конце");
	}
	
	
	if (id_timer==eJMC.Timers.Id["kill_all_timer"]){
		eJMC.Timers.KillAllTimer();
		eJMC.Parse("конец");
	}
	
	if (id_timer==eJMC.Timers.Id["bash"]){
		eJMC.Parse("толч");
	}
	
	
}

// При первоначальной загрузке или перезапуске скриптового движка, следует обнулять таймеры
eJMC.Timers.KillAllTimer();

Как я управляю таймерами из JMC: У меня есть обертка для выполнения JS кода прямо из JMS через ввод #eJMC.*.

Собсвенно для зауска таймера, который бы перемещал чара по миру каждые 5 секунд я ввожу команду: #eJMC.Timers.Set('go_random', 5)

Для того, что бы автоматически кастовались детекты (обнаружение скрытого и магии в мире), я ввожу команду: #eJMC.Timers.Set('detect', 5)

Для удаления использую: #eJMC.Timers.Kill('go_random')


blog comments powered by Disqus