← Все статьи

Датапаки против команд: как на самом деле их устанавливать

Почти каждый конструктор на этом сайте выдаёт команду, которую вы вставляете в чат. С loot-таблицами, рецептами и ачивками так не получится, и никакой команды для них не существует. Это файлы. Эта статья объясняет разницу, потому что именно на ней спотыкаются раньше, чем на чём-либо ещё.

Открыть генератор датапаков

Команды /loottable не существует

Если вы пользовались конструктором предметов или зелий, порядок знаком: заполнили форму, скопировали строку /give, вставили в чат, готово. Это работает, потому что предмет — вещь, которую игра может выдать прямо сейчас.

Loot-таблица — не вещь, которую держат в руках. Это правило: «когда сгенерируется вот этот сундук, кинь такие шансы». Рецепт — правило про сетку крафта. Ачивка — правило о том, когда что-то считается достигнутым. Правила должны существовать до момента, к которому применяются, поэтому игра читает их при загрузке из файлов на диске. Нет ни /loottable, ни /recipe add, ни какой-либо чат-команды, создающей их, — потому что к моменту, когда вы её наберёте, событие, которым она управляет, уже прошло.

Вся разница сводится к этому:

КомандыДатапаки
ДоставкаВставить в чат или командный блокФайлы в папке, которую загружает мир
Для чегоРазовые действия: выдать предмет, поставить bossbar, отправить сообщениеПостоянные правила: добыча, рецепты, ачивки, переиспользуемые функции
Когда срабатываетСразуПри загрузке мира или /reload
Переживает рестартТолько результатДа, само правило сохраняется

Что такое датапак на самом деле

Папка с файлом pack.mcmeta наверху и директорией data под ним. Это всё требование целиком. Minecraft принимает её и в архиве, и распакованной, а лежать она должна здесь:

.minecraft/saves/<мир>/datapacks/<ваш-пак>/
  pack.mcmeta
  data/
    harbor/
      function/
        load.mcfunction
      loot_table/
        example_chest.json
    minecraft/
      tags/function/
        load.json

Здесь появляются два пространства имён, и у них разные задачи. harbor — ваше: оно не даёт вашим файлам столкнуться с ванильными или с другим паком и становится частью каждого ID, например harbor:load. Пространство minecraft используется только для того, чтобы зацепиться за то, что ваниль уже определила, — поэтому тег загрузки лежит именно там, а не у вас.

Переименование в 1.21, которое тихо ломает паки

Этот пункт заслуживает отдельного раздела из-за того, как он падает. В 1.21 Mojang переименовали все директории с содержимым из множественного числа в единственное:

Падает это мерзко: пак со старыми именами на 1.21+ всё равно загружается. /datapack list показывает его включённым. Ошибок нет. Игра просто никогда не заглядывает в эти папки, поэтому ничего из написанного вами не выполняется. На этом теряют вечера — обычно повторяя туториал, написанный до 1.21.

Если пак включён и не делает вообще ничего, проверяйте сначала имена папок, а не JSON внутри них.

pack_format — это замок версии, а не номер версии

Число в pack.mcmeta говорит Minecraft, в каком формате данных написаны ваши файлы. Ошибётесь — пак пометят как несовместимый.

{
  "pack": {
    "pack_format": 61,
    "description": "Правила портового района"
  }
}
Версия MinecraftФормат датапака
1.20 – 1.20.115
1.20.218
1.20.3 – 1.20.426
1.20.5 – 1.20.641
1.21 – 1.21.148
1.21.2 – 1.21.357
1.21.461
1.21.571
1.21.680
1.21.7 – 1.21.881

Обратите внимание: это номера для датапаков. У ресурс-паков своя отдельная шкала, поэтому pack_format, скопированный из туториала по ресурс-пакам, здесь будет неверным.

load и tick

Два функциональных хука закрывают почти всё, что пак должен делать сам. Вы пишете файл .mcfunction — обычный текстовый файл, по одной команде на строку, без ведущего слэша — и затем направляете на него тег.

load выполняется один раз при загрузке пака и снова при каждом /reload. Там настраивают скорборды, константы и стартовое состояние. tick выполняется двадцать раз в секунду, постоянно, пока пак включён. Это мощно и это самый простой способ угробить производительность сервера, поэтому берите его только тогда, когда что-то действительно надо проверять непрерывно.

Связывает их именно файл тега:

// data/minecraft/tags/function/load.json
{
  "values": ["harbor:load"]
}

Без этого тега функция всё равно существует и её можно вызвать вручную через /function harbor:load, но сама она не запустится.

Установка и проверка

  1. Положите папку пака или ZIP в <мир>/datapacks/. На сервере эта папка лежит рядом с level.dat.
  2. Выполните в игре /reload. Перезапуск не нужен.
  3. Выполните /datapack list. Ваш пак должен быть в списке включённых.

Если его в этом списке нет — проблема структурная: неверный pack_format, кривой pack.mcmeta или лишний уровень папки из-за того, что архив собрали из родительской директории, а не из содержимого самого пака. Последнее встречается часто: pack.mcmeta должен лежать в корне архива, а не внутри ещё одной папки.

Если пак в списке есть, но ничего не происходит — структура в порядке, и проблема внутри: множественное число в именах папок на 1.21+, опечатка в пространстве имён внутри тега или JSON, который синтаксически валиден, но по форме не тот, что ждёт игра.

Куда идти дальше

Генератор датапаков собирает весь этот скелет за вас и сам переключает имена папок и pack_format при выборе версии, что убирает два самых частых способа ошибиться. Дальше справочник по структуре ресурс-пака закрывает вторую половину экосистемы — ту, которая меняет внешний вид игры, а не её поведение.