用户定向:在 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 处)
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
"""1.20.x 渲染后端。
|
||
|
||
对应 Java 源码:scaffold/java/gen_1_20/
|
||
编译目标:1.20.x 的 client jar(重映射为可读名后)
|
||
|
||
API 特征(实测):
|
||
setLevel(ClientLevel)
|
||
GameRenderer.render(float partialTick, long nanoTime, boolean renderLevel)
|
||
LevelRenderer.countRenderedChunks()
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from .base import RenderBackend
|
||
|
||
|
||
class Gen_1_20(RenderBackend):
|
||
"""1.20.x 系列(含 1.20 / 1.20.1 / 1.20.2 / 1.20.3 / 1.20.4 / 1.20.5 / 1.20.6)。"""
|
||
|
||
generation = "gen_1_20"
|
||
# ★ 诚实标注:仅实测过 1.20.1 与 1.20.2(以及 1.20.1 的 mappings 对比)。
|
||
# 1.16~1.19 未验证 —— 不要因为「看起来同代」就宣称支持。
|
||
verified_versions = ("1.20.1", "1.20.2")
|
||
min_mc_version = "(未验证)"
|
||
max_mc_version = "1.20.6" # 1.21 起换世代(由 DeltaTracker 判据确定)
|
||
|
||
# 该世代的 Java 源码目录(相对 scaffold/java/)
|
||
java_dir = "java/gen_1_20"
|
||
# 判据类(用于自动识别)
|
||
markers: tuple[str, ...] = ()
|
||
|
||
def api_notes(self) -> dict:
|
||
return {
|
||
"setLevel": "Minecraft.setLevel(ClientLevel)",
|
||
"render": "GameRenderer.render(float, long, boolean)",
|
||
"count": "LevelRenderer.countRenderedChunks()",
|
||
"deltaTracker": False,
|
||
}
|