diff --git a/api/src/main/java/net/momirealms/customfishing/api/manager/ItemManager.java b/api/src/main/java/net/momirealms/customfishing/api/manager/ItemManager.java index e718f2b3..1081e3a6 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/manager/ItemManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/manager/ItemManager.java @@ -133,6 +133,8 @@ public interface ItemManager { @Nullable BuildableItem getBuildableItem(String namespace, String value); + ItemStack getItemStackAppearance(Player player, String material); + /** * Register an item library. * diff --git a/plugin/src/main/java/net/momirealms/customfishing/command/sub/GUIEditorCommand.java b/plugin/src/main/java/net/momirealms/customfishing/command/sub/GUIEditorCommand.java index 3a75a624..85ddb7ae 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/command/sub/GUIEditorCommand.java +++ b/plugin/src/main/java/net/momirealms/customfishing/command/sub/GUIEditorCommand.java @@ -2,7 +2,7 @@ package net.momirealms.customfishing.command.sub; import dev.jorel.commandapi.CommandAPICommand; import net.momirealms.customfishing.api.CustomFishingPlugin; -import net.momirealms.customfishing.gui.SelectFileGUI; +import net.momirealms.customfishing.gui.page.file.FileSelector; import java.io.File; @@ -13,7 +13,7 @@ public class GUIEditorCommand { public CommandAPICommand getEditorCommand() { return new CommandAPICommand("edit") .executesPlayer((player, arg) -> { - new SelectFileGUI(player, new File(CustomFishingPlugin.get().getDataFolder(), "contents")); + new FileSelector(player, new File(CustomFishingPlugin.get().getDataFolder(), "contents")); }); } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/compatibility/entity/ItemsAdderEntityImpl.java b/plugin/src/main/java/net/momirealms/customfishing/compatibility/entity/ItemsAdderEntityImpl.java index f842674c..09f5223c 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/compatibility/entity/ItemsAdderEntityImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/compatibility/entity/ItemsAdderEntityImpl.java @@ -36,10 +36,10 @@ public class ItemsAdderEntityImpl implements EntityLibrary { CustomEntity customEntity = CustomEntity.spawn( id, location, - (Boolean) propertyMap.get("frustumCulling"), - (Boolean) propertyMap.get("noBase"), - (Boolean) propertyMap.get("noHitbox") + (Boolean) propertyMap.getOrDefault("frustumCulling", true), + (Boolean) propertyMap.getOrDefault("noBase", false), + (Boolean) propertyMap.getOrDefault("noHitbox", false) ); return customEntity.getEntity(); } -} +} \ No newline at end of file diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/Icon.java b/plugin/src/main/java/net/momirealms/customfishing/gui/Icon.java new file mode 100644 index 00000000..e300c1ca --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/Icon.java @@ -0,0 +1,4 @@ +package net.momirealms.customfishing.gui; + +public interface Icon { +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/ItemPage.java b/plugin/src/main/java/net/momirealms/customfishing/gui/ItemPage.java new file mode 100644 index 00000000..7354e7a2 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/ItemPage.java @@ -0,0 +1,8 @@ +package net.momirealms.customfishing.gui; + +import org.bukkit.configuration.ConfigurationSection; + +public interface ItemPage extends YamlPage { + + ConfigurationSection getSection(); +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/ParentPage.java b/plugin/src/main/java/net/momirealms/customfishing/gui/ParentPage.java new file mode 100644 index 00000000..26e8e629 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/ParentPage.java @@ -0,0 +1,13 @@ +package net.momirealms.customfishing.gui; + +import net.momirealms.customfishing.gui.icon.BackToPageItem; +import xyz.xenondevs.invui.item.Item; + +public interface ParentPage { + + void reOpen(); + + default Item getBackItem() { + return new BackToPageItem(this); + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/YamlPage.java b/plugin/src/main/java/net/momirealms/customfishing/gui/YamlPage.java new file mode 100644 index 00000000..611532b0 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/YamlPage.java @@ -0,0 +1,6 @@ +package net.momirealms.customfishing.gui; + +public interface YamlPage extends ParentPage { + + void save(); +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackGroundItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackGroundItem.java index 10e88ea3..e3a35c7f 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackGroundItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackGroundItem.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.gui.icon; +import net.momirealms.customfishing.gui.Icon; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -13,7 +14,7 @@ public class BackGroundItem extends AbstractItem implements Icon { @Override public ItemProvider getItemProvider() { - return new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE); + return new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE).setDisplayName(""); } @Override diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToFolderItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToFolderItem.java index 03fe3878..e5509c19 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToFolderItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToFolderItem.java @@ -2,7 +2,8 @@ package net.momirealms.customfishing.gui.icon; import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; -import net.momirealms.customfishing.gui.SelectFileGUI; +import net.momirealms.customfishing.gui.Icon; +import net.momirealms.customfishing.gui.page.file.FileSelector; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -15,7 +16,7 @@ import xyz.xenondevs.invui.item.impl.AbstractItem; import java.io.File; import java.util.List; -public class BackToFolderItem extends AbstractItem implements Icon { +public class BackToFolderItem extends AbstractItem implements Icon { private final File file; @@ -41,6 +42,6 @@ public class BackToFolderItem extends AbstractItem implements Icon { @Override public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { if (file != null && file.getPath().startsWith("plugins\\CustomFishing\\contents")) - new SelectFileGUI(player, file); + new FileSelector(player, file); } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToPageItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToPageItem.java new file mode 100644 index 00000000..a95abcc2 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/BackToPageItem.java @@ -0,0 +1,35 @@ +package net.momirealms.customfishing.gui.icon; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.gui.ParentPage; +import org.bukkit.Material; +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.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +public class BackToPageItem extends AbstractItem { + + private final ParentPage parentPage; + + public BackToPageItem(ParentPage parentPage) { + this.parentPage = parentPage; + } + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.ORANGE_STAINED_GLASS_PANE) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FF8C00>Back to parent page" + ))); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + parentPage.reOpen(); + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/Icon.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/Icon.java deleted file mode 100644 index 26e581bd..00000000 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/Icon.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.momirealms.customfishing.gui.icon; - -public interface Icon { -} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/NextPageItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/NextPageItem.java index 62e618da..98e7e5a9 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/NextPageItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/NextPageItem.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.gui.icon; +import net.momirealms.customfishing.gui.Icon; import org.bukkit.Material; import xyz.xenondevs.invui.gui.PagedGui; import xyz.xenondevs.invui.item.ItemProvider; diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/PreviousPageItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/PreviousPageItem.java index 41fb3c38..dac4d9b0 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/PreviousPageItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/PreviousPageItem.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.gui.icon; +import net.momirealms.customfishing.gui.Icon; import org.bukkit.Material; import xyz.xenondevs.invui.gui.PagedGui; import xyz.xenondevs.invui.item.ItemProvider; diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollDownItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollDownItem.java index ea6ed66c..fb13751e 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollDownItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollDownItem.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.gui.icon; +import net.momirealms.customfishing.gui.Icon; import org.bukkit.Material; import xyz.xenondevs.invui.gui.ScrollGui; import xyz.xenondevs.invui.item.ItemProvider; diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollUpItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollUpItem.java index d3619dda..dbf5e25b 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollUpItem.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/ScrollUpItem.java @@ -1,5 +1,6 @@ package net.momirealms.customfishing.gui.icon; +import net.momirealms.customfishing.gui.Icon; import org.bukkit.Material; import xyz.xenondevs.invui.gui.ScrollGui; import xyz.xenondevs.invui.item.ItemProvider; diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/CMDItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/CMDItem.java new file mode 100644 index 00000000..7e31382d --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/CMDItem.java @@ -0,0 +1,60 @@ +package net.momirealms.customfishing.gui.icon.property; + +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.CustomModelDataEditor; +import org.bukkit.Material; +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.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +public class CMDItem extends AbstractItem { + + private final ItemPage itemPage; + + public CMDItem(ItemPage itemPage) { + this.itemPage = itemPage; + } + + @Override + public ItemProvider getItemProvider() { + ItemBuilder itemBuilder = new ItemBuilder(Material.GLOW_INK_SAC) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FFC0CB>● Custom Model Data" + ))); + + if (itemPage.getSection().contains("custom-model-data")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "Current value: " + itemPage.getSection().getInt("custom-model-data") + ))) + .addLoreLines(""); + itemBuilder.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 CustomModelDataEditor(player, itemPage, itemPage.getSection().getString("material", ""), itemPage.getSection()); + } else if (clickType.isRightClick()) { + itemPage.getSection().set("custom-model-data", null); + itemPage.save(); + itemPage.reOpen(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/DisplayNameItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/DisplayNameItem.java new file mode 100644 index 00000000..8aab0ee8 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/DisplayNameItem.java @@ -0,0 +1,60 @@ +package net.momirealms.customfishing.gui.icon.property; + +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.DisplayNameEditor; +import org.bukkit.Material; +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.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +public class DisplayNameItem extends AbstractItem { + + private final ItemPage itemPage; + + public DisplayNameItem(ItemPage itemPage) { + this.itemPage = itemPage; + } + + @Override + public ItemProvider getItemProvider() { + ItemBuilder itemBuilder = new ItemBuilder(Material.NAME_TAG) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FAFAD2>● Display Name" + ))); + + if (itemPage.getSection().contains("display.name")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "Current value: " + itemPage.getSection().getString("display.name") + ))) + .addLoreLines(""); + itemBuilder.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 DisplayNameEditor(player, itemPage, itemPage.getSection()); + } else if (clickType.isRightClick()) { + itemPage.getSection().set("display.name", null); + itemPage.save(); + itemPage.reOpen(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/LoreItem.java b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/LoreItem.java new file mode 100644 index 00000000..7a87865b --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/icon/property/LoreItem.java @@ -0,0 +1,65 @@ +package net.momirealms.customfishing.gui.icon.property; + +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.LoreEditor; +import org.bukkit.Material; +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.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; + +public class LoreItem extends AbstractItem { + + private final ItemPage itemPage; + + public LoreItem(ItemPage itemPage) { + this.itemPage = itemPage; + } + + @Override + public ItemProvider getItemProvider() { + ItemBuilder itemBuilder = new ItemBuilder(Material.BIRCH_SIGN) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FA8072>● Lore" + ))); + + if (itemPage.getSection().contains("display.lore")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "Current value: " + ))); + for (String lore : itemPage.getSection().getStringList("display.lore")) { + itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + " - " + lore + ))); + } + itemBuilder.addLoreLines(""); + itemBuilder.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 LoreEditor(player, itemPage, itemPage.getSection()); + } else if (clickType.isRightClick()) { + itemPage.getSection().set("display.lore", null); + itemPage.save(); + itemPage.reOpen(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/SelectFileGUI.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/file/FileSelector.java similarity index 87% rename from plugin/src/main/java/net/momirealms/customfishing/gui/SelectFileGUI.java rename to plugin/src/main/java/net/momirealms/customfishing/gui/page/file/FileSelector.java index 598d467b..6ba58579 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/SelectFileGUI.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/file/FileSelector.java @@ -1,8 +1,13 @@ -package net.momirealms.customfishing.gui; +package net.momirealms.customfishing.gui.page.file; import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; -import net.momirealms.customfishing.gui.icon.*; +import net.momirealms.customfishing.gui.Icon; +import net.momirealms.customfishing.gui.icon.BackGroundItem; +import net.momirealms.customfishing.gui.icon.BackToFolderItem; +import net.momirealms.customfishing.gui.icon.ScrollDownItem; +import net.momirealms.customfishing.gui.icon.ScrollUpItem; +import net.momirealms.customfishing.gui.page.item.ItemSelector; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -23,9 +28,9 @@ import java.io.File; import java.util.ArrayDeque; import java.util.Deque; -public class SelectFileGUI { +public class FileSelector { - public SelectFileGUI(Player player, File folder) { + public FileSelector(Player player, File folder) { File[] files = folder.listFiles(); Deque items = new ArrayDeque<>(); if (files != null) { @@ -94,7 +99,7 @@ public class SelectFileGUI { String type = split[3]; switch (type) { case "item" -> { - new ItemEditor(player, file); + new ItemSelector(player, file); } } } @@ -117,7 +122,7 @@ public class SelectFileGUI { @Override public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { - new SelectFileGUI(player, file); + new FileSelector(player, file); } } } 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 new file mode 100644 index 00000000..dc7d734e --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemEditor.java @@ -0,0 +1,116 @@ +package net.momirealms.customfishing.gui.page.item; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.api.CustomFishingPlugin; +import net.momirealms.customfishing.gui.ItemPage; +import net.momirealms.customfishing.gui.icon.BackGroundItem; +import net.momirealms.customfishing.gui.icon.BackToPageItem; +import net.momirealms.customfishing.gui.icon.NextPageItem; +import net.momirealms.customfishing.gui.icon.PreviousPageItem; +import net.momirealms.customfishing.gui.icon.property.CMDItem; +import net.momirealms.customfishing.gui.icon.property.DisplayNameItem; +import net.momirealms.customfishing.gui.icon.property.LoreItem; +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; + +public class ItemEditor implements ItemPage { + + private final Player player; + private final ItemSelector itemSelector; + private final ConfigurationSection section; + private final String key; + + public ItemEditor(Player player, String key, ItemSelector itemSelector, ConfigurationSection section) { + this.player = player; + this.section = section; + this.itemSelector = itemSelector; + this.key = key; + this.reOpen(); + } + + @Override + public void reOpen() { + Item border = new SimpleItem(new ItemBuilder(Material.AIR)); + Gui upperGui = Gui.normal() + .setStructure( + "# a #" + ) + .addIngredient('a', new RefreshExample()) + .addIngredient('#', border) + .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", + "# # a # c # b # #" + ) + .addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL) + .addIngredient('#', new BackGroundItem()) + .addIngredient('a', new PreviousPageItem()) + .addIngredient('b', new NextPageItem()) + .addIngredient('c', new BackToPageItem(itemSelector)) + .setContent(getItemList()) + .build(); + + var window = AnvilWindow.split() + .setViewer(player) + .setTitle(new ShadedAdventureComponentWrapper( + AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key) + )) + .setUpperGui(upperGui) + .setLowerGui(gui) + .build(); + + window.open(); + } + + @Override + public void save() { + itemSelector.save(); + } + + public class RefreshExample extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(CustomFishingPlugin.get().getItemManager().getItemBuilder(section, "item", key).build(player)); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + notifyWindows(); + } + } + + public List getItemList() { + ArrayList items = new ArrayList<>(); + items.add(new DisplayNameItem(this)); + items.add(new LoreItem(this)); + items.add(new CMDItem(this)); + return items; + } + + @Override + public ConfigurationSection getSection() { + return section; + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/ItemEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemSelector.java similarity index 75% rename from plugin/src/main/java/net/momirealms/customfishing/gui/ItemEditor.java rename to plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemSelector.java index e76ec520..530d920b 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/gui/ItemEditor.java +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/item/ItemSelector.java @@ -1,9 +1,10 @@ -package net.momirealms.customfishing.gui; +package net.momirealms.customfishing.gui.page.item; import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.util.LogUtils; +import net.momirealms.customfishing.gui.YamlPage; import net.momirealms.customfishing.gui.icon.BackGroundItem; import net.momirealms.customfishing.gui.icon.BackToFolderItem; import net.momirealms.customfishing.gui.icon.NextPageItem; @@ -33,29 +34,35 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class ItemEditor { +public class ItemSelector implements YamlPage { - private static final String SEARCH = "Search"; + public static final String SEARCH = "Search"; private final Player player; private final YamlConfiguration yaml; private String prefix; private final File file; + private long coolDown; - public ItemEditor(Player player, File file) { + public ItemSelector(Player player, File file) { this.yaml = YamlConfiguration.loadConfiguration(file); this.player = player; this.file = file; this.prefix = SEARCH; - this.reOpenWithFilter(); + this.reOpenWithFilter(SEARCH); } - public void reOpenWithFilter() { + @Override + public void reOpen() { + reOpenWithFilter(prefix); + } + + public void reOpenWithFilter(String filter) { Item border = new SimpleItem(new ItemBuilder(Material.AIR)); Gui upperGui = Gui.normal() .setStructure( "a # #" ) - .addIngredient('a', new SimpleItem(new ItemBuilder(Material.NAME_TAG).setDisplayName(prefix))) + .addIngredient('a', new SimpleItem(new ItemBuilder(Material.NAME_TAG).setDisplayName(filter))) .addIngredient('#', border) .build(); @@ -74,16 +81,18 @@ public class ItemEditor { .setContent(getItemList()) .build(); - var temp = prefix; var window = AnvilWindow.split() .setViewer(player) .setTitle(new ShadedAdventureComponentWrapper( AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Select item to edit") )) .addRenameHandler(s -> { - if (s.equals(temp)) return; + long current = System.currentTimeMillis(); + if (current - coolDown < 100) return; + if (s.equals(filter)) return; prefix = s; - reOpenWithFilter(); + coolDown = current; + reOpenWithFilter(s); }) .setUpperGui(upperGui) .setLowerGui(gui) @@ -126,6 +135,7 @@ public class ItemEditor { yaml.set(key, null); } + @Override public void save() { try { yaml.save(file); @@ -138,33 +148,34 @@ public class ItemEditor { private final String key; private final ItemBuilder itemBuilder; - private final ItemEditor itemEditor; + private final ItemSelector itemSelector; - public ItemInList(String key, ItemBuilder itemBuilder, ItemEditor itemEditor) { + public ItemInList(String key, ItemBuilder itemBuilder, ItemSelector itemSelector) { this.key = key; - this.itemBuilder = itemBuilder; - this.itemEditor = itemEditor; + this.itemBuilder = itemBuilder.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + key + ))).addLoreLines("") + .addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Left click to edit" + ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#FF6347> -> Right click to delete" + ))); + this.itemSelector = itemSelector; } @Override public ItemProvider getItemProvider() { - return itemBuilder.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( - key - ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( - "Left click to edit" - ))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( - "Right click to delete" - ))); + return itemBuilder; } @Override public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { if (clickType.isLeftClick()) { - + new ItemEditor(player, key, itemSelector, itemSelector.yaml.getConfigurationSection(key)); } else if (clickType.isRightClick()) { - this.itemEditor.removeKey(key); - this.itemEditor.save(); - this.itemEditor.reOpenWithFilter(); + this.itemSelector.removeKey(key); + this.itemSelector.save(); + this.itemSelector.reOpenWithFilter(itemSelector.prefix); } } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/CustomModelDataEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/CustomModelDataEditor.java new file mode 100644 index 00000000..043847ad --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/CustomModelDataEditor.java @@ -0,0 +1,137 @@ +package net.momirealms.customfishing.gui.page.property; + +import net.momirealms.customfishing.adventure.AdventureManagerImpl; +import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper; +import net.momirealms.customfishing.api.CustomFishingPlugin; +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.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.invui.gui.Gui; +import xyz.xenondevs.invui.gui.PagedGui; +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; + +public class CustomModelDataEditor { + + private final Player player; + private final YamlPage parentPage; + private String cmd; + private final ConfigurationSection section; + private final String material; + + public CustomModelDataEditor(Player player, YamlPage parentPage, String material, ConfigurationSection section) { + this.player = player; + this.parentPage = parentPage; + this.section = section; + this.material = material; + + Item border = new SimpleItem(new ItemBuilder(Material.AIR)); + var confirm = new ConfirmIcon(); + Gui upperGui = Gui.normal() + .setStructure( + "a # b" + ) + .addIngredient('a', new ItemBuilder(CustomFishingPlugin.get() + .getItemManager() + .getItemStackAppearance(player, material) + ) + .setCustomModelData(section.getInt("custom-model-data", 0)) + .setDisplayName(String.valueOf(section.getInt("custom-model-data", 0)))) + .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', new ItemStack(Material.AIR)) + .addIngredient('c', parentPage.getBackItem()) + .addIngredient('#', new BackGroundItem()) + .build(); + + var window = AnvilWindow.split() + .setViewer(player) + .setTitle(new ShadedAdventureComponentWrapper( + AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit CustomModelData") + )) + .addRenameHandler(s -> { + cmd = s; + confirm.notifyWindows(); + }) + .setUpperGui(upperGui) + .setLowerGui(gui) + .build(); + + window.open(); + } + + public class ConfirmIcon extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + if (cmd == null || cmd.isEmpty()) { + return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00CED1>● Delete property" + ))); + } else { + try { + int value = Integer.parseInt(cmd); + if (value >= 0) { + return new ItemBuilder( + CustomFishingPlugin.get() + .getItemManager() + .getItemStackAppearance(player, material) + ) + .setCustomModelData(value) + .setDisplayName("New value: " + value) + .addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Click to confirm" + ))); + } else { + return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "● Invalid number" + ))); + } + } catch (NumberFormatException e) { + return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "● Invalid number" + ))); + } + } + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + if (cmd == null || cmd.isEmpty()) { + section.set("custom-model-data", null); + } else { + try { + int value = Integer.parseInt(cmd); + if (value >= 0) { + section.set("custom-model-data", value); + } else { + return; + } + } catch (NumberFormatException e) { + return; + } + } + parentPage.reOpen(); + parentPage.save(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/DisplayNameEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/DisplayNameEditor.java new file mode 100644 index 00000000..a6e2a52e --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/DisplayNameEditor.java @@ -0,0 +1,104 @@ +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.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.invui.gui.Gui; +import xyz.xenondevs.invui.gui.PagedGui; +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; + +public class DisplayNameEditor { + + private final Player player; + private final YamlPage parentPage; + private String name; + private final ConfigurationSection section; + + public DisplayNameEditor(Player player, YamlPage parentPage, ConfigurationSection section) { + this.player = player; + this.parentPage = parentPage; + this.section = section; + + 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(section.getString("display.name", "New Name"))) + .addIngredient('#', border) + .addIngredient('b', confirm) + .build(); + + var gui = PagedGui.items() + .setStructure( + "x x x x x x x x x", + "x x x x a x x x x", + "x x x x x x x x x", + "# # # # c # # # #" + ) + .addIngredient('x', new ItemStack(Material.AIR)) + .addIngredient('c', parentPage.getBackItem()) + .addIngredient('#', new BackGroundItem()) + .build(); + + var window = AnvilWindow.split() + .setViewer(player) + .setTitle(new ShadedAdventureComponentWrapper( + AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit Display Name") + )) + .addRenameHandler(s -> { + name = s; + confirm.notifyWindows(); + }) + .setUpperGui(upperGui) + .setLowerGui(gui) + .build(); + + window.open(); + } + + public class ConfirmIcon extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + if (name == null || name.isEmpty()) { + return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00CED1>● Delete property" + ))); + } else { + return new ItemBuilder(Material.NAME_TAG) + .setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + name + ))) + .addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "<#00FF7F> -> Click to confirm" + ))); + } + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + if (name == null || name.isEmpty()) { + section.set("display.name", null); + } else { + section.set("display.name", name); + } + parentPage.reOpen(); + parentPage.save(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/LoreEditor.java b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/LoreEditor.java new file mode 100644 index 00000000..d19ab9b8 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/gui/page/property/LoreEditor.java @@ -0,0 +1,184 @@ +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; + +public class LoreEditor { + + private final Player player; + private final YamlPage parentPage; + private final ArrayList lore; + private final ConfigurationSection section; + private int index; + + public LoreEditor(Player player, YamlPage parentPage, ConfigurationSection section) { + this.player = player; + this.parentPage = parentPage; + this.section = section; + this.index = 0; + this.lore = new ArrayList<>(section.getStringList("display.lore")); + this.lore.add(0, "Select one line"); + 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(lore.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 Lore") + )) + .addRenameHandler(s -> { + if (index == 0) return; + lore.set(index, s); + confirm.notifyWindows(); + }) + .setUpperGui(upperGui) + .setLowerGui(gui) + .build(); + + window.open(); + } + + public List getContents() { + ArrayList items = new ArrayList<>(); + int i = 1; + List subList = lore.subList(1, lore.size()); + for (String lore : subList) { + items.add(new LoreElement(lore, i++)); + } + items.add(new AddLore()); + return items; + } + + public class AddLore extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + "[+] Add a new line" + ))); + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + lore.add("Text"); + index = lore.size() - 1; + reOpen(index); + } + } + + public class LoreElement extends AbstractItem { + + private final String line; + private final int idx; + + public LoreElement(String line, int idx) { + this.line = line; + this.idx = idx; + } + + @Override + public ItemProvider getItemProvider() { + return new ItemBuilder(Material.PAPER).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) { + lore.remove(idx); + index = Math.min(index, lore.size() - 1); + reOpen(index); + } + } + } + + public class ConfirmIcon extends AbstractItem { + + @Override + public ItemProvider getItemProvider() { + List subList = lore.subList(1, lore.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 lore : subList) { + builder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage( + " - " + lore + ))); + } + return builder; + } + } + + @Override + public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + List subList = lore.subList(1, lore.size()); + if (lore.isEmpty()) { + section.set("display.lore", null); + } else { + section.set("display.lore", subList); + } + parentPage.reOpen(); + parentPage.save(); + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java index 3f3020b2..762e8b44 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java @@ -62,6 +62,7 @@ import org.bukkit.event.player.PlayerItemMendEvent; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -358,6 +359,37 @@ public class ItemManagerImpl implements ItemManager, Listener { return nbtItem.getItem(); } + @Override + public ItemStack getItemStackAppearance(Player player, String material) { + if (material != null) { + if (material.contains(":")) { + ItemStack itemStack = buildAnyPluginItemByID(player, material); + if (itemStack != null) { + ItemStack stack = new ItemStack(itemStack.getType()); + ItemMeta meta = stack.getItemMeta(); + meta.setCustomModelData(itemStack.getItemMeta().getCustomModelData()); + stack.setItemMeta(meta); + return stack; + } else { + return new ItemStack(Material.BARRIER); + } + } else { + try { + var m = Material.valueOf(material.toUpperCase(Locale.ENGLISH)); + if (m.isItem()) { + return new ItemStack(m); + } else { + return new ItemStack(Material.BARRIER); + } + } catch (IllegalArgumentException e) { + return new ItemStack(Material.BARRIER); + } + } + } else { + return new ItemStack(Material.STRUCTURE_VOID); + } + } + /** * Register an item library. *