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 245a730a54c4b241a9a67eccceefafd2763bd238..7414b4fa690d393a8e9557cc1fd1ce12fa426940 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. * * @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; @@ -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