Purtmars Plugins
插件️Chemdah开始

任务 Schema

任务 Schema

完整的任务 YAML 字段参考(与 Chemdah/core/quest 下示例结构一致)。入门说明见 任务结构addon 分项见 任务组件 等章节;agent代理脚本;条目 condition / goal条目类型

条目类型字段名为 objective(不是 type)。游戏中可用 /chemdah objective <关键词> 查看已注册类型及条件键;附属插件自定义类型见 开发 · 自定义目标

文件级选项

任务文件中的 __option__ 节点为当前文件中的所有任务提供默认值。任务自身定义的同名字段会覆盖此处的值。

__option__:
  # 数据隔离标识(字符串)
  # 启用后该文件中的任务数据独立建表,分担主表压力
  # 不设置则使用主表
  data-isolation: ~

  # 是否记录任务完成时间
  # 记录到 user_data 表,key: quest.complete.<id>
  # 禁用会影响依赖判断和重复接受检查
  record-quest-completed: true

  # 是否记录条目完成时间
  # 记录到 user_data 表,key: quest.complete.<id>.<task_id>
  # 默认 false;未写时可用 record-completed 作为后备
  record-task-completed: false

  # 兼容旧配置的字段
  # 同时作为 record-quest-completed / record-task-completed 的后备值
  record-completed: true

任务结构

