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;
|
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();
|
||||||
|
|
|
@ -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;
|
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();
|
||||||
|
|
||||||
|
@ -65,11 +67,58 @@ public class MenuListener implements Listener {
|
||||||
|
|
||||||
event.setCancelled(true);
|
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."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
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
|
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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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.*:
|
||||||
|
|
Loading…
Reference in a new issue