From c173d73dc1d0cb82f83b2f253afead8ea01845c7 Mon Sep 17 00:00:00 2001 From: TheClashFruit Date: Sun, 18 Jun 2023 19:29:14 +0200 Subject: [PATCH] feat: cosmetics menu and dedicated gui class --- .gradle/file-system.probe | Bin 8 -> 8 bytes .../java/me/theclashfruit/hubbit/Hubbit.java | 9 +- .../hubbit/commands/CosmeticsCommand.java | 30 ++++++ .../hubbit/commands/MenuCommand.java | 97 ------------------ .../hubbit/commands/ServersCommand.java | 45 ++++++++ .../hubbit/events/MenuListener.java | 63 +++++++++++- .../hubbit/events/PlayerActionsListener.java | 4 + .../hubbit/utils/ConfigLoader.java | 6 +- .../theclashfruit/hubbit/utils/GuiUtil.java | 85 +++++++++++++++ src/main/resources/config.yml | 6 -- src/main/resources/menu/cosmetics_menu.yml | 10 ++ src/main/resources/menu/server_menu.yml | 1 + src/main/resources/plugin.yml | 3 + 13 files changed, 249 insertions(+), 110 deletions(-) create mode 100644 src/main/java/me/theclashfruit/hubbit/commands/CosmeticsCommand.java delete mode 100644 src/main/java/me/theclashfruit/hubbit/commands/MenuCommand.java create mode 100644 src/main/java/me/theclashfruit/hubbit/commands/ServersCommand.java create mode 100644 src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index c1dc8bc0b66375faef80a299e2366bf4cba46cfd..83433039c07353cb84786cbec91e2da58e90201d 100644 GIT binary patch literal 8 PcmZQzVC*>Ga&RR838@1| literal 8 PcmZQzVC*=Mc~Khx2)+WZ diff --git a/src/main/java/me/theclashfruit/hubbit/Hubbit.java b/src/main/java/me/theclashfruit/hubbit/Hubbit.java index 742595b..5999904 100644 --- a/src/main/java/me/theclashfruit/hubbit/Hubbit.java +++ b/src/main/java/me/theclashfruit/hubbit/Hubbit.java @@ -1,8 +1,9 @@ package me.theclashfruit.hubbit; import me.theclashfruit.hubbit.bstats.Metrics; +import me.theclashfruit.hubbit.commands.CosmeticsCommand; import me.theclashfruit.hubbit.commands.InfoCommand; -import me.theclashfruit.hubbit.commands.MenuCommand; +import me.theclashfruit.hubbit.commands.ServersCommand; import me.theclashfruit.hubbit.events.MenuListener; import me.theclashfruit.hubbit.events.PlayerActionsListener; import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; @@ -14,7 +15,8 @@ public final class Hubbit extends JavaPlugin { public void onEnable() { // Register Commands this.getCommand("hubbit").setExecutor(new InfoCommand()); - this.getCommand("servers").setExecutor(new MenuCommand()); + this.getCommand("servers").setExecutor(new ServersCommand()); + this.getCommand("cosmetics").setExecutor(new CosmeticsCommand()); this.getCommand("hubbit").setTabCompleter(new me.theclashfruit.hubbit.utils.TabUtil()); @@ -25,6 +27,9 @@ public final class Hubbit extends JavaPlugin { // Config this.saveDefaultConfig(); this.saveResource("menu/server_menu.yml", false); + this.saveResource("menu/cosmetics_menu.yml", false); + + this.saveResource("cosmetics/example.yml", false); // Load Singletons ConfigLoaderSingleton.getInstance(); diff --git a/src/main/java/me/theclashfruit/hubbit/commands/CosmeticsCommand.java b/src/main/java/me/theclashfruit/hubbit/commands/CosmeticsCommand.java new file mode 100644 index 0000000..d86e59c --- /dev/null +++ b/src/main/java/me/theclashfruit/hubbit/commands/CosmeticsCommand.java @@ -0,0 +1,30 @@ +package me.theclashfruit.hubbit.commands; + +import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; +import me.theclashfruit.hubbit.utils.GuiUtil; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; + +public class CosmeticsCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getCosmeticsMenuFileConfig(); + + if(sender instanceof Player) { + Player player = (Player) sender; + + Inventory menuGui = GuiUtil.createGui(menuConfig, player, "main"); + + player.openInventory(menuGui); + } else { + sender.sendRichMessage("You must be a player to use this command!"); + } + + return true; + } +} diff --git a/src/main/java/me/theclashfruit/hubbit/commands/MenuCommand.java b/src/main/java/me/theclashfruit/hubbit/commands/MenuCommand.java deleted file mode 100644 index 60a2375..0000000 --- a/src/main/java/me/theclashfruit/hubbit/commands/MenuCommand.java +++ /dev/null @@ -1,97 +0,0 @@ -package me.theclashfruit.hubbit.commands; - -import me.theclashfruit.hubbit.Hubbit; -import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; -import me.theclashfruit.hubbit.utils.MenuInventoryHolder; -import me.theclashfruit.hubbit.utils.MessageFormatter; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Material; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.bukkit.plugin.java.JavaPlugin.getPlugin; -import static org.bukkit.Bukkit.getLogger; - -public class MenuCommand implements CommandExecutor { - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getMenuFileConfig(); - - if(sender instanceof Player) { - Player player = (Player) sender; - - Inventory menu = new MenuInventoryHolder(getPlugin(Hubbit.class), menuConfig.getInt("size"), MessageFormatter.formatMessage(menuConfig.getString("title"), player)).getInventory(); - - int inventorySize = menuConfig.getInt("size"); - - getLogger().log(java.util.logging.Level.INFO, menuConfig.getMapList("pages").toString()); - - if (menuConfig.getBoolean("border.enabled") && menuConfig.getInt("size") >= 27) { - ItemStack borderItem = new ItemStack(Material.valueOf(menuConfig.getString("border.material")), 1); - - ItemMeta borderItemMeta = borderItem.getItemMeta(); - - borderItemMeta.displayName(MiniMessage.miniMessage().deserialize(" ")); - - borderItem.setItemMeta(borderItemMeta); - - for (int i = 0; i < inventorySize; i++) { - if (i < 9 || i > (inventorySize - 10) || i % 9 == 0 || i % 9 == 8) { - menu.setItem(i, borderItem); - } - } - } - - AtomicInteger currentPage = new AtomicInteger(); - - menuConfig.getMapList("pages").forEach(page -> { - if(currentPage.get() > 0 && !menuConfig.getBoolean("navigation")) { - return; - } - - List> items = (List>) page.get("items"); - - items.forEach(item -> { - ItemStack itemStack = new ItemStack(Material.valueOf((String) item.get("material")), (int) item.get("count")); - - ItemMeta itemMeta = itemStack.getItemMeta(); - - itemMeta.displayName(MessageFormatter.formatItemName(item.get("name").toString(), player)); - - List lore = (List) item.get("lore"); - List loreFinal = new java.util.ArrayList<>(List.of()); - - for (String s : lore) { - loreFinal.add(MessageFormatter.formatItemName(s, player)); - } - - itemMeta.lore(loreFinal); - - itemStack.setItemMeta(itemMeta); - - menu.setItem((int) item.get("slot"), itemStack); - }); - - currentPage.getAndIncrement(); - }); - - player.openInventory(menu); - } else { - sender.sendRichMessage("You must be a player to use this command!"); - } - - return true; - } -} diff --git a/src/main/java/me/theclashfruit/hubbit/commands/ServersCommand.java b/src/main/java/me/theclashfruit/hubbit/commands/ServersCommand.java new file mode 100644 index 0000000..a981660 --- /dev/null +++ b/src/main/java/me/theclashfruit/hubbit/commands/ServersCommand.java @@ -0,0 +1,45 @@ +package me.theclashfruit.hubbit.commands; + +import me.theclashfruit.hubbit.Hubbit; +import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; +import me.theclashfruit.hubbit.utils.GuiUtil; +import me.theclashfruit.hubbit.utils.MenuInventoryHolder; +import me.theclashfruit.hubbit.utils.MessageFormatter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.bukkit.plugin.java.JavaPlugin.getPlugin; +import static org.bukkit.Bukkit.getLogger; + +public class ServersCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getServersMenuFileConfig(); + + if(sender instanceof Player) { + Player player = (Player) sender; + + Inventory menuGui = GuiUtil.createGui(menuConfig, player, "main"); + + player.openInventory(menuGui); + } else { + sender.sendRichMessage("You must be a player to use this command!"); + } + + return true; + } +} diff --git a/src/main/java/me/theclashfruit/hubbit/events/MenuListener.java b/src/main/java/me/theclashfruit/hubbit/events/MenuListener.java index b942615..31198c6 100644 --- a/src/main/java/me/theclashfruit/hubbit/events/MenuListener.java +++ b/src/main/java/me/theclashfruit/hubbit/events/MenuListener.java @@ -1,6 +1,7 @@ package me.theclashfruit.hubbit.events; import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; +import me.theclashfruit.hubbit.utils.GuiUtil; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; @@ -16,7 +17,8 @@ import java.util.Map; public class MenuListener implements Listener { @EventHandler public void onClick(InventoryClickEvent event) { - FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getMenuFileConfig(); + FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getServersMenuFileConfig(); + FileConfiguration cosmeticsConfig = ConfigLoaderSingleton.getInstance().getCosmeticsMenuFileConfig(); Player player = (Player) event.getWhoClicked(); @@ -53,8 +55,54 @@ public class MenuListener implements Listener { player.sendRichMessage( "An error occurred while executing the action of the item." + - "" + - "Please contact an administrator." + "" + + "Please contact an administrator." + ); + } + } + }); + } + }); + }); + + event.setCancelled(true); + } + + if(event.getView().title().equals(MiniMessage.miniMessage().deserialize(cosmeticsConfig.getString("title")))) { + int eventSlot = event.getSlot(); + + cosmeticsConfig.getMapList("pages").forEach(page -> { + List> items = (List>) page.get("items"); + + items.forEach(item -> { + if(item.get("slot").equals(eventSlot)) { + List> events = (List>) item.get("events"); + + events.forEach(menuEvent -> { + switch (menuEvent.get("action").toString().toLowerCase()) { + case "send_message" -> { + player.closeInventory(); + + player.sendMessage(MiniMessage.miniMessage().deserialize(menuEvent.get("data").toString())); + } + case "join_server" -> { + player.closeInventory(); + + player.performCommand("server " + menuEvent.get("data").toString()); + } + case "execute_command" -> { + player.closeInventory(); + + player.performCommand(menuEvent.get("data").toString()); + } + case "do_nothing" -> {} + default -> { + player.closeInventory(); + + player.sendRichMessage( + "An error occurred while executing the action of the item." + + "" + + "Please contact an administrator." ); } } @@ -69,7 +117,8 @@ public class MenuListener implements Listener { @EventHandler public void onUse(PlayerInteractEvent event) { - FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getMenuFileConfig(); + FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getServersMenuFileConfig(); + FileConfiguration cosmeticsConfig = ConfigLoaderSingleton.getInstance().getCosmeticsMenuFileConfig(); Player player = event.getPlayer(); @@ -78,5 +127,11 @@ public class MenuListener implements Listener { player.performCommand("servers"); } + + if(player.getInventory().getItemInMainHand().getType() == Material.valueOf(cosmeticsConfig.getString("open_material"))) { + event.setCancelled(true); + + player.performCommand("cosmetics"); + } } } diff --git a/src/main/java/me/theclashfruit/hubbit/events/PlayerActionsListener.java b/src/main/java/me/theclashfruit/hubbit/events/PlayerActionsListener.java index b8be2aa..5aab6ec 100644 --- a/src/main/java/me/theclashfruit/hubbit/events/PlayerActionsListener.java +++ b/src/main/java/me/theclashfruit/hubbit/events/PlayerActionsListener.java @@ -57,6 +57,10 @@ public class PlayerActionsListener implements Listener { event.getPlayer().getInventory().setContents(playerInv.getContents()); event.getPlayer().updateInventory(); + + if(mainConfig.getBoolean("hub.tablist")) { + + } } } diff --git a/src/main/java/me/theclashfruit/hubbit/utils/ConfigLoader.java b/src/main/java/me/theclashfruit/hubbit/utils/ConfigLoader.java index bf9e5a4..0a13ec2 100644 --- a/src/main/java/me/theclashfruit/hubbit/utils/ConfigLoader.java +++ b/src/main/java/me/theclashfruit/hubbit/utils/ConfigLoader.java @@ -9,9 +9,13 @@ import static org.bukkit.plugin.java.JavaPlugin.getPlugin; public class ConfigLoader { YamlConfiguration serverMenuConfig = YamlConfiguration.loadConfiguration(new File(getPlugin(Hubbit.class).getDataFolder() + "/menu/server_menu.yml")); + YamlConfiguration cosmeticMenuConfig = YamlConfiguration.loadConfiguration(new File(getPlugin(Hubbit.class).getDataFolder() + "/menu/cosmetics_menu.yml")); - public @org.jetbrains.annotations.NotNull YamlConfiguration getMenuFileConfig() { + public @org.jetbrains.annotations.NotNull YamlConfiguration getServersMenuFileConfig() { return serverMenuConfig; } + public @org.jetbrains.annotations.NotNull YamlConfiguration getCosmeticsMenuFileConfig() { + return cosmeticMenuConfig; + } } diff --git a/src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java b/src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java new file mode 100644 index 0000000..f0ba7f5 --- /dev/null +++ b/src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java @@ -0,0 +1,85 @@ +package me.theclashfruit.hubbit.utils; + +import me.theclashfruit.hubbit.Hubbit; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.bukkit.plugin.java.JavaPlugin.getPlugin; + +public class GuiUtil { + public static Inventory createGui(FileConfiguration guiConfig, Player guiHolder, String pageId) { + Inventory inventoryGui = new MenuInventoryHolder(getPlugin(Hubbit.class), guiConfig.getInt("size"), MessageFormatter.formatMessage(guiConfig.getString("title"), guiHolder)).getInventory(); + + int inventorySize = guiConfig.getInt("size"); + + if (guiConfig.getBoolean("border.enabled") && guiConfig.getInt("size") >= 27) { + ItemStack borderItem = new ItemStack(Material.valueOf(guiConfig.getString("border.material")), 1); + + ItemMeta borderItemMeta = borderItem.getItemMeta(); + + borderItemMeta.displayName(MiniMessage.miniMessage().deserialize(" ")); + + borderItem.setItemMeta(borderItemMeta); + + for (int i = 0; i < inventorySize; i++) { + if (i < 9 || i > (inventorySize - 10) || i % 9 == 0 || i % 9 == 8) { + inventoryGui.setItem(i, borderItem); + } + } + } + + guiConfig.getMapList("pages").forEach(page -> { + if (page.get("id").equals(pageId)) { + List> items = (List>) page.get("items"); + + items.forEach(item -> { + ItemStack itemStack = new ItemStack(Material.valueOf((String) item.get("material")), (int) item.get("count")); + + ItemMeta itemMeta = itemStack.getItemMeta(); + + itemMeta.displayName(MessageFormatter.formatItemName(item.get("name").toString(), guiHolder)); + + List lore = (List) item.get("lore"); + List loreFinal = new java.util.ArrayList<>(List.of()); + + for (String s : lore) { + loreFinal.add(MessageFormatter.formatItemName(s, guiHolder)); + } + + itemMeta.lore(loreFinal); + + itemStack.setItemMeta(itemMeta); + + inventoryGui.setItem((int) item.get("slot"), itemStack); + }); + } + }); + + return inventoryGui; + } + + public static boolean guiActionHandler( + FileConfiguration guiConfig, + InventoryClickEvent inventoryClickEvent, + String guiAction, + String guiActionData, + String guiTitle, + String guiPageId, + Player guiHolder + ) { + // TODO: Make a better gui action handler + + return false; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a4ec798..fd9e375 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -22,12 +22,6 @@ hub: count: 1 lore: - 'Select your awesome cosmetics!' - - name: 'Lobby Changer' - material: 'CLOCK' - slot: 8 - count: 1 - lore: - - 'Get into a more interesting lobby!' protection: true tablist: enbled: true diff --git a/src/main/resources/menu/cosmetics_menu.yml b/src/main/resources/menu/cosmetics_menu.yml index 832fbf1..9510a66 100644 --- a/src/main/resources/menu/cosmetics_menu.yml +++ b/src/main/resources/menu/cosmetics_menu.yml @@ -21,6 +21,16 @@ pages: - type: 'click' action: 'open_page' data: 'pets' + - name: 'Effects' + material: 'POTION' + slot: 22 + count: 1 + lore: + - 'Aww so cute!' + events: + - type: 'click' + action: 'open_page' + data: 'pets' - title: 'Pets (1/3)' id: 'pets' items: diff --git a/src/main/resources/menu/server_menu.yml b/src/main/resources/menu/server_menu.yml index b5e9859..b9f22c5 100644 --- a/src/main/resources/menu/server_menu.yml +++ b/src/main/resources/menu/server_menu.yml @@ -9,6 +9,7 @@ open_material: 'COMPASS' pages: - title: 'Servers' + id: 'main' items: - name: 'Getting Started' material: 'OAK_SIGN' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3c1ad72..a22162f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -18,6 +18,9 @@ commands: servers: description: Server Menu usage: / + cosmetics: + description: Cosmetics Menu + usage: / permissions: hubbit.admin.*: