Skip to content

流程说明

强化流程围绕“目标装备 + 强化配方 + 消耗材料 + 成功/失败结果”运行。排查问题时按流程定位:先看配方是否匹配,再看材料和费用,最后看 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_starstars 节点。
点击后提示材料不足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_containsLore 包含指定文本。
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_starsbroadcast.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 展示。装备状态会记录首次达到过的星级集合,用于避免重复广播。

达到里程碑星级时可以通过该星级的 effectsactions 触发:

  • 额外属性加成(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"

动作行中可用的占位符见占位符参考