Руководства / Команды и данные
Экраны диалогов: настоящие меню без мода
Диалоги датапаков дают полноценное окно с полями ввода и кнопками. Вот структура JSON, то, как кнопка выполняет команду, и сравнение с трюком с книгой-меню.
Серверные меню раньше делали из книг с кликабельными страницами или из сундука, замаскированного под интерфейс через рамки. Диалоги заменили и то, и другое настоящим экраном.
Что такое диалог
Это JSON-файл в датапаке, описывающий окно:
data/<namespace>/dialog/welcome.json
{
"type": "minecraft:notice",
"title": { "text": "Welcome" },
"body": [{ "type": "minecraft:plain_message",
"contents": { "text": "Pick a class to begin." } }],
"action": { "label": { "text": "Continue" } }
}
Затем /dialog show @p my_pack:welcome.
Типы
| Тип | Форма |
|---|---|
notice | текст и одна кнопка закрытия |
confirmation | да / нет, у каждой свой действие |
multi_action | сетка кнопок |
server_links | встроенный список ссылок |
dialog_list | меню, открывающее другие диалоги |
multi_action — рабочая лошадка: это и выбор класса, и магазин, и список телепортов.
Кнопки выполняют команды
{ "label": { "text": "Warp to spawn" },
"action": { "type": "minecraft:run_command", "command": "/spawn" } }
Как и clickEvent в чате, это выполняется от имени игрока, нажавшего кнопку, с его уровнем прав. Кнопка, вызывающая команду только для операторов, ничего не сделает для обычного игрока. Стандартный обходной путь — объектив trigger: кнопка выполняет /trigger warp set 1, а тикающая функция делает привилегированную часть.
Поля ввода
"inputs": [
{ "type": "minecraft:text", "key": "name", "label": { "text": "Your name" }, "max_length": 16 },
{ "type": "minecraft:boolean", "key": "pvp", "label": { "text": "Enable PvP" } },
{ "type": "minecraft:single_option", "key": "class", "label": { "text": "Class" }, "options": [
{ "id": "mage", "display": { "text": "Mage" } },
{ "id": "rogue", "display": { "text": "Rogue" } } ] }
]
Значения попадают в команду через кнопку, действие которой — minecraft:dynamic/run_command: её template принимает $(key) для каждого поля ввода. Обычная кнопка run_command не получает ничего.
"action": {
"type": "minecraft:dynamic/run_command",
"template": "function my_pack:join {name:'$(name)',class:'$(class)'}"
}
Вызываемая функция тогда является макросом:
$say Welcome $(name), you chose $(class)
Префикс $ в строке и $(key) для подстановки, с обоих концов. Это весь механизм привязки, и именно он делает диалоги по-настоящему полезными, а не декоративными.
Почему это лучше трюка с книгой
- Это экран, поэтому он приостанавливает ввод, а не висит в истории чата.
- Поля ввода действительно существуют. Книга могла предложить только ссылки.
- Предмет не нужен. Нечего терять, выбрасывать или дублировать.
- Он закрывается чисто, и к нему нельзя прокрутить назад.
Единственное, что книги всё ещё делают лучше, — это длинное чтение: тело диалога — не лучшее место для трёх страниц лора.
Стили путевых точек
Тот же инструмент охватывает путевые точки на полосе локатора, стили которых — ресурсы ресурспака (assets/<namespace>/waypoint_style/), управляющие спрайтами и дистанциями затухания отслеживаемого игрока или позиции; цвет задаётся отдельно через /waypoint modify <target> color. Полезно для меток команды, где боссбар был бы слишком навязчивым.
Создавайте экраны диалогов с полями ввода и кнопками и настраивайте стили путевых точек в Dialog Input & Waypoint Style Builder.