Dialog Menu
概览
Dialog Menu 通过 Paper 的对话框 API 打开 Minecraft 1.21.6 及更高版本的原生对话框界面。对话框是屏幕中央的一个窗口,包含标题、文本正文、可选的物品、按钮和输入字段。它不需要资源包,也不需要自定义物品栏。
你只需在一个动作条目 Paper Dialog 中构建整个对话框。每个按钮要么以玩家身份运行命令,要么触发其他 TypeWriter 条目。输入字段(文本、开关、选项、滑块)会在玩家确认时被读取,其值会通过 $(key) 插入到命令中。
功能
- 原生对话框 — 通过 Paper 的对话框 API 打开的原版对话框窗口。
- 三种布局 — 按钮网格、是/否确认框,或单按钮通知。
- 动作按钮 — 以玩家身份运行命令,也可选择以 OP 身份运行。
- 触发器按钮 — 无需命令,直接触发 TypeWriter 条目。
- 输入 — 文本框(含多行)、开关、多选项和数字滑块。
- 命令中的输入值 — 在命令中使用
$(key),插入玩家输入或选择的内容。 - 动态文本 — 标题、消息和标签支持 MiniMessage 和 PlaceholderAPI 占位符。
- 正文物品 — 在对话框正文中显示一个物品。
- 动作后的行为 — 关闭对话框、保持打开,或等待服务器响应。
- 占位符 — 检查玩家当前是否打开了对话框。
安装
- 运行 Paper(或 Folia 等分支)1.21.6 或更高版本:更旧的版本没有对话框 API。
- 确认已安装 TypeWriter 的 Basic 扩展(参见 TypeWriter 文档)。
- 可选:安装 PlaceholderAPI,以便在文本中使用占位符。
- 将 Dialog Menu 的 JAR 放入
plugins/Typewriter/extensions/并重启服务器。
快速上手
在传送玩家之前显示一个确认窗口:
- 在 TypeWriter 网页面板中,打开一个**序列(sequence)**页面,添加一个 Paper Dialog 条目。
- 将
displayName设为<gold>Travel to the spawn?,并将message设为对话框正文的文本。 - 将
dialogType设为CONFIRMATION。 - 在
buttons中添加一个动作按钮。将其label设为Yes,command设为spawn。 - 在
exitButton中,将label设为No。将command留空:这样该按钮只会关闭对话框。 - 将该条目链接到应当打开它的内容:NPC 交互、命令或对话选项。
- 发布,并在游戏中触发该条目。
若要收集一个值,请在 buttons 中添加一个文本输入:将 key 设为 name,buttonLabel 设为 Send,command 设为 rename $(name)。玩家点击按钮时,文本会被插入到 $(name) 的位置。
asOp 会以临时的管理员权限运行命令。仅在你完全掌控的命令上使用,并且绝不要把玩家输入的自由文本插入此类命令。
工作原理
动作运行时,对话框会根据该条目构建,并显示给触发的玩家。按钮是一次性的:点击后,其动作对该对话框只运行一次。对话框会根据 afterAction 关闭或保持打开。
所有文本字段都支持 MiniMessage 和占位符。displayName 为空时,会回退为条目名称。
菜单
对话框的布局取决于 dialogType:
| 类型 | 布局 |
|---|---|
MULTI_ACTION | 有 columns 列的按钮网格;当 showExitButton 开启时,还会有退出按钮。 |
CONFIRMATION | 原版的是/否窗口:第一个按钮表示确认,退出按钮表示拒绝。在此模式下始终会构建退出按钮。 |
NOTICE | 使用第一个按钮的单按钮窗口;如果没有按钮,则使用退出按钮。 |
可以添加到 buttons 中的按钮类型:
| 类型 | 字段 | 命令宏 |
|---|---|---|
| 动作按钮 | label、command、asOp | 无 |
| 触发器按钮 | label、triggers | 无 |
| 文本输入 | label、key(默认 input)、buttonLabel、command、asOp、width、labelVisible、initial、maxLength、maxLines、height | $(input) |
| 布尔开关 | label、key(默认 boolean)、initial、onTrue、onFalse、buttonLabel、command、asOp | $(boolean),会被替换为 onTrue 或 onFalse |
| 多选项 | label、key(默认 choice)、options、buttonLabel、command、asOp | $(choice) |
| 数值范围 | label、key(默认 value)、start、end、initial、step、buttonLabel、command、asOp | $(value),四舍五入为整数 |
输入字段显示在按钮上方。每个输入按钮还会添加它自己的确认按钮,文本为 buttonLabel;命令可以使用同一对话框中任意输入的 $(key)。退出按钮在 exitButton 中单独配置。
对于多选项,请将 options 写成以逗号分隔的列表,并在应当默认选中的选项后加上 *,例如 Easy,Normal*,Hard。
占位符
PlaceholderAPI 占位符,由 typewriter 扩展提供。
| 占位符 | 返回 |
|---|---|
%typewriter_inmenudialog% | 如果玩家打开了本扩展的对话框则为 1,否则为 0。 |
%typewriter_inmenudialog_<name>% | 如果打开的对话框是具有此条目名称的 Paper Dialog 条目,则为 1。%typewriter_inmenudialog:<name>% 同样可用。 |
该状态会在点击按钮、玩家退出以及 TypeWriter 重载时被清除。玩家用 Esc 键关闭对话框时则不会被清除。
条目
1 个条目,由扩展源码生成。
动作1
- Paper DialogDisplay a customizable dialog
故障排查
动作运行时没有显示任何内容。 对话框需要 Paper 1.21.6 或更高版本。在更旧的服务器上,对话框 API 不存在,动作会失败。同时请检查该条目的 criteria 是否通过。
按钮没有任何反应。 command 为空的命令按钮只会关闭对话框。否则命令会以玩家身份运行:如果玩家没有相应权限,它会对其静默失败,并且失败会被记录为 Dialog command '…' failed。请先在聊天中测试该命令。
$(key) 原样出现在命令中,或被替换为空。 输入的 key 与宏必须完全一致。不匹配任何输入的宏会被替换为空文本。对于开关,宏给出的是 onTrue 或 onFalse 的值,而不是 true 或 false。
第一次点击后按钮不再起作用。 每个按钮对每个已打开的对话框都是一次性的。当 afterAction 设为 NONE 或 WAIT_FOR_RESPONSE 时,窗口可以留在屏幕上,但其按钮不再有反应。请重新触发该动作以打开新的对话框。
%typewriter_inmenudialog% 一直是 1。 玩家用 Esc 关闭了对话框,这不会重置状态。它会在下一次点击按钮、玩家离开或重载时重置。
相关扩展
- Companion — 当玩家点击其同伴时打开对话框。