From 49942b35dafae65bf395d4651dccbb4fc2f63406 Mon Sep 17 00:00:00 2001 From: Marc Baloup Date: Fri, 17 Jan 2025 00:50:15 +0100 Subject: [PATCH] Add support for item data components in ItemStackBuilder --- .../lib/paper/inventory/ItemStackBuilder.java | 79 ++++++++++++++++--- 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/inventory/ItemStackBuilder.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/inventory/ItemStackBuilder.java index 45dab58..5157af9 100644 --- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/inventory/ItemStackBuilder.java +++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/inventory/ItemStackBuilder.java @@ -2,6 +2,11 @@ package fr.pandacube.lib.paper.inventory; import com.google.common.collect.Streams; import fr.pandacube.lib.chat.Chat; +import io.papermc.paper.block.BlockPredicate; +import io.papermc.paper.datacomponent.DataComponentType; +import io.papermc.paper.datacomponent.DataComponentType.Valued; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.ItemAdventurePredicate; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; import org.bukkit.Material; @@ -70,15 +75,10 @@ public class ItemStackBuilder { private final ItemStack stack; - private ItemMeta cachedMeta; private ItemStackBuilder(ItemStack base) { stack = base; } - - private ItemMeta getOrInitMeta() { - return (cachedMeta != null) ? cachedMeta : (cachedMeta = stack.getItemMeta()); - } /** * Runs the provided updater on the {@link ItemMeta} instance of the built stack. @@ -97,10 +97,7 @@ public class ItemStackBuilder { * @return itself. */ public ItemStackBuilder meta(Consumer metaUpdater, Class metaType) { - stack.editMeta(metaType, m -> { - metaUpdater.accept(m); - cachedMeta = m; - }); + stack.editMeta(metaType, metaUpdater); return this; } @@ -166,7 +163,7 @@ public class ItemStackBuilder { */ public ItemStackBuilder addLoreAfter(List lores) { if (lores != null) { - List baseLore = getOrInitMeta().lore(); + List baseLore = stack.getItemMeta().lore(); if (baseLore == null) baseLore = Collections.emptyList(); return rawLore( Streams.concat( @@ -302,6 +299,68 @@ public class ItemStackBuilder { } + /** + * Sets a value for a data component of this item. + * @param dataType the data component type. + * @param dataValue the data component value. + * @return itself. + * @param the data component API type. + */ + public ItemStackBuilder data(Valued dataType, T dataValue) { + stack.setData(dataType, dataValue); + return this; + } + + /** + * Unset (set to empty) a value for a data component of this item. + * @param dataType the data component type. + * @return itself. + */ + public ItemStackBuilder unsetData(DataComponentType dataType) { + stack.unsetData(dataType); + return this; + } + + /** + * Reset (act as default) a value for a data component of this item. + * @param dataType the data component type. + * @return itself. + */ + public ItemStackBuilder resetData(DataComponentType dataType) { + stack.resetData(dataType); + return this; + } + + + /** + * Sets the {@code can_break} data component to the provided list of block predicate. + * @param canBreak a list of block predicate. If empty, unsets the data component. If null, reset to default. + * @return itself. + */ + public ItemStackBuilder canBreak(List canBreak) { + if (canBreak == null) + return resetData(DataComponentTypes.CAN_BREAK); + else if (canBreak.isEmpty()) + return unsetData(DataComponentTypes.CAN_BREAK); + else + return data(DataComponentTypes.CAN_BREAK, ItemAdventurePredicate.itemAdventurePredicate(canBreak)); + } + + /** + * Sets the {@code can_place_on} data component to the provided list of block predicate. + * @param canPlaceOn a list of block predicate. If empty, unsets the data component. If null, reset to default. + * @return itself. + */ + public ItemStackBuilder canPlaceOn(List canPlaceOn) { + if (canPlaceOn == null) + return resetData(DataComponentTypes.CAN_PLACE_ON); + else if (canPlaceOn.isEmpty()) + return unsetData(DataComponentTypes.CAN_PLACE_ON); + else + return data(DataComponentTypes.CAN_PLACE_ON, ItemAdventurePredicate.itemAdventurePredicate(canPlaceOn)); + } + + /** * Build the {@link ItemStack}. * @return the build item stack.