From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Thu, 29 Feb 2024 17:54:26 -0500
Subject: [PATCH] Deprecate ItemStack#setType


diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index b669df4bd1ff0ecba575d42415973e81bccddbbe..1294f7ce50977dfe72daf535b611386844c205e0 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -134,8 +134,18 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      * {@link Material#isItem()} returns false.</b>
      *
      * @param type New type to set the items in this stack to
+     * @deprecated <b>Setting the material type of ItemStacks is no longer supported.</b>
+     * <p>
+     * This method is deprecated due to potential illegal behavior that may occur
+     * during the context of which this ItemStack is being used, allowing for certain item validation to be bypassed.
+     * It is recommended to instead create a new ItemStack object with the desired
+     * Material type, and if possible, set it in the appropriate context.
+     *
+     * Using this method in ItemStacks passed in events will result in undefined behavior.
+     * @see ItemStack#withType(Material)
      */
     @Utility
+    @Deprecated // Paper
     public void setType(@NotNull Material type) {
         Preconditions.checkArgument(type != null, "Material cannot be null");
         this.type = type;
@@ -148,6 +158,24 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
             this.data = null;
         }
     }
+    // Paper start
+    /**
+     * Creates a new ItemStack with the specified Material type, where the item count and item meta is preserved.
+     *
+     * @param type The Material type of the new ItemStack.
+     * @return A new ItemStack instance with the specified Material type.
+     */
+    @NotNull
+    @org.jetbrains.annotations.Contract(value = "_ -> new", pure = true)
+    public ItemStack withType(@NotNull Material type) {
+        ItemStack itemStack = new ItemStack(type, this.amount);
+        if (this.hasItemMeta()) {
+            itemStack.setItemMeta(this.getItemMeta());
+        }
+
+        return itemStack;
+    }
+    // Paper end
 
     /**
      * Gets the amount of items in this stack
