Кастомные крафты и балансировка через datapack
Экономика на выживание-сервере рушится тихо: сначала алмазы валяются кучами, потом нетерит перестаёт быть достижением, а через месяц никто не торгует, потому что всё и так есть у всех. Плагин экономики тут не поможет — проблема не в деньгах, а в рецептах крафта, которые балансировались для одиночной игры, а не для сотни игроков, фармящих сутками напролёт. Решение не требует ни модов, ни перекомпиляции сервера — обычный datapack, который меняет JSON-файл рецепта, полностью совместим с ванильным клиентом и накатывается командой /reload без рестарта. В этой статье — конкретный пример: как создать свой datapack и переопределить существующий рецепт крафта, изменив количество нужных ресурсов.
Содержание
Что такое datapack и почему это не мод
Datapack — это способ переопределить игровые данные (рецепты, лут-таблицы, продвижения, функции, тэги) без единой строчки Java-кода и без установки на клиент. Работает на чистом ванильном сервере (не нужен ни Forge, ни Fabric, ни Paper-плагин), потому что система datapack встроена в саму игру начиная с Minecraft 1.13. Игроку для захода на сервер с datapack не нужно ставить вообще ничего — с его стороны всё выглядит как обычный ванильный Minecraft, просто с изменёнными рецептами.
Если раньше вы уже ставили готовые datapack'и (например, из Vanilla Tweaks или CurseForge) — механика та же самая, только сейчас мы соберём его сами. Ключевая разница между модами и datapack: мод меняет код игры и требует такой же мод-клиент у игрока, а datapack просто подсовывает игре другой набор JSON-данных вместо встроенных — игра даже не знает, что рецепт "не родной".
Из плюсов для владельца сервера на выживание:
- Правки применяются мгновенно через
/reload, без перезапуска и простоя. - Легко откатить — просто убрать папку datapack'а и снова
/reload. - Полностью серверная штука — не ломает совместимость с клиентами игроков.
- Можно версионировать в git и хранить рядом с остальным конфигом сервера.
Структура datapack'а: минимальный набор файлов
Datapack — это просто папка с файлами по строгой структуре, которая лежит в world/datapacks/ (или в папке конкретного мира на вашем сервере — на панели MAATRIX GAMES путь обычно /minecraft/world/datapacks/). Создаём папку с говорящим именем, например balance_tweaks, и внутри неё:
world/datapacks/balance_tweaks/
├── pack.mcmeta
└── data/
└── balance_tweaks/
└── recipes/
└── netherite_ingot_from_scrap.json
Два обязательных файла на старте: pack.mcmeta в корне пакета и файл рецепта внутри data/{namespace}/recipes/. {namespace} — это ваше собственное пространство имён (id datapack'а), любое латиницей без пробелов: balance_tweaks, myserver, admin_fixes — что угодно, лишь бы не пересекалось с minecraft (это зарезервировано под ванильные данные).
pack.mcmeta
Этот файл говорит игре, под какую версию Minecraft собран datapack — через pack_format. Число зависит от версии игры, и если промахнуться, сервер в логе выдаст предупреждение о несовместимости (пак всё равно попробует загрузиться, но лучше не рисковать).
{
"pack": {
"pack_format": 26,
"description": "Balance tweaks for survival economy"
}
}
Ориентир по pack_format (точное число сверяйте с версией своего сервера — оно меняется почти в каждом крупном апдейте):
| Версия Minecraft | pack_format (ориентир) |
|---|---|
| 1.19–1.19.3 | 9–10 |
| 1.20–1.20.1 | 15 |
| 1.20.2–1.20.4 | 18 |
| 1.21–1.21.1 | 48 |
| 1.21.2+ | уточняйте в changelog версии |
Если число не уверены — проверьте актуальное значение в Minecraft Wiki для своей конкретной версии перед сборкой, не берите наугад из этой таблицы для новых релизов.
Поднять сервер Minecraft за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверФормат JSON рецепта крафта
Возьмём практическую задачу: на сервере алмазная броня и инструменты производятся слишком легко, потому что алмазы фармятся вагонами через автоматические шахты. Хотим сделать нетеритовый слиток (следующая ступень апгрейда) дороже — увеличить количество нужного лома незера (netherite scrap) с ванильных 4 до 6 штук, чтобы редкий ресурс из Нижнего мира реально ценился.
Ванильный рецепт нетеритового слитка — это crafting shaped-рецепт (точнее, в оригинале используется minecraft:crafting_transmute/smithing-система, но для примера возьмём классический shapeless-рецепт объединения лома с золотыми слитками, который проще всего переопределить). Файл netherite_ingot_from_scrap.json:
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{ "item": "minecraft:netherite_scrap" },
{ "item": "minecraft:netherite_scrap" },
{ "item": "minecraft:netherite_scrap" },
{ "item": "minecraft:netherite_scrap" },
{ "item": "minecraft:gold_ingot" },
{ "item": "minecraft:gold_ingot" },
{ "item": "minecraft:gold_ingot" },
{ "item": "minecraft:gold_ingot" },
{ "item": "minecraft:netherite_scrap" },
{ "item": "minecraft:netherite_scrap" }
],
"result": {
"id": "minecraft:netherite_ingot",
"count": 1
}
}
Здесь ingredients — список предметов для shapeless-рецепта (порядок в инвентаре крафта не важен, важно только количество каждого предмета). Мы просто добавили ещё два netherite_scrap относительно ванильного рецепта (было 4, стало 6), оставив золото без изменений. Для рецептов с фиксированной сеткой 3x3 (например, привычный крафт брони или инструментов) используется другой тип — minecraft:crafting_shaped, где раскладка задаётся паттерном:
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"pattern": [
"XXX",
" # ",
" # "
],
"key": {
"X": { "item": "minecraft:diamond" },
"#": { "item": "minecraft:stick" }
},
"result": {
"id": "minecraft:diamond_pickaxe",
"count": 1
}
}
Хотим сделать алмазную кирку дороже — меняем pattern так, чтобы задействовать больше алмазов, либо добавляем дополнительный ингредиент через ключ key. Например, если хотим требовать ещё и железный слиток как "рукоять", добавляем букву в паттерн и новый ключ в key. Экспериментируйте с раскладкой — паттерн обязан быть прямоугольным (строки одинаковой длины, пробел — пустая ячейка).
Как переопределить ванильный рецепт (а не добавить новый)
Самый частый вопрос новичков: если положить свой JSON в data/balance_tweaks/recipes/, разве он не будет просто *ещё одним* рецептом рядом с ванильным? Нет — если назвать файл точно так же, как называется файл ванильного рецепта, и положить его в тот же namespace minecraft, ваш файл полностью перекроет оригинал.
Это ключевой момент, который многие упускают: чтобы переопределить, а не добавить, путь должен быть:
data/minecraft/recipes/netherite_ingot.json
а не data/balance_tweaks/recipes/... — namespace обязан совпадать с ванильным (minecraft), иначе игра будет считать, что у вас появился второй, отдельный рецепт того же результата, и оба будут работать одновременно (что, возможно, не то, что вы хотели, если цель — именно повысить цену существующего крафта).
Точное имя файла ванильного рецепта нужно посмотреть в исходниках игры — они лежат внутри .jar-файла сервера, в data/minecraft/recipes/. Распакуйте server.jar архиватором (это обычный zip) и найдите нужный файл по имени предмета — для нетеритового слитка это netherite_ingot.json, для алмазной кирки — diamond_pickaxe.json, по шаблону "имя_предмета.json".
Итоговая структура для переопределения (не добавления) рецепта:
world/datapacks/balance_tweaks/
├── pack.mcmeta
└── data/
└── minecraft/
└── recipes/
└── netherite_ingot.json
Обратите внимание: сам pack.mcmeta всё ещё описывает ваш пакет как есть, но данные внутри лежат под namespace minecraft — это нормально и штатно поддерживается игрой именно для таких переопределений.
Тестирование через /reload без рестарта сервера
Главное преимущество datapack перед модом или плагином — цикл правки-проверки занимает секунды, а не минуты рестарта. Порядок действий:
- Кладём папку
balance_tweaksвworld/datapacks/(путь на панели MAATRIX GAMES — файловый менеджер → папка мира →datapacks). - Заходим на сервер с правами оператора (
opв консоли, если ещё не выданы) и выполняем команду:
/reload
- Сервер перечитает все datapack'и, включая ваш, без разрыва соединений игроков. В чате должно появиться сообщение о завершении перезагрузки.
- Проверяем результат: открываем верстак, кладём ингредиенты по старому (ванильному) рецепту — если он больше не работает, а работает только новый расклад, переопределение прошло успешно.
- Если после
/reloadрецепт не изменился — почти всегда проблема в одном из трёх мест: опечатка в JSON (сервер молча игнорирует битый файл, проверьте логlogs/latest.logна ошибки парсинга), неверныйpack_format, или файл лежит не в том namespace.
Полезная команда для диагностики — /datapack list, она покажет все загруженные пакеты и их статус (enabled/available). Если вашего пакета нет в списке enabled — значит игра его не подхватила, скорее всего из-за структуры папок.
/datapack list
/datapack enable "file/balance_tweaks"
Второй вариант нужен, если пакет попал в available, но не активировался автоматически (бывает при добавлении в уже существующий мир).
Зачем это нужно: балансировка экономики на выживание-сервере
Готовые модпаки и плагины экономики решают "деньги", но не решают "ценность ресурса". Если алмазы всё ещё добываются в промышленных масштабах автофермами и через мироторговцев, никакая внутриигровая валюта не спасёт от инфляции лута — просто у всех будет одинаково много одинаково бесполезных ресурсов.
Через datapack можно точечно управлять "узкими местами" экономики сервера:
- Сделать редкий ресурс редким по факту. Если лом незера или дынный ломтик (или любой другой ресурс, который на вашем сервере оказался в избытке из-за особенностей генерации мира или фарм-схем игроков) слишком доступен — повышаем его расход в рецептах, куда он ведёт.
- Создать "экономические цепочки". Переопределить не один, а несколько связанных рецептов так, чтобы прогрессия от дерева до нетерита ощущалась как настоящий путь, а не как "нафармил час — получил всё".
- Балансировать под конкретный конфиг сервера. У вас может быть кастомный мир с изменённой генерацией руды (например, через datapack worldgen или плагин), и стандартные ванильные пропорции рецептов просто не подходят под новую плотность ресурсов.
- Экспериментировать без риска. Раскатили новый баланс — не понравилось игрокам — откатили папку и
/reload. Никаких миграций базы данных, никаких потерянных сборок серверного джарника.
Если вы только настраиваете сервер — прежде почитайте нашу статью про выбор между Forge, Fabric и Paper: для чисто datapack-балансировки подойдёт даже ванильный сервер или Paper, а для более глубоких правок можно совместить это с плагинами экономики поверх Paper. А если хотите готовых наработок вместо ручной сборки с нуля — посмотрите на подборку модпаков для Minecraft-сервера, там встречаются сборки с уже перебалансированной прогрессией.
Поднять сервер Minecraft за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверЧастые вопросы
Можно ли использовать datapack на ванильном сервере без Paper или Forge?
Да, datapack — это встроенная в игру система, начиная с версии 1.13 она работает на чистом ванильном сервере без каких-либо дополнительных платформ.
Заметят ли игроки, что рецепт изменён, без переустановки клиента?
Нет, никаких файлов на клиенте ставить не нужно — datapack целиком серверная штука, клиент просто получает от сервера новые правила крафта.
Что будет, если в JSON опечатка?
Сервер игнорирует некорректный файл рецепта и пишет предупреждение в лог (logs/latest.log), остальные файлы пакета продолжают работать — проверяйте лог после каждого /reload.
Можно ли удалить рецепт вообще, а не изменить количество?
Да — замените файл на рецепт с заведомо недостижимыми ингредиентами, либо используйте функцию recipes remove через datapack-функции (.mcfunction), это отдельная, более продвинутая тема.
Нужно ли перезаливать datapack при каждом обновлении Minecraft?
pack_format привязан к версии игры, при апдейте стоит свериться, не изменился ли формат — иначе появится предупреждение о несовместимости, хотя пак чаще всего продолжает работать.
Как обкатать datapack перед выкаткой на живой сервер?
Проще всего поднять тестовый сервер с копией мира, прогнать /reload и /datapack list там, и только потом переносить папку на боевой.