EmakiForge
EmakiForge 负责锻造流程:玩家放入目标装备、图纸和材料后,模块检查配方、容量和条件,再改造目标装备或生成新装备。品质、材料贡献和结果展示都在这里配置。
基本信息
| 项目 | 值 |
|---|---|
| 模块版本 | 4.6.0 |
| 主命令 | /emakiforge |
| 别名 | /eforge、/ef |
| 硬依赖 | EmakiCoreLib |
| 软依赖 | EmakiAttribute、EmakiItem、PlaceholderAPI |
| 主要权限 | emakiforge.use、emakiforge.book、emakiforge.reload、emakiforge.debug、emakiforge.admin |
核心概念
| 概念 | 说明 |
|---|---|
| 图纸 | 控制玩家是否能执行某个锻造配方。 |
| 材料 | 玩家投入的资源,可以影响成功、品质或最终属性。 |
| 配方 | 定义输入要求、容量、条件、结果和动作。 |
| 容量 | 限制可投入材料的 capacity_cost 总和。 |
| 品质 | 锻造结果的确定性加权等级,可配保底。 |
| 配方书 | 玩家查看可用配方的 GUI。 |
默认配置目录
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/ 由 PlayerDataStore 维护,按玩家 UUID 存放 <uuid>.yml 锻造计数与保底计数。示例脚本由 CoreLib 释放到 plugins/EmakiCoreLib/scripts/examples/forge_success.js。
功能页面
| 页面 | 内容 |
|---|---|
| 命令与权限 | 锻造、配方书、重载、列表和调试命令。 |
| 配方系统 | 输入、图纸、结果、动作和配方匹配。 |
| 材料系统 | 材料贡献、容量、品质修正和效果写入。 |
| 品质系统 | 品质池、保底、物品元数据和确定性算法。 |
| 锻造历史记录 | 玩家锻造数据、自动保存和异常排查。 |
| GUI | 锻造界面与配方书模板。 |
| 审计 | 结果物品的锻造审计数据与材料签名。 |
| 占位符 | PlaceholderAPI 输出。 |
| CoreLib 动作 | Forge 注册的刷新动作。 |
| API 接入 | EmakiForgeApi 静态门面。 |
| 事件 API | ForgeStartEvent、ForgeCompletedEvent。 |
| JavaScript 脚本 | 锻造成功率规则与结果钩子。 |
典型锻造流程
- 玩家用
/ef forge打开锻造 GUI。 - 在图纸槽放入图纸,Forge 按图纸物品源自动匹配配方。
- 在必需材料槽和可选材料槽放入材料。
- 模块检查配方、条件、容量和材料数量。
- 玩家点击确认槽,触发
actions.pre。 - 按玩家 + 配方 + 材料指纹计算确定性品质与保底。
- 生成
result.success.outputs中的主产物,并附加 forge layer 快照。 - 依次执行
result.success.actions→actions.success→ 品质动作;失败时执行actions.failure。 - CoreLib 物品装配服务重建物品展示。
- 安装 EmakiAttribute 时,材料的
ea_attribute效果写入结构化 PDC 属性层。
与 Attribute 的关系
Forge 可以不安装 Attribute 运行基础锻造功能。材料的 ea_attribute 效果需要 EmakiAttribute 才会生效:此时属性通过 EmakiAttribute 的权威 API 写入结构化 PDC layer,参与真实战斗计算,而不是只显示在 Lore 中。
EmakiAttribute 未安装时,Forge 走 no-op 路径:锻造照常完成,只是不写入属性 payload,不会报错或中断流程。
JavaScript 调用
CoreLib JavaScript 脚本中可通过 emaki.module("forge") 查询 Forge API 的可用性、版本和就绪状态。当前 Forge 公开 API 只暴露身份与就绪探针;锻造执行仍通过配方、GUI 和动作流程完成。
js
function main(ctx) {
if (emaki.module("forge").available() && emaki.module("forge").ready()) {
emaki.logger.info("Forge API version=" + emaki.module("forge").apiVersion());
}
return true;
}