简体中文
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 子键见锻造历史记录, 这里不重复
| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
version | string | 否 | 4.8.7 | — | 配置结构的版本标记, 由资源同步流程维护. 源码里另有一个控制版本迁移的常量是 4.5.11, 两者不是同一个数值, 不要混用, 也不要手动改这里 |
language | string | 否 | zh_CN | 已存在的语言文件名 (不含 .yml) | 决定加载 lang/ 下的哪个语言文件. 该文件不存在, 或缺少某个键时, 改用内置的 zh_CN 语言资源补上 |
release_default_data | boolean | 否 | true | true / false | 填 true 时, 缺少内置默认数据 recipes/example_recipe.yml 就会把它释放到插件目录; 填 false 时跳过这一步. config.yml 与 lang/*.yml 属于版本化资源, 会按内置的键补齐合并; gui/*.yml 属于静态资源, 缺失时按内置副本创建. 这两类都不受本键控制 |
op_bypass | boolean | 否 | false | true / false | 填 true 时 OP 可以跳过命令权限检查. 只有在顶层键缺失时, 才回头读旧的 permission.op_bypass, 并在启动时给出告警, 随后自动迁移到顶层键 |
number_format.default | string | 否 | 0.## | 任意 DecimalFormat 模板 | 普通数值显示成什么样 |
number_format.integer | string | 否 | 0 | 任意 DecimalFormat 模板 | 整数显示成什么样 |
number_format.percentage | string | 否 | 0.##% | 任意 DecimalFormat 模板 | 百分比显示成什么样 |
condition.invalid_as_failure | boolean | 否 | true | true / false | 填 true 时, 条件表达式写错导致解析失败, 就按"条件不通过"处理; 填 false 时不因为解析失败就中断这次锻造 |
quality | object | 否 | 见下 | — | 全局的品质池, 保底和品质物品元数据. 全部键见品质系统 |
history | object | 否 | 见下 | — | 锻造历史的开关与自动保存. 全部键见锻造历史记录 |
发货默认值 (随模块发布的 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 静态门面 |
| 事件 API | ForgeStartEvent, ForgeCompletedEvent |
典型锻造流程
- 玩家用
/ef forge打开锻造界面 - 把图纸放进图纸槽, Forge 按图纸的物品来源自动匹配配方
- 把材料放进必需材料槽和可选材料槽
- 模块检查配方, 条件, 容量和材料数量
- 玩家点击确认槽, 触发
actions.pre - 按玩家 + 配方 + 材料指纹算出这次的品质与保底 (材料指纹就是把这次投入的材料组合算出来的一段标识)
- 生成
result.success.outputs里的主产物, 并给它附上锻造层快照 - 依次执行
result.success.actions→actions.success→ 品质动作; 失败时执行actions.failure - CoreLib 物品装配服务重建物品展示
- 安装了 EmakiAttribute 时, 材料的
ea_attribute效果写入结构化 PDC 属性层 (PDC 是物品自带的键值数据容器)
与 Attribute 的关系
不装 EmakiAttribute, Forge 也能完成基础锻造. 材料的 ea_attribute 效果要装了 EmakiAttribute 才会生效: 这时属性写入结构化 PDC 层, 参与真实战斗计算, 而不是只显示在 Lore 里
没装 EmakiAttribute 时, 这条效果走空操作路径 (什么都不做): 锻造照常完成, 只是不写入属性数据, 不会报错, 也不会中断流程