跳到正文
烈焰甘蔗Wiki

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

源码缺陷

  1. 重命名放置时抛 ClassCastException。BlockPamGrinder.java:65 与 Presser 的缺陷完全同型:
    ((TileEntityOven)par1World.func_147438_o(xcoord, ycoord, zcoord)).func_145951_a(par6Ist.func_82833_r());
    
    Grinder 的 TileEntity 是 TileEntityPamGrinder,被强转为 TileEntityOven;同文件 :70 处已正确写作 (TileEntityPamGrinder)。触发条件:手持改名物品放置。
  2. TileEntity 无条件注册。HarvestCraft.java:102 无论 enablemeatGrinder 与否都执行 registerTileEntity(TileEntityPamGrinder.class, "PamGrinder"),在默认配置下产生一条指向不存在方块的孤儿 TileEntity 注册。
  3. 未注册的 Block 实例。BlockRegistry.java:451 无条件 new BlockPamGrinder(),:640 才条件注册;关掉开关时该实例被创建却从不进 GameRegistry。
  4. 多方块 / 控制器 / 可否旋转:源码未定义。

相关条目

  • Presser — 机制完全相同,但无条件可用
  • Oven(含受 enablemeatGrinder 门控的绞肉配方)
  • TileEntity:Grinder

订正记录

  • 本条目完全重写。旧版基于 MC 1.12.2 fork,把 grinder 描述为默认存在的普通机器,且未记录 backports.enablemeatGrinder 条件注册。旧版行号一律作废。
浏览全部模组