跳到正文
烈焰甘蔗Wiki

WorldGenPamFruitTree(普通果树生成)

事实基准:harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。

基本信息

属性 值 来源
类 com.pam.harvestcraft.WorldGenPamFruitTree WorldGenPamFruitTree.java:15
父类 WorldGenAbstractTree(不是 IWorldGenerator 的顶层注册对象) WorldGenPamFruitTree.java:16
实例化方 PamTreeGenerator.generateSurface PamTreeGenerator.java:53,58,63,…
直接注册 否 HarvestCraft.java:124 只注册 PamTreeGenerator

构造器

public WorldGenPamFruitTree(boolean par1, int par2, int par3, int par4, Block par5)

(WorldGenPamFruitTree.java:22-28)

形参 字段 含义
par1 → super(par1) WorldGenAbstractTree 的"是否需要更新方块通知"标志
par2 minTreeHeight 最小树高
par3 metaWood 树干方块 meta
par4 metaLeaves 树叶方块 meta
par5 fruitType 结果时挂的果实方块

字段全部 final(:17-20)。

PamTreeGenerator 实际使用的实参组合:

组合 调用点 用途
(true, 5, 0, 0, pamXxx) 温带 9 种,如 :53 普通果树,meta 全 0
(true, 5, 3, 3, pamCoconut) 海洋椰子 :103、热带椰子 :124 棕榈感配色,meta 3

生成流程(func_76484_a,:30-91)

func_76484_a 是原版 WorldGenerator.generate(World, Random, int, int, int)(SRG 名 → 未解析;语义佐证:PamTreeGenerator 以 world, rand, x, y, z 五参调用它,且 IWorldGenerator 在 1.7.10 继承自 WorldGenerator)。

步骤 逻辑 行
1 实际树高 l = par2Random.nextInt(3) + minTreeHeight → 最小高 5 时为 5~7 :31
2 高度前置校验:par4 >= 1 && par4 + l + 1 <= 256,否则 return false :33
3 空间校验:逐层检查,底部 1 层 b0=0、顶部 2 层 b0=2、其余 b0=1;要求范围内全部 isReplaceable :37-56
4 任一格不可替换 → return false :57-59
5 土壤校验:取 par4-1 处方块,要求 canSustainPlant(world, x, y, z, ForgeDirection.UP, <Plantable>) 为真 :60-61
6 土壤不成立或 par4 >= 256 - l - 1 → return false;否则 onPlantGrow(...) 消耗骨粉/生长 :62-63
7 树冠:从 par4 - 3 + l 到 par4 + l 逐层,半径 l1 = 1 - (i3/2),角上 50% 概率跳过(i3 == 0 时不跳) :66-80
8 放树叶:func_150516_a(world, x, y, z, Blocks.field_150362_t, metaLeaves) :75
9 挂果:当 y-1 与 y-2 都是 Blocks.field_150350_a、k1 > 2 且 rand.nextInt(4) == 0 时,在 y-1 放 fruitType :76-77
10 树干:逐层放 Blocks.field_150364_r,meta 为 metaWood :81-85
11 return true :86

SRG 名(全部未解析,本机无 MCP 映射表)

下列名字在源码中以 SRG 形式出现。语义佐证来自它们在本文件内的用法:

SRG 名 出现位置 语义佐证 推定
Blocks.field_150362_t :75 作为"树叶"的方块传给 func_150516_a(World, int, int, int, Block, int) 树叶
Blocks.field_150364_r :84 作为"树干"逐层竖直堆叠 原木
Blocks.field_150350_a :76 果实必须"悬在两格该方块之上" 泥土
Blocks.field_150345_g :61 作为 IPlantable 传给 canSustainPlant 作物(种子)
par1World.func_147439_a :48,60,82 三参 (int,int,int) 取方块 World.getBlock
par1World.func_147465_d :77 五参 (x,y,z,Block,int,int) 放置方块 World.setBlock 带 meta 与更新标志
par1World.func_147449_b —— (本文件未用) — —
func_150516_a :75,84 5 参 + meta 的原版"带 meta 放方块"辅助方法 setBlock 变体
func_76484_a —— 5 参生成入口 WorldGenerator.generate

这些"推定"列是根据用法推断的,不是 MCP 映射。 唯一可确证的是"它们被当作树叶/树干/泥土/作物使用"这一调用位置事实。

源码缺陷 / 观察

位置 问题
WorldGenPamFruitTree.java:76 果实生成条件里 rand.nextInt(4) != 0 时 continue,即 25% 概率挂果。但该 rand.nextInt(4) 位于"两格泥土"检查之后的 `
WorldGenPamFruitTree.java:45-46 循环条件写成 j1 <= par3 + b0 && flag / k1 <= par5 + b0 && flag,即用 flag 参与循环条件(而非体内 break)。功能正确但可读性差。
WorldGenPamFruitTree.java:50-52 flag = false; continue; 之后紧跟 flag = false;(i1 越界分支),两处赋值冗余。

以上均为可读性/冗余问题,没有改变行为。

相关条目

浏览全部模组