跳到正文
烈焰甘蔗Wiki

世界生成器注册总表

事实基准: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 两个维度的额外行为都不会触发。

相关条目

浏览全部模组