1. 原版熔炉配方

和原版工作台配方不一样,原版熔炉并没有使用专门的 Recipe 类或接口,而是单纯地使用 FurnaceRecipes 这样一个类来管理一个私有的 Map<ItemStack, ItemStack>。实际上这个类使用这个 Map 的方式更像是在用 Collection<Map.Entry<ItemStack, ItemStack>>,毕竟 ItemStack 不满足用作 Map 的键的要求。
实际上我们甚至不需要去管 FurnaceRecipes 这个类,因为 FML 出手了。

// inputItem 是输入的 ItemStack
// outputItem 是输出的 ItemStack
// expGained 是烧炼一次后玩家获得的经验数量,一定是 float。
GameRegistry.addSmelting(inputItem, outputItem, expGained);

1.1. 燃料热值

在 Forge patch 过原版熔炉后,燃料热值由一个事件决定:

@SubscribeEvent
public static void getVanillaFurnaceFuelValue(FurnaceFuelBurnTimeEvent event) {
    if (check(event.getItemStack())) {
        event.setBurnTime(100);
        // 可以设定为 0。0 代表“这个物品不是燃料”,更准确地说是“这个物品燃烧时间是 0”。
        // 可以设定为 -1。-1 代表“由原版逻辑来决定”。
        // 可通过 event.getBurnTime() 获得当前决定的燃烧时间。
        // 这个事件可以取消。取消意味着后续的 Event listener 将不会收到这个事件,进而
        // 无法修改燃烧时间。
    }
}