From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Riley Park Date: Sun, 23 May 2021 05:04:28 -0700 Subject: [PATCH] ItemStack#editMeta diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java index 99768256af87b72b3366898278b52acef4ae4ded..3a5d5968f1c3b75292c06606733c9f449d6b550f 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -596,6 +596,50 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat return result.ensureServerConversions(); // Paper } + // Paper start + /** + * Edits the {@link ItemMeta} of this stack. + *

+ * The {@link java.util.function.Consumer} must only interact + * with this stack's {@link ItemMeta} through the provided {@link ItemMeta} instance. + * Calling this method or any other meta-related method of the {@link ItemStack} class + * (such as {@link #getItemMeta()}, {@link #addItemFlags(ItemFlag...)}, {@link #lore()}, etc.) + * from inside the consumer is disallowed and will produce undefined results or exceptions. + *

+ * + * @param consumer the meta consumer + * @return {@code true} if the edit was successful, {@code false} otherwise + */ + public boolean editMeta(final @NotNull java.util.function.Consumer consumer) { + return editMeta(ItemMeta.class, consumer); + } + + /** + * Edits the {@link ItemMeta} of this stack if the meta is of the specified type. + *

+ * The {@link java.util.function.Consumer} must only interact + * with this stack's {@link ItemMeta} through the provided {@link ItemMeta} instance. + * Calling this method or any other meta-related method of the {@link ItemStack} class + * (such as {@link #getItemMeta()}, {@link #addItemFlags(ItemFlag...)}, {@link #lore()}, etc.) + * from inside the consumer is disallowed and will produce undefined results or exceptions. + *

+ * + * @param metaClass the type of meta to edit + * @param consumer the meta consumer + * @param the meta type + * @return {@code true} if the edit was successful, {@code false} otherwise + */ + public boolean editMeta(final @NotNull Class metaClass, final @NotNull java.util.function.Consumer<@NotNull ? super M> consumer) { + final @Nullable ItemMeta meta = this.getItemMeta(); + if (metaClass.isInstance(meta)) { + consumer.accept((M) meta); + this.setItemMeta(meta); + return true; + } + return false; + } + // Paper end + /** * Get a copy of this ItemStack's {@link ItemMeta}. *