Option to prevent NBT copy in smithing recipes (#6671)

This commit is contained in:
Jake Potrebic 2021-09-30 11:27:25 -07:00
parent 019c768488
commit 1264c08ef8
2 changed files with 140 additions and 0 deletions

View File

@ -0,0 +1,56 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Sun, 26 Sep 2021 12:57:35 -0700
Subject: [PATCH] Option to prevent NBT copy in smithing recipes
diff --git a/src/main/java/org/bukkit/inventory/SmithingRecipe.java b/src/main/java/org/bukkit/inventory/SmithingRecipe.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/inventory/SmithingRecipe.java
+++ b/src/main/java/org/bukkit/inventory/SmithingRecipe.java
@@ -0,0 +0,0 @@ public class SmithingRecipe implements Recipe, Keyed {
private final ItemStack result;
private final RecipeChoice base;
private final RecipeChoice addition;
+ private final boolean copyNbt; // Paper
/**
* Create a smithing recipe to produce the specified result ItemStack.
@@ -0,0 +0,0 @@ public class SmithingRecipe implements Recipe, Keyed {
* @param addition The addition ingredient
*/
public SmithingRecipe(@NotNull NamespacedKey key, @NotNull ItemStack result, @NotNull RecipeChoice base, @NotNull RecipeChoice addition) {
+ // Paper start
+ this(key, result, base, addition, true);
+ }
+ /**
+ * Create a smithing recipe to produce the specified result ItemStack.
+ *
+ * @param key The unique recipe key
+ * @param result The item you want the recipe to create.
+ * @param base The base ingredient
+ * @param addition The addition ingredient
+ * @param copyNbt whether to copy the nbt from the input base item to the output
+ */
+ public SmithingRecipe(@NotNull NamespacedKey key, @NotNull ItemStack result, @NotNull RecipeChoice base, @NotNull RecipeChoice addition, boolean copyNbt) {
+ this.copyNbt = copyNbt;
+ // Paper end
this.key = key;
this.result = result;
this.base = base;
@@ -0,0 +0,0 @@ public class SmithingRecipe implements Recipe, Keyed {
public NamespacedKey getKey() {
return this.key;
}
+
+ // Paper start
+ /**
+ * Whether or not to copy the NBT of the input base item to the output.
+ *
+ * @return true to copy the NBT (default for vanilla smithing recipes)
+ */
+ public boolean willCopyNbt() {
+ return copyNbt;
+ }
+ // Paper end
}

View File

@ -0,0 +1,84 @@
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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java
+++ b/src/main/java/net/minecraft/world/item/crafting/UpgradeRecipe.java
@@ -0,0 +0,0 @@ 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;
@@ -0,0 +0,0 @@ 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;
}
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java
@@ -0,0 +0,0 @@ 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;
}
@@ -0,0 +0,0 @@ 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
}
}