Skip to content
iPlugin

对话结构

关于对话配置结构

所有对话文件均在 QuestEngine/core/conversation 目录下,你可以在这个目录下建立子目录来分类

基本结构

对话的基本结构是对话标识符、对话内容、应答

基本结构(格式)
id:
  content: []
  answer: []

id

对话的唯一标识符

content

对话的内容列表

content 示例
  content:
    - 欢迎来到我的小店,{{ player name }}。
    - 我这里什么都有,珍稀的药草、强力的武器。

额外支持

对话内容支持Kether和PlaceholderAPI

kether需要用{{}}包裹,placeholderapi需要用%包裹

content Kether/PlaceholderAPI 示例
content:
  - "欢迎,{{ player name }}!当前世界:%player_world%"
  - "你拥有的金币:%vault_eco_balance_fixed%"

answer

应答是玩家回应的选项,可以触发特定的脚本或打开新的对话

answer(格式)
  answer:
    - text: ""
      action: ""
      open: ""
      if: ""

字段表:

字段类型必填默认说明
textstring是-选项显示文本
actionstring否-选择后执行的 Kether 脚本
openstring否-打开的新对话标识符
ifstring否-显示条件,需要返回 boolean(使用 Kether)

Kether

需要使用 Kether 脚本返回 boolean 布尔值结果

示例

answer 示例
  answer:
    - text: "你有什么特别推荐的吗?"
      action: |
        tell "这把剑非常强大,适合冒险者!"
      open: example_2-1  # 打开新的对话
    - text: "我只是想看看,感谢你。"
      action: |
        tell "如果你需要帮助,随时告诉我。"
      open: example_3  # 打开另一个对话
    - text: "仅管理员可见选项"
      if: |
        permission user.admin
      action: |
        tell "管理员选项触发"

逻辑结构

逻辑结构可以基于条件判断决定打开哪个对话或者执行脚本

when(格式)
id:
  when:
    - if: ""
      open: ""
      action: ""

字段表:

字段类型必填默认说明
ifstring否-条件(Kether),返回 boolean。省略表示恒真
openstring否-条件满足时打开的新对话标识符
actionstring否-条件满足时执行的 Kether 脚本

评估顺序:

  • 按书写顺序自上而下评估第一条匹配的规则;未匹配则继续下一条。

  • 省略 if 的规则可作为兜底分支,建议放在列表末尾。

  • 当规则匹配且同时配置了 action 与 open 时,两者都会生效。若需严格控制先后顺序,请在脚本中显式处理。

示例

when 示例
id:
  when:
    - if: |
        permission user.a
      open: example_4
      action: |
        tell "打开对话"
    - open: example_5

绑定 NPC

你可以通过 npc 或者 npcs 参数来绑定 NPC,交互 NPC 时会触发该对话

npc/npcs 绑定(格式)
id:
  # 单个 NPC 绑定
  npc: npc_id
  # 多个 NPC 绑定
  npcs:
    - npc_id_1
    - npc_id_2

字段表:

字段类型必填默认说明
npcstring否-绑定单个 NPC 的标识符
npcsstring[]否-绑定多个 NPC 的标识符列表

发言者名称

你可以通过 name 参数来设置发言者名称。如果未设置,将默认显示为 NPC 的名称

设置发言者名称(示例)
id:
  name: "老板"

如果你没有为某个对话指定 name 参数,将会自动使用该 NPC 的默认名称。

例如,如果你的 NPC 名为商人,那么对话中的发言者名称就会显示为商人

没有定义 name,默认显示为 NPC 的名称
id:
  # 没有定义 name,默认显示为 NPC 的名称
  content:
    - "欢迎来到我的商店!"

外部标签

通过 tags 参数,你可以为对话添加外部标签,以便提供给外部调用,这对 Xerr Xession 等插件非常有用

tags(格式)
id:
  tags:
    - tag_1
    - tag_2

最佳实践

  • 将不带条件的兜底规则放在 answer/when 列表末尾。
  • action 与 open 可并存;如需顺序控制,在脚本中显式处理。
  • 复杂 if 条件建议抽离为可读性更高的 Kether 逻辑块。

常见错误

  • 忘记为 if 返回 boolean,导致条件始终不生效。
  • 在 content 中忘记用 {{ }} 或 % % 包裹表达式。
  • when 列表没有兜底分支,导致未命中规则时无反馈。