跳到正文
烈焰甘蔗Wiki

PamGardenGenerator(野生花园生成)

事实基准:harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。 本条目的 switch 结论已用 class 字节码复核。

基本信息

属性 值 来源
类 com.pam.harvestcraft.PamGardenGenerator PamGardenGenerator.java:16
实现 IWorldGenerator PamGardenGenerator.java:17
注册条件 无条件 HarvestCraft.java:123
注册权重 0 HarvestCraft.java:123

字节码级复核:维度 switch

PamGardenGenerator.class 的 generate 方法(code_len=105)与 PamTreeGenerator.generate 结构完全相同:

偏移 指令 归属
8 lookupswitch default +96;0→+36,6→+51,7→+72
44–56 aload_0 … invokevirtual #36 case 0(主世界)→ generateSurface,其后无 goto
59 getstatic #42 case 6;enableAroma1997sdimensionalworldgardenGen
62 ifeq → 80 开关为 false 跳到 case 7
65–77 … invokevirtual #36 generateSurface,其后无 goto
80 getstatic #45 case 7;enabletwilightforestgardenGen
83 ifne → 89 · 86 goto → 104 —
104 return default 落点

裁定:与 PamTreeGenerator 相同,case 0 与 case 6 是真实落穿。 字节码 @56 后、@77 后都没有 goto。

与果树生成器不同,PamGardenGenerator.generateSurface 内部没有 switch,全是顺序的 if (配置开关 && 生态条件) 块,因此不存在"内层编译期落穿"的问题需要区分。

维度 行为 主世界调用次数
0 1 次 + Aroma 开关 1 次 + 暮色森林开关 1 次 1~3 次
6 Aroma 开关为 true 才执行,再落入 case 7 0~2 次
7 暮色森林开关为 true 才执行 0~1 次
其它 无 0

默认 4 个 dimensions 开关全为 false(BlockRegistry.java:438-441),主世界恰好执行 1 次。

12 类花园与生态条件

generateSurface(PamGardenGenerator.java:35-153)开头对 DEAD 生态直接 return(:42-44)。其余为 12 个独立 if:

# 花园方块 开关(gardens 分类) 生态条件 行
1 pamberryGarden enableberrygardenGeneration FOREST | HILLS | COLD | WET :45-53
2 pamdesertGarden enabledesertgardenGeneration SANDY :54-62
3 pamgrassGarden enablegrassgardenGeneration PLAIN 且非 COLD :63-71
4 pamgourdGarden enablegourdgardenGeneration PLAIN | FOREST :72-80
5 pamgroundGarden enablegroundgardenGeneration MOUNTAIN | HILLS | MESA | SAVANNA :81-89
6 pamherbGarden enableherbgardenGeneration (FOREST 且非 COLD) | WET :90-98
7 pamleafyGarden enableleafygardenGeneration (FOREST 且非 COLD) | WET :99-107
8 pammushroomGarden enablemushroomgardenGeneration (FOREST 且非 COLD 且非 MOUNTAIN) | WET :108-116
9 pamstalkGarden enablestalkgardenGeneration (PLAIN 且非 COLD) | (FOREST 且非 COLD) | WET :117-125
10 pamtextileGarden enabletextilegardenGeneration COLD | HILLS | WET :126-134
11 pamtropicalGarden enabletropicalgardenGeneration WET | HOT :135-143
12 pamwaterGarden enablewatergardenGeneration (OCEAN 且非 COLD) | (RIVER 且非 COLD) :144-152
  • 12 个开关默认全为 true(BlockRegistry.java:378-389)。
  • 11 类用 new WorldGenPamGarden(方块, flowerType);只有第 8 项蘑菇园用 new WorldGenPamMushroomGarden(...)(:114)。
  • BiomeDictionary.Type 是 Forge 的原版生物群系字典(net.minecraftforge.common.BiomeDictionary),非 SRG 名。

共同的放置参数

12 个分支的放置代码完全同构(以 :46-52 为例):

for (i = 0; i < BlockRegistry.gardenRarity; ++i) {
    flowerType = rand.nextInt(1);
    randPosX = chunkX + rand.nextInt(16) + 8;
    randPosY = rand.nextInt(128);
    randPosZ = chunkZ + rand.nextInt(16) + 8;
    new WorldGenPamGarden(BlockRegistry.pamberryGarden, flowerType).func_76484_a(world, rand, randPosX, randPosY, randPosZ);
}
参数 值 说明
每区块尝试次数 BlockRegistry.gardenRarity,默认 2 BlockRegistry.java:373(gardens 分类)
flowerType rand.nextInt(1) 恒为 0 —— nextInt(1) 的取值范围只有 {0}
X chunkX*16 + rand.nextInt(16) + 8 实际范围 +8 … +23
Y rand.nextInt(128) 0 … 127
Z chunkZ*16 + rand.nextInt(16) + 8 实际范围 +8 … +23

源码缺陷

位置 问题
PamGardenGenerator.java:20-28 case 0 缺 break,落穿进 case 6(字节码 @56 后无 goto)。
PamGardenGenerator.java:23-28 case 6 缺 break,落穿进 case 7(字节码 @77 后无 goto)。
PamGardenGenerator.java:47(及 11 处同型) flowerType = rand.nextInt(1) —— 参数上界为 1,恒返回 0。花园方块的 meta 永远是 0,多样性随机失效。
PamGardenGenerator.java:48,50(及 11 处同型) 传入的是 chunkX*16,再加 rand.nextInt(16) + 8,X/Z 实际落在 chunk*16+8 … chunk*16+23 —— 越出本区块(0…15)进入相邻区块。若原意是"取区块内随机点",+8 是多余的。

上述两条 +8 / nextInt(1) 的问题是源码层面可确证的写法缺陷,不依赖对 break 的判断。

相关条目

浏览全部模组