# ═══════════════════════════════════════════════════
# 任务 ID(全局唯一标识符)
# ═══════════════════════════════════════════════════
quest_id:

  # ─── 直接字段 ──────────────────────────────────
  # 以下字段直接写在任务根节点下
  # 它们会覆盖 __option__ 中的同名字段

  # 数据隔离标识
  data-isolation: ~

  # 是否记录任务完成时间
  record-quest-completed: true

  # 是否记录条目完成时间(默认同 __option__,通常 false)
  record-task-completed: false

  # 兼容旧字段(后备值)
  record-completed: true

  # ─── 元数据 ────────────────────────────────────
  meta:
    # 任务名称(字符串)
    # 支持 & 颜色代码
    name: "&e开采矿石"

    # 任务类型(字符串 | 列表)
    # 用于 UI 分类和分组控制
    # 单个类型:type: 日常
    # 多个类型:type: [日常, 采集]
    # 逗号分隔:type: "日常,采集"
    type: 日常

    # 导入其他任务的元数据
    # 被导入的任务 ID 列表
    import:
      - other_quest_id

  # ─── 条目列表 ──────────────────────────────────
  task:
    # 条目 ID(同一任务内唯一)
    task_id:

      # 条目类型(必填,键名 objective)
      # /chemdah objective <关键词> 查看类型、condition / goal 键
      # 常见类型:
      #   block break          破坏方块
      #   block place          放置方块
      #   player kill          击杀实体
      #   player attack        攻击实体
      #   entity interact      与实体交互
      #   player chat          聊天
      #   player command       执行命令
      #   trigger              主动触发
      #   player inventory     持有物品
      #   player permission    持有权限
      #   player conversation  完成对话
      #   player conversation closed  关闭对话
      #   always               自动触发
      #   mythicmobs kill      击杀 MythicMobs 怪物
      #   anpc interact        右键 Adyeshach NPC
      #   anpc damage          左键 Adyeshach NPC
      #   custom level         Chemdah 等级变化
      #   player data          Chemdah 数据变化
      #   quest data           任务数据变化
      objective: block break

      # 触发条件
      # 不同 objective 支持不同的条件字段
      # 值支持分号分隔的列表语法:material: "iron_ore;gold_ore"
      condition:
        material: iron_ore
        # 可选:condition.$ 为 Kether 脚本条件(与具体 objective 的键并列)

      # 完成目标
      # 计数器类型默认支持 amount(触发次数)
      goal:
        amount: 10

      # 条目元数据
      meta:
        name: "&7挖掘铁矿"

      # ─── 条目级别组件 ────────────────────────
      addon:

        # --- depend(依赖)---
        # 类型:字符串 | 列表
        # 控制条目的激活顺序
        # 值类型:
        #   "task_id"        依赖指定条目完成
        #   "*"              依赖同任务中所有其他条目
        #   "group:组名"     依赖指定组中的所有任务
        depend:
          - other_task_id

        # --- optional(可选)---
        # 类型:布尔值
        # true 表示该条目不影响任务完成判定
        optional: false

        # --- stats(进度统计)---
        # 类型:配置节
        stats:
          # 是否显示进度条
          # true: 进度变化时临时显示
          # false: 不显示
          # "always": 始终显示
          visible: true

          # BossBar 临时显示时长(tick)
          # 默认从 config.yml 的 default-stats.stay 读取
          stay: 100

          # BossBar 样式
          # 可选:SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20
          style: SOLID

          # BossBar 颜色
          # 可选:PINK, BLUE, RED, GREEN, YELLOW, PURPLE, WHITE
          color: WHITE

          # 显示文本模板
          # 支持变量:{name} {value} {target} {percent}
          content: "&f{name} &7{value}/{target} &8({percent}%)"

          # BossBar 附加效果
          boss-music: false
          darken-sky: false

          # 自定义进度计算脚本(Kether)
          # 需要设置 value、target、percent 变量
          $:
            - "set value to quest progress value"
            - "set target to quest progress target"

        # --- track(追踪)---
        # 类型:配置节
        # 条目级和任务级均可写,条目级优先
        track:
          # 追踪目标坐标
          # 格式:"world x y z"(固定坐标)
          # 格式:"adyeshach <实体ID>"(NPC 坐标)
          center: "world 100 64 100"

          # 显示名称
          name: "铁矿石"

          # 描述文本(纯文本列表,不做变量替换)
          # 仅在 scoreboard-option.content 中通过 {description} 引用展开
          description:
            - "前往矿洞开采铁矿石"

          # 开始追踪时的提示信息
          # 支持 {name} 变量
          message:
            - "&a开始追踪:{name}"

        # --- timeout(超时)---
        # 类型:字符串
        # 支持的格式:
        #   "1h30m"              持续时间
        #   "day 4 0"            每天 4:00
        #   "week 3 4 0"          每周三 4:00(参数:星期 1-7, 时, 分)
        #   "month 1 4 0"        每月 1 日 4:00
        #   "2025/1/1 0:0"       绝对日期
        timeout: "1h"

        # --- party(队伍)---
        # 类型:配置节
        party:
          # 是否允许分享给队员
          share: false
          # 仅队长可分享
          share-only-leader: false
          # 队员可以代替完成条目
          continue: false
          # 最少需要的队伍人数
          require-members: 0

        # --- reset-data-on-accepted(接受时重置数据)---
        # 类型:布尔值
        # 接受或重新接受任务时清除条目的持久化数据
        # 仅对实现了 IPlayerData 接口的 objective 生效
        reset-data-on-accepted: false

      # ─── 条目级别脚本代理 ────────────────────
      agent:
        # 条目持续进行时执行(每次条目被检查时)
        continued: |
          tell colored "&7任务进行中..."

        # 条目完成后执行
        completed: |
          tell colored "&a条目已完成!"

        # 条目重新开始时执行
        restarted: |
          tell colored "&e条目已重置。"

  # ─── 任务级别组件 ──────────────────────────────
  # 与 task 同级
  addon:

    # --- ui(任务页面)---
    # 类型:配置节
    # 仅在任务级别使用
    ui:
      # 是否在 UI 中显示
      visible:
        # 接受前是否可见
        start: false
        # 完成后是否可见
        complete: true
      # 显示材质(物品名)
      icon: iron_pickaxe
      # 任务描述
      description:
        - "&7开采铁矿石和金矿石。"

    # --- control(控制)---
    # 类型:列表(每项是一个规则)
    # 仅在任务级别使用
    control:
      # 脚本代理型(直接写 Kether 脚本)
      - $:
          - "permission example.quest"

      # 共存限制:限制同类型任务同时进行的数量
      - type: coexist
        amount:
          日常: 3
          周常: 5

      # 重复限制:限制接受(或完成)次数
      - type: repeat accept
        amount: 3
        # 周期:每个周期内独立计数
        period: "day 1 6 0"
        # 分组:同 group 的任务共享计数
        group: daily_quest

      # 冷却限制:接受(或完成)后的冷却时间
      - type: cooldown complete
        time: "24h"
        group: daily_quest

    # --- automation(自动化)---
    # 类型:配置节
    # 仅在任务级别使用
    automation:
      # 玩家登录时自动接受
      auto-accept: false
      # 计划任务:按时间规律自动分配
      plan:
        # 计时基准
        # START_IN_MONDAY: 以周一为起点
        # START_IN_SUNDAY: 以周日为起点
        method: START_IN_MONDAY
        # 每个周期分配几个任务
        count: 1
        # 分组名:同组内随机分配
        group: daily_quest
        # 时间表达式
        # "hour <分钟>"                     每小时的第 N 分钟
        # "day <数量> [时] [分]"            每天(别名:daily)
        # "week <数量> <星期> [时] [分]"    每周(别名:weekly),星期 1-7
        type: "day 1 6 0"

    # --- depend(依赖)---
    # 类型:字符串 | 列表
    # 任务级:控制前置任务
    depend:
      - prerequisite_quest_id
      - "group:chapter_one"

    # --- restart(重启条件)---
    # 类型:字符串 | 列表(Kether 脚本)
    # 所有脚本返回 true 时允许重新接受
    restart:
      - "permission quest.restart"

    # --- timeout(超时)---
    timeout: "7d"

    # --- party(队伍)---
    party:
      share: true
      share-only-leader: false
      continue: true
      require-members: 1

    # --- stats(进度统计)---
    stats:
      visible: "always"
      color: GREEN
      content: "&f{name} &7{value}/{target}"

    # --- track(追踪)---
    # 任务级和条目级均可写
    # 条目级有 track 时使用条目级的;没有时回退到任务级
    track:
      center: "adyeshach npc_elder"
      name: "寻找村长"
      description:
        - "前往村庄中心广场"
      message:
        - "&a开始追踪:{name}"

      # 信标:在目标位置显示粒子光柱
      beacon: true
      beacon-option:
        # 粒子类型
        type: HAPPY_VILLAGER
        # 粒子宽度
        size: 0.3
        # 粒子数量
        count: 2
        # 最大显示距离(方块)
        distance: 128
        # true: 固定在目标位置
        # false: 在玩家前方显示方向指引
        fixed: false
        # 粒子刷新间隔(tick)
        period: 10

      # 地标:在目标位置显示全息文字
      landmark: true
      landmark-option:
        # 最大显示距离(方块)
        distance: 128
        # 靠近目标时自动隐藏
        hide-near: true
        # 显示内容
        # 支持变量:{distance}(距离)、{name}(名称)
        # 注意:{description} 在地标中不生效
        content:
          - "&e{name}"
          - "&7{distance}m"

      # 导航:沿路径播放粒子引导
      navigation: true
      navigation-option:
        # 是否主线程寻路(建议 false)
        sync: false
        # 最大寻路距离(方块)
        distance: 64
        # 显示类型:POINT(粒子点)或 ARROW(箭头)
        type: POINT

        # POINT 模式参数
        point:
          # 粒子发送间隔(tick)
          period: 20
          # 粒子类型
          type: CRIT
          # Y 轴偏移
          y: 0.5
          # 粒子散布范围
          size:
            x: 0.1
            y: 0.1
          # 每个节点的粒子数
          count: 1
          # 节点间延迟(tick)
          speed: 2

        # ARROW 模式参数
        arrow:
          period: 20
          type: CRIT
          y: 1.0
          # 箭头密度
          density: 3
          # 箭头长度
          length: 0.5
          # 箭头张角
          angle: 0.5
          speed: 2

      # 记分板:在屏幕右侧显示任务信息
      scoreboard: true
      scoreboard-option:
        # 每行最大字符数
        length: 20
        # 显示内容
        # 支持变量:{name}(名称)、{description}(展开描述文本)
        content:
          - "&e{name}"
          - "{description}"

  # ─── 任务级别脚本代理 ──────────────────────────
  # 与 task 同级
  # 代理值为 Kether 脚本(字符串或多行字符串)
  agent:
    # 接受前执行,返回 false 可拦截接受
    accept: |
      permission quest.accept

    # 接受后执行
    accepted: |
      tell colored "&a已接受任务!"

    # 接受被拦截后执行
    accept_cancelled: |
      tell colored "&c无法接受此任务。"

    # 完成前执行,返回 false 可拦截完成
    complete: |
      pass

    # 完成后执行
    completed: |
      tell colored "&a任务完成!"
      command inline "give {{ player name }} diamond 5" as console

    # 失败前执行,返回 false 可拦截失败
    fail: |
      pass

    # 失败后执行
    failed: |
      tell colored "&c任务失败。"

    # 重新接受前执行
    restart: |
      pass

    # 重新接受后执行
    restarted: |
      tell colored "&e任务已重置。"

    # 代理支持 @restrict 后缀
    # @self: 仅触发玩家自己(默认)
    # @all / @*: 广播给队伍所有成员
    accepted@all: |
      tell colored "&a队伍成员接受了任务!"

