Skip to content

EmakiForge

EmakiForge 负责锻造流程:玩家放入目标装备、图纸和材料后,模块检查配方、容量和条件,再改造目标装备或生成新装备。品质、材料贡献和结果展示都在这里配置。

基本信息

项目
模块版本4.6.0
主命令/emakiforge
别名/eforge/ef
硬依赖EmakiCoreLib
软依赖EmakiAttribute、EmakiItem、PlaceholderAPI
主要权限emakiforge.useemakiforge.bookemakiforge.reloademakiforge.debugemakiforge.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 静态门面。
事件 APIForgeStartEventForgeCompletedEvent
JavaScript 脚本锻造成功率规则与结果钩子。

典型锻造流程

  1. 玩家用 /ef forge 打开锻造 GUI。
  2. 在图纸槽放入图纸,Forge 按图纸物品源自动匹配配方。
  3. 在必需材料槽和可选材料槽放入材料。
  4. 模块检查配方、条件、容量和材料数量。
  5. 玩家点击确认槽,触发 actions.pre
  6. 按玩家 + 配方 + 材料指纹计算确定性品质与保底。
  7. 生成 result.success.outputs 中的主产物,并附加 forge layer 快照。
  8. 依次执行 result.success.actionsactions.success → 品质动作;失败时执行 actions.failure
  9. CoreLib 物品装配服务重建物品展示。
  10. 安装 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;
}