对话屏幕:不使用模组也能构建真正的菜单
数据包对话框能为你提供带输入框和按钮的真正窗口。本文将介绍其 JSON 结构、按钮如何运行命令,以及它与“书本菜单”这种取巧方式的对比。
以前,服务器菜单通常是用可点击页面的书本,或是用物品展示框伪造的箱子 GUI 来实现的。现在,对话框取代了这两种方式,提供了一个真正的屏幕。
什么是对话框
对话框是数据包中的一个 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", "options": [
{ "id": "mage", "display": { "text": "Mage" } },
{ "id": "rogue", "display": { "text": "Rogue" } } ] }
]
值会作为宏参数传递给按钮调用的函数,因此接收函数是一个宏:
$say Welcome $(name), you chose $(class)
行前的 $ 前缀和用于替换的 $(key)。这就是整个绑定机制,也是对话框真正有用而非仅仅是装饰的原因。
为什么它优于书本菜单这种取巧方式
- 它是一个屏幕,因此会暂停输入,而不是停留在聊天记录中。
- 输入框真实存在。书本只能提供链接。
- 无需物品。没有东西会丢失、掉落或被复制。
- 它能干净地关闭,并且无法滚动回去。
书本唯一仍然做得更好的地方是长篇阅读——对话框主体不是放置三页背景故事的好地方。
路点样式
同样的工具也涵盖了定位器栏路点,这是一个单独的数据包注册表,用于控制被追踪玩家或位置的标记颜色和精灵图。这对于团队标记很有用,因为 Boss 血条会过于干扰。
在对话输入和路点样式构建器中构建带输入框和按钮的对话屏幕,并自定义路点样式。