跳到正文
烈焰甘蔗Wiki

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 有 —— 虚报成功;调用方不消费

相关条目

浏览全部模组