变量替换速查

变量生效位置来源
{name}landmark-option.contentscoreboard-option.contentmessagetrack.name 或任务显示名
{distance}landmark-option.content玩家到目标的实时距离
{description}scoreboard-option.content展开 track.description 列表
{value}stats.content当前进度值
{target}stats.content目标值
{percent}stats.content百分比

track.description 是纯文本列表,其中不做任何变量替换。{distance}{name} 只在 landmark-option.content 等显示模板中生效。

脚本代理类型速查

任务级别

YAML 键触发时机可拦截
accept接受前
accepted接受后
accept_cancelled接受被拦截后
complete完成前
completed完成后
fail失败前
failed失败后
restart重新接受前
restarted重新接受后

条目级别

YAML 键触发时机可拦截
continued条目被检查时
completed条目完成后
restarted条目重置后

代理键名解析规则:转为大写后,空格和冒号替换为下划线。因此 accept_cancelledaccept cancelled 等价,但连字符 - 不会被替换(accept-cancelled 无效)。

相关文档

主题链接
最小示例与 meta任务结构
control / track / ui 等细节任务组件(侧栏「任务组件」)
agent 脚本与 @restrict代理脚本
各 objective 的 condition条目类型
数据隔离与库表开发 · 自定义数据库存档键映射

On this page