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的判断。
相关条目
- 世界生成器注册总表
- WorldGenPamGarden · WorldGenPamMushroomGarden
- 兄弟维度:网络包 · 配置 · 兼容层