Руководства / Команды и данные
Пользовательские зачарования без модов: формат зачарований на основе данных
Зачарования стали JSON-данными датапаков, поэтому для своего зачарования мод не нужен. Вот структура файла, компоненты эффектов, которые действительно что-то делают, и способы сделать зачарование доступным.
Раньше зачарования были жёстко зашиты в код. Теперь это данные датапака, а значит настоящее пользовательское зачарование — с новым названием, новым эффектом и новой кривой стоимости — это файл JSON.
Где он лежит
data/<namespace>/enchantment/lightning_strike.json
В единственном числе enchantment/, как и любая другая категория датапаков после переименования.
Минимальный файл
{
"description": { "translate": "enchantment.my_pack.lightning_strike" },
"supported_items": "#minecraft:enchantable/melee_weapon",
"weight": 2,
"max_level": 3,
"min_cost": { "base": 10, "per_level_above_first": 10 },
"max_cost": { "base": 50, "per_level_above_first": 10 },
"anvil_cost": 4,
"slots": ["mainhand"]
}
Уже этого достаточно, чтобы зачарование загружалось и отображалось на предмете. Но оно пока ничего не делает — поведение задаётся отдельно — и стол не предложит его, пока оно не добавлено в тег (см. ниже).
weight— это редкость у чародейского стола. В ванилле используется 10 для обычных, 1 для очень редких. Значение относительное, а не процент.slotsопределяет, где зачарование действует:mainhand,offhand,armor,headи так далее. Оно обязательно: пропустите его — и файл не загрузится.supported_itemsпринимает тег предмета или список. Теги#minecraft:enchantable/*уже существуют для разумных групп —melee_weapon,sharp_weapon,mining,armorи так далее. Тегаenchantable/swordне существует; несуществующий тег приводит к ошибке загрузки файла.
Заставляем его что-то делать
effects прикрепляет поведение:
"effects": {
"minecraft:post_attack": [{
"enchanted": "attacker",
"affected": "victim",
"effect": { "type": "minecraft:run_function", "function": "my_pack:strike" },
"requirements": { "condition": "minecraft:random_chance", "chance": 0.25 }
}]
}
post_attack нужно знать, чьё это зачарование (enchanted) и на кого действует эффект (affected) — оба обязательны. run_function — это лазейка: зачарование может делать всё, что умеет функция. Встроенные типы эффектов покрывают урон, отдачу, прочность, выпадение предметов и атрибуты без всякой функции, и они дешевле.
requirements принимает любой предикат, поэтому условие по типу цели, погоде или случайному шансу — это один блок JSON.
Даём ему название
description — это текстовый компонент, поэтому жёстко заданное имя работает:
"description": { "text": "Lightning Strike", "color": "gold" }
но ключ translate плюс языковой файл в ресурспаке — вот что заставляет его читаться правильно для игроков на других языках — по той же причине этот сайт берёт игровые термины из собственных переводов Mojang.
Делаем его доступным
Три пути, и обычно нужно больше одного:
- Чародейский стол — когда заданы
weightи кривая стоимости, а зачарование входит в#minecraft:in_enchanting_table. - Таблицы добычи —
enchant_randomlyс вашим зачарованием в списке илиenchant_with_levels, если оно должно конкурировать по стоимости. - Крестьянин торгует — чародейская книга с вашим зачарованием в предмете торговли.
Именно добавление в #minecraft:in_enchanting_table заставляет стол вообще предлагать его; про этот тег легко забыть, и тогда получается зачарование, которое существует, но никогда не появляется.
Соберите JSON зачарования и его аналог для узора брони, с заданными тегами и слотами, в Конструкторе пользовательских зачарований и узоров.