diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/EnchantmentItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/EnchantmentItem.java new file mode 100644 index 00000000..8ef39e88 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/EnchantmentItem.java @@ -0,0 +1,73 @@ +package net.momirealms.customfishing.gui.icon.property.item; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.gui.ItemPage; +import net.momirealms.customfishing.gui.page.property.EnchantmentEditor; +import net.momirealms.customfishing.gui.page.property.SizeEditor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemFlag; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +import java.util.Map; + +public class EnchantmentItem extends AbstractItem { + + private final ItemPage itemPage; + + public EnchantmentItem(ItemPage itemPage) { + this.itemPage = itemPage; + } + + @Override + public ItemProvider getItemProvider() { + ItemBuilder itemBuilder = new ItemBuilder(Material.IRON_HOE) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#8A2BE2>● Enchantment" + ))) + .addEnchantment(Enchantment.ARROW_FIRE,1,true) + .addItemFlags(ItemFlag.HIDE_ENCHANTS); + + if (itemPage.getSection().contains("enchantments")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "Current value: " + ))); + + for (Map.Entry entry : itemPage.getSection().getConfigurationSection("enchantments").getValues(false).entrySet()) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + " - " + entry.getKey() + ":" + entry.getValue() + ))); + } + + itemBuilder.addLoreLines("").addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to edit" + ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FF6347> -> Right click to reset" + ))); + } else { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to set" + ))); + } + + return itemBuilder; + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + if (clickType.isLeftClick()) { + new EnchantmentEditor(player, itemPage, itemPage.getSection(), false); + } else if (clickType.isRightClick()) { + itemPage.getSection().set("enchantments", null); + itemPage.save(); + itemPage.reOpen(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/StoredEnchantmentItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/StoredEnchantmentItem.java new file mode 100644 index 00000000..871d3fa1 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/item/StoredEnchantmentItem.java @@ -0,0 +1,72 @@ +package net.momirealms.customfishing.gui.icon.property.item; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.gui.ItemPage; +import net.momirealms.customfishing.gui.page.property.EnchantmentEditor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemFlag; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +import java.util.Map; + +public class StoredEnchantmentItem extends AbstractItem { + + private final ItemPage itemPage; + + public StoredEnchantmentItem(ItemPage itemPage) { + this.itemPage = itemPage; + } + + @Override + public ItemProvider getItemProvider() { + ItemBuilder itemBuilder = new ItemBuilder(Material.ENCHANTED_BOOK) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#6A5ACD>● Stored Enchantment" + ))) + .addEnchantment(Enchantment.ARROW_FIRE,1,true) + .addItemFlags(ItemFlag.HIDE_ENCHANTS); + + if (itemPage.getSection().contains("stored-enchantments")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "Current value: " + ))); + + for (Map.Entry entry : itemPage.getSection().getConfigurationSection("stored-enchantments").getValues(false).entrySet()) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + " - " + entry.getKey() + ":" + entry.getValue() + ))); + } + + itemBuilder.addLoreLines("").addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to edit" + ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FF6347> -> Right click to reset" + ))); + } else { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to set" + ))); + } + + return itemBuilder; + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + if (clickType.isLeftClick()) { + new EnchantmentEditor(player, itemPage, itemPage.getSection(), true); + } else if (clickType.isRightClick()) { + itemPage.getSection().set("stored-enchantments", null); + itemPage.save(); + itemPage.reOpen(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemEditor.java index 46a435fb..61f27d37 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemEditor.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemEditor.java @@ -15,6 +15,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.gui.PagedGui; @@ -46,13 +47,12 @@ public class ItemEditor implements ItemPage { @Override public void reOpen() { - Item border = new SimpleItem(new ItemBuilder(Material.AIR)); Gui upperGui = Gui.normal() .setStructure( "# a #" ) .addIngredient('a', new RefreshExample()) - .addIngredient('#', border) + .addIngredient('#', new ItemStack(Material.AIR)) .build(); var gui = PagedGui.items() @@ -124,6 +124,8 @@ public class ItemEditor implements ItemPage { items.add(new ItemFlagItem(this)); items.add(new Head64Item(this)); items.add(new NBTItem(this)); + items.add(new EnchantmentItem(this)); + items.add(new StoredEnchantmentItem(this)); return items; } diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/EnchantmentEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/EnchantmentEditor.java new file mode 100644 index 00000000..1afdf376 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/EnchantmentEditor.java @@ -0,0 +1,216 @@ +package net.momirealms.customfishing.gui.page.property; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.gui.YamlPage; +import net.momirealms.customfishing.gui.icon.BackGroundItem; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.invui.gui.Gui; +import xyz.xenondevs.invui.gui.PagedGui; +import xyz.xenondevs.invui.gui.structure.Markers; +import xyz.xenondevs.invui.item.Item; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; +import xyz.xenondevs.invui.item.impl.SimpleItem; +import xyz.xenondevs.invui.window.AnvilWindow; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class EnchantmentEditor { + + private final Player player; + private final YamlPage parentPage; + private final ArrayList enchantments; + private final ConfigurationSection section; + private int index; + private boolean store; + + public EnchantmentEditor(Player player, YamlPage parentPage, ConfigurationSection section, boolean store) { + this.player = player; + this.parentPage = parentPage; + this.section = section; + this.store = store; + this.index = 0; + this.enchantments = new ArrayList<>(); + this.enchantments.add("Select one enchantment"); + ConfigurationSection eSection = section.getConfigurationSection(store ? "stored-enchantments" : "enchantments"); + if (eSection != null) + for (Map.Entry entry : eSection.getValues(false).entrySet()) { + this.enchantments.add(entry.getKey() + ":" + entry.getValue()); + } + reOpen(0); + } + + public void reOpen(int idx) { + Item border = new SimpleItem(new ItemBuilder(Material.AIR)); + var confirm = new ConfirmIcon(); + Gui upperGui = Gui.normal() + .setStructure( + "a # b" + ) + .addIngredient('a', new ItemBuilder(Material.NAME_TAG).setDisplayName(enchantments.get(idx))) + .addIngredient('#', border) + .addIngredient('b', confirm) + .build(); + + var gui = PagedGui.items() + .setStructure( + "x x x x x x x x x", + "x x x x x x x x x", + "x x x x x x x x x", + "# # # # c # # # #" + ) + .addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL) + .addIngredient('c', parentPage.getBackItem()) + .addIngredient('#', new BackGroundItem()) + .setContent(getContents()) + .build(); + + var window = AnvilWindow.split() + .setViewer(player) + .setTitle(new ShadedAdventureComponentWrapper( + AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit" + (store ? " Stored ": " ") + "Enchantment") + )) + .addRenameHandler(s -> { + if (index == 0) return; + enchantments.set(index, s); + confirm.notifyWindows(); + }) + .setUpperGui(upperGui) + .setLowerGui(gui) + .build(); + + window.open(); + } + + public List getContents() { + ArrayList items = new ArrayList<>(); + int i = 1; + List subList = enchantments.subList(1, enchantments.size()); + for (String lore : subList) { + items.add(new EnchantmentElement(lore, i++)); + } + items.add(new AddEnchantment()); + return items; + } + + public class AddEnchantment extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "[+] Add a new enchantment" + ))); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + enchantments.add("namespace:enchantment:level"); + index = enchantments.size() - 1; + reOpen(index); + } + } + + public class EnchantmentElement extends AbstractItem { + + private final String line; + private final int idx; + + public EnchantmentElement(String line, int idx) { + this.line = line; + this.idx = idx; + } + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.ENCHANTED_BOOK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + line + ))).addLoreLines("") + .addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to edit" + ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FF6347> -> Right click to delete" + ))); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + if (clickType == ClickType.LEFT) { + index = idx; + reOpen(idx); + } else if (clickType == ClickType.RIGHT) { + enchantments.remove(idx); + index = Math.min(index, enchantments.size() - 1); + reOpen(index); + } + } + } + + public class ConfirmIcon extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + List subList = enchantments.subList(1, enchantments.size()); + if (subList.isEmpty()) { + return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00CED1>● Delete property" + ))); + } else { + var builder = new ItemBuilder(Material.NAME_TAG) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Click to confirm" + ))); + for (String enchantment : subList) { + String[] split = enchantment.split(":"); + if (split.length != 3) { + return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "● Illegal format" + ))); + } + try { + Integer.parseInt(split[2]); + builder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + " - " + enchantment + ))); + } catch (NumberFormatException e) { + return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "● Illegal format" + ))); + } + } + return builder; + } + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + List subList = enchantments.subList(1, enchantments.size()); + for (String line : subList) { + String[] split = line.split(":"); + if (split.length != 3) { + return; + } + try { + Integer.parseInt(split[2]); + } catch (NumberFormatException e) { + return; + } + } + section.set(store ? "stored-enchantments" : "enchantments", null); + for (String line : subList) { + String[] split = line.split(":"); + section.set((store ? "stored-enchantments" : "enchantments") + "." + split[0] + ":" + split[1], Integer.parseInt(split[2])); + } + parentPage.reOpen(); + parentPage.save(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/NBTEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/NBTEditor.java index 24d81609..d0f2fe12 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/NBTEditor.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/NBTEditor.java @@ -416,7 +416,7 @@ public class NBTEditor { @Override public ItemProvider getItemProvider() { - return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + return new ItemBuilder(Material.OAK_SIGN).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( "Add a new compound" ))); } @@ -431,7 +431,7 @@ public class NBTEditor { @Override public ItemProvider getItemProvider() { - return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + return new ItemBuilder(Material.SPRUCE_SIGN).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( "Add a new list" ))); } @@ -446,7 +446,7 @@ public class NBTEditor { @Override public ItemProvider getItemProvider() { - return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + return new ItemBuilder(Material.ACACIA_SIGN).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( "Add a new value" ))); }