对话框界面:无需模组打造真正的菜单
数据包对话框为你提供了一个带输入框和按钮的正式窗口。这里介绍它的 JSON 结构、按钮如何执行命令,以及它与书菜单这种土办法的对比,对话框一共有五种类型,包括 notice、confirmation、multi_action 等。
服务器菜单过去要么用带可点击页面的成书,要么用物品展示框伪装的箱子界面。对话框把这两者都取代了,换成了一个真正的屏幕。
什么是对话框
数据包中描述一个窗口的 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 单独设置。适合做队伍标记,用 Boss 栏会太打扰。
在对话框输入与路径点样式生成器中构建带输入框和按钮的对话框界面,并自定义路径点样式。