From c561c8c517353a732755b4c35ee9813890e50104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Baran=20=C3=96ZCAN?= Date: Wed, 22 Jan 2020 19:25:12 +0300 Subject: [PATCH] renewed menu system --- .../java/me/draww/superrup/RankCommand.java | 3 +- .../me/draww/superrup/menus/MainMenu.java | 233 ++++++++++++++++++ src/main/resources/config.yml | 72 +++--- 3 files changed, 271 insertions(+), 37 deletions(-) create mode 100644 src/main/java/me/draww/superrup/menus/MainMenu.java diff --git a/src/main/java/me/draww/superrup/RankCommand.java b/src/main/java/me/draww/superrup/RankCommand.java index 04bfa15..53ff491 100644 --- a/src/main/java/me/draww/superrup/RankCommand.java +++ b/src/main/java/me/draww/superrup/RankCommand.java @@ -1,5 +1,6 @@ package me.draww.superrup; +import me.draww.superrup.menus.MainMenu; import me.draww.superrup.utils.Text; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -11,7 +12,7 @@ public class RankCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (args.length == 0 && sender.hasPermission("superrup.menu") && sender instanceof Player) { - new RankMenu((Player) sender); + new MainMenu((Player) sender); } else if (args.length > 0) { if (args[0].equals("reload") && sender.hasPermission("superrup.reload")) { Main.INSTANCE.reload(); diff --git a/src/main/java/me/draww/superrup/menus/MainMenu.java b/src/main/java/me/draww/superrup/menus/MainMenu.java new file mode 100644 index 0000000..a8b27ef --- /dev/null +++ b/src/main/java/me/draww/superrup/menus/MainMenu.java @@ -0,0 +1,233 @@ +package me.draww.superrup.menus; + +import me.blackness.black.Element; +import me.blackness.black.Pane; +import me.blackness.black.element.BasicElement; +import me.blackness.black.pane.BasicPane; +import me.blackness.black.target.BasicTarget; +import me.draww.superrup.Main; +import me.draww.superrup.Rank; +import me.draww.superrup.Settings; +import me.draww.superrup.api.ConditionRegisterer; +import me.draww.superrup.api.ExecutorRegisterer; +import me.draww.superrup.api.SuperRankupAPI; +import me.draww.superrup.inventory.builder.NormalMenu; +import me.draww.superrup.inventory.util.ElementUtil; +import me.draww.superrup.utils.ItemStackBuilder; +import me.draww.superrup.utils.ItemUtil; +import me.draww.superrup.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.List; + +@SuppressWarnings({"FieldCanBeLocal", "unused"}) +public class MainMenu extends NormalMenu { + + private Player player; + private String group; + private int currentPage = 1; + + private int ranksPaneX, ranksPaneY, ranksPaneHeight, ranksPaneLength; + + public MainMenu(Player player) { + super("r:Main"); + this.player = player; + group = Main.INSTANCE.getGroupManager().getPlayerPrimaryGroup(player, "default"); + Settings settings = SuperRankupAPI.INSTANCE.getSettings(); + if (settings.getDisabledGroups().contains(group)) { + player.sendMessage(Text.colorize(Main.INSTANCE.getLanguageConfig().getConfig().getString("disable_group"))); + return; + } + Settings.MenuSettings menuSettings = settings.getMenuSettings(); + setTitle(Text.colorize(Text.replacePlayerPlaceholders(player, menuSettings.getTitle()))); + List ranks = Main.INSTANCE.getRankManager().getSortedRanks(); + int size = menuSettings.getSize(); + if (size < 0) { + int calcSize = calcSize(ranks.size()); + if (calcSize <= 0) { + return; + } + setSize(calcSize); + load(calcSize / 9, menuSettings, ranks); + } else { + setSize(size * 9); + load(size, menuSettings, ranks); + } + } + + private void load(int size, Settings.MenuSettings menuSettings, List ranks) { + String arrowsPosition = menuSettings.getDirectionArrowsPosition(); + if (arrowsPosition.equalsIgnoreCase("TOP")) { + if (size == 1) { + size = size + 1; + setSize(size * 9); + } + add("ranks"); + add("arrows"); + ranksPaneX = 0; + ranksPaneY = 1; + ranksPaneHeight = size - 1; + ranksPaneLength = 9; + addPane("ranks", new BasicPane(ranksPaneX, ranksPaneY, ranksPaneHeight, ranksPaneLength)); + addPane("arrows", new BasicPane(0, 0, 1, 9)); + insertArrowTopOrDown(size, menuSettings, true); + loadRanks(size, menuSettings, ranks); + build(getPane("ranks", 0), getPane("arrows", 0)); + showTo(player); + } else if (arrowsPosition.equalsIgnoreCase("DOWN")) { + if (size == 1) { + size = size + 1; + setSize(size * 9); + } + add("ranks"); + add("arrows"); + ranksPaneX = 0; + ranksPaneY = 0; + ranksPaneHeight = size - 1; + ranksPaneLength = 9; + addPane("ranks", new BasicPane(ranksPaneX, ranksPaneY, ranksPaneHeight, ranksPaneLength)); + addPane("arrows", new BasicPane(0, size - 1, 1, 9)); + insertArrowTopOrDown(size, menuSettings, true); + loadRanks(size, menuSettings, ranks); + build(getPane("ranks", 0), getPane("arrows", 0)); + showTo(player); + } else if (arrowsPosition.equalsIgnoreCase("SIDE")) { + add("ranks"); + add("arrows"); + ranksPaneX = 1; + ranksPaneY = 0; + ranksPaneHeight = size; + ranksPaneLength = 7; + addPane("ranks", new BasicPane(ranksPaneX, ranksPaneY, ranksPaneHeight, ranksPaneLength)); + addPane("arrows", new BasicPane(0, 0, size, 1)); + addPane("arrows", new BasicPane(8, 0, size, 1)); + insertArrowSide(size, menuSettings); + loadRanks(size, menuSettings, ranks); + build(getPane("ranks", 0), getPane("arrows", 0), getPane("arrows", 1)); + showTo(player); + } + } + + private void loadRanks(int size, Settings.MenuSettings menuSettings, List ranks) { + if (ranks != null && !ranks.isEmpty()) { + Integer indexPlayer = null; + for (Rank rank : ranks.toArray(new Rank[0])) { + if (rank.getGroup().equals(group)) { + indexPlayer = rank.getQueue(); + } + } + if (indexPlayer == null) indexPlayer = 0; + final Integer finalIndexPlayer = indexPlayer; + ranks.forEach(rank -> { + if (!rank.getGroup().equals(group)) { + if (finalIndexPlayer > rank.getQueue()) { + addLast(ElementUtil.emptyElement(ItemUtil.redesignPlaceholderItemStack(player, rank.getIconLow()))); + } else if (finalIndexPlayer < rank.getQueue()) { + if (rank.getQueue().equals(finalIndexPlayer + 1)) { + addLast(new BasicElement(ItemUtil.redesignPlaceholderItemStack(player, rank.getIconJump()), + new BasicTarget(e -> { + e.cancel(); + e.closeView(); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.INSTANCE, () -> { + boolean controlConditions = ConditionRegisterer.testAllConditions(player, rank); + if (controlConditions) { + ExecutorRegisterer.runAllExecutors(player, rank); + Main.INSTANCE.getGroupManager().setPlayerPrimaryGroup(player, rank.getGroup()); + } + }, 20L); + }))); + } else { + addLast(ElementUtil.emptyElement(ItemUtil.redesignPlaceholderItemStack(player, rank.getIconHigh()))); + } + } else if (rank.getGroup().equals(group)) { + addLast(ElementUtil.emptyElement(ItemUtil.redesignPlaceholderItemStack(player, rank.getIconEqual()))); + } + } else { + addLast(ElementUtil.emptyElement(ItemUtil.redesignPlaceholderItemStack(player, rank.getIconEqual()))); + } + }); + for (int i = 0; i < 60; i++) { + addLast(ElementUtil.emptyElement(ItemStackBuilder.of(Material.PAPER).build())); + } + Settings.MenuSettings.EmptyFillSetting emptyFillSetting = menuSettings.getEmptyRankContainer(); + if (emptyFillSetting.isStatus()) { + for (Pane pane : getAllPane("ranks")) { + pane.fill(ElementUtil.emptyElement(emptyFillSetting.getIcon())); + } + } + } + } + + private void insertArrowTopOrDown(int size, Settings.MenuSettings menuSettings, boolean fill) { + insertElement("arrows", 0, new BasicElement(ItemUtil.redesignPlaceholderItemStack(player, menuSettings.getElementDownArrow(), "%currentPage%", String.valueOf(this.currentPage)), + new BasicTarget(e -> { + e.cancel(); + int localCurrentPage = currentPage - 1; + if (localCurrentPage < 1) return; + if (!hasPane("ranks", localCurrentPage - 1)) return; + currentPage = localCurrentPage; + clear("arrows", 0); + insertArrowTopOrDown(size, menuSettings, false); + build(getPane("ranks", localCurrentPage - 1), getPane("arrows", 0)); + showTo(e.player()); + })), 0, 0, false); + insertElement("arrows", 0, new BasicElement(ItemUtil.redesignPlaceholderItemStack(player, menuSettings.getElementUpArrow(), "%currentPage%", String.valueOf(this.currentPage)), + new BasicTarget(e -> { + e.cancel(); + int localCurrentPage = currentPage + 1; + if (!hasPane("ranks", localCurrentPage - 1)) return; + currentPage = localCurrentPage; + clear("arrows", 0); + insertArrowTopOrDown(size, menuSettings, false); + build(getPane("ranks", localCurrentPage - 1), getPane("arrows", 0)); + showTo(e.player()); + })), 8, 0, false); + Settings.MenuSettings.EmptyFillSetting emptyFillSetting = menuSettings.getEmptyArrowContainer(); + if (emptyFillSetting.isStatus()) { + fillElement("arrows", 0, ElementUtil.emptyElement(emptyFillSetting.getIcon())); + } + } + + private void insertArrowSide(int size, Settings.MenuSettings menuSettings) { + fillElement("arrows", 0, new BasicElement(ItemUtil.redesignPlaceholderItemStack(player, menuSettings.getElementDownArrow(), "%currentPage%", String.valueOf(this.currentPage)), + new BasicTarget(e -> { + e.cancel(); + int localCurrentPage = currentPage - 1; + if (localCurrentPage < 1) return; + if (!hasPane("ranks", localCurrentPage - 1)) return; + currentPage = localCurrentPage; + clear("arrows", 0); + clear("arrows", 1); + insertArrowSide(size, menuSettings); + build(getPane("ranks", localCurrentPage - 1), getPane("arrows", 0), getPane("arrows", 1)); + showTo(e.player()); + }))); + fillElement("arrows", 1, new BasicElement(ItemUtil.redesignPlaceholderItemStack(player, menuSettings.getElementUpArrow(), "%currentPage%", String.valueOf(this.currentPage)), + new BasicTarget(e -> { + e.cancel(); + int localCurrentPage = currentPage + 1; + if (!hasPane("ranks", localCurrentPage - 1)) return; + currentPage = localCurrentPage; + clear("arrows", 0); + clear("arrows", 1); + insertArrowSide(size, menuSettings); + build(getPane("ranks", localCurrentPage - 1), getPane("arrows", 0), getPane("arrows", 1)); + showTo(e.player()); + }))); + } + + private void addLast(Element element) { + if (!addToLastPane("ranks", element)) { + addPane("ranks", new BasicPane(ranksPaneX, ranksPaneY, ranksPaneHeight, ranksPaneLength)); + addToLastPane("ranks", element); + } + } + + private int calcSize(int i) { + int temp = i; + while (temp % 9 != 0) temp++; + return Math.min(temp, 54); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 37f36f7..e10b849 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -10,41 +10,41 @@ disabled_groups: - VIP - ExampleVIP units: - day: "day" - days: "days" - hour: "hour" - hours: "hours" - minute: "minute" - minutes: "minutes" - second: "second" - seconds: "seconds" + day: " day " + days: " days " + hour: " hour " + hours: " hours " + minute: " minute " + minutes: " minutes " + second: " second " + seconds: " seconds " menu: title: "&aRank Menu" - size: 5 # Minimum 1, Maximum 6 - panes: - rank: - x: 0 - y: 0 - height: 4 - length: 9 - up_down_info: - x: 0 - y: 4 - height: 1 - length: 9 - empty_fill: - status: true - icon: - material: STAINED_GLASS_PANE:0 - amount: 1 - name: ' ' - elements: - up: - x: 8 - y: 0 - down: - x: 0 - y: 0 - info: - x: 4 - y: 0 + size: 5 # Minimum 1, Maximum 6 or DYNAMIC + directionArrowsPosition: DOWN #TOP(min size 2), SIDE(min size 1), DOWN(min size 2) + empty_fill: + rank_container: + status: true + icon: + material: STAINED_GLASS_PANE:0 + amount: 1 + name: ' ' + arrow_container: + status: true + icon: + material: STAINED_GLASS_PANE:0 + amount: 1 + name: ' ' + elements: + down_arrow: + material: ARROW + amount: 1 + name: '&c<--' + lores: + - '&eCurrent page: %currentPage%' + up_arrow: + material: ARROW + amount: 1 + name: '&c-->' + lores: + - '&eCurrent page: %currentPage%' \ No newline at end of file