From d3252eecbd9f2f0253924587295e85e432d311e2 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:02:05 +0200 Subject: [PATCH] Add Bulk enchantment operation interface. --- .../bulk/BukkitEnchantBulkOperation.java | 47 +++++++++++++++++++ .../bulk/BulkCleanEnchantOperation.java | 28 +++++++++++ .../enchant/bulk/BulkGetEnchantOperation.java | 23 +++++++++ .../bulk/EnchantSquaredBulkOperation.java | 37 +++++++++++++++ .../kotlin/io/delilaheve/util/ItemUtil.kt | 1 - .../cuanvil/group/EnchantConflictManager.kt | 2 +- 6 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkCleanEnchantOperation.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkGetEnchantOperation.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/EnchantSquaredBulkOperation.java diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java new file mode 100644 index 0000000..d34bd49 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java @@ -0,0 +1,47 @@ +package xyz.alexcrea.cuanvil.enchant.bulk; + +import io.delilaheve.util.ItemUtil; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.api.EnchantmentApi; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; + +import java.util.Map; + +public class BukkitEnchantBulkOperation implements BulkGetEnchantOperation, BulkCleanEnchantOperation { + + @Override + public void bulkGet(@NotNull Map enchantmentList, @NotNull ItemStack item, @NotNull ItemMeta meta) { + if (ItemUtil.INSTANCE.isEnchantedBook(item)) { + ((EnchantmentStorageMeta)meta).getStoredEnchants().forEach((enchantment, level) -> + enchantmentList.put(EnchantmentApi.getByKey(enchantment.getKey()), level) + ); + } else { + item.getEnchantments().forEach((enchantment, level) -> + enchantmentList.put(EnchantmentApi.getByKey(enchantment.getKey()), level) + ); + } + } + + @Override + public void bulkClear(@NotNull ItemStack item) { + if (item.getType() != Material.ENCHANTED_BOOK) { + item.getEnchantments().forEach((enchantment, leve) -> + item.removeEnchantment(enchantment) + ); + } + } + + @Override + public void bulkClear(@NotNull ItemStack item, @NotNull ItemMeta meta) { + if (item.getType() == Material.ENCHANTED_BOOK) { + EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta; + bookMeta.getStoredEnchants().forEach((enchantment, leve) -> + bookMeta.removeStoredEnchant(enchantment) + ); + } + } +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkCleanEnchantOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkCleanEnchantOperation.java new file mode 100644 index 0000000..4b1a225 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkCleanEnchantOperation.java @@ -0,0 +1,28 @@ +package xyz.alexcrea.cuanvil.enchant.bulk; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +/** + * Bulk operation for clean enchantments operations. + */ +public interface BulkCleanEnchantOperation { + + /** + * Bulk clear part of the enchantments from this item. + * The item can be edited freely. If you need the meta it is preferred to use {@link #bulkClear(ItemStack, ItemMeta)} if possible + * @param item The item to clear enchantment from. + */ + void bulkClear(@NotNull ItemStack item); + + /** + * Bulk clear part of the enchantments from this item meta. + * Item should not be edited as meta will be applied later. + * If you need to edit the item and do not need the meta use {@link #bulkClear(ItemStack)} + * @param item The item source of the item meta. should not be edited. + * @param meta The item meta to clear enchantment from. + */ + void bulkClear(@NotNull ItemStack item, @NotNull ItemMeta meta); + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkGetEnchantOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkGetEnchantOperation.java new file mode 100644 index 0000000..a985edd --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BulkGetEnchantOperation.java @@ -0,0 +1,23 @@ +package xyz.alexcrea.cuanvil.enchant.bulk; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; + +import java.util.Map; + +/** + * Bulk operation for get enchantments operations. + */ +public interface BulkGetEnchantOperation { + + /** + * Bulk get part of the stored enchantment of this item. + * @param enchantmentList Mutable map of collected enchantment. should b + * @param item The item to get enchantment from. Should not get edited. + * @param meta The item meta to get enchantment from. Should not get edited. + */ + void bulkGet(@NotNull Map enchantmentList, @NotNull ItemStack item, @NotNull ItemMeta meta); + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/EnchantSquaredBulkOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/EnchantSquaredBulkOperation.java new file mode 100644 index 0000000..59bd6ec --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/EnchantSquaredBulkOperation.java @@ -0,0 +1,37 @@ +package xyz.alexcrea.cuanvil.enchant.bulk; + +import me.athlaeos.enchantssquared.managers.CustomEnchantManager; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.dependency.DependencyManager; +import xyz.alexcrea.cuanvil.dependency.EnchantmentSquaredDependency; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; + +import java.util.Collections; +import java.util.Map; + +public class EnchantSquaredBulkOperation implements BulkGetEnchantOperation, BulkCleanEnchantOperation { + + @Override + public void bulkGet(@NotNull Map enchantmentList, @NotNull ItemStack item, @NotNull ItemMeta meta) { + EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); + if(enchantmentSquared != null){ + enchantmentSquared.getEnchantmentsSquared(item, enchantmentList); + } + } + + + @Override + public void bulkClear(@NotNull ItemStack item) { + EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); + if(enchantmentSquared != null){ + CustomEnchantManager.getInstance().setItemEnchants(item, Collections.emptyMap()); + } + } + + @Override + public void bulkClear(@NotNull ItemStack item, @NotNull ItemMeta meta) { + // item meta is not preferred for enchantment squared clear + } +} diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt index 3c415f6..a85af39 100644 --- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt @@ -29,7 +29,6 @@ object ItemUtil { fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { CAEnchantment.clearEnchants(this) - //TODO maybe faster methode to add vanilla enchantment. maybe move this function to wrapped enchantment enchantments.forEach { (enchantment, level) -> enchantment.addEnchantmentUnsafe(this, level) } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index dbe2374..abebcbc 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -210,7 +210,7 @@ class EnchantConflictManager { val newItem = item.clone() CAEnchantment.clearEnchants(newItem) - enchantments.forEach{//TODO maybe bulk add if possible + enchantments.forEach{ enchantment -> enchantment.key.addEnchantmentUnsafe(newItem, enchantment.value) }