Свой сервер

Датапак с функциями: команды по таймеру и при входе

Впишите команды — получите датапак для Minecraft 26.3, который выполняет их сам: раз в N секунд, когда игрок заходит на сервер, и при загрузке мира. Без плагинов и командных блоков.

По таймеру

0 — каждый тик, двадцать раз в секунду. Частые значения: 0 — каждый тик, 1 — 1 с, 5 — 5 с, 30 — 30 с, 60 — 1 мин, 300 — 5 мин, 600 — 10 мин.

Когда игрок заходит

При загрузке мира

Латиницей: это пространство имён функций — my_pack:load.

Результат · пример

Архив · my_pack-datapack.zip
Таймер
раз в 10 мин
Вход игрока
первый
Формат датапака
121

data/minecraft/tags/function/load.json

Тег load: игра зовёт функцию при загрузке мира и после /reload.

{
  "values": ["my_pack:load"]
}

data/minecraft/tags/function/tick.json

Тег tick: функция идёт каждый тик — 20 раз в секунду.

{
  "values": ["my_pack:tick"]
}

data/my_pack/function/load.mcfunction

При загрузке мира: ваши команды и запуск таймера.

schedule function my_pack:timer 600s
say Датапак загружен

data/my_pack/function/tick.mcfunction

Каждый тик: команды по тику и проверка, кто вошёл.

execute as @a[tag=!my_pack_joined] at @s run function my_pack:join

data/my_pack/function/timer.mcfunction

Раз в 10 мин: ваши команды и запись себя в очередь снова.

say Не забудьте проголосовать за сервер — /vote
schedule function my_pack:timer 600s

data/my_pack/function/join.mcfunction

Для вошедшего игрока: команды идут от его имени и с его места (@s).

title @s title "Добро пожаловать!"
give @s minecraft:bread 8
tag @s add my_pack_joined
Скачать датапак

Как применить

  1. Скачайте архив

    Распаковывать не нужно: игра читает датапак прямо из zip.

  2. Положите в папку мира

    На сервере — world/datapacks, в одиночной игре — saves/<мир>/datapacks.

  3. Перезагрузите

    Командой /reload или перезапуском. Таймер и проверка входа запустятся сами.

  4. Проверьте

    /datapack list покажет, включён ли он, а /function my_pack:load — выполнится ли функция без ошибок.

Что нужно знать

  • Таймер — это schedule, а не счётчик в тике. Функция timer в конце ставит себя в очередь снова, а первый раз её запускает load. После /reload второй круг не появится: schedule по умолчанию заменяет прежний.
  • События «игрок зашёл» в игре нет. Первый вход ловят по метке my_pack_joined, которой у новичка ещё нет, а повторный — по счёту leave_game: он растёт, когда игрок выходит. Проверка идёт каждый тик и почти ничего не стоит.
  • Каждый тик — это 20 раз в секунду. Тяжёлые команды (fill, поиск по всем сущностям) так лучше не крутить: для «каждую секунду» хватит таймера на 1 с.
  • Без косой черты и без команд плагинов. В файле функции «/» в начале строки — ошибка, и игра не загрузит функцию целиком. Команды плагинов в функциях датапака не выполняются вовсе.
  • Папки — function и tags/function. С 1.21 игра читает только их, во множественном числе — пропускает молча. Датапак объявляет формат 121 — под Minecraft 26.3.

Частые вопросы

Как сделать, чтобы команда выполнялась каждые N секунд?

Функцией датапака, которая в конце ставит себя же в очередь командой schedule function … Ns, а первый раз её запускает тег load. Без плагинов и командных блоков — и на сервере, и в одиночной игре.

Как выполнить команду при входе игрока в Minecraft?

События входа в ванили нет: в тике ищут игроков без метки (первый вход) и с выросшим счётом leave_game (вернулся после выхода), зовут для них функцию и ставят метку. Генератор собирает это сам.

Почему функция датапака не работает?

Чаще всего в строке стоит косая черта, папка названа functions вместо function или в функции команда плагина. Проверьте /datapack list и /function my_pack:load — игра покажет ошибку.