Oven(烤炉)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
Oven 有两个注册名(关/开两种状态),共用同一个类。
| 属性 | 关闭态 | 开启态 | 来源 |
|---|---|---|---|
| 注册名 | harvestcraft:oven |
harvestcraft:ovenon |
BlockRegistry.java:645 / :646 |
| 构造参数 | new BlockPamOven(false) |
new BlockPamOven(true) |
BlockRegistry.java:456 / :457 |
| 字段 | pamOven |
pamOvenon |
BlockRegistry.java:43 / :42 |
| 贴图 | oven_front_off |
oven_front_on |
BlockPamOven.java:47 |
| 公共属性 | 值 | 来源 |
|---|---|---|
| 类 | BlockPamOven extends BlockContainer implements IFuelHandler |
BlockPamOven.java:29-30 |
| 显示名 | tile.oven.name / tile.ovenon.name 均为 Oven |
en_US.lang:48-49 |
| 硬度 / 抗爆 | 1.5f / 10.0f |
BlockRegistry.java:456-457 |
| TileEntity | TileEntityOven | BlockPamOven.java:40 |
| GUI ID | 5 |
BlockPamOven.java:55 |
| 多方块 | 否,源码未定义任何多方块结构 | — |
| 朝向 | 放置时按玩家朝向设 4 个 metadata(0–3) | BlockPamOven.java:78-83 |
槽位布局(TileEntityOven.java:15,inventory = new ItemStack[3])
| 槽位 | 内容 | 容器槽(ContainerOven.java:32-35) |
|---|---|---|
| 0 | 待烧制原料(上) | GUI (80,17) |
| 1 | 燃料(下) | GUI (80,53) |
| 2 | 成品(SlotOven,只允许取出,不可放入) |
GUI (80,35) |
每槽堆叠上限 64(TileEntityOven.java:16)。玩家背包 36 槽(3–29 主背包,30–38 快捷栏)。
处理什么 / 产什么
- 配方表
OvenRecipes.getSmeltingResult(ItemStack);经验值OvenRecipes.getSmeltExperience(ItemStack)(TileEntityOven.java:173-175)。 - 匹配使用通配符比较:
PamUtils.areItemStacksEqualWithWildcard,Short.MAX_VALUE元数据视为通配(PamUtils.java:9-14)。
配方条数(集合运算,非调用点计数)
| 来源 | 条数 | 位置 |
|---|---|---|
字面 this.addSmelting(Item, ...) |
48 | OvenRecipes.java 构造器 |
字面 this.addSmeltingRecipeForBlock(...) |
3 | OvenRecipes.java:27,32,33 |
ItemFishFood.FishType.values() 循环 |
= FishType 中 func_150973_i() 为真的常量个数 |
OvenRecipes.java:51-54 |
| 绞肉 meta 循环 | 迭代 mincedmeatrawItem.func_77612_l() = 8 |
OvenRecipes.java:79-83 |
- 前两项合计 51 条为静态可数。
- FishType 循环的确切条数无法从本仓库核实(仓库内无 Minecraft 源码与 MCP 映射),只记录循环条件本身。
- 绞肉循环被
BlockRegistry.enablemeatGrinder && ItemRegistry.forcecookinginmeatrecipes双重开关门控(OvenRecipes.java:79),且存在缺陷,见下。
处理耗时 / 速率
| 参数 | 值 | 来源 |
|---|---|---|
| 烹饪判定 | ovenCookTime == 100 → 100 tick = 5 秒 |
TileEntityOven.java:180 |
| 每 tick 燃料消耗 | -1 |
TileEntityOven.java:164 |
| 冷却降速 | 可容纳物品数 > 1 时每次同时烤 2 个 | TileEntityOven.java:176-178 |
| 进度条分母 | 200(ovenCookTime * 200 / 200) |
TileEntityOven.java:143 |
| GUI 进度条像素宽度 | 48 | GuiOven.java:43 |
Oven 是本作最快的烹饪机器:100 tick,而 Churn 与 Quern 均为 200 tick。
耗什么(燃料)
- 专属燃料:
ItemRegistry.oliveoilItem(橄榄油)→ 1600 tick(TileEntityOven.java:172-175)。 - 通用燃料:
GameRegistry.getFuelValue(stack);本类实现IFuelHandler,getFuelTime在返回 0(TileEntityOven.java:167-170),即不额外提供燃料值。
交互
| 触发 | 行为 | 来源 |
|---|---|---|
| 右键 | openGui(..., 5, ...) |
BlockPamOven.java:55 |
| 放置 | 按 player.func_70048_d().field_70179_ys 设 0–3 朝向 |
BlockPamOven.java:78-83 |
| 破坏 | 掉落 Item.func_150898_a(BlockRegistry.pamOven) —— 注意是关闭态方块 |
BlockPamOven.java:59-61 |
源码缺陷
- 进度条永远只填一半。
GuiOven.java:43用getCookProgressScaled(48),而公式ovenCookTime * 48 / 200(TileEntityOven.java:143)在ovenCookTime达到 100 时只得到 24 像素。分母 200 与实际完成阈值 100 不一致,箭头动画停在半途。对比GuiChurn.java:43/GuiQuern.java:43传 24 而完成阈值为 200(TileEntityChurn.java:…同理匹配),三台机器中只有 Oven 不匹配。 - 绞肉配方元数据丢失。
OvenRecipes.java:81在循环内调用.func_77973_b()取回 Item(丢掉meta),随后addSmelting以new ItemStack(input, 1, Short.MAX_VALUE)建键(OvenRecipes.java私有addSmelting)。8 个 meta 因此写入同一个键,互相覆盖;叠加PamUtils.areItemStacksEqualWithWildcard把Short.MAX_VALUE当通配,任意绞肉元都会被匹配到最后一次写入的输出(meta 7,鹿肉)。8 次迭代只产生 1 条有效映射。 - 「开启态」方块掉落的是「关闭态」物品。
BlockPamOven.java:59-61的func_149650_a写死返回Item.getItemFromBlock(BlockRegistry.pamOven),没有区分this。pamOvenon是独立注册的方块(BlockRegistry.java:646),有自己的注册名ovenon,但破坏它只会掉一个oven物品;harvestcraft:ovenon的物品形式在正常玩法中拿不到。Churn、Quern 三者同型(各自:59-61)。 - 无多方块、无控制器、可否旋转:源码未定义(
BlockPamOven.java无任何canConnect/结构判定)。
相关条目
订正记录
- 本条目为新增。旧版 wiki 的机器类条目基于 MC 1.12.2 fork(
TileEntityPamOven等 1.12.2 类名体系),行号与类名不适用于 1.7.10,本条目一律以harvestcraft-1.7.10-GTNH反编译行号为准。