From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Sun, 26 Sep 2021 12:57:28 -0700
Subject: [PATCH] Option to prevent NBT copy in smithing recipes


diff --git a/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java b/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java
index d80fc47820edbb3bea439aedf2e02e82c1931e35..076e10e5d7908c590402cfbb739bf73bc00276ce 100644
--- a/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java
+++ b/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java
@@ -25,8 +25,15 @@ public class UpgradeRecipe implements net.minecraft.world.item.crafting.Recipe<C
     final Ingredient addition;
     final ItemStack result;
     private final ResourceLocation id;
+    final boolean copyNbt; // Paper
 
     public UpgradeRecipe(ResourceLocation id, Ingredient base, Ingredient addition, ItemStack result) {
+        // Paper start
+        this(id, base, addition, result, true);
+    }
+    public UpgradeRecipe(ResourceLocation id, Ingredient base, Ingredient addition, ItemStack result, boolean copyNbt) {
+        this.copyNbt = copyNbt;
+        // Paper end
         this.id = id;
         this.base = base;
         this.addition = addition;
@@ -41,11 +48,13 @@ public class UpgradeRecipe implements net.minecraft.world.item.crafting.Recipe<C
     @Override
     public ItemStack assemble(Container inventory) {
         ItemStack itemstack = this.result.copy();
+        if (copyNbt) { // Paper - copy nbt conditionally
         CompoundTag nbttagcompound = inventory.getItem(0).getTag();
 
         if (nbttagcompound != null) {
             itemstack.setTag(nbttagcompound.copy());
         }
+        } // Paper
 
         return itemstack;
     }
@@ -96,7 +105,7 @@ public class UpgradeRecipe implements net.minecraft.world.item.crafting.Recipe<C
     public Recipe toBukkitRecipe() {
         CraftItemStack result = CraftItemStack.asCraftMirror(this.result);
 
-        CraftSmithingRecipe recipe = new CraftSmithingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition));
+        CraftSmithingRecipe recipe = new CraftSmithingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition), this.copyNbt); // Paper
 
         return recipe;
     }
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java
index 0353ba44015cb72efa3892c527568902c9fa626b..bfd6b859fcfed89d0ebaca5200b7ca6f5d353d04 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java
@@ -8,15 +8,21 @@ import org.bukkit.inventory.RecipeChoice;
 import org.bukkit.inventory.SmithingRecipe;
 
 public class CraftSmithingRecipe extends SmithingRecipe implements CraftRecipe {
+    @Deprecated // Paper
     public CraftSmithingRecipe(NamespacedKey key, ItemStack result, RecipeChoice base, RecipeChoice addition) {
         super(key, result, base, addition);
     }
+    // Paper start
+    public CraftSmithingRecipe(NamespacedKey key, ItemStack result, RecipeChoice base, RecipeChoice addition, boolean copyNbt) {
+        super(key, result, base, addition, copyNbt);
+    }
+    // Paper end
 
     public static CraftSmithingRecipe fromBukkitRecipe(SmithingRecipe recipe) {
         if (recipe instanceof CraftSmithingRecipe) {
             return (CraftSmithingRecipe) recipe;
         }
-        CraftSmithingRecipe ret = new CraftSmithingRecipe(recipe.getKey(), recipe.getResult(), recipe.getBase(), recipe.getAddition());
+        CraftSmithingRecipe ret = new CraftSmithingRecipe(recipe.getKey(), recipe.getResult(), recipe.getBase(), recipe.getAddition(), recipe.willCopyNbt()); // Paper
         return ret;
     }
 
@@ -24,6 +30,6 @@ public class CraftSmithingRecipe extends SmithingRecipe implements CraftRecipe {
     public void addToCraftingManager() {
         ItemStack result = this.getResult();
 
-        MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.UpgradeRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), toNMS(this.getBase(), true), toNMS(this.getAddition(), true), CraftItemStack.asNMSCopy(result)));
+        MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.UpgradeRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), toNMS(this.getBase(), true), toNMS(this.getAddition(), true), CraftItemStack.asNMSCopy(result), this.willCopyNbt())); // Paper
     }
 }
