FML 生命周期阶段

基本信息

属性 值
枚举类 alexiil.mods.load.FMLProgressTracker.Stage
总阶段数 7(含 LOAD_COMPLETE → FINAL_LOADING 衔接)
跨度 PROGRESS_SPAN = 1F / (VALUES.length - 1) = 1/6 ≈ 0.1667
根条索引 FML_ROOT_BAR_INDEX = 0(“Loading”)
生命周期条索引 FML_LIFECYCLE_BAR_INDEX = 1

阶段枚举

阶段 ordinal nameKey fallbackName fmlTitle 跨度区间
0 construction Construction Construction 0.000 – 0.167
1 pre_initialization Pre Initialization PreInitialization 0.167 – 0.333
2 lite LiteLoader null 0.333 – 0.500
3 initialization Initialization Initialization 0.500 – 0.667
4 post_initialization Post Initialization PostInitialization 0.667 – 0.833
5 completed Completed LoadComplete 0.833 – 1.000
6 reloading_resource_packs Reloading Resource Packs null 1.000(连接 LOAD_COMPLETE 后的刷新)

行为

  • fromProgressBar(bar):根据当前活跃 ProgressBar 列表里 index=1 的标题与 fmlTitle 字符串匹配,返回对应 Stage;非生命周期条返回 null。
  • translate():查 betterloadingscreen.state.<nameKey> 的翻译键(来自 assets/betterloadingscreen/lang/*.lang),未命中用 fallbackName。
  • PROGRESS_SPAN:把 0~1 整体进度均分到 6 个阶段(含 LOAD_COMPLETE);FINAL_LOADING 仅在 LOAD_COMPLETE pop 时显示在 1.0 处。

三类回调

FMLProgressTracker 在 ASM transformer 注入到 ProgressManager.push/step/pop 后调用:

onBarPush(bar)

  • 客户端侧才生效。
  • refreshActiveBars() 重抓 ProgressManager.barIterator() 到 activeBars。
  • 调 displaySubProgress() 把活跃条中非生命周期条的最新一条写到 sub-progress。

onBarStep(bar)

  • 通过 Stage.fromProgressBar 判断当前 bar 是否为生命周期条。
  • 是生命周期条 → 计算 percent = (stage.ordinal() + completedSteps / steps) * PROGRESS_SPAN,并把 bar.getMessage() 拼成 "<stage>: loading <message>"。
  • 不是 → 仅刷新 sub-progress,不动主进度。

onBarPop(bar)

  • 若 pop 的是 LOAD_COMPLETE → 主进度跳到 1F,文本切换为 FINAL_LOADING.translate()。
  • 其他生命周期条 pop → 主进度跳到 (ordinal + 1) * PROGRESS_SPAN,仅显示阶段名(注释明确:避免误导用户以为是刚 pop 的那个 mod 卡住)。
  • 非生命周期条 pop → 刷新 sub-progress。

子进度计算

getSubProgress() 扫描 activeBars 里 index > FML_ROOT_BAR_INDEX 且不是生命周期条且 title 非空的条,取首条标题 + 末条标题(用 " - " 连接),以及末条 message 与 step/steps 计算的百分比。

LiteLoader 桥接

LiteLoaderProgress extends com.mumfrey.liteloader.client.gui.startup.LoadingBar,覆盖 LiteLoader 的 _incLiteLoadingBarProgress / _setEnabled / _setMessage 等回调,把 LiteLoader 进度折算到 LITE_LOADER_INIT 阶段的内部比例(PROGRESS_SPAN * liteProgress / totalLiteProgress)后通过 ProgressDisplayer.displayProgress 上报。

相关条目