跳到正文
烈焰甘蔗Wiki

WorldGenPamFruitPalmTree(棕榈果树生成 · 死代码)

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

概览:本类从未被实例化

检查项 结果
全仓库对类名的引用 仅 2 处,且都在本文件内:WorldGenPamFruitPalmTree.java:13(类声明)、:20(构造器声明)
new WorldGenPamFruitPalmTree(...) 0 处
在 PamTreeGenerator / PamGardenGenerator / HarvestCraft 中出现 无
是否有 @Optional / 反射加载 无

因此本类的 generate 从不执行。 本条目记录其源码形态与其中的确证缺陷,但这些缺陷当前无任何运行时后果(无调用点)。

基本信息

属性 值 来源
类 com.pam.harvestcraft.WorldGenPamFruitPalmTree WorldGenPamFruitPalmTree.java:13
父类 WorldGenAbstractTree WorldGenPamFruitPalmTree.java:14
构造器 (boolean, int minTreeHeight, int metaWood, int metaLeaves, Block fruitType) :20-26
状态 死代码 —

生成流程(func_76484_a,:28-103)

步骤 逻辑 行
1 树高 treeHeight = rand.nextInt(2) + minTreeHeight(注意是 nextInt(2),另两个果树类是 nextInt(3)) :29
2 边界校验 y >= 1 && y + treeHeight + 1 <= 256 :31
3 空间校验:逐层 b0 0/1/2,要求 isAir | isLeaves | Blocks.field_150349_c | Blocks.field_150346_d | isWood :32-51
4 地表校验:j11 != field_150349_c && j11 != field_150346_d 或 y >= 256 - treeHeight - 1 → return false :55-58
5 把 y-1 处的地表改写成泥土:func_147449_b(x, y-1, z, Blocks.field_150346_d) :59
6 手工摆放 35 个方块:顶端树叶 y+treeHeight+2、两格树干 y+treeHeight 与 +1、四个方向的斜向叶枝、四个对角的果实 :60-94
7 补齐树干:for l1 in 0..treeHeight-1 逐层放 Blocks.field_150364_r :95-99
8 return true :100

源码缺陷(3 处确证)

1. 内层循环用错坐标轴(:41)

for (int l1 = x - b0; l1 <= x + b0 && flag; ++l1) {      // :40  外层:X 轴
    for (int j1 = x - b0; j1 <= x + b0 && flag; ++j1) {  // :41  内层:又是 X 轴 —— 应为 Z

内层循环用的是 x 而不是 z。对照 WorldGenPamFruitTree.java:46 的同型代码,内层应为 par5 - b0 … par5 + b0(Z 轴)。

后果:空间校验实际检查的是 x 附近的一个 X×X 的竖直薄片,而不是 x×z 的柱体。Z 方向完全不被校验,而下方 :63,66,67,… 摆放树叶时却按 Z 偏移(z+1、z+2、z+3、z+4、z-1…)—— 校验范围与摆放范围不一致。

2. 失败路径返回 true(:102)

if (y >= 1 && y + treeHeight + 1 <= 256) {
    ...
    return true;     // :100  成功
    return false;    // :86 / :57  内部失败
}
return true;         // :102  ← 边界校验失败时也返回 true

y 越界(y < 1 或 y + treeHeight + 1 > 256)时,方法返回 true,即向调用方报告"生成成功",但实际上一个方块都没放。

对照 WorldGenPamFruitTree.java:33 / :90:同类结构的外层失败分支是 return false,本类把它写成了 return true。

由于本类无调用点,IWorldGenerator / WorldGenerator 也不会消费这个返回值(若真被注册,返回值会被忽略),所以这是正确性缺陷但无实际影响。

3. 覆写地表(:59)

func_147449_b(x, y-1, z, Blocks.field_150346_d) 会把脚下的草地/泥土直接替换成泥土,且没有 onPlantGrow 调用(另两个果树类在 :63 有 onPlantGrow)。这会抹掉草方块的形态。

SRG 名(全部未解析)

SRG 名 行 语义佐证
Blocks.field_150349_c :44,56 在 :59 之前被当作"可接受的地表"检查,之后被写入 —— 草方块
Blocks.field_150346_d :44,56,59 同上,:59 明确把它写入地表 —— 泥土
Blocks.field_150364_r :61,62,98 逐层竖直堆叠 —— 原木
Blocks.field_150362_t :60,63,… 大范围横向摆放 —— 树叶
par1World.func_147439_a :43,55,96 三参取方块
par1World.func_147449_b :59 四参 (x,y,z,Block) 放置且不带 meta
func_150516_a :60,… 带 meta 的放置
func_76484_a —— 5 参生成入口

相关条目

浏览全部模组