WorldGenPamMushroomGarden(蘑菇园生成)
事实基准:harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 |
值 |
来源 |
| 类 |
com.pam.harvestcraft.WorldGenPamMushroomGarden |
WorldGenPamMushroomGarden.java:12 |
| 父类 |
WorldGenerator |
WorldGenPamMushroomGarden.java:13 |
| 构造器 |
WorldGenPamMushroomGarden(Block plantBlockId, int flowerType) |
:17-20 |
| 实例化方 |
PamGardenGenerator.generateSurface,仅 1 处 |
PamGardenGenerator.java:114 |
| 目标方块 |
BlockRegistry.pammushroomGarden |
PamGardenGenerator.java:114 |
| 对应的 12 宫格中的序号 |
第 8 类(enablemushroomgardenGeneration) |
PamGardenGenerator.java:108 |
为什么单列一个类:12 类花园中只有蘑菇园需要先铺 3 格地面再放本体,逻辑无法套用 WorldGenPamGarden 的"直接放一块"模式,因此独立成一个类。
生成逻辑(func_76484_a,:22-34)
for (int l = 0; l < 8; ++l) {
int i1 = i + random.nextInt(8) - random.nextInt(8);
if (!world.func_147437_c(i1, j1 = j + random.nextInt(4) - random.nextInt(4),
k1 = k + random.nextInt(8) - random.nextInt(8))
|| !this.plantBlockId.func_149742_c(world, i1, j1, k1)) continue;
world.func_147465_d(i1, j1, k1, Blocks.field_150364_r, 4, 2);
world.func_147465_d(i1 + 1, j1, k1, Blocks.field_150364_r, 4, 2);
world.func_147465_d(i1 - 1, j1, k1, Blocks.field_150364_r, 4, 2);
world.func_147465_d(i1, j1 + 1, k1, this.plantBlockId, this.flowerType, 2);
}
return true;
| 项 |
值 |
说明 |
| 每次调用尝试次数 |
8(硬编码 :23) |
与 WorldGenPamGarden 相同 |
| X / Y / Z 偏移 |
−7…+7 / −3…+3 / −7…+7 |
与 WorldGenPamGarden 相同(同样是两个独立随机数相减) |
| 地面 |
Blocks.field_150364_r,3 格:(i1, j1, k1)、(i1+1, j1, k1)、(i1-1, j1, k1) |
meta = 4,更新标志 = 2 |
| 本体 |
(i1, j1+1, k1),即三格地面的正上方 1 格 |
meta = this.flowerType(恒为 0) |
与 WorldGenPamGarden 的三处差异
| 差异 |
WorldGenPamGarden |
WorldGenPamMushroomGarden |
| 地面铺垫 |
无 |
3 格,meta 4,用 Blocks.field_150364_r |
| 放置的 Y |
与候选点同高 j1 |
候选点上方 1 格 j1 + 1 |
| 放置次数 |
每次尝试放 1 块 |
每次尝试放 4 块(3 地面 + 1 本体) |
注意 3 格地面中间那格 (i1, j1, k1) 与本体位置 j1+1 组合后,本体正好在 3 格地面的正上方;但左右两格 (i1±1, j1, k1) 地面上没有对应本体。
SRG 名(全部未解析)
| SRG 名 |
行 |
语义佐证 |
Blocks.field_150364_r |
:28-30 |
在本文件被用作铺在候选点同一高度、且要求 func_147437_c 判定为"可放置"的方块。在 WorldGenPamFruitTree 中同名方块被当作"树干"竖直堆叠。推定为泥土或原木一类的实体方块;本机无 MCP 映射表,不作断定。 |
world.func_147437_c |
:27 |
"该位置可放置"类判定 |
plantBlockId.func_149742_c |
:27 |
方块自身的放置可行性判定 |
world.func_147465_d |
:28-31 |
六参 (x, y, z, Block, int meta, int flags) 放置方块 |
func_76484_a |
:22 |
5 参生成入口 |
Blocks.field_150345_g(作物 IPlantable)、field_150350_a(泥土)、field_150349_c(草方块)等在本文件中不出现。
源码缺陷 / 观察
| 位置 |
问题 |
有无运行时影响 |
:28-31 |
3 格地面 + 1 格本体 = 4 次 setBlock,但只做了 1 次位置校验(:26-27)。左右两格地面 i1±1 未经 func_147437_c 校验就被写入,可能覆盖掉实体方块或空气上方的方块。 |
有 |
:30 |
三格地面之间的本体只放在正上方 1 格,左右格顶部为空,形状是"T"形而非"三连"。 |
有(形状设计问题,非逻辑错误) |
:27 |
本体 meta = this.flowerType,上游传 rand.nextInt(1) 恒为 0 |
有 —— 蘑菇园无随机性 |
:34 |
无论成功与否一律 return true |
有 —— 虚报成功;调用方不消费 |
相关条目