From 1eac81aef66bcbee22b25f9c567e5f93cfdf86ea Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Sun, 16 Jun 2024 03:58:18 +0200 Subject: [PATCH] Attempt to switch from Enchantment to WrapperEnchantment --- .../config/SelectEnchantmentContainer.java | 8 ++-- .../global/AbstractEnchantConfigGui.java | 6 +-- .../config/global/EnchantCostConfigGui.java | 4 +- .../config/global/EnchantLimitConfigGui.java | 6 +-- .../EnchantConflictSubSettingGui.java | 16 +++---- .../settings/EnchantSelectSettingGui.java | 13 +++--- .../cuanvil/gui/util/GuiSharedConstant.java | 6 +-- .../io/delilaheve/util/ConfigOptions.kt | 24 ++-------- .../io/delilaheve/util/EnchantmentUtil.kt | 10 ++--- .../kotlin/io/delilaheve/util/ItemUtil.kt | 45 +++++-------------- .../cuanvil/group/EnchantConflictGroup.kt | 12 ++--- .../cuanvil/group/EnchantConflictManager.kt | 17 +++---- 12 files changed, 63 insertions(+), 104 deletions(-) diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java index ee6ce77..95bf586 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java @@ -1,15 +1,15 @@ package xyz.alexcrea.cuanvil.gui.config; -import org.bukkit.enchantments.Enchantment; +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import java.util.Set; public interface SelectEnchantmentContainer { - Set getSelectedEnchantments(); + Set getSelectedEnchantments(); - boolean setSelectedEnchantments(Set enchantments); + boolean setSelectedEnchantments(Set enchantments); - Set illegalEnchantments(); + Set illegalEnchantments(); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java index 7c6d31e..4bbd48a 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java @@ -4,7 +4,7 @@ import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.pane.Orientable; import com.github.stefvanschie.inventoryframework.pane.OutlinePane; import io.delilaheve.CustomAnvil; -import org.bukkit.enchantments.Enchantment; +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; @@ -55,7 +55,7 @@ public abstract class AbstractEnchantConfigGui(); - for (Enchantment enchant : GuiSharedConstant.SORTED_ENCHANTMENT_LIST) { + for (WrappedEnchantment enchant : GuiSharedConstant.SORTED_ENCHANTMENT_LIST) { T factory = getFactoryFromEnchant(enchant); bookItemFactoryList.add(factory); @@ -80,7 +80,7 @@ public abstract class AbstractEnchantConfigGui enchantLore = new ArrayList<>(); enchantLore.add("\u00A77Allow you to select a list of \u00A75Enchantments \u00A77that this conflict should include"); - Set enchants = getSelectedEnchantments(); + Set enchants = getSelectedEnchantments(); if (enchants.isEmpty()) { enchantLore.add("\u00A77There is no included enchantment for this conflict."); } else { enchantLore.add("\u00A77List of included enchantment for this conflict:"); - Iterator enchantIterator = enchants.iterator(); + Iterator enchantIterator = enchants.iterator(); boolean greaterThanMax = enchants.size() > 5; int maxindex = (greaterThanMax ? 4 : enchants.size()); @@ -243,12 +243,12 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl // Select enchantment container methods @Override - public Set getSelectedEnchantments() { + public Set getSelectedEnchantments() { return this.enchantConflict.getEnchants(); } @Override - public boolean setSelectedEnchantments(Set enchantments) { + public boolean setSelectedEnchantments(Set enchantments) { if (!this.shouldWork) { CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict + " enchants but sub config is destroyed"); return false; @@ -260,7 +260,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl // Save on file configuration String[] enchantKeys = new String[enchantments.size()]; int index = 0; - for (Enchantment enchantment : enchantments) { + for (WrappedEnchantment enchantment : enchantments) { enchantKeys[index++] = enchantment.getKey().getKey(); } ConfigHolder.CONFLICT_HOLDER.getConfig().set(enchantConflict + ".enchantments", enchantKeys); @@ -280,7 +280,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl } @Override - public Set illegalEnchantments() { + public Set illegalEnchantments() { return Collections.emptySet(); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java index f4d3337..6eeef37 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java @@ -13,6 +13,7 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.SelectEnchantmentContainer; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; @@ -29,7 +30,7 @@ public class EnchantSelectSettingGui extends AbstractSettingGui { SelectEnchantmentContainer enchantContainer; int page; - Set selectedEnchant; + Set selectedEnchant; public EnchantSelectSettingGui(@NotNull String title, ValueUpdatableGui parent, SelectEnchantmentContainer enchantContainer, int page) { super(6, title, parent); @@ -64,8 +65,8 @@ public class EnchantSelectSettingGui extends AbstractSettingGui { filledEnchant.align(OutlinePane.Alignment.BEGIN); filledEnchant.setOrientation(Orientable.Orientation.HORIZONTAL); - Set illegalEnchant = this.enchantContainer.illegalEnchantments(); - for (Enchantment enchant : GuiSharedConstant.SORTED_ENCHANTMENT_LIST) { + Set illegalEnchant = this.enchantContainer.illegalEnchantments(); + for (WrappedEnchantment enchant : GuiSharedConstant.SORTED_ENCHANTMENT_LIST) { if (illegalEnchant.contains(enchant)) { return; } @@ -76,7 +77,7 @@ public class EnchantSelectSettingGui extends AbstractSettingGui { } - private GuiItem getGuiItemFromEnchant(Enchantment enchantment) { + private GuiItem getGuiItemFromEnchant(WrappedEnchantment enchantment) { boolean isIn = this.selectedEnchant.contains(enchantment); Material usedMaterial; @@ -122,7 +123,7 @@ public class EnchantSelectSettingGui extends AbstractSettingGui { item.setItemMeta(meta); } - private Consumer getEnchantItemConsumer(Enchantment enchant, GuiItem guiItem) { + private Consumer getEnchantItemConsumer(WrappedEnchantment enchant, GuiItem guiItem) { return event -> { event.setCancelled(true); @@ -151,7 +152,7 @@ public class EnchantSelectSettingGui extends AbstractSettingGui { @Override public boolean hadChange() { - Set baseGroup = this.enchantContainer.getSelectedEnchantments(); + Set baseGroup = this.enchantContainer.getSelectedEnchantments(); return baseGroup.size() != this.selectedEnchant.size() || !baseGroup.containsAll(this.selectedEnchant); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java index d8bebca..1c33af2 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java @@ -5,9 +5,9 @@ import com.github.stefvanschie.inventoryframework.pane.Pane; import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; import java.util.Arrays; @@ -17,10 +17,10 @@ import java.util.List; public class GuiSharedConstant { - public static final List SORTED_ENCHANTMENT_LIST; + public static final List SORTED_ENCHANTMENT_LIST; static { - SORTED_ENCHANTMENT_LIST = Arrays.asList(Enchantment.values()); + SORTED_ENCHANTMENT_LIST = Arrays.asList(WrappedEnchantment.values()); SORTED_ENCHANTMENT_LIST.sort(Comparator.comparing(ench -> ench.getKey().getKey())); } diff --git a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt index 2ee3749..0fefdf2 100644 --- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt +++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt @@ -2,8 +2,8 @@ package io.delilaheve.util import io.delilaheve.CustomAnvil import io.delilaheve.util.EnchantmentUtil.enchantmentName -import org.bukkit.enchantments.Enchantment import xyz.alexcrea.cuanvil.config.ConfigHolder +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment /** * Config option accessors @@ -239,7 +239,7 @@ object ConfigOptions { /** * Get the given [enchantment]'s limit */ - fun enchantLimit(enchantment: Enchantment): Int { + fun enchantLimit(enchantment: WrappedEnchantment): Int { return enchantLimit(enchantment.enchantmentName) } @@ -273,7 +273,7 @@ object ConfigOptions { * it's source [isFromBook] */ fun enchantmentValue( - enchantment: Enchantment, + enchantment: WrappedEnchantment, isFromBook: Boolean ): Int { return enchantmentValue(enchantment.enchantmentName, isFromBook) @@ -309,22 +309,4 @@ object ConfigOptions { return DEFAULT_ENCHANT_VALUE } - /** - * Get an array of key of basic config options - */ - fun getBasicConfigKeys(): Array { - return arrayOf( - DEFAULT_LIMIT_PATH, - CAP_ANVIL_COST, - MAX_ANVIL_COST, - REPLACE_TOO_EXPENSIVE, - ITEM_REPAIR_COST, - UNIT_REPAIR_COST, - ITEM_RENAME_COST, - SACRIFICE_ILLEGAL_COST, - REMOVE_ANVIL_COST_LIMIT - ) - } - - } diff --git a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt index 0f1639c..9d3f95a 100644 --- a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt @@ -2,9 +2,9 @@ package io.delilaheve.util import io.delilaheve.CustomAnvil import org.bukkit.Material -import org.bukkit.enchantments.Enchantment import org.bukkit.entity.HumanEntity import xyz.alexcrea.cuanvil.config.ConfigHolder +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment import xyz.alexcrea.cuanvil.group.ConflictType import kotlin.math.max import kotlin.math.min @@ -17,17 +17,17 @@ object EnchantmentUtil { /** * Enchantment name without namespace */ - val Enchantment.enchantmentName: String + val WrappedEnchantment.enchantmentName: String get() = key.key /** * Combine 2 sets of enchantments according to our configuration */ - fun Map.combineWith( - other: Map, + fun Map.combineWith( + other: Map, mat: Material, player: HumanEntity - ) = mutableMapOf().apply { + ) = mutableMapOf().apply { putAll(this@combineWith) other.forEach { (enchantment, level) -> // Get max level or 255 if player can bypass diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt index 7eed593..9d7d899 100644 --- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt @@ -1,11 +1,9 @@ package io.delilaheve.util -import io.delilaheve.CustomAnvil import org.bukkit.Material.ENCHANTED_BOOK -import org.bukkit.enchantments.Enchantment import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable -import org.bukkit.inventory.meta.EnchantmentStorageMeta +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment import kotlin.math.ceil import kotlin.math.max import kotlin.math.min @@ -23,44 +21,21 @@ object ItemUtil { /** * Find the enchantment map for this [ItemStack] and return it as a [MutableMap] */ - fun ItemStack.findEnchantments() = if (isEnchantedBook()) { - (itemMeta as? EnchantmentStorageMeta)?.storedEnchants ?: emptyMap() - } else { - itemMeta?.enchants ?: emptyMap() - } + fun ItemStack.findEnchantments(): MutableMap = WrappedEnchantment.getEnchants(this) /** * Apply an [enchantments] map to this [ItemStack] */ - fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { - if (isEnchantedBook()) { - /* For some god-forsaken reason, item meta is not mutable - * so, we have to get the instance, modify it, then set it - * back to the item... #BecauseMinecraft */ - val bookMeta = (itemMeta as? EnchantmentStorageMeta) - bookMeta?.replaceEnchants(enchantments) - itemMeta = bookMeta - } else { - itemMeta?.enchants?.forEach { (enchant, _) -> - removeEnchantment(enchant) - } - addUnsafeEnchantments(enchantments) - } - } + fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { + WrappedEnchantment.clearEnchants(this) - /** - * Apply an [enchantments] map to this book - */ - private fun EnchantmentStorageMeta.replaceEnchants( - enchantments: Map - ) { - storedEnchants.forEach { (enchant, _) -> - removeStoredEnchant(enchant) - } - enchantments.forEach { (enchant, level) -> - val added = addStoredEnchant(enchant, level, true) - CustomAnvil.log("${enchant.key} added to item? $added") + val meta = this.itemMeta ?: return + + enchantments.forEach { (enchantment, level) -> + enchantment.addEnchantmentUnsafe(this, meta, level) } + + this.itemMeta = meta } /** diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index 76a07d8..edd98f3 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.group import io.delilaheve.CustomAnvil import org.bukkit.Material -import org.bukkit.enchantments.Enchantment +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment class EnchantConflictGroup( private val name: String, @@ -10,13 +10,13 @@ class EnchantConflictGroup( var minBeforeBlock: Int ) { - private val enchantments = HashSet() + private val enchantments = HashSet() - fun addEnchantment(enchant: Enchantment) { + fun addEnchantment(enchant: WrappedEnchantment) { enchantments.add(enchant) } - fun allowed(enchants: Set, mat: Material): Boolean { + fun allowed(enchants: Set, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { return true } @@ -42,11 +42,11 @@ class EnchantConflictGroup( return this.cantConflict } - fun getEnchants(): HashSet { + fun getEnchants(): HashSet { return enchantments } - fun setEnchants(enchants: Set) { + fun setEnchants(enchants: Set) { enchantments.clear() enchantments.addAll(enchants) } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index e295396..06260bf 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -5,6 +5,7 @@ import org.bukkit.Material import org.bukkit.NamespacedKey import org.bukkit.configuration.ConfigurationSection import org.bukkit.enchantments.Enchantment +import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment class EnchantConflictManager { @@ -27,12 +28,12 @@ class EnchantConflictManager { // 1.20.5 compatibility TODO better update system private val SWEEPING_EDGE_ENCHANT = - Enchantment.getByKey(NamespacedKey.minecraft("sweeping_edge")) ?: - Enchantment.SWEEPING_EDGE + WrappedEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge")) ?: + WrappedEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key) } - private lateinit var conflictMap: HashMap> + private lateinit var conflictMap: HashMap> lateinit var conflictList: ArrayList // Read and prepare all conflict @@ -58,14 +59,14 @@ class EnchantConflictManager { } } - fun addConflictToConflictMap(enchant: Enchantment, conflict: EnchantConflictGroup) { + fun addConflictToConflictMap(enchant: WrappedEnchantment, conflict: EnchantConflictGroup) { if (!conflictMap.containsKey(enchant)) { conflictMap[enchant] = ArrayList() } conflictMap[enchant]!!.add(conflict) } - fun removeConflictFromMap(enchant: Enchantment, conflict: EnchantConflictGroup): Boolean { + fun removeConflictFromMap(enchant: WrappedEnchantment, conflict: EnchantConflictGroup): Boolean { return conflictMap[enchant]!!.remove(conflict) } @@ -100,7 +101,7 @@ class EnchantConflictManager { return conflict } - private fun getEnchantByName(enchantName: String): Enchantment? { + private fun getEnchantByName(enchantName: String): WrappedEnchantment? { // Temporary solution for 1.20.5 when(enchantName){ @@ -110,7 +111,7 @@ class EnchantConflictManager { } val enchantKey = NamespacedKey.minecraft(enchantName) - return Enchantment.getByKey(enchantKey) + return WrappedEnchantment.getByKey(enchantKey) } @@ -151,7 +152,7 @@ class EnchantConflictManager { return group } - fun isConflicting(base: Set, mat: Material, newEnchant: Enchantment): ConflictType { + fun isConflicting(base: Set, mat: Material, newEnchant: WrappedEnchantment): ConflictType { CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}") val conflictList = conflictMap[newEnchant] ?: return ConflictType.NO_CONFLICT CustomAnvil.verboseLog("Did not get skipped")