Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
š Furnace NBT Recipes
š„ Minecraft datapack library for handling custom furnace recipes with advanced NBT / component support!
Enables creation of complex smelting recipes using NBT tags / components. š ļø
š How to Use
š§ Function Tags
The library provides several function tags that you can use to add your custom recipes:
šØ Smelting, Blasting, Smoking
The function tags are the following:
#furnace_nbt_recipes:v1/smelting_recipes: š„ Recipes in a classic furnace#furnace_nbt_recipes:v1/blasting_recipes: āļø Recipes in a blast furnace (e.g. ores)#furnace_nbt_recipes:v1/smoking_recipes: š Recipes in a smoker (e.g. food)
š In any of these function tags, you must add a call to a function you created that will handle the recipe.
ā
Each line should check if the #found score is 0 and the input matches your recipe.
š If so, it will run a loot table command in the container.3 slot.
ā” Taken example from SimplEnergy:
# Smelt 'Raw Simplunium' into 'Simplunium Ingot'
execute if score #found furnace_nbt_recipes.data matches 0 store result score #found furnace_nbt_recipes.data if data storage furnace_nbt_recipes:main input{"components": {"minecraft:custom_data": {"simplenergy": {"raw_simplunium": true}}}} run loot replace block ~ ~ ~ container.3 loot simplenergy:i/simplunium_ingot
#furnace_nbt_recipes:v1/disable_cooking
š§ As the library stands on fake recipes, we need to prevent the default vanilla items from smelting ā ļø
Therefore, you should use this function tag to disable them with the following syntax ā¬ļø:
# For instance, if a custom recipe uses command block as a base item:
execute if score #reset furnace_nbt_recipes.data matches 0 store success score #reset furnace_nbt_recipes.data if data storage furnace_nbt_recipes:main input{"id":"minecraft:command_block"}
#furnace_nbt_recipes:v1/recipes_used
ā” Configure XP rewards for your custom recipes when a player retrieves items from the furnace.
šÆ The XP amount can be customized based on the input item and furnace type (š„ regular furnace, āļø blast furnace, or š smoker).
⨠Taken example from SimplEnergy:
# Give 0.8 XP for smelting 'Raw Simplunium'
execute if score #found furnace_nbt_recipes.data matches 0 store result score #found furnace_nbt_recipes.data if data storage furnace_nbt_recipes:main input{"components": {"minecraft:custom_data": {"simplenergy": {"raw_simplunium": true}}}} run function simplenergy:calls/furnace_nbt_recipes/xp_reward/0.8
#furnace_nbt_recipes:v1/configure_furnace
ā” Configure a furnace once, the tick the library starts tracking it, so a configured furnace costs nothing extra afterwards.
š It runs as the furnace's marker entity, at the furnace, and sets furnace_nbt_recipes.speed, given per thousand: 1000 is the vanilla pace, 8000 cooks eight times faster, and 1200 cooks 1.2 times faster.
š§® Thousandths exist so a furnace can cook at a fraction of a tick per tick; the leftover is carried between ticks, so even 1050 stays exact over a whole recipe.
š The progress arrow stays smooth at any speed, because the library scales progress onto the clock it holds rather than onto the recipe duration.
⨠Example, an electric smelter that smelts eight times faster:
# Run as the marker, at the furnace: check whatever identifies your block
execute if entity @e[tag=simplenergy.electric_smelter,distance=..1] run scoreboard players set @s furnace_nbt_recipes.speed 8000
š Recipe Format
š For each custom recipe you make, you'll need to add a recipe that take the base item ingredient as ingredient and result the base item of the result.
ā±ļø The cookingtime field is mandatory, and the game divides it by the speed multiplier of the fuel: write 200 and a furnace takes ten seconds, while a blast furnace or a smoker on vanilla fuel takes five.
ā ļø This part is really wanky and I don't want people to use this library so here is a link to SimplEnergy's example.
āļø How the cooking is driven
š The library owns the furnace clock: it holds the cooking time high enough that the vanilla recipe can never complete on its own, and swaps in your result once the recipe has had its full duration.
ā½ The pace comes from the fuel, whatever it is: a custom fuel with a speed_multiplier of 10 cooks ten times faster, exactly as it would for a vanilla recipe.
š„ Vanilla refuses to light a furnace whose output slot holds an item its own recipe result cannot stack with. The library hands it a free slot for one tick so it lights itself and burns its fuel normally, then puts the item back.
š§± Two custom results never merge: while the output slot holds a different item, the furnace stops instead of stacking them, and resumes once the slot is cleared.


