From e440d05bb9208334267348692c28488b87fd7de5 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Sat, 6 Apr 2024 15:21:40 +0200 Subject: [PATCH] Create global and sub setting recipe config gui. --- .../config/global/CustomRecipeConfigGui.java | 86 +++++++ .../global/ElementListGlobalConfigGui.java | 6 +- .../gui/config/global/EnchantConflictGui.java | 158 ++---------- .../gui/config/global/MainConfigGui.java | 15 +- .../global/MappedElementListConfigGui.java | 156 ++++++++++++ .../subsetting/CustomRecipeSubSettingGui.java | 241 ++++++++++++++++++ .../EnchantConflictSubSettingGui.java | 34 ++- .../subsetting/MappedToListSubSettingGui.java | 28 ++ .../cuanvil/group/EnchantConflictGroup.kt | 9 +- .../cuanvil/group/EnchantConflictManager.kt | 4 +- .../xyz/alexcrea/cuanvil/interfaces/Named.kt | 7 + .../cuanvil/recipe/AnvilCustomRecipe.kt | 15 +- .../recipe/CustomAnvilRecipeManager.kt | 34 ++- 13 files changed, 613 insertions(+), 180 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/global/MappedElementListConfigGui.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/CustomRecipeSubSettingGui.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/MappedToListSubSettingGui.java create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/interfaces/Named.kt diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java new file mode 100644 index 0000000..ed00af6 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java @@ -0,0 +1,86 @@ +package xyz.alexcrea.cuanvil.gui.config.global; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.gui.config.settings.subsetting.CustomRecipeSubSettingGui; +import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; + +import java.util.Arrays; +import java.util.List; + +public class CustomRecipeConfigGui extends MappedElementListConfigGui { + + + public final static CustomRecipeConfigGui INSTANCE = new CustomRecipeConfigGui(); + + static { + INSTANCE.init(); + } + + private CustomRecipeConfigGui() { + super("title"); + + } + + @Override + protected ItemStack createItemForGeneric(AnvilCustomRecipe recipe) { + // Get base item to display + ItemStack craftResultItem = recipe.getResultItem(); + ItemStack displaydItem; + if(craftResultItem == null){ + displaydItem = new ItemStack(Material.BARRIER); + }else{ + displaydItem = craftResultItem.clone(); + } + + // edit displayed item + ItemMeta meta = displaydItem.getItemMeta(); + + meta.setDisplayName("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(recipe.getName()) + " \u00A7fCustom recipe"); + meta.setLore(Arrays.asList( + "TODO" + )); + + displaydItem.setItemMeta(meta); + return displaydItem; + } + + @Override + protected CustomRecipeSubSettingGui newInstanceOfGui(AnvilCustomRecipe generic, GuiItem item) { + return new CustomRecipeSubSettingGui(this, generic, item); + } + + @Override + protected String genericDisplayedName() { + return "custom recipe"; + } + + @Override + protected AnvilCustomRecipe createAndSaveNewEmptyGeneric(String name) { + // Create new empty conflict and display it to the admin + AnvilCustomRecipe recipe = new AnvilCustomRecipe( + name, + AnvilCustomRecipe.Companion.getDEFAULT_EXACT_COUNT_CONFIG(), + AnvilCustomRecipe.Companion.getDEFAULT_XP_COST_CONFIG(), + AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG(), + AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG(), + AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG()); + + ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager().cleanAddNew(recipe); + + // Save recipe to file + recipe.saveToFile(); + + return recipe; + } + + + @Override + protected List getEveryDisplayableInstanceOfGeneric() { + return ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager().getRecipeList(); + } +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ElementListGlobalConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ElementListGlobalConfigGui.java index 2f8a6c6..1655c30 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ElementListGlobalConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/ElementListGlobalConfigGui.java @@ -25,8 +25,8 @@ import java.util.UUID; public abstract class ElementListGlobalConfigGui< T > extends ValueUpdatableGui { - public ElementListGlobalConfigGui(int rows, @NotNull String title) { - super(rows, title, CustomAnvil.instance); + public ElementListGlobalConfigGui(@NotNull String title) { + super(6, title, CustomAnvil.instance); } @@ -265,7 +265,7 @@ public abstract class ElementListGlobalConfigGui< T > extends ValueUpdatableGui } - public void removeConflict(T generic) { + public void removeGeneric(T generic) { GuiItem item = findGuiItemForRemoval(generic); if(item == null) return; removeFromPage(item); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java index e713e36..0b9e22f 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java @@ -1,28 +1,20 @@ package xyz.alexcrea.cuanvil.gui.config.global; import com.github.stefvanschie.inventoryframework.gui.GuiItem; -import io.delilaheve.CustomAnvil; -import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; import xyz.alexcrea.cuanvil.group.IncludeGroup; import xyz.alexcrea.cuanvil.gui.config.settings.subsetting.EnchantConflictSubSettingGui; -import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Locale; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; -public class EnchantConflictGui extends ElementListGlobalConfigGui { +public class EnchantConflictGui extends MappedElementListConfigGui { public final static EnchantConflictGui INSTANCE = new EnchantConflictGui(); @@ -30,115 +22,33 @@ public class EnchantConflictGui extends ElementListGlobalConfigGui conflictGuiMap; - private EnchantConflictGui() { - super(6, "Conflict Config"); - this.conflictGuiMap = new HashMap<>(); + super( "Conflict Config"); } @Override - protected GuiItem prepareCreateNewItem(){ - // Create new conflict item - ItemStack createItem = new ItemStack(Material.PAPER); - ItemMeta createMeta = createItem.getItemMeta(); + protected EnchantConflictGroup createAndSaveNewEmptyGeneric(String name){ + // Create new empty conflict and display it to the admin + EnchantConflictGroup conflict = new EnchantConflictGroup( + name, + new IncludeGroup("new_group"), + 0); - createMeta.setDisplayName("\u00A7aCreate new conflict"); - createMeta.setLore(Arrays.asList( - "\u00A77Create a new anvil restriction.", - "\u00A77You will be asked to name the conflict in chat.", - "\u00A77Then, you should edit the conflict config as you need" - )); + ConfigHolder.CONFLICT_HOLDER.getConflictManager().getConflictList().add(conflict); - createItem.setItemMeta(createMeta); + // save empty conflict in config + String[] emptyStringArray = new String[0]; - return new GuiItem(createItem, (clickEvent) -> { - clickEvent.setCancelled(true); - HumanEntity player = clickEvent.getWhoClicked(); + FileConfiguration config = ConfigHolder.CONFLICT_HOLDER.getConfig(); + config.set(name + ".enchantments", emptyStringArray); + config.set(name + ".notAffectedGroups", emptyStringArray); + config.set(name + ".maxEnchantmentBeforeConflict", 0); - // check permission - if (!player.hasPermission(CustomAnvil.editConfigPermission)) { - player.closeInventory(); - player.sendMessage(GuiGlobalActions.NO_EDIT_PERM); - return; - } - player.closeInventory(); + if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { + ConfigHolder.CONFLICT_HOLDER.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE); + } - player.sendMessage("\u00A7eWrite the conflict you want to create in the chat.\n" + - "\u00A7eOr write \u00A7ccancel \u00A7eto go back to conflict config menu"); - - CustomAnvil.Companion.getChatListener().setListenedCallback(player, prepareCreateItemConsumer(player)); - - }, CustomAnvil.instance); - } - - private Consumer prepareCreateItemConsumer(HumanEntity player) { - AtomicReference> selfRef = new AtomicReference<>(); - Consumer selfCallback = (message) -> { - if (message == null) return; - - // check permission - if (!player.hasPermission(CustomAnvil.editConfigPermission)) { - player.sendMessage(GuiGlobalActions.NO_EDIT_PERM); - return; - } - - message = message.toLowerCase(Locale.ROOT); - if ("cancel".equalsIgnoreCase(message)) { - player.sendMessage("conflict creation cancelled..."); - show(player); - return; - } - - message = message.replace(' ', '_'); - - // Try to find if it already exists in a for loop - // Not the most efficient on large number of conflict, but it should not run often. - for (EnchantConflictGroup conflict : ConfigHolder.CONFLICT_HOLDER.getConflictManager().getConflictList()) { - if (conflict.getName().equalsIgnoreCase(message)) { - player.sendMessage("\u00A7cPlease enter a conflict name that do not already exist..."); - // wait next message. - CustomAnvil.Companion.getChatListener().setListenedCallback(player, selfRef.get()); - return; - } - } - - // Create new empty conflict and display it to the admin - EnchantConflictGroup conflict = new EnchantConflictGroup( - message, - new IncludeGroup("new_group"), - 0); - - ConfigHolder.CONFLICT_HOLDER.getConflictManager().getConflictList().add(conflict); - updateValueForGeneric(conflict, true); - - // save empty conflict in config - String[] emptyStringArray = new String[0]; - - FileConfiguration config = ConfigHolder.CONFLICT_HOLDER.getConfig(); - config.set(message + ".enchantments", emptyStringArray); - config.set(message + ".notAffectedGroups", emptyStringArray); - config.set(message + ".maxEnchantmentBeforeConflict", 0); - - if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { - ConfigHolder.CONFLICT_HOLDER.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE); - } - - // show the new conflict config to the player - this.conflictGuiMap.get(conflict).show(player); - - }; - - selfRef.set(selfCallback); - return selfCallback; - } - - @Override - public void reloadValues() { - this.conflictGuiMap.forEach((conflict, gui) -> gui.cleanUnused()); - this.conflictGuiMap.clear(); - - super.reloadValues(); + return conflict; } @Override @@ -159,35 +69,13 @@ public class EnchantConflictGui extends ElementListGlobalConfigGui extends ElementListGlobalConfigGui< T > { + + + protected final HashMap elementGuiMap; + public MappedElementListConfigGui(@NotNull String title) { + super(title); + this.elementGuiMap = new HashMap<>(); + + } + + @Override + protected GuiItem prepareCreateNewItem(){ + // Create new conflict item + ItemStack createItem = new ItemStack(Material.PAPER); + ItemMeta createMeta = createItem.getItemMeta(); + + createMeta.setDisplayName("\u00A7aCreate new "+genericDisplayedName()); + createMeta.setLore(Arrays.asList( + "\u00A77Create a new "+genericDisplayedName()+".", + "\u00A77You will be asked to name the "+genericDisplayedName()+" in chat.", + "\u00A77Then, you should edit the "+genericDisplayedName()+" config as you need" + )); + + createItem.setItemMeta(createMeta); + + return new GuiItem(createItem, (clickEvent) -> { + clickEvent.setCancelled(true); + HumanEntity player = clickEvent.getWhoClicked(); + + // check permission + if (!player.hasPermission(CustomAnvil.editConfigPermission)) { + player.closeInventory(); + player.sendMessage(GuiGlobalActions.NO_EDIT_PERM); + return; + } + player.closeInventory(); + + player.sendMessage("\u00A7eWrite the "+genericDisplayedName()+" name you want to create in the chat.\n" + + "\u00A7eOr write \u00A7ccancel \u00A7eto go back to "+genericDisplayedName()+" config menu"); + + CustomAnvil.Companion.getChatListener().setListenedCallback(player, prepareCreateItemConsumer(player)); + + }, CustomAnvil.instance); + } + + @Override + public void reloadValues() { + this.elementGuiMap.forEach((conflict, gui) -> gui.cleanUnused()); + this.elementGuiMap.clear(); + + super.reloadValues(); + } + + @Override + protected void updateGeneric(T generic, ItemStack usedItem) { + S gui = this.elementGuiMap.get(generic); + + GuiItem guiItem; + if (gui == null) { + // Create new sub setting gui + guiItem = new GuiItem(usedItem, CustomAnvil.instance); + gui = newInstanceOfGui(generic, guiItem); + + guiItem.setAction(GuiGlobalActions.openGuiAction(gui)); + + this.elementGuiMap.put(generic, gui); + addToPage(guiItem); + } else { + // Replace item with the updated one + guiItem = gui.getParentItemForThisGui(); + guiItem.setItem(usedItem); + } + gui.updateLocal(); + + } + + @Override + protected GuiItem findGuiItemForRemoval(T generic) { + S gui = this.elementGuiMap.get(generic); + if (gui == null) return null; + + this.elementGuiMap.remove(generic); + return gui.getParentItemForThisGui(); + } + + protected Consumer prepareCreateItemConsumer(HumanEntity player){ + AtomicReference> selfRef = new AtomicReference<>(); + Consumer selfCallback = (message) -> { + if (message == null) return; + + // check permission + if (!player.hasPermission(CustomAnvil.editConfigPermission)) { + player.sendMessage(GuiGlobalActions.NO_EDIT_PERM); + return; + } + + message = message.toLowerCase(Locale.ROOT); + if ("cancel".equalsIgnoreCase(message)) { + player.sendMessage(genericDisplayedName()+" creation cancelled..."); + show(player); + return; + } + + message = message.replace(' ', '_'); + + // Try to find if it already exists in a for loop + // Not the most efficient on large number of conflict, but it should not run often. + for (T generic : getEveryDisplayableInstanceOfGeneric()) { + if (generic.getName().equalsIgnoreCase(message)) { + player.sendMessage("\u00A7cPlease enter a "+genericDisplayedName()+" name that do not already exist..."); + // wait next message. + CustomAnvil.Companion.getChatListener().setListenedCallback(player, selfRef.get()); + return; + } + } + + T generic = createAndSaveNewEmptyGeneric(message); + + updateValueForGeneric(generic, true); + + // show the new conflict config to the player + this.elementGuiMap.get(generic).show(player); + + update(); + }; + + selfRef.set(selfCallback); + return selfCallback; + } + + protected abstract S newInstanceOfGui(T generic, GuiItem item); + + protected abstract String genericDisplayedName(); + + protected abstract T createAndSaveNewEmptyGeneric(String name); + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/CustomRecipeSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/CustomRecipeSubSettingGui.java new file mode 100644 index 0000000..7cea19d --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/CustomRecipeSubSettingGui.java @@ -0,0 +1,241 @@ +package xyz.alexcrea.cuanvil.gui.config.settings.subsetting; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.pane.PatternPane; +import com.github.stefvanschie.inventoryframework.pane.util.Pattern; +import io.delilaheve.CustomAnvil; +import kotlin.ranges.IntRange; +import org.bukkit.Material; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.gui.config.ConfirmActionGui; +import xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui; +import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui; +import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui; +import xyz.alexcrea.cuanvil.gui.config.settings.ItemSettingGui; +import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; +import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; +import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; +import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe; +import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; + +import java.util.Collections; +import java.util.function.Supplier; + +public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui { + + private final CustomRecipeConfigGui parent; + private final AnvilCustomRecipe anvilRecipe; + private final PatternPane pane; + private boolean shouldWork = true; + + public CustomRecipeSubSettingGui( + @NotNull CustomRecipeConfigGui parent, + @NotNull AnvilCustomRecipe anvilRecipe, + @NotNull GuiItem parentItemForThisGui) { + super(parentItemForThisGui, 3, "title"); + this.parent = parent; + this.anvilRecipe = anvilRecipe; + + Pattern pattern = new Pattern( + GuiSharedConstant.EMPTY_GUI_FULL_LINE, + "01230450D", + "B00000000" + ); + this.pane = new PatternPane(0, 0, 9, 3, pattern); + addPane(this.pane); + + prepareStaticValues(); + } + + BoolSettingsGui.BoolSettingFactory exactCountFactory; + IntSettingsGui.IntSettingFactory xpCostFactory; + ItemSettingGui.ItemSettingFactory leftItemFactory; + ItemSettingGui.ItemSettingFactory rightItemFactory; + ItemSettingGui.ItemSettingFactory resultItemFactory; + + private void prepareStaticValues() { + + GuiGlobalItems.addBackItem(this.pane, this.parent); + GuiGlobalItems.addBackgroundItem(this.pane); + + // Delete item + ItemStack deleteItem = new ItemStack(Material.RED_TERRACOTTA); + ItemMeta deleteMeta = deleteItem.getItemMeta(); + + deleteMeta.setDisplayName("\u00A74DELETE RECIPE"); + deleteMeta.setLore(Collections.singletonList("\u00A7cCaution with this button !")); + + deleteItem.setItemMeta(deleteMeta); + this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance)); + + // Displayed item will be updated later + + IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE(); + exactCountFactory = BoolSettingsGui.boolFactory("title", this, + this.anvilRecipe.getName()+"."+AnvilCustomRecipe.EXACT_COUNT_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER, + AnvilCustomRecipe.Companion.getDEFAULT_EXACT_COUNT_CONFIG()); + + xpCostFactory = IntSettingsGui.intFactory("title", this, + this.anvilRecipe.getName()+"."+AnvilCustomRecipe.XP_COST_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER, + costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.Companion.getDEFAULT_XP_COST_CONFIG(), 1, 5, 10); + + + leftItemFactory = ItemSettingGui.itemFactory("title", this, + this.anvilRecipe.getName()+"."+AnvilCustomRecipe.LEFT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER, + AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG()); + + rightItemFactory = ItemSettingGui.itemFactory("title", this, + this.anvilRecipe.getName()+"."+AnvilCustomRecipe.EXACT_COUNT_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER, + AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG()); + + resultItemFactory = ItemSettingGui.itemFactory("title", this, + this.anvilRecipe.getName()+"."+AnvilCustomRecipe.EXACT_COUNT_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER, + AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG()); + } + + private ConfirmActionGui createDeleteGui() { + Supplier deleteSupplier = () -> { + CustomAnvilRecipeManager manager = ConfigHolder.CUSTOM_RECIPE_HOLDER.getRecipeManager(); + + // Remove from manager + manager.cleanRemove(this.anvilRecipe); + + // Remove from parent + this.parent.removeGeneric(this.anvilRecipe); + + // Remove self + cleanUnused(); + + // Update config file storage + ConfigHolder.CUSTOM_RECIPE_HOLDER.getConfig().set(this.anvilRecipe.getName(), null); + + // Save + boolean success = true; + if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) { + success = ConfigHolder.CONFLICT_HOLDER.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE); + } + + return success; + }; + + return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.anvilRecipe.getName()) + "\u00A7c?", + "\u00A77Confirm that you want to delete this conflict.", + this, this.parent, deleteSupplier + ); + } + + @Override + public void updateGuiValues() { + this.parent.updateValueForGeneric(this.anvilRecipe, true); + // Parent should call updateLocal + } + + public void updateLocal() { + if (!this.shouldWork) return; + + /*// Prepare enchantment lore + ArrayList enchantLore = new ArrayList<>(); + enchantLore.add("\u00A77Allow you to select a list of \u00A75Enchantments \u00A77that this conflict should include"); + 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(); + + boolean greaterThanMax = enchants.size() > 5; + int maxindex = (greaterThanMax ? 4 : enchants.size()); + for (int i = 0; i < maxindex; i++) { + // format string like "- Fire Protection" + String formattedName = CasedStringUtil.snakeToUpperSpacedCase(enchantIterator.next().getKey().getKey()); + enchantLore.add("\u00A77- \u00A75" + formattedName); + } + if (greaterThanMax) { + enchantLore.add("\u00A77And " + (enchants.size() - 4) + " more..."); + } + + } + + // Prepare group lore + ArrayList groupLore = new ArrayList<>(); + groupLore.add("\u00A77Allow you to select a list of \u00A73Groups \u00A77that this conflict should include"); + Set grouos = getSelectedGroups(); + if (grouos.isEmpty()) { + groupLore.add("\u00A77There is no excluded groups for this conflict."); + } else { + groupLore.add("\u00A77List of excluded groups for this conflict:"); + Iterator groupIterator = grouos.iterator(); + + boolean greaterThanMax = grouos.size() > 5; + int maxindex = (greaterThanMax ? 4 : grouos.size()); + for (int i = 0; i < maxindex; i++) { + // format string like "- Melee Weapons" + String formattedName = CasedStringUtil.snakeToUpperSpacedCase(groupIterator.next().getName()); + groupLore.add("\u00A77- \u00A73" + formattedName); + + } + if (greaterThanMax) { + groupLore.add("\u00A77And " + (grouos.size() - 4) + " more..."); + } + } + + // Configure enchant setting item + ItemStack enchantItem = this.enchantSettingItem.getItem(); + ItemMeta enchantMeta = enchantItem.getItemMeta(); + + enchantMeta.setDisplayName("\u00A7aSelect included \u00A75Enchantments \u00A7aSettings"); + enchantMeta.setLore(enchantLore); + + enchantItem.setItemMeta(enchantMeta); + + this.enchantSettingItem.setItem(enchantItem); // Just in case + + // Configure group setting item + ItemStack groupItem = this.groupSettingItem.getItem(); + ItemMeta groupMeta = groupItem.getItemMeta(); + + groupMeta.setDisplayName("\u00A7aSelect excluded \u00A73Groups \u00A7aSettings"); + groupMeta.setLore(groupLore); + + groupItem.setItemMeta(groupMeta); + + this.groupSettingItem.setItem(groupItem); // Just in case + + + this.pane.bindItem('M', GuiGlobalItems.intSettingGuiItem(this.minBeforeActiveSettingFactory, Material.COMMAND_BLOCK));*/ + update(); + } + + public void cleanUnused() { + for (HumanEntity viewer : getViewers()) { + this.parent.show(viewer); + } + this.shouldWork = false; + + // Just in case something is extremely wrong + GuiItem background = GuiGlobalItems.backgroundItem(); + this.pane.bindItem('1', background); + this.pane.bindItem('2', background); + this.pane.bindItem('3', background); + this.pane.bindItem('4', background); + this.pane.bindItem('5', background); + + this.pane.bindItem('D', background); + } + + @Override + public void show(@NotNull HumanEntity humanEntity) { + if (this.shouldWork) { + super.show(humanEntity); + } else { + this.parent.show(humanEntity); + } + } + + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/EnchantConflictSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/EnchantConflictSubSettingGui.java index d6f243f..0acaa8c 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/EnchantConflictSubSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/EnchantConflictSubSettingGui.java @@ -14,7 +14,6 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup; import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; import xyz.alexcrea.cuanvil.group.EnchantConflictManager; -import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.ConfirmActionGui; import xyz.alexcrea.cuanvil.gui.config.SelectEnchantmentContainer; import xyz.alexcrea.cuanvil.gui.config.SelectGroupContainer; @@ -34,24 +33,22 @@ import java.util.Set; import java.util.function.Supplier; import java.util.logging.Level; -public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements SelectEnchantmentContainer, SelectGroupContainer { +public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui implements SelectEnchantmentContainer, SelectGroupContainer { private final EnchantConflictGui parent; private final EnchantConflictGroup enchantConflict; - private final GuiItem parentItemForThisGui; private final PatternPane pane; - private boolean shouldWorld = true; + private boolean shouldWork = true; public EnchantConflictSubSettingGui( @NotNull EnchantConflictGui parent, @NotNull EnchantConflictGroup enchantConflict, @NotNull GuiItem parentItemForThisGui) { - super(3, - "\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.getName()) + " \u00A78Config", - CustomAnvil.instance); + super(parentItemForThisGui, + 3, + "\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.getName()) + " \u00A78Config"); this.parent = parent; this.enchantConflict = enchantConflict; - this.parentItemForThisGui = parentItemForThisGui; Pattern pattern = new Pattern( GuiSharedConstant.EMPTY_GUI_FULL_LINE, @@ -126,7 +123,7 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S manager.conflictList.remove(this.enchantConflict); // Remove from parent - this.parent.removeConflict(this.enchantConflict); + this.parent.removeGeneric(this.enchantConflict); // Remove self cleanUnused(); @@ -143,7 +140,7 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S return success; }; - return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.getName()) + "\u00A7c?", + return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.enchantConflict.getName()) + "\u00A7c?", "\u00A77Confirm that you want to delete this conflict.", this, this.parent, deleteSupplier ); @@ -155,8 +152,9 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S // Parent should call updateLocal } + @Override public void updateLocal() { - if (!this.shouldWorld) return; + if (!this.shouldWork) return; // Prepare enchantment lore ArrayList enchantLore = new ArrayList<>(); @@ -231,11 +229,12 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S update(); } + @Override public void cleanUnused() { for (HumanEntity viewer : getViewers()) { this.parent.show(viewer); } - this.shouldWorld = false; + this.shouldWork = false; // Just in case something is extremely wrong GuiItem background = GuiGlobalItems.backgroundItem(); @@ -247,17 +246,13 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S @Override public void show(@NotNull HumanEntity humanEntity) { - if (this.shouldWorld) { + if (this.shouldWork) { super.show(humanEntity); } else { this.parent.show(humanEntity); } } - public GuiItem getParentItemForThisGui() { - return parentItemForThisGui; - } - // Select enchantment container methods @Override @@ -267,7 +262,7 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S @Override public boolean setSelectedEnchantments(Set enchantments) { - if (!this.shouldWorld) { + if (!this.shouldWork) { CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict.getName() + " enchants but sub config is destroyed"); return false; } @@ -312,7 +307,7 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S @Override public boolean setSelectedGroups(Set groups) { - if (!this.shouldWorld) { + if (!this.shouldWork) { CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict.getName() + " groups but sub config is destroyed"); return false; } @@ -347,4 +342,5 @@ public class EnchantConflictSubSettingGui extends ValueUpdatableGui implements S return Collections.emptySet(); } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/MappedToListSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/MappedToListSubSettingGui.java new file mode 100644 index 0000000..bcadc73 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/subsetting/MappedToListSubSettingGui.java @@ -0,0 +1,28 @@ +package xyz.alexcrea.cuanvil.gui.config.settings.subsetting; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import io.delilaheve.CustomAnvil; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; + +public abstract class MappedToListSubSettingGui extends ValueUpdatableGui { + + private final GuiItem item; + public MappedToListSubSettingGui( + GuiItem item, + int rows, + @NotNull String title) { + super(rows, title, CustomAnvil.instance); + this.item = item; + } + + + public GuiItem getParentItemForThisGui() { + return item; + } + + + public abstract void updateLocal(); // TODO + + public abstract void cleanUnused(); // TODO +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index 3e5c5d0..7acf857 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -3,12 +3,13 @@ package xyz.alexcrea.cuanvil.group import io.delilaheve.CustomAnvil import org.bukkit.Material import org.bukkit.enchantments.Enchantment +import xyz.alexcrea.cuanvil.interfaces.Named class EnchantConflictGroup( - val name: String, + private val name: String, private val cantConflict: AbstractMaterialGroup, val minBeforeBlock: Int -) { +): Named { private val enchantments = HashSet() @@ -62,4 +63,8 @@ class EnchantConflictGroup( return Material.ENCHANTED_BOOK } + override fun getName(): String { + return name + } + } \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index 80aebf7..45a9f36 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -139,9 +139,9 @@ class EnchantConflictManager { var result = ConflictType.NO_CONFLICT for (conflict in conflictList) { - CustomAnvil.verboseLog("Is against ${conflict.name}") + CustomAnvil.verboseLog("Is against ${conflict.getName()}") val conflicting = conflict.allowed(base, mat) - CustomAnvil.verboseLog("Was against ${conflict.name} and conflicting: $conflicting ") + CustomAnvil.verboseLog("Was against ${conflict.getName()} and conflicting: $conflicting ") if (!conflicting) { if (conflict.getEnchants().size <= 1) { result = ConflictType.SMALL_CONFLICT diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/interfaces/Named.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/interfaces/Named.kt new file mode 100644 index 0000000..e3cd288 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/interfaces/Named.kt @@ -0,0 +1,7 @@ +package xyz.alexcrea.cuanvil.interfaces + +interface Named { + + fun getName(): String + +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt index 697c3d0..edb1a18 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt @@ -4,9 +4,10 @@ import org.bukkit.configuration.ConfigurationSection import org.bukkit.inventory.ItemStack import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant +import xyz.alexcrea.cuanvil.interfaces.Named class AnvilCustomRecipe( - val name: String, + private val name: String, var exactCount: Boolean, //var exactLeft: Boolean, //var exactRight: Boolean, @@ -16,7 +17,7 @@ class AnvilCustomRecipe( var leftItem: ItemStack?, var rightItem: ItemStack?, var resultItem: ItemStack?, -) { +): Named { // Static config name companion object { @@ -37,9 +38,9 @@ class AnvilCustomRecipe( val DEFAULT_XP_COST_CONFIG = 1 - val DEFAULT_LEFT_ITEM_CONFIG = null - val DEFAULT_RIGHT_ITEM_CONFIG = null - val DEFAULT_RESULT_ITEM_CONFIG = null + val DEFAULT_LEFT_ITEM_CONFIG: ItemStack? = null + val DEFAULT_RIGHT_ITEM_CONFIG: ItemStack? = null + val DEFAULT_RESULT_ITEM_CONFIG: ItemStack? = null; val XP_COST_CONFIG_RANGE = 0..255 @@ -115,5 +116,9 @@ class AnvilCustomRecipe( return true } + override fun getName(): String { + return name + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/CustomAnvilRecipeManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/CustomAnvilRecipeManager.kt index 82f80be..8f9dece 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/CustomAnvilRecipeManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/CustomAnvilRecipeManager.kt @@ -4,34 +4,37 @@ import io.delilaheve.CustomAnvil import org.bukkit.Material import org.bukkit.configuration.file.FileConfiguration import org.bukkit.inventory.ItemStack -import java.util.LinkedHashMap class CustomAnvilRecipeManager { - lateinit var recipeMap: LinkedHashMap + lateinit var recipeList: ArrayList lateinit var recipeByMat: LinkedHashMap> fun prepareRecipes(config: FileConfiguration) { - recipeMap = LinkedHashMap() + recipeList = ArrayList() recipeByMat = LinkedHashMap() // read all configs val keys = config.getKeys(false) for (key in keys) { - if (recipeMap.containsKey(key)) - continue val recipe = AnvilCustomRecipe.getFromConfig(key) if(recipe == null){ CustomAnvil.log("Can't load recipe $key") continue } - recipeMap[key] = recipe - val leftItem = recipe.leftItem - if(leftItem != null){ - addToMap(recipe, leftItem) - } + cleanAddNew(recipe) + } + + } + + + fun cleanAddNew(recipe: AnvilCustomRecipe){ + recipeList.add(recipe) + val leftItem = recipe.leftItem + if(leftItem != null){ + addToMatMap(recipe, leftItem) } } @@ -46,13 +49,13 @@ class CustomAnvilRecipeManager { test!!.remove(recipe) } if(leftItem != null){ - addToMap(recipe, leftItem) + addToMatMap(recipe, leftItem) } recipe.leftItem = leftItem } - fun addToMap(recipe: AnvilCustomRecipe, leftItem: ItemStack){ + private fun addToMatMap(recipe: AnvilCustomRecipe, leftItem: ItemStack){ var recipeList = recipeByMat[leftItem.type] if(recipeList == null){ recipeList = ArrayList() @@ -62,4 +65,11 @@ class CustomAnvilRecipeManager { } + fun cleanRemove(recipe: AnvilCustomRecipe) { + + recipeList.remove(recipe) + cleanSetLeftItem(recipe, null) + + } + } \ No newline at end of file