Grinder / Mincer(绞肉机)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册名 | harvestcraft:grinder |
BlockRegistry.java:640-641 |
| 方块类 | BlockPamGrinder extends BlockContainer |
BlockPamGrinder.java:29-30 |
| 字段 | BlockRegistry.pamGrinder |
BlockRegistry.java:51 |
| 构造 | new BlockPamGrinder() |
BlockRegistry.java:451 |
| 显示名 | tile.grinder.name = Mincer(不是 “Grinder”) |
en_US.lang:35 |
| 硬度 | 1.0f |
BlockRegistry.java:451 |
| TileEntity | TileEntityPamGrinder | BlockPamGrinder.java:42-44 |
| GUI ID | 10 |
BlockPamGrinder.java:91 |
| 多方块 | 否,源码未定义任何多方块结构 | — |
| 朝向 | 放置时设 0–3 metadata | BlockPamGrinder.java:51-63 |
⚠ 条件注册:默认不注册
BlockRegistry.java:640-641:
if (enablemeatGrinder) {
GameRegistry.registerBlock(pamGrinder, ItemPamGrinder.class, "grinder");
}
| 事实 | 值 | 来源 |
|---|---|---|
| 开关 | BlockRegistry.enablemeatGrinder |
BlockRegistry.java:51 |
| 配置键 | backports → enablemeatGrinder |
BlockRegistry.java 配置读取段 |
| 默认值 | false |
BlockRegistry.java 配置读取段(config.get(…, false).getBoolean(false)) |
| 分类 | backports —— 明确归类为**后移植(backport)**功能 |
同上 |
因此:默认配置下 harvestcraft:grinder 这个方块根本不存在,只有静态字段 BlockRegistry.pamGrinder 是一个已构造但未注册的 Block 实例(BlockRegistry.java:451 无条件构造)。
其它受同一开关影响的地方:
| 位置 | 行为 |
|---|---|
OvenRecipes.java:79 |
绞肉 → 熟绞肉配方需 enablemeatGrinder 且 ItemRegistry.forcecookinginmeatrecipes 同时为真 |
HarvestCraft.java:102 |
GameRegistry.registerTileEntity(TileEntityPamGrinder.class, "PamGrinder") 无条件执行 |
槽位布局(TileEntityPamGrinder.java:27,grinderItemStacks = new ItemStack[3])
| 槽位 | 内容 | 槽位类 | GUI 坐标(ContainerPamGrinder.java:28-30) |
|---|---|---|---|
| 0 | 待绞的原料(ItemMincedMeat 子类) |
SlotPamGrinder |
(80,23) |
| 1 | 产物 1 | SlotPamResult(只可取出) |
(62,54) |
| 2 | 产物 2 | SlotPamResult(只可取出) |
(98,54) |
与 Presser 槽位布局完全一致。SlotPamGrinder 限定只接受 ItemMincedMeat 实例。
处理什么 / 产什么
GrinderRecipes 在类初始化时动态从矿辞典构建,getGrindingResult 返回 ItemStack[2]。
配方条数:无法静态确定(动态注册)
GrinderRecipes 构造器结构(按集合运算):
for (int meta = 0; meta < 8; ++meta) // 8 = ItemMincedMeat.meatTypes.length
for (ItemStack oreStack : OreDictionary.getOres("listAll" + meatTypes[meta] + "raw"))
if (oreStack 的 Item 是 ItemMincedMeat) continue
registerItemRecipe(oreStack, 绞熟肉 meta, 绞熟肉 meta)
| 参数 | 值 | 来源 |
|---|---|---|
| 肉类种类数 | 8(beef / pork / chicken / fish / mutton / rabbit / turkey / venison) | base/item/ItemMincedMeat.java meatTypes 数组 |
| 矿辞典名 | "listAll" + 种类名 + "raw" |
GrinderRecipes 构造器 |
| 单种类条数 | = 该矿辞典名下的注册项数,由其它模组决定 | — |
所以总条数 = Σ(8 个矿辞典名各自在 OreDictionary 中的条目数),在纯净 1.7.10 环境下远小于跨模组整合包,无法从本仓库给出确定数字。这是「枚举/循环注册导致调用点严重虚高」的反向例子——grep 调用点会得到 0(全在循环内),真实值却是变量。
两条已知行为:
- 双产出两个槽位内容相同(都是同一 meta 的
mincedmeatcookedItem),不是两种不同产物。 - 随包文档
HarvestCraft 1.7.10Lb Recipes.txt没有//GRINDER RECIPES段落,与它作为默认关闭的 backport 一致。
处理耗时 / 速率
| 参数 | 值 | 来源 |
|---|---|---|
| 完成判定 | grinderCookTime >= 125 → 125 tick = 6.25 秒 |
TileEntityPamGrinder.java:109 |
| 进度条分母 | grinderCookTime * par1 / 125 |
TileEntityPamGrinder.java:97 |
| GUI 进度条像素宽度 | 24 | GuiPamGrinder.java:36 |
| 燃料 | 无 | TileEntityPamGrinder.java:20 |
交互
| 触发 | 行为 | 来源 |
|---|---|---|
| 右键 | openGui(..., 10, ...) |
BlockPamGrinder.java:86-93 |
| 放置 | 设 0–3 朝向 | BlockPamGrinder.java:51-63 |
| 破坏 | 掉落 Item.func_150898_a(BlockRegistry.pamGrinder),并散落容器内物品 |
BlockPamGrinder.java:46-48,69-84 |
源码缺陷
- 重命名放置时抛
ClassCastException。BlockPamGrinder.java:65与 Presser 的缺陷完全同型:
Grinder 的 TileEntity 是((TileEntityOven)par1World.func_147438_o(xcoord, ycoord, zcoord)).func_145951_a(par6Ist.func_82833_r());
TileEntityPamGrinder,被强转为TileEntityOven;同文件:70处已正确写作(TileEntityPamGrinder)。触发条件:手持改名物品放置。 - TileEntity 无条件注册。
HarvestCraft.java:102无论enablemeatGrinder与否都执行registerTileEntity(TileEntityPamGrinder.class, "PamGrinder"),在默认配置下产生一条指向不存在方块的孤儿 TileEntity 注册。 - 未注册的
Block实例。BlockRegistry.java:451无条件new BlockPamGrinder(),:640才条件注册;关掉开关时该实例被创建却从不进GameRegistry。 - 多方块 / 控制器 / 可否旋转:源码未定义。
相关条目
订正记录
- 本条目完全重写。旧版基于 MC 1.12.2 fork,把 grinder 描述为默认存在的普通机器,且未记录
backports.enablemeatGrinder条件注册。旧版行号一律作废。