跳到正文

Furnace NBT Recipes

作者:Stoupy51

Minecraft datapack library for handling custom furnace recipes with advanced NBT / component support!

收藏

介绍

中文介绍正在准备中,下面暂时显示原文。

📖 Furnace NBT Recipes

GitHub
Smithed
Modrinth
PMC
Discord
Powered by StewBeet

🔥 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"}

♻️ Like the recipe tags, it runs once per ingredient and furnace type, and its answer is reused by every furnace holding that ingredient: decide from input and #type only.

#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

🧩 A block that already has an entity inside the furnace can be tracked through it instead of a marker: add the furnace_nbt_recipes.furnace tag to it, set its furnace_nbt_recipes.speed, and kill any marker the library already placed within 0.75 blocks of it.

📝 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 <a href="https://github.com/Stoupy51/SimplEnergy/blob/main/build/datapack/data/furnace_nbt_recipes/recipe/vanilla_items/smeltingcommand_blockminecraft_diamond.json” target=”_blank” rel=”noopener nofollow”>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, or the same one without room for the result, the furnace stops instead of stacking them, and resumes once the slot is cleared.

🧪 Tests

🔬 The Ward tests in tests/ run against the built pack: uvx "mcward[cli]" test -p build/FurnaceNbtRecipes_datapack.zip -p tests -v 26.3 "furnace_nbt_recipes_test:*"

🔁 Use -v 26.4-snapshot-7 for the 26.4 snapshot. The first run starts a Ward server that stays up so the next runs take a second, and uvx "mcward[cli]" stop --all stops it.

⭐ Star History

Star History Chart

常见问题

Furnace NBT Recipes 支持哪些 Minecraft 版本?

Furnace NBT Recipes 支持 Minecraft Java 版 1.21.2–26.3,共 14 个版本。下载时注意选择和你游戏版本一致的文件。

Furnace NBT Recipes 怎么安装?

新建世界时在「数据包」里把下载的 .zip 拖进去;已有的存档,把文件放进存档目录下的 datapacks 文件夹,进游戏输入 /reload 即可生效。服务器同样放在世界目录的 datapacks 里。

评论

登录后评论和评分

Stoupy51 的其他作品

查看全部 →