Skip to content

EmakiForge ​

先看一次锻造从放入图纸和材料到产出装备要经过哪些步骤, 再看各个配置文件分别管什么, 最后了解它和 EmakiAttribute 是什么关系

EmakiForge 负责整个锻造流程: 你放入目标装备, 图纸和材料后, 它会先检查配方, 容量和条件, 再改造目标装备或生成新装备. 品质, 材料贡献和结果的展示方式也都由你在这里配置

基本信息 ​

项目值
模块版本4.8.7
主命令/emakiforge
别名/eforge, /ef
硬依赖EmakiCoreLib
软依赖EmakiAttribute, EmakiItem, PlaceholderAPI
主要权限emakiforge.use, emakiforge.book, emakiforge.reload, emakiforge.debug, emakiforge.admin

核心概念 ​

概念说明
图纸决定玩家能不能执行某个锻造配方
材料玩家投入的资源, 会影响锻造是否成功, 出什么品质, 以及成品的最终属性
配方一次锻造要放什么, 容量上限多大, 满足哪些条件, 产出什么, 以及成功或失败后执行哪些动作
容量限制玩家一次能投入的材料总量, 算法是把各材料的 capacity_cost 加起来, 总和不能超过配方给的容量
品质成品落在哪个品质等级, 由一个可以重复计算的结果决定, 不是每次现掷随机数, 另外可以配置保底
配方书玩家用来查看有哪些可用配方的界面

默认配置目录 ​

text
plugins/EmakiForge/
├── config.yml
├── recipes/
│   └── example_recipe.yml
├── gui/
│   ├── forge_gui.yml
│   └── recipe_book.yml
├── lang/
│   ├── zh_CN.yml
│   └── en_US.yml
└── data/

你先改 recipes/, 它决定一次锻造要放什么, 容量多大, 满足哪些条件, 产出什么, 以及成功后或失败后要做哪些动作. data/ 保存每个玩家自己的数据, 按 UUID 存成一个 <uuid>.yml, 里面记着这个玩家的锻造次数和保底计数

config.yml 主配置 ​

quality 子键见品质系统, history 子键见锻造历史记录, 这里不重复

字段类型必填默认值取值范围说明
versionstring否4.8.7—配置结构的版本标记, 由资源同步流程维护. 源码里另有一个控制版本迁移的常量是 4.5.11, 两者不是同一个数值, 不要混用, 也不要手动改这里
languagestring否zh_CN已存在的语言文件名 (不含 .yml)决定加载 lang/ 下的哪个语言文件. 该文件不存在, 或缺少某个键时, 改用内置的 zh_CN 语言资源补上
release_default_databoolean否truetrue / false填 true 时, 缺少内置默认数据 recipes/example_recipe.yml 就会把它释放到插件目录; 填 false 时跳过这一步. config.yml 与 lang/*.yml 属于版本化资源, 会按内置的键补齐合并; gui/*.yml 属于静态资源, 缺失时按内置副本创建. 这两类都不受本键控制
op_bypassboolean否falsetrue / false填 true 时 OP 可以跳过命令权限检查. 只有在顶层键缺失时, 才回头读旧的 permission.op_bypass, 并在启动时给出告警, 随后自动迁移到顶层键
number_format.defaultstring否0.##任意 DecimalFormat 模板普通数值显示成什么样
number_format.integerstring否0任意 DecimalFormat 模板整数显示成什么样
number_format.percentagestring否0.##%任意 DecimalFormat 模板百分比显示成什么样
condition.invalid_as_failureboolean否truetrue / false填 true 时, 条件表达式写错导致解析失败, 就按"条件不通过"处理; 填 false 时不因为解析失败就中断这次锻造
qualityobject否见下—全局的品质池, 保底和品质物品元数据. 全部键见品质系统
historyobject否见下—锻造历史的开关与自动保存. 全部键见锻造历史记录

发货默认值 (随模块发布的 config.yml, 此处省略 quality.tiers 重复项):

yaml
version: "4.8.7"
language: "zh_CN"
release_default_data: true
quality:
  tiers:
    - name: "平庸"
      weight: 60
      multiplier: 1.0
    - name: "完美"
      weight: 1
      multiplier: 1.2
  default_tier: "平庸"
  guarantee:
    enabled: true
    threshold: 60
    minimum: "无暇"
  item_meta:
    enabled: true
    tiers:
      无暇:
        name_actions:
          - action: "prepend_prefix"
            value: "<color:#4B64C8>[无暇] </color>"
        lore_actions:
        action:
          - 'broadcast_message text="..."'
      # 其余 5 个品质档位结构相同, 见 quality.md
number_format:
  default: "0.##"
  integer: "0"
  percentage: "0.##%"
op_bypass: false
condition:
  invalid_as_failure: true
history:
  enabled: true
  auto_save: true
  save_interval: 6000

可复制的最小示例 (改语言并放宽历史写盘频率):

yaml
language: "en_US"
number_format:
  percentage: "0.0%"
history:
  auto_save: true
  save_interval: 12000

功能页面 ​

页面内容
命令与权限锻造, 配方书, 重载, 列表和调试命令
配方系统输入, 图纸, 结果, 动作和配方匹配
材料系统材料贡献, 容量, 品质修正和效果写入
品质系统品质池, 保底, 物品元数据和确定性算法
锻造历史记录玩家锻造数据, 自动保存和异常排查
GUI锻造界面与配方书模板
审计结果物品的锻造审计数据与材料签名
占位符PlaceholderAPI 输出
CoreLib 动作Forge 注册的刷新动作
API 接入EmakiForgeApi 静态门面
事件 APIForgeStartEvent, ForgeCompletedEvent

典型锻造流程 ​

  1. 玩家用 /ef forge 打开锻造界面
  2. 把图纸放进图纸槽, Forge 按图纸的物品来源自动匹配配方
  3. 把材料放进必需材料槽和可选材料槽
  4. 模块检查配方, 条件, 容量和材料数量
  5. 玩家点击确认槽, 触发 actions.pre
  6. 按玩家 + 配方 + 材料指纹算出这次的品质与保底 (材料指纹就是把这次投入的材料组合算出来的一段标识)
  7. 生成 result.success.outputs 里的主产物, 并给它附上锻造层快照
  8. 依次执行 result.success.actions → actions.success → 品质动作; 失败时执行 actions.failure
  9. CoreLib 物品装配服务重建物品展示
  10. 安装了 EmakiAttribute 时, 材料的 ea_attribute 效果写入结构化 PDC 属性层 (PDC 是物品自带的键值数据容器)

与 Attribute 的关系 ​

不装 EmakiAttribute, Forge 也能完成基础锻造. 材料的 ea_attribute 效果要装了 EmakiAttribute 才会生效: 这时属性写入结构化 PDC 层, 参与真实战斗计算, 而不是只显示在 Lore 里

没装 EmakiAttribute 时, 这条效果走空操作路径 (什么都不做): 锻造照常完成, 只是不写入属性数据, 不会报错, 也不会中断流程