From 341dd10e3faf994c21f60f01c97c2adb48243f88 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Tue, 7 Jul 2026 17:27:32 +0200 Subject: [PATCH] start of enchant config gui --- .../cuanvil/enchant/CAEnchantment.java | 9 ++ .../gui/config/global/EnchantConfigGui.java | 138 ++++++++++++++++++ .../gui/config/global/ItemConfigGui.java | 6 +- .../cuanvil/command/EditConfigExecutor.kt | 3 +- 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java index ea657ace..1d1aca46 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import xyz.alexcrea.cuanvil.enchant.bulk.BulkCleanEnchantOperation; import xyz.alexcrea.cuanvil.enchant.bulk.BulkGetEnchantOperation; import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Collection; import java.util.HashMap; @@ -45,6 +46,14 @@ public interface CAEnchantment { @NotNull String getName(); + /** + * Get the enchantment name prettified (upper spaced case) + * @return Prettier enchantment name + */ + default String getPrettyName() { + return CasedStringUtil.snakeToUpperSpacedCase(getName()); + } + /** * Get the default maximum level of this enchantment. * @return The default maximum level of this enchantment. diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java new file mode 100644 index 00000000..aa79c64c --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConfigGui.java @@ -0,0 +1,138 @@ +package xyz.alexcrea.cuanvil.gui.config.global; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.PatternPane; +import com.github.stefvanschie.inventoryframework.pane.util.Pattern; +import io.delilaheve.CustomAnvil; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import xyz.alexcrea.cuanvil.api.EnchantmentApi; +import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; +import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; +import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; +import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; +import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.MaterialUtil; +import xyz.alexcrea.cuanvil.util.UnitRepairUtil; + +import java.lang.ref.PhantomReference; +import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; +import java.util.Collections; +import java.util.HashMap; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class EnchantConfigGui extends ChestGui { + + public EnchantLimitConfigGui enchantLimitConfigGui; + public EnchantMergeLimitConfigGui enchantMergeLimitConfigGui; + public EnchantCostConfigGui enchantCostConfigGui; + public EnchantConflictGui enchantConflictGui; + public GroupConfigGui groupConfigGui; + + public EnchantConfigGui(@NotNull Set enchantments) { + super(3, + "Configuring Enchantments", + CustomAnvil.instance); + + Pattern pattern = new Pattern( + "0000D0000", + "023405600", + "Q00000000" + ); + PatternPane pane = new PatternPane(0, 0, 9, 3, pattern); + addPane(pane); + + GuiGlobalItems.addBackgroundItem(pane); + + ItemStack displayItemstack = new ItemStack(Material.ENCHANTED_BOOK); + ItemMeta displayMeta = displayItemstack.getItemMeta(); + assert displayMeta != null; + + displayMeta.setDisplayName("§aConfiguring Enchantments:"); + displayItemstack.setItemMeta(displayMeta); + + // Set enchantments + HashMap enchantmentMap = new HashMap<>(); + for (CAEnchantment enchantment : enchantments) { + enchantmentMap.put(enchantment, 1); + } + EnchantmentApi.setEnchantments(displayItemstack, enchantmentMap); + + pane.bindItem('D', new GuiItem(displayItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance)); + + // enchant level limit item + var enchantLimitItem = MainConfigGui.enchantLimitItem(new EnchantLimitConfigGui()); //TODO + pane.bindItem('2', enchantLimitItem); + + // enchant level limit item + var enchantMergeLimitItem = MainConfigGui.enchantMergeLimitItem(new EnchantMergeLimitConfigGui()); //TODO + pane.bindItem('3', enchantMergeLimitItem); + + // enchant cost item + var enchantCostItem = MainConfigGui.enchantCostItem(new EnchantCostConfigGui()); //TODO + pane.bindItem('4', enchantCostItem); + + // Enchantment Conflicts item + var enchantConflictItem = MainConfigGui.enchantConflictItem(getEnchantConflictGui(enchantments)); + pane.bindItem('5', enchantConflictItem); + + // Group config items + var groupConfigItem = MainConfigGui.groupConfigItem(getGroupConfigGui(enchantments)); + pane.bindItem('6', groupConfigItem); + + // quit item + pane.bindItem('Q', MainConfigGui.quitItem()); + } + + @NotNull + @Contract(pure = true) + private Predicate getGroupFilter(@NotNull Set enchantments) { + return group -> group.getEnchants() + .stream() + .anyMatch(enchantments::contains); + } + + private EnchantConflictGui getEnchantConflictGui(@NotNull Set enchantments) { + if (enchantConflictGui == null) { + enchantConflictGui = new EnchantConflictGui(this); + enchantConflictGui.setFilter(getGroupFilter(enchantments)); + enchantConflictGui.init(); + } + + return enchantConflictGui; + } + + private GroupConfigGui getGroupConfigGui(@NotNull Set enchantments) { + if (groupConfigGui == null) { + groupConfigGui = new GroupConfigGui(this); + + // Get all the conflict related to this enchantment + var groups = ConfigHolder.CONFLICT_HOLDER + .getConflictManager() + .getConflictList() + .stream() + .filter(getGroupFilter(enchantments)) + .map(EnchantConflictGroup::getCantConflictGroup) + .collect(Collectors.toSet()); + + groupConfigGui.setFilter(group -> + groups.stream().anyMatch(other -> other.isReferencing(group)) + ); + groupConfigGui.init(); + } + + return groupConfigGui; + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java index d721619a..f7691d6e 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ItemConfigGui.java @@ -27,7 +27,11 @@ public class ItemConfigGui extends ChestGui { public CustomRecipeConfigGui customRecipeConfigGui; public ItemConfigGui(@NotNull Material display, @NotNull NamespacedKey material) { - super(3, CasedStringUtil.snakeToUpperSpacedCase(material.getKey().toLowerCase()) + " Config", CustomAnvil.instance); + super(3, + CasedStringUtil.snakeToUpperSpacedCase( + material.getKey().toLowerCase() + ) + " Config", + CustomAnvil.instance); Pattern pattern = new Pattern( "0000D0000", diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt index 0345441c..b11bfb4a 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt @@ -9,6 +9,7 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil import xyz.alexcrea.cuanvil.enchant.CAEnchantment import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry import xyz.alexcrea.cuanvil.gui.config.MainConfigGui +import xyz.alexcrea.cuanvil.gui.config.global.EnchantConfigGui import xyz.alexcrea.cuanvil.gui.config.global.ItemConfigGui import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions import xyz.alexcrea.cuanvil.util.MaterialUtil.customType @@ -80,7 +81,7 @@ class EditConfigExecutor : CASubCommand() { } } - // TODO open enchantments edit gui + EnchantConfigGui(enchantToFilter).show(sender) }