Okra Crop(pamokraCrop)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册名 | harvestcraft:pamokraCrop |
BlockRegistry.java:786 |
| 源码类 | BlockPamCrop(extends BlockCrops implements IPlantable) |
BlockPamCrop.java:24-26 |
| 字段 | BlockRegistry.pamokraCrop |
BlockRegistry.java:596 |
| 构造 | new BlockPamCrop().func_149658_d("okra").func_149663_c("pamokraCrop") |
BlockRegistry.java:596 |
| 纹理基名 | okra |
func_149658_d 实参 |
| 生长贴图 | harvestcraft:okracrop_0 ~ okracrop_3,共 4 张 |
BlockPamCrop.java:658-661 |
| 显示名 | tile.pamokraCrop.name = Okra Crop |
en_US.lang:193 |
| 创造标签 | 未调用 func_149647_a(创造标签 setter),继承原版 BlockCrops |
— |
| TileEntity | 无(BlockPamCrop 未实现任何 TileEntity) |
— |
| 多方块 | 否,单方块,无朝向覆写 | — |
生长
| 项 | 值 | 来源 |
|---|---|---|
| 生长阶段数 | 8(metadata 0–7) |
BlockPamCrop.java:32-38 |
| 成熟判定 | metadata == 7 | BlockPamCrop.java:43、:51 |
| 阶段 → 贴图 | 0,1→icons[0];2,3→icons[1];4,5→icons[2];6→先改写为 5 再 >>1 故也是 icons[2];≥7→icons[3] |
BlockPamCrop.java:31-39 |
| 贴图数组长度 | new IIcon[4] |
BlockPamCrop.java:658 |
| 成熟所需时间 / 随机刻 | 源码未定义(HarvestCraft 未覆写随机刻生长) | 见下 |
| 是否需要浇水 | 源码未定义(HarvestCraft 不干预,继承原版 BlockCrops) |
见下 |
| 适宜季节 | 1.7.10 源码中不存在季节机制 | 见下 |
| 适宜温度 | 1.7.10 源码中不存在温度机制 | 见下 |
| 适宜地面 | 农田 Blocks.field_150458_ak(func_149854_a 的默认返回,BlockPamCrop.java:86) |
BlockPamCrop.java:86 |
getPlantType |
EnumPlantType.Crop |
BlockPamCrop.java:682 |
| 方块硬度 | 源码未定义(60 处作物构造均未调用任何硬度 setter) | 见下 |
| 破坏掉落数量 | rightclickharvestCrop 为 true 时返回 0,为 false 时返回 1 |
BlockPamCrop.java:58-63 |
为什么上面有 5 行是「源码未定义」
这些不是漏写,而是 1.7.10 GTNH 版的源码里确实不存在对应数据。逐项核查方式:
| 项 | 核查方式 | 结论 |
|---|---|---|
| 生长阶段数 | HarvestCraft 自身的贴图映射与成熟判定 | 8,可证(见上表) |
| 成熟时间 / 随机刻 | 全源码树 grep -rn "func_149874_m"(随机刻生长覆写) |
命中 0 —— 生长完全继承原版 BlockCrops,原版源码不在本仓库内,故不编造刻数 |
| 浇水判定 | 同上,无任何相关覆写 | HarvestCraft 不干预,判定继承原版 BlockCrops |
| 季节 / 温度 | 全源码树 grep -rniE "season|temperature|cropSeason" |
命中 0 —— 1.7.10 版没有作物季节或温度系统 |
| 硬度 | 60 处 new BlockPamCrop() 构造调用均无 func_149711_c |
未调用任何硬度 setter;实际数值由原版 BlockCrops + Material.crops 决定,本仓库无原版源码,故不写数值 |
⚠️ 「季节 / 温度机制」是 1.12.2 fork 才有的东西。1.7.10 GTNH 版里全部 60 个作物共用同一套
BlockPamCrop,没有任何按作物区分的季节或温度。
收获产出
| 项 | 种子物品(种下去的那个) | 产出物品(成熟后收获的那个) |
|---|---|---|
| 注册名 | harvestcraft:okraseedItem |
harvestcraft:okraItem |
| 字段 | ItemRegistry.okraseedItem |
ItemRegistry.okraItem |
| 物品类 | ItemSeeds |
ItemPamSeedFood(extends ItemFood) |
| 构造 | new ItemSeeds(BlockRegistry.pamokraCrop, Blocks.field_150458_ak) |
new ItemPamSeedFood(cropfoodRestore, cropsaturationRestore, BlockRegistry.pamokraCrop, Blocks.field_150458_ak) |
| 来源 | ItemRegistry.java:1151 |
ItemRegistry.java:1087 |
| 物品注册 | ItemRegistry.java:1861 |
ItemRegistry.java:1914 |
| 显示名 | Okra Seed |
Okra |
| 食物值 | — | cropfoodRestore(默认 1) |
| 饱和度 | — | cropsaturationRestore(默认 0.6) |
食物值 / 饱和度取自配置项(ItemRegistry.java:912-913,默认 cropfoodRestore = 1、cropsaturationRestore = 0.6),不是源码里写死的数值。
到底掉种子还是掉产出:由 cropsdropSeeds 决定
BlockPamCrop 有两个覆写方法,各自受不同配置控制 —— 这是本组方块最容易误读的地方:
| 覆写方法 | cropsdropSeeds = false(默认) |
cropsdropSeeds = true |
|---|---|---|
func_149866_i()(BlockPamCrop.java:89-470) |
返回产出物品 okraItem |
返回种子物品 okraseedItem |
func_149865_P()(BlockPamCrop.java:472-692) |
返回产出物品 okraItem(不受该配置影响) |
同样返回产出物品 okraItem |
- 默认配置下(
cropsdropSeeds默认false,BlockRegistry.java:429):成熟后收获得到的是产出物品。 func_149866_i末尾兜底返回Items.field_151014_N(BlockPamCrop.java:469);func_149865_P末尾兜底返回Items.field_151015_O(BlockPamCrop.java:651)。
交互
| 触发 | 行为 | 来源 |
|---|---|---|
右键(meta == 7,rightclickharvestCrop 默认 true) |
直接收获:调 func_149697_b 后把方块换成空气 |
BlockPamCrop.java:51-54 |
右键(rightclickmatureshowcropHearts 默认 false) |
在成熟作物上方生成心形粒子 | BlockPamCrop.java:43-50 |
| 随机刻生长 | 未覆写,继承原版 | 全源码树无 func_149874_m |
| 骨粉 | 未覆写,继承原版 BlockCrops |
— |
rightclickharvestCrop 为 true 时 func_149745_a 返回 0(BlockPamCrop.java:58-63),即左键破坏成熟作物不掉落,必须右键收获。
相关配置项
| 配置项 | 所属 | 默认值 | 对本方块的作用 | 来源 |
|---|---|---|---|---|
crops / cropsdropSeeds |
BlockRegistry |
false |
决定收获给种子还是给产出物品 | BlockRegistry.java:429 |
crops / enablecropspecialplanting |
BlockRegistry |
true |
开启与否对农田类作物无影响 | BlockRegistry.java:435 |
crops / rightclickharvestCrop |
BlockRegistry |
true |
是否允许右键收获;关闭后左键破坏才掉落 | BlockRegistry.java:432 |
crops / rightclickmatureshowcropHearts |
BlockRegistry |
false |
右键时是否冒心形粒子 | BlockRegistry.java:431 |
crops / cropfoodRestore |
ItemRegistry |
1 |
产出物品的食物值 | ItemRegistry.java:912 |
crops / cropsaturationRestore |
ItemRegistry |
0.6 |
产出物品的饱和度 | ItemRegistry.java:913 |
miscellaneous recipes / enablecropitemsasseeds |
ItemRegistry |
true |
产出物品能否当种子直接种下 | ItemRegistry.java:923 |
种子还可否从草丛掉落,由 PamCropSeedDropRegistry 中同名 <crop>seeddropfromgrass 开关控制(PamCropSeedDropRegistry.java),稀有度取 seedrarity(默认 1,ItemRegistry.java:922)。
源码缺陷与注意事项
func_149866_i的cropsdropSeeds = false分支与func_149865_P内容完全重复(两处各 60 条同序映射,共 120 条),源码层面存在冗余。BlockPamCrop.func_149727_a里meta被赋值后紧接着又判meta == 7(BlockPamCrop.java:51)—— 这是 CFR 对同一局部变量的重复还原,不是缺陷。func_149691_a(BlockPamCrop.java:31-39)中的if (meta == 6) meta = 5;使第 6 阶段与第 4/5 阶段共用同一张贴图,因此 8 个阶段只对应 4 张贴图。这是有意为之的贴图复用,不是 bug。
相关条目
- Crops(作物总览) — 60 个作物方块的完整对照表
- ItemPamSeedFood — 产出物品的基类(
extends ItemFood)