Guides / Commands & Data

对话屏幕:不使用模组也能构建真正的菜单

数据包对话框能为你提供带输入框和按钮的真正窗口。本文将介绍其 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 血条会过于干扰。

对话输入和路点样式构建器中构建带输入框和按钮的对话屏幕,并自定义路点样式。

对话框与路径点样式生成器 →

More guides

Browse all →

还想找别的我的世界工具?

一整套在浏览器里运行的生成器、查看器和转换器,全部免费。