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 8db71bd075b8ece36c6f0dc0339841df9257038b..4818b4e6583414fa98194bb6f3c5dbd4bd95be3a 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -136,8 +136,18 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat * {@link Material#isItem()} returns false. * * @param type New type to set the items in this stack to + * @deprecated Setting the material type of ItemStacks is no longer supported. + *
+ * 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; @@ -150,6 +160,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