Text Display Dialogue
概览
Text Display Dialogue 用 Minecraft 的 text_display 实体取代 TypeWriter 对话的聊天框。说话者的名称和文本行会悬浮在 NPC 旁边(或你选择的位置),逐字打出,并带有简短的缩放动画淡入淡出。所有内容都通过数据包发送给参与对话的玩家:世界中不会生成任何东西,其他玩家也看不到。
该扩展添加了三个对话条目和一个过场动画条目。它们的行为与常规的 TypeWriter 对话条目相同(说话者、criteria、modifiers、triggers、打字 duration、sound),因此你可以在不改动页面其余部分的情况下,将它们替换进现有对话中。
功能
- 悬浮的说话对话 — 说话者名称和文本以打字效果和弹出动画显示在说话者上方。
- 世界中的选项菜单 — 每个选项是一行悬浮文字;玩家滚动快捷栏来切换高亮的选项,并右键确认。
- 相对玩家的菜单 — 一种以可配置偏移跟随玩家的变体,适用于在世界中没有位置的说话者。
- 过场动画字幕 — 在过场动画时间轴上显示带延迟和打字动画的文本片段。
- 完整的样式 —
scale、textOpacity、viewRange、billboard,以及说话者、文本和选项各自独立的背景颜色。 - 选项计时器 — 一段延迟后自动取消选择并触发
cancelTriggers,并提供实时倒计时占位符。 - 按选项设置逻辑 — 每个选项都有自己的
criteria、modifiers和triggers,以及可选的位置。 - 物品栏锁定 — 在显示对话期间,玩家无法打开物品栏、丢弃物品或交换手持物。
安装
- 如果你想在对话文本中使用
%placeholders%,请安装 PlaceholderAPI(可选)。 - 从商店获取该扩展(见上方按钮),并将 JAR 放入
plugins/Typewriter/extensions/。 - 重启服务器。
该扩展不需要任何其他插件:文本展示实体通过 TypeWriter 自带的数据包库发送。 仅支持 Paper,不支持 Folia。
快速上手
将一句简单的问候变成带选项的悬浮对话:
- 在 TypeWriter 网页面板中,打开一个已有 NPC(说话者)和交互触发器的**序列(sequence)**页面,或者新建一个。
- 添加一个 Spoken dialogue with Text Display 条目。将
speaker设为你的 NPC,并编写text,例如Welcome, traveller!。将duration设为2s以获得打字效果(为零则一次性显示文本)。 - 添加一个 Option dialogue with Text Display 条目,设置相同的
speaker,在text中写下问题,然后添加两到三个options。为每个选项设置各自的triggers。 - 将说话条目的
triggers链接到选项条目,使对话得以继续。 - 可选:将选项条目上的
timer设为15s,并将cancelTriggers链接到一个告别条目。文本中可以使用%typewriter_textdisplaydialogue_timer%显示倒计时。 - 发布该页面并与 NPC 交谈。右键点击悬浮文字(或空气)以继续;遇到选项时,滚动快捷栏并右键确认。
默认情况下,文本放置在说话者位置上方一格处。如果说话者不是带有位置的 NPC 实体,或者你想要固定的位置,请使用位置捕获工具设置 position。当菜单应当跟随玩家时,请使用 player option 变体。
工作原理
每个对话条目都会把文本拆分为每行一个 text_display,因此较长的消息会向下堆叠。typing 效果使用标准的 TypeWriter 打字模式。选项会在文本完成后依次出现(间隔 100 毫秒),并且只有在全部可见之后才能确认。
操作
| 对话 | 继续或确认 | 切换选项 |
|---|---|---|
| Spoken | TypeWriter 的确认键,或右键点击其中一段悬浮文字。第一次按下会完成打字,第二次则关闭对话。 | 不适用 |
| Option 和 Player option | 在所有选项都显示后,在空气中或某段悬浮文字上右键点击。 | 滚动快捷栏(手持的槽位始终不会改变)。选择会循环。 |
配置
对话没有配置文件。显示的每段文本都是一个 snippet,可在 plugins/Typewriter/snippets 中编辑;默认值与标准显示一致。片段中的 <token> 会被替换为对应的值,其他 <标签> 仍是 MiniMessage。在布局片段(*.format)中,说话者和提示仅在包含对应 token 时才显示,而文本和选项始终显示。提示片段为空时不显示提示。
| 片段 | 使用者 | 作用 | Token |
|---|---|---|---|
textdisplay.option.format | Option、Player option | 布局 | <speaker_name> <text> <options> <instruction> |
textdisplay.speaker.format | Option、Player option | 说话者名称 | <speaker_name> |
textdisplay.option.prefix.selected | Option、Player option | 选中选项的前缀 | - |
textdisplay.option.prefix.unselected | Option、Player option | 其他选项的前缀 | - |
textdisplay.option.selected | Option、Player option | 选中选项的行 | <prefix> <option_number> <option_text> |
textdisplay.option.unselected | Option、Player option | 其他选项的行 | <prefix> <option_number> <option_text> |
textdisplay.instruction | Option、Player option | 提示 | - |
textdisplay.spoken.format | Spoken | 布局 | <speaker_name> <text> <instruction> |
textdisplay.spoken.speaker.format | Spoken | 说话者名称 | <speaker_name> |
textdisplay.spoken.text.format | Spoken | 文本行 | <text> |
textdisplay.spoken.instruction | Spoken | 提示 | - |
textdisplay.spoken.continue | Spoken | 继续提示(确认键) | <key> |
textdisplay.cinematic.spoken.format | 过场动画 | 布局 | <speaker_name> <text> <instruction> |
textdisplay.cinematic.spoken.speaker.format | 过场动画 | 说话者名称 | <speaker_name> |
textdisplay.cinematic.spoken.instruction | 过场动画 | 提示 | - |
textdisplay.inventory.blocked | 所有对话 | 玩家尝试打开物品栏时的消息(为空:不显示消息) | - |
textdisplay.error.init | 所有对话 | 显示无法启动时的消息(为空:不显示消息) | - |
Player option 对话与 Option 对话使用相同的片段。
占位符
| 占位符 | 返回 |
|---|---|
%typewriter_textdisplaydialogue_timer% | 当前选项对话 timer 的剩余秒数,没有计时器运行时为 0。 |
该占位符已在 PlaceholderAPI(Typewriter 扩展)中注册,因此在其他地方(计分板、聊天、其他插件)也能使用,没有计时器运行时返回 0。扩展还会在选项对话的 text、每个选项的文本和说话者名称中自行替换它,因此在这些位置无需 PlaceholderAPI 也能使用。安装 PlaceholderAPI 后,这些文本中也可使用其他 PlaceholderAPI 占位符。
条目
4 个条目,由扩展源码生成。
对话3
- Textdisplay OptionOption dialogue with Text Display
- Textdisplay Player OptionPlayer Option dialogue with Text Display(relative position)
- Textdisplay SpokenSpoken dialogue with Text Display
过场动画1
- Textdisplay Spoken CinematicDisplay a spoken dialogue using TextDisplay during a cinematic
故障排查
什么都没有出现,并且玩家看到红色的 "Dialog initialization error"。 扩展在生成展示实体时捕获到了错误。请在服务器日志中查找以 TextDisplay initialization error 开头的那一行以了解原因,并检查设置的 position 是否是一个存在的世界中的有效位置。
文本出现在玩家脚下或错误的位置。 文本锚定在说话者实体的位置。如果 speaker 为空,或者不是对玩家可见的 NPC 实例,则会使用玩家的位置(再向上一格)。请设置 position 以精确放置。
选项菜单无法确认。 只有在打字完成且所有选项都已出现之后,才会接受右键点击。在 duration 较长且选项较多时,请等待完整的菜单出现。criteria 不匹配的选项根本不会显示;如果全都不匹配,则无法选择任何内容。
滚动不会切换选项。 滚动事件被限制为每 150 毫秒一次,因此过快的滚动会被忽略。对话期间手持的快捷栏槽位始终不会改变,这是预期行为。
倒计时原样显示 %typewriter_textdisplaydialogue_timer%。 没有 PlaceholderAPI 时,占位符只会在选项对话中被替换,且仅当 timer 大于零时。请安装 PlaceholderAPI,以便在普通对话或其他地方使用它。
玩家抱怨物品栏被锁定。 在显示对话期间,打开物品栏、在其中点击、丢弃物品和交换手持物都会被取消。这是有意设计的,并会在对话结束时解除。
相关扩展
- BetterModel — 带动画的模型 NPC,可以作为悬浮对话的说话者。