世界生成器注册总表
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。 本维度的switch结论已用 jar 内 class 字节码逐条复核,不依赖 CFR 的break呈现。
注册位置
世界生成器全部在 HarvestCraft.init(FMLInitializationEvent) 中注册(HarvestCraft.java:115-125),不是 preInit。共 4 次 registerWorldGenerator 调用,其中 2 次是有条件的。
| # | 生成器类 | 实现 IWorldGenerator |
注册条件 | 权重 | 来源 |
|---|---|---|---|---|---|
| 1 | WorldGenPamSalt |
是(直接) | BlockRegistry.enablesaltGeneration(默认 true) |
1 | HarvestCraft.java:117-119 |
| 2 | PamBeeGenerator |
是(直接) | BlockRegistry.enablebeehiveGeneration(默认 true) |
0 | HarvestCraft.java:120-122 |
| 3 | PamGardenGenerator |
是(直接) | 无条件 | 0 | HarvestCraft.java:123 |
| 4 | PamTreeGenerator |
是(直接) | 无条件 | 0 | HarvestCraft.java:124 |
FML registerWorldGenerator(generator, weight) 的第二个参数是生成权重(0 = 最低)。本模组 4 个里只有盐矿是 1,其余 3 个都是 0。
未直接注册的 5 个 WorldGen* 辅助类
以下 5 个类不是 IWorldGenerator 的顶层注册对象,而是被上面的生成器在运行时 new 出来并直接调用其 generate 方法:
| 类 | 父类 | 实例化方 | 状态 |
|---|---|---|---|
WorldGenPamFruitTree |
WorldGenAbstractTree |
PamTreeGenerator |
在用(温带/热带果树的默认形态) |
WorldGenPamFruitLogTree |
WorldGenAbstractTree |
PamTreeGenerator |
在用(肉桂 / 枫 / 纸皮树) |
WorldGenPamFruitPalmTree |
WorldGenAbstractTree |
无 | 死代码,见该条目 |
WorldGenPamGarden |
WorldGenerator |
PamGardenGenerator |
在用(12 类花园中的 11 类) |
WorldGenPamMushroomGarden |
WorldGenerator |
PamGardenGenerator |
在用(蘑菇园,单独实现) |
三个顶层生成器的 switch (维度 ID) 逐条裁定
三个生成器的 generate 方法都用 switch (world.field_73011_w.field_76574_g) 分派维度。
field_73011_w = World.provider(WorldProvider),field_76574_g = WorldProvider.getDimensionId(),二者均为 SRG 名,本机无 MCP 映射表 → 未解析;语义佐证:结果被用作 switch 选择子,且分支体分别对应"主世界 / Aroma1997 维度 / 暮色森林"这三类维度配置开关。
以下结论来自 class 字节码(lookupswitch 的跳转目标 + 各 case 末指令是否为 goto),不是从 CFR 源码反推:
| 生成器 | 判别器 | case → 绝对偏移 | default | case 末指令 | 是否 fallthrough |
|---|---|---|---|---|---|
PamBeeGenerator |
lookupswitch @8 |
-1 → 36,0 → 51 |
→ 66 | -1: invokevirtual @48 |
是 —— @51 紧接 case 0 |
PamTreeGenerator |
lookupswitch @8 |
0 → 44,6 → 59,7 → 80 |
→ 104 | 0: invokevirtual @56<br>6: invokevirtual @77<br>7: goto @86 |
0→6 是;6→7 是;7 有 goto |
PamGardenGenerator |
lookupswitch @8 |
0 → 44,6 → 59,7 → 80 |
→ 104 | 同上(结构完全相同) | 同上 |
对 brief 中"PamTreeGenerator 是反编译伪影"这一说法的裁定:不成立。 字节码显示 PamTreeGenerator.generate 的 case 0 与 case 6 末都没有 goto,是真的落穿。详见 PamTreeGenerator 与 PamGardenGenerator 的逐指令说明。
真正属于 javac 省略冗余 goto(即源码本有 break、字节码却落穿)的是 PamTreeGenerator.generateSurface 内部按 rand.nextInt(9) / rand.nextInt(25) 选树种的 tableswitch:每个 case 都是 getstatic 配置开关; ifeq <下一个 case 的起始偏移>; <种树>,ifeq 的目标恰好等于下一 case 起点,语义等价于 break。这是唯一应归类为"反编译/编译期落穿"的地方。
各生成器的实际维度行为
| 维度 ID | PamTreeGenerator |
PamGardenGenerator |
PamBeeGenerator |
WorldGenPamSalt |
|---|---|---|---|---|
0(主世界) |
generateSurface |
generateSurface |
generateSurface |
GenerateOverworld |
-1(下界) |
不做(default→return) | 不做 | generateNether(空)后落穿进 generateSurface |
不做 |
6(Aroma1997 维度) |
受 enableAroma1997sdimensionalworldfruittreeGen 开关 |
受 enableAroma1997sdimensionalworldgardenGen 开关 |
不做 | 不做 |
7(暮色森林) |
受 enabletwilightforestfruittreeGen 开关 |
受 enabletwilightforestgardenGen 开关 |
不做 | 不做 |
| 其它 | 不做 | 不做 | 不做 | 不做 |
四个 dimensions 分类的配置项默认值全为 false(BlockRegistry.java:438-441),所以默认安装下 6 / 7 两个维度的额外行为都不会触发。