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 参生成入口 |
相关条目
- WorldGenPamFruitTree —— 实际使用的普通果树(
nextInt(3)树高、挂果、正确校验 Z 轴) - WorldGenPamFruitLogTree —— 实际使用的原木果树
- PamTreeGenerator —— 只创建上面两个,不创建本类
- 兄弟维度:网络包 · 配置 · 兼容层