feat: cosmetics menu and dedicated gui class
This commit is contained in:
parent
7eefc3bb43
commit
c173d73dc1
Binary file not shown.
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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(
|
||||
"<red>An error occurred while executing the action of the item." +
|
||||
"<newline>" +
|
||||
"<red>Please contact an administrator."
|
||||
"<newline>" +
|
||||
"<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
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,6 +57,10 @@ public class PlayerActionsListener implements Listener {
|
|||
|
||||
event.getPlayer().getInventory().setContents(playerInv.getContents());
|
||||
event.getPlayer().updateInventory();
|
||||
|
||||
if(mainConfig.getBoolean("hub.tablist")) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
85
src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java
Normal file
85
src/main/java/me/theclashfruit/hubbit/utils/GuiUtil.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -22,12 +22,6 @@ hub:
|
|||
count: 1
|
||||
lore:
|
||||
- '<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
|
||||
tablist:
|
||||
enbled: true
|
||||
|
|
|
@ -21,6 +21,16 @@ pages:
|
|||
- type: 'click'
|
||||
action: 'open_page'
|
||||
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>'
|
||||
id: 'pets'
|
||||
items:
|
||||
|
|
|
@ -9,6 +9,7 @@ open_material: 'COMPASS'
|
|||
|
||||
pages:
|
||||
- title: '<green>Servers'
|
||||
id: 'main'
|
||||
items:
|
||||
- name: '<green>Getting Started'
|
||||
material: 'OAK_SIGN'
|
||||
|
|
|
@ -18,6 +18,9 @@ commands:
|
|||
servers:
|
||||
description: Server Menu
|
||||
usage: /<command>
|
||||
cosmetics:
|
||||
description: Cosmetics Menu
|
||||
usage: /<command>
|
||||
|
||||
permissions:
|
||||
hubbit.admin.*:
|
||||
|
|
Loading…
Reference in a new issue