用户定向:在 python 层写 switch,调用不同 java 后端(而非一个文件里 switch)。
新增:
mcfold/backends/{__init__,base,gen_1_20,gen_1_21}.py 后端体系与分派
scaffold/java/gen_1_20/ 对 1.20.x client jar 编译
scaffold/java/gen_1_21/ 对 1.21.1 client jar 编译(✅ 实测编译通过)
scaffold/java/VERSION-DIFFS.md 实测差异全表
判据:DeltaTracker 类是否存在(1.21 引入,正是 render 签名变化的根源)
⇒ 比硬编码版本号稳
实测差异共 11 处(21 个检查点里 13 个跨世代完全一致):
setLevel / GameRenderer.render / countRendered* / createPackRepository /
ResourceLocation 构造 / enableDataFixerOptimizations(移除) / User 构造 /
ChunkStatus 包路径 / ClientPacketListener 构造(参数个数语义都变) /
loadEffect(变 private)
为什么必须分后端:DeltaTracker 在 1.20.x jar 中不存在,
两代调用无法共存于一份源码(实测编译报 cannot find symbol)。
1.21.1 反混淆已验证(29MB named jar,DeltaTracker 3 处)
37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""1.21+ 渲染后端。
|
||
|
||
对应 Java 源码:scaffold/java/gen_1_21/
|
||
编译目标:1.21.x 的 client jar(重映射为可读名后)
|
||
|
||
API 特征(实测,与世代 A 的差异):
|
||
setLevel(ClientLevel, ReceivingLevelScreen$Reason) ← 多一个参数
|
||
GameRenderer.render(DeltaTracker, boolean) ← 签名整个换了
|
||
Minecraft.getTimer() → DeltaTracker ← 1.21 引入
|
||
LevelRenderer.countRenderedSections() ← 1.20.2 起改名
|
||
|
||
★ 这些差异**无法**写在与 1.20 相同的源码里:
|
||
DeltaTracker 在 1.20.x 的 jar 中不存在 ⇒ 编译期即失败。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from .base import RenderBackend
|
||
|
||
|
||
class Gen_1_21(RenderBackend):
|
||
"""1.21+ 系列。"""
|
||
|
||
generation = "gen_1_21"
|
||
min_mc_version = "1.21"
|
||
max_mc_version = ""
|
||
java_dir = "java/gen_1_21"
|
||
markers = ("net/minecraft/client/DeltaTracker.class",)
|
||
|
||
def api_notes(self) -> dict:
|
||
return {
|
||
"setLevel": "Minecraft.setLevel(ClientLevel, ReceivingLevelScreen$Reason)",
|
||
"render": "GameRenderer.render(DeltaTracker, boolean)",
|
||
"count": "LevelRenderer.countRenderedSections()",
|
||
"deltaTracker": True,
|
||
"source": "Minecraft.getTimer()",
|
||
}
|