对话结构
关于对话配置结构
所有对话文件均在 QuestEngine/core/conversation 目录下,你可以在这个目录下建立子目录来分类
基本结构
对话的基本结构是对话标识符、对话内容、应答
id:
content: []
answer: []id
对话的唯一标识符
content
对话的内容列表
content:
- 欢迎来到我的小店,{{ player name }}。
- 我这里什么都有,珍稀的药草、强力的武器。额外支持
对话内容支持Kether和PlaceholderAPI
kether需要用{{}}包裹,placeholderapi需要用%包裹
content:
- "欢迎,{{ player name }}!当前世界:%player_world%"
- "你拥有的金币:%vault_eco_balance_fixed%"answer
应答是玩家回应的选项,可以触发特定的脚本或打开新的对话
answer:
- text: ""
action: ""
open: ""
if: ""字段表:
| 字段 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| text | string | 是 | - | 选项显示文本 |
| action | string | 否 | - | 选择后执行的 Kether 脚本 |
| open | string | 否 | - | 打开的新对话标识符 |
| if | string | 否 | - | 显示条件,需要返回 boolean(使用 Kether) |
Kether
需要使用 Kether 脚本返回 boolean 布尔值结果
示例
answer:
- text: "你有什么特别推荐的吗?"
action: |
tell "这把剑非常强大,适合冒险者!"
open: example_2-1 # 打开新的对话
- text: "我只是想看看,感谢你。"
action: |
tell "如果你需要帮助,随时告诉我。"
open: example_3 # 打开另一个对话
- text: "仅管理员可见选项"
if: |
permission user.admin
action: |
tell "管理员选项触发"逻辑结构
逻辑结构可以基于条件判断决定打开哪个对话或者执行脚本
id:
when:
- if: ""
open: ""
action: ""字段表:
| 字段 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| if | string | 否 | - | 条件(Kether),返回 boolean。省略表示恒真 |
| open | string | 否 | - | 条件满足时打开的新对话标识符 |
| action | string | 否 | - | 条件满足时执行的 Kether 脚本 |
评估顺序:
-
按书写顺序自上而下评估第一条匹配的规则;未匹配则继续下一条。
-
省略
if的规则可作为兜底分支,建议放在列表末尾。 -
当规则匹配且同时配置了
action与open时,两者都会生效。若需严格控制先后顺序,请在脚本中显式处理。
示例
id:
when:
- if: |
permission user.a
open: example_4
action: |
tell "打开对话"
- open: example_5绑定 NPC
你可以通过 npc 或者 npcs 参数来绑定 NPC,交互 NPC 时会触发该对话
id:
# 单个 NPC 绑定
npc: npc_id
# 多个 NPC 绑定
npcs:
- npc_id_1
- npc_id_2字段表:
| 字段 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| npc | string | 否 | - | 绑定单个 NPC 的标识符 |
| npcs | string[] | 否 | - | 绑定多个 NPC 的标识符列表 |
发言者名称
你可以通过 name 参数来设置发言者名称。如果未设置,将默认显示为 NPC 的名称
id:
name: "老板"如果你没有为某个对话指定 name 参数,将会自动使用该 NPC 的默认名称。
例如,如果你的 NPC 名为商人,那么对话中的发言者名称就会显示为商人
id:
# 没有定义 name,默认显示为 NPC 的名称
content:
- "欢迎来到我的商店!"外部标签
通过 tags 参数,你可以为对话添加外部标签,以便提供给外部调用,这对 Xerr Xession 等插件非常有用
id:
tags:
- tag_1
- tag_2最佳实践
- 将不带条件的兜底规则放在
answer/when列表末尾。 action与open可并存;如需顺序控制,在脚本中显式处理。- 复杂
if条件建议抽离为可读性更高的 Kether 逻辑块。
常见错误
- 忘记为
if返回 boolean,导致条件始终不生效。 - 在
content中忘记用{{ }}或% %包裹表达式。 when列表没有兜底分支,导致未命中规则时无反馈。