Датапаки для продвинутых ивентов

Когда командных блоков недостаточно — используйте датапаки: функции, скорборд-таймеры, теги и предикаты сделают ивент аккуратным и быстрым.

1. Зачем нужны датапаки

2. Структура папок

Датапак — папка в world/datapacks/. Минимально нужен файл pack.mcmeta.

my_event/
└── pack.mcmeta
└── data/
    └── myevent/
        └── functions/
            ├── start.mcfunction
            ├── tick.mcfunction
            └── reward.mcfunction

Содержимое pack.mcmeta (версия pack_format зависит от версии Minecraft):

{
  "pack": {
    "description": "Событие: события",
    "pack_format": 48
  }
}
pack_format меняется от версии к версии. Совет: скачайте актуальный шаблон или проверьте на minecraft.wiki.

3. Функции и вызов

Функция — это текстовый файл .mcfunction, в котором каждая строка — отдельная команда. Запускается командой:

/function myevent:start

Пример functions/start.mcfunction:

say Ивент "Скоро старт!"
tp @a[m=adventure] 0 65 0
scoreboard objectives add eventTime dummy
scoreboard players set @a eventTime 0

Полезно: в функциях можно использовать # для комментариев (создания контента).

4. Таймеры через scoreboard

Классический приём — тиковый счётчик. Вызывайте скорборд-тик каждый игровой тик через tick.mcfunction, привязанный через minecraft:tick tag.

Сначала создайте #load или привязку тика: в папке data/minecraft/tags/function/tick.json

// tick.json
{ "values": ["myevent:tick"] }

Теперь сам functions/tick.mcfunction:

# Увеличиваем счётчик для участников
execute as @a[tag=event] run scoreboard players add @s eventTime 1

# Каждые 200 тиков (10 секунд) выводим время
execute as @a[tag=event] if score @s eventTime matches 200.. run say Прошло 10 секунд!

# Через 1200 тиков (60 сек) завершаем
execute as @a[tag=event] if score @s eventTime matches 1200 run function myevent:reward

В reward.mcfunction:

give @a[tag=event] diamond 1
tag @a[tag=event] remove event
say Ивент завершён, спасибо всем!
20 тиков = 1 секунда. 1200 тиков = 60 секунд.

5. Теги и предикаты

Тег — метка, которую можно вешать через /tag. Гораздо удобнее, чем скорборд, для быстрого фильтрования.

/tag @p add event_participant
/tag @p remove event_participant

Фильтрация в командах:

/tp @a[tag=event_participant] 0 65 0
/effect give @a[tag=event_participant] speed 1 1 true

Используйте теги, чтобы ставить игроков «в очередь» автоматически: например, при входе в старт-зону вешается тег in_start, при выходе — снимается.

6. Установка и отладка

  1. Положите папку с датапаком в мир/datapacks/ (над уровнем data/level.dat).
  2. В игре запустите /reload.
  3. Откройте панель: /datapack list — датапак должен быть в списке.
  4. Проверяйте ошибочные строки через /function и лог по сообщениям в чате/консоли.
После изменения файлов всегда вызывайте /reload, иначе изменения не подхватятся. Ошибки в .mcfunction не «положат» игру, но команда просто не выполнится — смотрите вывод.

Быстрая проверка

/datapack list
/function myevent:start
/tag @s add event_participant