From 9aa22ffc86c6b76435ae9fcad0db6efad8d97d7a Mon Sep 17 00:00:00 2001 From: Auxilor Date: Tue, 5 Apr 2022 15:38:34 +0100 Subject: [PATCH] Added Items#mergeFrom --- .../java/com/willfp/eco/core/items/Items.java | 59 +++++++++++++++++++ .../kotlin/com/willfp/eco/core/items/Items.kt | 13 ++++ 2 files changed, 72 insertions(+) diff --git a/eco-api/src/main/java/com/willfp/eco/core/items/Items.java b/eco-api/src/main/java/com/willfp/eco/core/items/Items.java index 1ec570fe..21d30ea9 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/items/Items.java +++ b/eco-api/src/main/java/com/willfp/eco/core/items/Items.java @@ -13,6 +13,7 @@ import com.willfp.eco.util.NamespacedKeyUtils; import com.willfp.eco.util.NumberUtils; import org.bukkit.Material; import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; @@ -430,6 +431,64 @@ public final class Items { return items; } + /** + * Merge ItemStack onto another ItemStack. + * + * @param from The ItemStack to merge from. + * @param to The ItemStack to merge onto. + * @return The ItemStack, merged (same instance as to). + */ + @NotNull + public static ItemStack mergeFrom(@NotNull final ItemStack from, + @NotNull final ItemStack to) { + ItemMeta fromMeta = from.getItemMeta(); + ItemMeta toMeta = to.getItemMeta(); + + if (fromMeta == null || toMeta == null) { + return to; + } + + ItemMeta newMeta = mergeFrom(fromMeta, toMeta); + + to.setItemMeta(newMeta); + to.setType(from.getType()); + to.setAmount(from.getAmount()); + return to; + } + + /** + * Merge ItemMeta onto other ItemMeta. + * + * @param from The ItemMeta to merge from. + * @param to The ItemMeta to merge onto. + * @return The ItemMeta, merged (same instance as to). + */ + @NotNull + public static ItemMeta mergeFrom(@NotNull final ItemMeta from, + @NotNull final ItemMeta to) { + if (from.hasDisplayName()) { + to.setDisplayName(from.getDisplayName()); + } + + to.setLore(from.getLore()); + + for (Enchantment enchant : to.getEnchants().keySet()) { + to.removeEnchant(enchant); + } + + for (Map.Entry entry : from.getEnchants().entrySet()) { + to.addEnchant(entry.getKey(), entry.getValue(), true); + } + + if (from.hasCustomModelData()) { + to.setCustomModelData(from.getCustomModelData()); + } else { + to.setCustomModelData(null); + } + + return to; + } + private Items() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); } diff --git a/eco-api/src/main/kotlin/com/willfp/eco/core/items/Items.kt b/eco-api/src/main/kotlin/com/willfp/eco/core/items/Items.kt index 5eb01d89..d54ddf63 100644 --- a/eco-api/src/main/kotlin/com/willfp/eco/core/items/Items.kt +++ b/eco-api/src/main/kotlin/com/willfp/eco/core/items/Items.kt @@ -3,9 +3,22 @@ package com.willfp.eco.core.items import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.ItemMeta /** * @see Items.toLookupString */ fun ItemStack?.toLookupString(): String = Items.toLookupString(this) + +/** + * @see Items.mergeFrom + */ +fun ItemStack.mergeFrom(other: ItemStack): ItemStack = + Items.mergeFrom(other, this) + +/** + * @see Items.mergeFrom + */ +fun ItemMeta.mergeFrom(other: ItemMeta): ItemMeta = + Items.mergeFrom(other, this)