流程说明
强化流程围绕“目标装备 + 强化配方 + 消耗材料 + 成功/失败结果”运行。排查问题时按流程定位:先看配方是否匹配,再看材料和费用,最后看 PDC 写入与展示刷新。
标准流程
text
┌─────────────────────────────────────────────────────────────┐
│ 1. 玩家打开强化 GUI │
│ 2. 放入目标装备 → 读取当前星级与锻印等级 │
│ 3. 按 match 规则匹配可用强化配方 │
│ 4. 校验材料、费用、条件和星级上限 │
│ 5. 计算成功率(目标星级基础率 + 锻印加成,钳制到上限) │
│ 6. 触发 StrengthenPreAttemptEvent(可取消、可改写成功率) │
│ 7. 执行随机判定 → 成功 / 失败 │
│ 8. 按结果重建物品并写入 strengthen layer │
│ 9. 扣除经济费用 │
│ 10. 触发 JavaScript 结果钩子与 StrengthenAttemptEvent │
│ 11. 执行该星级的 actions.success / actions.failure │
│ 12. 首次达到广播星级时发送本地或全服广播 │
│ 13. 在玩家 owner 线程安全结算 escrow,刷新 GUI 与背包 │
└─────────────────────────────────────────────────────────────┘排查入口
| 现象 | 先检查 |
|---|---|
| GUI 显示无法强化 | 配方 match、当前星级、limits.max_star 和 stars 节点。 |
| 点击后提示材料不足 | materials、物品来源、数量和玩家实际背包。 |
| 金币不足或扣费异常 | economy.currencies、经济提供器和 cost_formula。 |
| 星级没有变化 | strengthen layer 是否写入,是否被失败降星或保护材料影响。 |
| Lore 没刷新 | CoreLib 装配是否执行,必要时使用 /estrengthen refresh。 |
详细阶段说明
阶段 1-2:打开 GUI 与装备识别
玩家打开强化 GUI 后,将目标装备放入指定槽位。模块会:
- 读取装备当前的 strengthen layer(星级、锻印等级、里程碑标记、成功/失败计数、分支路径)。
- 如果装备没有 strengthen layer,视为 +0。
阶段 3:配方匹配
配方的 match 节点支持以下规则:
| 规则 | 说明 |
|---|---|
source_ids | 精确绑定 EmakiItem / ItemSource 标识。推荐优先使用。 |
source_types | 按物品来源类型匹配。 |
source_patterns | 按物品来源模式匹配。 |
slot_groups | 粗粒度槽位组/装备类型组(weapon/armor/offhand/generic),不是具体装备槽位。 |
lore_contains | Lore 包含指定文本。 |
stats_any | 拥有指定属性之一。 |
同时还要求当前星级未达到 limits.max_star,且目标星级在 stars 中有对应配置。
阶段 4:校验
| 校验项 | 失败行为 |
|---|---|
| 必需材料数量 | 提示材料不足,阻止操作。 |
| 经济余额 | 扣费失败时返回未提交结果。 |
| 条件检查 | 条件不满足时返回 strengthen.error.condition_not_met。 |
| 星级上限 | 已达 limits.max_star 时阻止操作。 |
保护材料和锻印材料在此阶段被识别但不强制要求。
阶段 5:成功率计算
text
成功率 = 目标星级基础成功率 + 有效锻印等级 × temper_chance_bonus_per_level
最终成功率 = clamp(成功率, 0, success_chance_cap)- 目标星级基础成功率优先取配方
success_rates中对应目标星级的值;配方未配置时回退到config.yml的全局success_rates。 - 有效锻印等级 =
clamp(当前锻印 + 材料提供的 temper_boost, 0, max_temper)。
阶段 6-7:事件与随机判定
StrengthenPreAttemptEvent 在主线程触发,可取消,也可通过 setSuccessRate 改写成功率。随后生成 [0, 100) 区间随机数,小于成功率即判定成功。
阶段 8:写入强化层
| 结果 | 星级 | 锻印 |
|---|---|---|
| 成功 | 提升到目标星级 | 重置为 0 |
| 失败(目标星级 < 6) | 保持不变 | 累加锻印增量 |
| 失败(目标星级 ≥ 6,无保护材料) | 降 1 星,最低 0 | 累加锻印增量 |
| 失败(有保护材料) | 保持不变 | 累加锻印增量 |
锻印增量:目标星级 ≤ 8 时 +1,目标星级 > 8 时 +2;累加后钳制到 limits.max_temper。
成功和失败都会更新装备上的成功次数、失败次数和最后尝试时间;成功时还会记录首次达到的星级里程碑。
阶段 9-13:扣费、动作与安全结算
- 物品重建成功后才扣除经济费用;扣费失败时本次尝试不提交。
- JavaScript 结果钩子和
StrengthenAttemptEvent在结算阶段触发。 - 对应星级的
actions.success/actions.failure会获得可变item_target,动作链全部完成后才读取最终物品。 - 首次达到
broadcast.local_stars或broadcast.global_stars中的星级时发送广播,详见广播系统。 - 最终物品、未消耗材料和其他 escrow 内容只在玩家 owner 线程结算,然后刷新 GUI 与玩家背包。
待结算与恢复
如果结果动作已完成,但玩家离线或实体调度被拒绝,本次尝试会保留为待结算状态,不会提前发放,也不会丢弃 escrow:
- 玩家重新加入时,模块会在该玩家的 owner 线程重试。
- 玩家再次打开强化 GUI 时也会尝试恢复待结算项。
- GUI 关闭或配置重载不会清除已提交结果的待结算状态。
- 结算按阶段记录进度;如果结果物品已发放、后续材料返还发生异常,重试只继续剩余阶段,不会重复发放结果物品。
- 待结算项只有在全部阶段成功完成后才移除,以保证重试幂等。
待结算队列是当前服务器进程内的运行时恢复机制;本页不承诺跨完整服务端重启持久化。
锻印(Temper)
锻印是失败时累积的等级,用于补偿连续失败:
- 每次失败按目标星级增加 1 或 2 级锻印,上限为
limits.max_temper。 - 每级锻印按
limits.temper_chance_bonus_per_level提升下一次的成功率。 - 强化成功后锻印重置为 0。
- 材料可配置
temper_boost,在本次尝试中额外提供锻印加成。 - 管理员可用
/estrengthen clearcrack清除主手装备的锻印值。
锻印状态保存在 strengthen layer 的 PDC 中。
里程碑星级
stars.<星级>.name 可以给该星级命名,用于 GUI 展示。装备状态会记录首次达到过的星级集合,用于避免重复广播。
达到里程碑星级时可以通过该星级的 effects 和 actions 触发:
- 额外属性加成(
ea_attribute)与技能附加(es_skill)。 - 名称前缀或 Lore 标记(
name_action/lore_action)。 - 成功动作(如全服广播、音效、标题)。
动作节点
星级阶段的 actions 节点支持两个键:
| 节点 | 触发时机 |
|---|---|
actions.success | 该星级强化成功后。 |
actions.failure | 该星级强化失败后。 |
动作示例
yaml
stars:
8:
name: "<gold>伤害提升</gold>"
actions:
success:
- 'sendtitle title="<gold><bold>+8 物理伤害提升</bold></gold>" subtitle="<yellow>额外增伤已解锁</yellow>"'
- "playsound sound=minecraft:entity.player.levelup volume=1.1 pitch=1.2"
failure:
- 'sendmessage text="<red>强化失败,当前等级 +%star%。</red>"'
- "playsound sound=minecraft:block.anvil.destroy volume=1 pitch=0.8"动作行中可用的占位符见占位符参考。