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 越界分支),两处赋值冗余。 |
以上均为可读性/冗余问题,没有改变行为。
相关条目
- PamTreeGenerator —— 谁创建本类
- WorldGenPamFruitLogTree —— 变体(树干用果实方块、不挂果)
- WorldGenPamFruitPalmTree —— 另一个未被使用的变体
- 兄弟维度:网络包 · 配置 · 兼容层