feat: cosmetics menu and dedicated gui class

This commit is contained in:
TheClashFruit 2023-06-18 19:29:14 +02:00
parent 7eefc3bb43
commit c173d73dc1
Signed by: TheClashFruit
GPG key ID: CF4A319B9A73290C
13 changed files with 249 additions and 110 deletions

Binary file not shown.

View file

@ -1,8 +1,9 @@
package me.theclashfruit.hubbit; package me.theclashfruit.hubbit;
import me.theclashfruit.hubbit.bstats.Metrics; import me.theclashfruit.hubbit.bstats.Metrics;
import me.theclashfruit.hubbit.commands.CosmeticsCommand;
import me.theclashfruit.hubbit.commands.InfoCommand; 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.MenuListener;
import me.theclashfruit.hubbit.events.PlayerActionsListener; import me.theclashfruit.hubbit.events.PlayerActionsListener;
import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton;
@ -14,7 +15,8 @@ public final class Hubbit extends JavaPlugin {
public void onEnable() { public void onEnable() {
// Register Commands // Register Commands
this.getCommand("hubbit").setExecutor(new InfoCommand()); 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()); this.getCommand("hubbit").setTabCompleter(new me.theclashfruit.hubbit.utils.TabUtil());
@ -25,6 +27,9 @@ public final class Hubbit extends JavaPlugin {
// Config // Config
this.saveDefaultConfig(); this.saveDefaultConfig();
this.saveResource("menu/server_menu.yml", false); this.saveResource("menu/server_menu.yml", false);
this.saveResource("menu/cosmetics_menu.yml", false);
this.saveResource("cosmetics/example.yml", false);
// Load Singletons // Load Singletons
ConfigLoaderSingleton.getInstance(); ConfigLoaderSingleton.getInstance();

View file

@ -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;
}
}

View file

@ -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<Map<?, ?>> items = (List<Map<?, ?>>) 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<String> lore = (List<String>) item.get("lore");
List<Component> 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;
}
}

View file

@ -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;
}
}

View file

@ -1,6 +1,7 @@
package me.theclashfruit.hubbit.events; package me.theclashfruit.hubbit.events;
import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton; import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton;
import me.theclashfruit.hubbit.utils.GuiUtil;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
@ -16,7 +17,8 @@ import java.util.Map;
public class MenuListener implements Listener { public class MenuListener implements Listener {
@EventHandler @EventHandler
public void onClick(InventoryClickEvent event) { 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(); Player player = (Player) event.getWhoClicked();
@ -53,8 +55,54 @@ public class MenuListener implements Listener {
player.sendRichMessage( player.sendRichMessage(
"<red>An error occurred while executing the action of the item." + "<red>An error occurred while executing the action of the item." +
"<newline>" + "<newline>" +
"<red>Please contact an administrator." "<red>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<Map<?, ?>> items = (List<Map<?, ?>>) page.get("items");
items.forEach(item -> {
if(item.get("slot").equals(eventSlot)) {
List<Map<?, ?>> events = (List<Map<?, ?>>) 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(
"<red>An error occurred while executing the action of the item." +
"<newline>" +
"<red>Please contact an administrator."
); );
} }
} }
@ -69,7 +117,8 @@ public class MenuListener implements Listener {
@EventHandler @EventHandler
public void onUse(PlayerInteractEvent event) { public void onUse(PlayerInteractEvent event) {
FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getMenuFileConfig(); FileConfiguration menuConfig = ConfigLoaderSingleton.getInstance().getServersMenuFileConfig();
FileConfiguration cosmeticsConfig = ConfigLoaderSingleton.getInstance().getCosmeticsMenuFileConfig();
Player player = event.getPlayer(); Player player = event.getPlayer();
@ -78,5 +127,11 @@ public class MenuListener implements Listener {
player.performCommand("servers"); player.performCommand("servers");
} }
if(player.getInventory().getItemInMainHand().getType() == Material.valueOf(cosmeticsConfig.getString("open_material"))) {
event.setCancelled(true);
player.performCommand("cosmetics");
}
} }
} }

View file

@ -57,6 +57,10 @@ public class PlayerActionsListener implements Listener {
event.getPlayer().getInventory().setContents(playerInv.getContents()); event.getPlayer().getInventory().setContents(playerInv.getContents());
event.getPlayer().updateInventory(); event.getPlayer().updateInventory();
if(mainConfig.getBoolean("hub.tablist")) {
}
} }
} }

View file

@ -9,9 +9,13 @@ import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class ConfigLoader { public class ConfigLoader {
YamlConfiguration serverMenuConfig = YamlConfiguration.loadConfiguration(new File(getPlugin(Hubbit.class).getDataFolder() + "/menu/server_menu.yml")); 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; return serverMenuConfig;
} }
public @org.jetbrains.annotations.NotNull YamlConfiguration getCosmeticsMenuFileConfig() {
return cosmeticMenuConfig;
}
} }

View file

@ -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<Map<?, ?>> items = (List<Map<?, ?>>) 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<String> lore = (List<String>) item.get("lore");
List<Component> 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;
}
}

View file

@ -22,12 +22,6 @@ hub:
count: 1 count: 1
lore: lore:
- '<grey>Select your awesome cosmetics!' - '<grey>Select your awesome cosmetics!'
- name: '<light_purple>Lobby Changer'
material: 'CLOCK'
slot: 8
count: 1
lore:
- '<grey>Get into a more interesting lobby!'
protection: true protection: true
tablist: tablist:
enbled: true enbled: true

View file

@ -21,6 +21,16 @@ pages:
- type: 'click' - type: 'click'
action: 'open_page' action: 'open_page'
data: 'pets' data: 'pets'
- name: '<gold>Effects'
material: 'POTION'
slot: 22
count: 1
lore:
- '<grey>Aww so cute!'
events:
- type: 'click'
action: 'open_page'
data: 'pets'
- title: '<gold>Pets</gold> <dark_grey>(</dark_grey>1<dark_grey>/</dark_grey>3<dark_grey>)</dark_grey>' - title: '<gold>Pets</gold> <dark_grey>(</dark_grey>1<dark_grey>/</dark_grey>3<dark_grey>)</dark_grey>'
id: 'pets' id: 'pets'
items: items:

View file

@ -9,6 +9,7 @@ open_material: 'COMPASS'
pages: pages:
- title: '<green>Servers' - title: '<green>Servers'
id: 'main'
items: items:
- name: '<green>Getting Started' - name: '<green>Getting Started'
material: 'OAK_SIGN' material: 'OAK_SIGN'

View file

@ -18,6 +18,9 @@ commands:
servers: servers:
description: Server Menu description: Server Menu
usage: /<command> usage: /<command>
cosmetics:
description: Cosmetics Menu
usage: /<command>
permissions: permissions:
hubbit.admin.*: hubbit.admin.*: