## ① natives 必须平铺,不能保留包路径
natives-linux jar 里的路径是 `linux/x64/org/lwjgl/<module>/lib*.so`,
而 LWJGL 经 java.library.path / LD_LIBRARY_PATH 按**文件名**找库 ——
嵌套一层的目录它找不到。实测:
UnsatisfiedLinkError: Failed to locate library: liblwjgl.so
at RenderSystem.<clinit> → Tesselator.<clinit>
build.sh 原来直接 `unzip -d $OUT/natives`(保留包路径)⇒ 产物不可用。
改为解到临时目录再 `find -name '*.so' -exec cp` 平铺。
(已用新逻辑重铺 store/vanilla-1.20.1/.mcfold/natives,7 个 .so 在根下。)
## ② api_notes 应为 staticmethod
35534b1 把世代分派改成类级调用后,`api_notes` 仍是实例方法,
测试里 `Gen_1_20.api_notes()` 直接 TypeError。它不读 self ⇒ 一律 staticmethod。
这也是它能"不启动后端就做世代对照"的前提。
## ③ classpath.txt 的语义写进注释
它**只含第三方 libraries**;client-named.jar 与 classes/ 由使用方拼接
(build.sh:88 自己拼,测试/后端从各自路径取)。
在 build.sh 里注明,避免下一个人以为它是"完整运行 classpath"。
## 验证
./run_tests.sh → 62 项全绿
.mcfold classpath + 平铺 natives → 渲染联测 **7/7 全绿**
(injected=49 chunks=31 colors=11714 / placed=1003716 chunks=25 colors=4540)
39 lines
1.3 KiB
Python
39 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, ...] = ()
|
||
|
||
@staticmethod
|
||
def api_notes() -> dict:
|
||
return {
|
||
"setLevel": "Minecraft.setLevel(ClientLevel)",
|
||
"render": "GameRenderer.render(float, long, boolean)",
|
||
"count": "LevelRenderer.countRenderedChunks()",
|
||
"deltaTracker": False,
|
||
}
|