Команды /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 переименовали все директории с содержимым из множественного числа в единственное:
functions→functionadvancements→advancementloot_tables→loot_tablerecipes→recipepredicates→predicateitem_modifiers→item_modifierstructures→structuretags/functions→tags/function
Падает это мерзко: пак со старыми именами на 1.21+ всё равно загружается. /datapack list показывает его включённым. Ошибок нет. Игра просто никогда не заглядывает в эти папки, поэтому ничего из написанного вами не выполняется. На этом теряют вечера — обычно повторяя туториал, написанный до 1.21.
Если пак включён и не делает вообще ничего, проверяйте сначала имена папок, а не JSON внутри них.
pack_format — это замок версии, а не номер версии
Число в pack.mcmeta говорит Minecraft, в каком формате данных написаны ваши файлы. Ошибётесь — пак пометят как несовместимый.
{
"pack": {
"pack_format": 61,
"description": "Правила портового района"
}
}
| Версия Minecraft | Формат датапака |
|---|---|
| 1.20 – 1.20.1 | 15 |
| 1.20.2 | 18 |
| 1.20.3 – 1.20.4 | 26 |
| 1.20.5 – 1.20.6 | 41 |
| 1.21 – 1.21.1 | 48 |
| 1.21.2 – 1.21.3 | 57 |
| 1.21.4 | 61 |
| 1.21.5 | 71 |
| 1.21.6 | 80 |
| 1.21.7 – 1.21.8 | 81 |
Обратите внимание: это номера для датапаков. У ресурс-паков своя отдельная шкала, поэтому pack_format, скопированный из туториала по ресурс-пакам, здесь будет неверным.
load и tick
Два функциональных хука закрывают почти всё, что пак должен делать сам. Вы пишете файл .mcfunction — обычный текстовый файл, по одной команде на строку, без ведущего слэша — и затем направляете на него тег.
load выполняется один раз при загрузке пака и снова при каждом /reload. Там настраивают скорборды, константы и стартовое состояние. tick выполняется двадцать раз в секунду, постоянно, пока пак включён. Это мощно и это самый простой способ угробить производительность сервера, поэтому берите его только тогда, когда что-то действительно надо проверять непрерывно.
Связывает их именно файл тега:
// data/minecraft/tags/function/load.json
{
"values": ["harbor:load"]
}
Без этого тега функция всё равно существует и её можно вызвать вручную через /function harbor:load, но сама она не запустится.
Установка и проверка
- Положите папку пака или ZIP в
<мир>/datapacks/. На сервере эта папка лежит рядом сlevel.dat. - Выполните в игре
/reload. Перезапуск не нужен. - Выполните
/datapack list. Ваш пак должен быть в списке включённых.
Если его в этом списке нет — проблема структурная: неверный pack_format, кривой pack.mcmeta или лишний уровень папки из-за того, что архив собрали из родительской директории, а не из содержимого самого пака. Последнее встречается часто: pack.mcmeta должен лежать в корне архива, а не внутри ещё одной папки.
Если пак в списке есть, но ничего не происходит — структура в порядке, и проблема внутри: множественное число в именах папок на 1.21+, опечатка в пространстве имён внутри тега или JSON, который синтаксически валиден, но по форме не тот, что ждёт игра.
Куда идти дальше
Генератор датапаков собирает весь этот скелет за вас и сам переключает имена папок и pack_format при выборе версии, что убирает два самых частых способа ошибиться. Дальше справочник по структуре ресурс-пака закрывает вторую половину экосистемы — ту, которая меняет внешний вид игры, а не её поведение.