Skip to content

配置详解 ​

EmakiCodex 各份配置文件里的字段, 每个字段的默认值和作用如下

EmakiCodex 的配置分为主配置, 原版成就页配置, 分类条目配置, GUI 模板和语言文件. config.yml, codex/*.yml, gui/codex_gui.yml 与 lang/*.yml 各管一块, 先记住它们各自的分工:

  • config.yml: 全局开关, 默认资源是否释放, 原版成就注册和 PacketEvents 坐标通道
  • codex/*.yml: 分类, 条目, 解锁条件和奖励; 与 advancements/*.yml 的 page_id 是独立命名空间
  • gui/codex_gui.yml: 分类条目 GUI 布局和占位符
  • lang/*.yml: 命令, GUI 与控制台提示

advancements/*.yml 的页面与节点字段见成就页定义, 分类条目 GUI 见分类条目 GUI, 两类自动解锁触发器见事件触发器

config.yml ​

默认主配置:

yaml
version: "1.1.6"
language: "zh_CN"
release_default_data: true
op_bypass: false

advancement:
  enabled: true
  announce_default: false
  remove_on_disable: true
  packet_coordinates: true
  triggers_enabled: true

字段说明 (必填=否 表示源码带默认值, 可省略):

字段类型必填默认值取值范围说明
versionstring否1.1.6任意字符串这是配置结构的版本标记, 默认资源的版本由资源同步流程维护. 源码内部还有一个迁移常量是 1.0.14, 不要和它混用
languagestring否zh_CNlang/<language>.yml 的文件名指定使用 lang/<language>.yml 这个语言文件. 留空或文件缺失时回退到 zh_CN
release_default_databoolean否truetrue / false填 true 且对应文件缺失时, 释放内置的 advancements/example_page.yml 与 codex/example_category.yml 等默认数据
op_bypassboolean否falsetrue / false填 true 时 OP 可以跳过命令的权限检查, 填 false 时 OP 也必须拥有对应权限节点
advancement.enabledboolean否truetrue / false原版成就注册的总开关. 关掉后不再加载和注册成就, /codex reload 会移除本插件已经注册的节点
advancement.announce_defaultboolean否falsetrue / false节点自己没有单独配 announce 时, 是否默认全服广播
advancement.remove_on_disableboolean否truetrue / false插件被禁用时是否移除已经注册的动态成就. /codex reload 的重建流程总是先清掉本插件命名空间再注册, 不受这个开关控制
advancement.packet_coordinatesboolean否truetrue / false安装了 PacketEvents 时, 是否把节点 x / y 写进客户端成就树. 这个值在插件启用时构造发包网关时读取, 运行中改了要重启才生效
advancement.triggers_enabledboolean否truetrue / false是否开启按游戏事件自动授予 (节点 triggers.entries 与条目 unlock.triggers). 关掉后仍然可以用命令, API 或 CoreLib 动作手动授予

配置示例 (关闭自动触发, 保留坐标注入):

yaml
language: "en_US"
op_bypass: true

advancement:
  enabled: true
  packet_coordinates: true
  triggers_enabled: false

分类条目文件 codex/*.yml ​

每个文件定义一个 GUI 分类; 文件名不参与 id 识别, 分类 id 取 category_id. 条目的复合 id 固定为 <category_id>/<entry_id>, 例如 example/first_blood

随插件发布的默认值片段 (节选自 codex/example_category.yml):

yaml
category_id: "example"
title: "<gold>试炼图鉴</gold>"
icon: "minecraft-book"
order: 100

entries:
  first_blood:
    title: "<yellow>初次讨伐</yellow>"
    description: "<gray>击败任意敌对生物。</gray>"
    icon: "minecraft-iron_sword"
    hidden: false
    unlock:
      triggers:
        - event: "entity_kill"
      advancements: []
    rewards:
      attributes:
        physical_attack: 2.0
      actions:
        - "send_message text=<green>已领取初次讨伐的奖励。</green>"

字段说明 (entries 下每个条目都可用以下键):

字段类型必填默认值取值范围说明
category_idstring否空非空字符串 (会归一化为 id)分类 id. 留空时整份文件会被跳过
titleMiniMessage string否category_idMiniMessage分类标题, 界面上的分类标签会用到它
iconItemSource string否minecraft-bookCoreLib ItemSource 短写分类图标
orderinteger否100整数分类标签的排序权重, 越小越靠前; 权重相同时再按 category_id 排序
entriesmap否空键为条目 id条目定义集合
entries.<id>.titleMiniMessage string否条目 idMiniMessage条目标题
entries.<id>.descriptionMiniMessage string否空MiniMessage条目描述
entries.<id>.iconItemSource string否minecraft-bookCoreLib ItemSource 短写条目图标; 条目未解锁时改用锁定图标渲染
entries.<id>.hiddenboolean否falsetrue / false未解锁时是否从界面里藏起来; 填 false 时会显示成未知条目
entries.<id>.unlock.triggerslist否空触发器列表共享玩法事件触发器, 见事件触发器
entries.<id>.unlock.triggers[].eventstring是—CoreLib 事件 ID触发器事件 ID (会归一化); 留空则跳过这一条
entries.<id>.unlock.triggers[].conditionCoreLib condition group否空condition.type + condition.entries可选项; 省略时只要事件发生就算命中
entries.<id>.unlock.advancementslist<string>否空原版 advancement key任意一个命中就能解锁; 取值会先去掉首尾空格再去重
entries.<id>.rewards.attributesmap<string,double>否空属性 id → double (非 0.0)条目激活后实时提供, 不会把数值快照写进玩家文件; 值为 0.0 的项会被丢掉, 同名的键相加
entries.<id>.rewards.actionslist<string>否空CoreLib 动作行领取时只执行一次的 CoreLib Action; 领取状态先写进玩家文件, 然后才执行动作

一句话记住这套解锁逻辑: unlock.triggers 与 unlock.advancements 是并列通路, 任一通路成功即可把条目变为"已解锁". 解锁, 激活, 领取是三件独立的事: 解锁不会自动激活, 激活也不会自动执行一次性领取动作

使用示例 (两个条目, 分别走触发器与 advancement 解锁):

yaml
category_id: "example"
title: "<gold>试炼图鉴</gold>"
icon: "minecraft-book"
order: 100

entries:
  first_blood:
    title: "<yellow>初次讨伐</yellow>"
    description: "<gray>击败任意敌对生物。</gray>"
    icon: "minecraft-iron_sword"
    hidden: false
    unlock:
      triggers:
        - event: "entity_kill"
    rewards:
      attributes:
        physical_attack: 2.0
      actions:
        - "send_message text=<green>已领取初次讨伐的奖励。</green>"

  master_miner:
    title: "<aqua>掘进者</aqua>"
    icon: "minecraft-diamond_pickaxe"
    hidden: true
    unlock:
      triggers:
        - event: "block_break"
          condition:
            type: "all_of"
            entries:
              - '%block_type% == "DIAMOND_ORE"'
      advancements:
        - "emakicodex:example/first_step"
    rewards:
      attributes:
        max_health: 5.0

语言文件 ​

语言文件位于 lang/*.yml. 默认包含:

yaml
version: "1.1.6"
general:
  prefix: "<gray>[ <gradient:#D946EF:#F59E0B>EmakiCodex</gradient> ]</gray>"
  no_permission: "<red>你没有权限执行此操作。</red>"

command:
  help:
    commands:
      reload: "重载配置、重注册成就并给全员重发成就"
      grant: "授予玩家成就"
      revoke: "撤销玩家成就"
      debug: "管理 Debug 模式"

语言文本支持 MiniMessage (一套用标签写颜色和样式的文本格式). 改完执行 /codex reload 就能生效

修改 config.yml, advancements/*.yml, codex/*.yml, gui/codex_gui.yml 与 lang/*.yml 后, 执行 /codex reload 应用变更. 玩家的 data/<uuid>.yml 不会因 reload 清空, 放心重载

相关页面 ​

  • 成就页定义: advancements/*.yml 的页面与节点字段, key 规则与完成动作
  • 分类条目 GUI: 分类文件与 GUI type, 四态状态和奖励操作
  • 事件触发器: 原版 triggers.entries 与分类 unlock.triggers 的写法, 可用事件与条件组示例
  • 命令与权限: /codex reload, 原版授予/撤销和分类条目管理
  • CoreLib 动作: 在动作链中授予, 撤销或广播成就