Back
scheduler_example.md
markdownwiki/examples/scheduler_example.md
# ⏰ Примеры планирования задач
Готовые примеры использования планировщика задач в ScriptsLab.
---
## Таймер с задержкой
Выполняет код один раз после указанной задержки.
```javascript
/**
* Scheduler.runLater - Выполнить один раз
*
* 20 тиков = 1 секунда
*/
Console.log('Запускаем отложенную задачу...');
// Выполнить через 5 секунд (100 тиков)
Scheduler.runLater(function() {
Server.broadcast('§eСообщение через 5 секунд!');
Console.log('Отложенная задача выполнена');
}, 100);
Console.log('Задача запланирована');
```
---
## Повторяющаяся задача
Выполняет код через равные промежутки времени.
```javascript
/**
* Scheduler.runTimer - Повторяющаяся задача
*/
var counter = 0;
// Выполнять каждую секунду (20 тиков)
var taskId = Scheduler.runTimer(function() {
counter++;
Server.broadcast('§eСчётчик: ' + counter);
if (counter >= 10) {
// Остановить после 10 выполнений
// Примечание: в текущей версии нужно реализовать отмену
Console.log('Задача завершена');
}
}, 0, 20); // 0 = начать сразу, 20 = каждую секунду
Console.log('Повторяющаяся задача запущена, ID: ' + taskId);
```
---
## Автоматические объявления
Показывает разные сообщения через определённые интервалы.
```javascript
/**
* Автоматические объявления
*/
var messages = [
'§6[Объявление] §eНе забудьте проголосовать за сервер!',
'§6[Объявление] §eПосетите наш Discord!',
'§6[Объявление] §eИспользуйте §a/fly §eдля полёта!',
'§6[Объявление] §eИспользуйте §a/heal §eдля лечения!'
];
var currentIndex = 0;
// Отправлять каждые 5 минут (6000 тиков)
Scheduler.runTimer(function() {
Server.broadcast(messages[currentIndex]);
currentIndex = (currentIndex + 1) % messages.length;
}, 100, 6000); // 100 = первое через 5 секунд, 6000 = каждые 5 минут
Console.log('Автоматические объявления запущены');
```
---
## Автосохранение
Автоматически сохраняет данные игроков.
```javascript
/**
* Автосохранение данных
*/
Console.log('Запускаем автосохранение...');
// Выполнять каждые 5 минут
Scheduler.runTimer(function() {
var online = Server.getOnlinePlayers();
if (online.size() > 0) {
// Сохранение данных каждого игрока
for (var i = 0; i < online.size(); i++) {
var player = online.get(i);
var key = 'player.' + player.getUniqueId() + '.lastsave';
Storage.save(key, Date.now());
}
Console.log('Сохранено данных для ' + online.size() + ' игроков');
}
}, 0, 6000); // Каждые 5 минут
Console.log('Автосохранение настроено');
```
---
## Обратный отсчёт
Запускает обратный отсчёт.
```javascript
/**
* Обратный отсчёт до события
*/
var seconds = 10;
var countdown = Scheduler.runTimer(function() {
if (seconds > 0) {
Server.broadcast('§eОсталось: ' + seconds + ' секунд');
seconds--;
} else {
Server.broadcast('§aВремя вышло!');
// Здесь код после окончания
Console.log('Обратный отсчёт завершён');
}
}, 0, 20); // Каждую секунду
Console.log('Обратный отсчёт запущен');
```
---
## Проверка онлайна
Регулярно проверяет количество игроков.
```javascript
/**
* Проверка онлайна
*/
var checkInterval = function() {
var players = Server.getOnlinePlayers();
Console.log('Онлайн: ' + players.size() + ' игроков');
// Проверка минимального онлайна
if (players.size() === 0) {
Console.log('На сервере нет игроков!');
}
};
// Проверять каждые 2 минуты
Scheduler.runTimer(function() {
checkInterval();
}, 0, 2400);
Console.log('Проверка онлайна настроена');
```
---
## Напоминание о правилах
Напоминает правила через определённые промежутки.
```javascript
/**
* Напоминание о правилах
*/
var reminders = [
'§eПомните о правилах сервера: §aNo Griefing!',
'§eНе спамьте в чате!',
'§eУважайте других игроков!',
'§eСмотрите §a/help §eдля списка команд'
];
var index = 0;
// Каждые 10 минут
Scheduler.runTimer(function() {
Server.broadcast(reminders[index]);
index = (index + 1) % reminders.length;
}, 0, 12000);
Console.log('Напоминания настроены');
```
---
## Арена PvP - таймер раунда
Управляет раундами на арене.
```javascript
/**
* Таймер раунда на арене PvP
*/
var roundTime = 300; // 5 минут в секундах (тиках)
var isRoundActive = false;
var roundTimer = Scheduler.runTimer(function() {
if (!isRoundActive) {
return;
}
roundTime--;
// Показывать оставшееся время
if (roundTime === 60) {
Server.broadcast('§eДо конца раунда: §c1 минута!');
} else if (roundTime === 30) {
Server.broadcast('§eДо конца раунда: §c30 секунд!');
} else if (roundTime <= 10 && roundTime > 0) {
Server.broadcast('§c' + roundTime + '...');
} else if (roundTime === 0) {
Server.broadcast('§cРаунд завершён!');
isRoundActive = false;
// Завершение раунда
}
}, 0, 1); // Каждую секунду
// Функция старта раунда
var startRound = function() {
roundTime = 300;
isRoundActive = true;
Server.broadcast('§aРаунд начался! Удачи!');
};
Console.log('Таймер арены настроен');
```
---
## Интервал между тиками
| Интервал (тиков) | Время | Использование |
|------------------|-------|---------------|
| 20 | 1 секунда | Быстрые проверки |
| 100 | 5 секунд | Сообщения |
| 600 | 30 секунд | Средние задачи |
| 1200 | 1 минута | Автосохранение |
| 6000 | 5 минут | Объявления |
| 12000 | 10 минут | Напомина��ия |
---
## Отмена задачи
> **Примечание**: В текущей версии отмена задач требует дополнительной реализации. Сохраняйте ID задачи для будущей отмены.
```javascript
// Сохраняем ID задачи
var taskId = Scheduler.runTimer(function() {
// Код
}, 0, 20);
// Для отмены (требует реализации в будущем)
// Scheduler.cancel(taskId);
```
---
## Лучшие практики
1. **Не выполняйте тяжёлые операции в таймерах** - используйте `runLater` для отложенных задач
2. **Проверяйте онлайн перед отправкой** - избегайте ошибок при отсутствии игроков
3. **Используйте осмысленные интервалы** - не нагружайте сервер слишком частыми задачами
4. **Логируйте важные события** - записывайте выполнение задач в консоль
---
## Следующие шаги
| Шаг | Описание |
|-----|----------|
| [Команды](commands.md) | Примеры команд |
| [События](events.md) | Обработка событий |
| [Предметы](items.md) | Кастомные предметы |