MAATRIX GAMES / Блог / Кастомные крафты и балансировка через datapack

Кастомные крафты и балансировка через datapack

MAATRIX GAMES

Экономика на выживание-сервере рушится тихо: сначала алмазы валяются кучами, потом нетерит перестаёт быть достижением, а через месяц никто не торгует, потому что всё и так есть у всех. Плагин экономики тут не поможет — проблема не в деньгах, а в рецептах крафта, которые балансировались для одиночной игры, а не для сотни игроков, фармящих сутками напролёт. Решение не требует ни модов, ни перекомпиляции сервера — обычный 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 (точное число сверяйте с версией своего сервера — оно меняется почти в каждом крупном апдейте):

Версия Minecraftpack_format (ориентир)
1.19–1.19.39–10
1.20–1.20.115
1.20.2–1.20.418
1.21–1.21.148
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 перед модом или плагином — цикл правки-проверки занимает секунды, а не минуты рестарта. Порядок действий:

  1. Кладём папку balance_tweaks в world/datapacks/ (путь на панели MAATRIX GAMES — файловый менеджер → папка мира → datapacks).
  2. Заходим на сервер с правами оператора (op в консоли, если ещё не выданы) и выполняем команду:
/reload
  1. Сервер перечитает все datapack'и, включая ваш, без разрыва соединений игроков. В чате должно появиться сообщение о завершении перезагрузки.
  2. Проверяем результат: открываем верстак, кладём ингредиенты по старому (ванильному) рецепту — если он больше не работает, а работает только новый расклад, переопределение прошло успешно.
  3. Если после /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 там, и только потом переносить папку на боевой.