From 27be29145bcc67819757ac036c923a12afb6c939 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 27 Jul 2018 23:11:19 +0100 Subject: [PATCH] Sort servers --- .../mineplex/hub/server/ServerManager.java | 8 +- .../hub/server/newui/ServerSelectionPage.java | 163 +++++++++++++++--- 2 files changed, 144 insertions(+), 27 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index 28bac5213..aaf6ae09c 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -18,6 +18,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -313,6 +314,11 @@ public class ServerManager extends MiniPlugin @EventHandler public void playerInteract(PlayerInteractEvent event) { + if (event.getAction() == Action.PHYSICAL) + { + return; + } + Player player = event.getPlayer(); ItemStack itemStack = player.getItemInHand(); @@ -437,7 +443,7 @@ public class ServerManager extends MiniPlugin gameServer.setInfo(gameInfo); - String prefix = gameServer.getPrefix(); + String prefix = serverGroup.getPrefix(); // Special case for MPS. Normally they are all separate ServerGroups however here we want to group them together if (serverGroup.getHost() != null && !serverGroup.getHost().isEmpty()) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/newui/ServerSelectionPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/newui/ServerSelectionPage.java index 32bf57020..75aadb99e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/newui/ServerSelectionPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/newui/ServerSelectionPage.java @@ -7,6 +7,8 @@ import java.util.concurrent.TimeUnit; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; @@ -20,23 +22,62 @@ import mineplex.core.game.status.GameInfo.GameDisplayStatus; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.shop.item.IButton; import mineplex.core.shop.page.ShopPageBase; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.hub.server.GameServer; import mineplex.hub.server.ServerManager; +import mineplex.hub.server.ServerManager.Perm; +import mineplex.serverdata.data.MinecraftServer; import mineplex.serverdata.data.ServerGroup; public class ServerSelectionPage extends ShopPageBase { - private static final int STARTING_SLOT = 19; + private static final int STARTING_JOIN_SLOT = 19; private static final int MAX_SHOWN_SERVERS = 7; + private static final int STARTING_PROGRESS_SLOT = 9; private static final long MAX_VIEWING_TIME = TimeUnit.SECONDS.toMillis(45); private static final Comparator GAME_SERVER_SORTER = (o1, o2) -> { - return 0; + // Dev Server + if (o1.isDevServer()) + { + return -1; + } + else if (o2.isDevServer()) + { + return 1; + } + + GameInfo info1 = o1.getInfo(), info2 = o2.getInfo(); + + // Join-ability + if (info1.getJoinable() != info2.getJoinable()) + { + return info1.getJoinable().compareTo(info2.getJoinable()); + } + + // Status + if (info1.getStatus() != info2.getStatus()) + { + return info1.getStatus().compareTo(info2.getStatus()); + } + + MinecraftServer server1 = o1.getServer(), server2 = o2.getServer(); + + // Players + if (server1.getPlayerCount() != server2.getPlayerCount()) + { + return Integer.compare(server1.getPlayerCount(), server2.getPlayerCount()); + } + + // Server Number + return Integer.compare(o1.getNumber(), o2.getNumber()); }; private final ServerGroup _serverGroup; private final long _openedAt; + private final boolean _ownsUltra; private boolean _showInProgress; @@ -46,33 +87,31 @@ public class ServerSelectionPage extends ShopPageBase servers = new ArrayList<>(getPlugin().getServers(_serverGroup.getPrefix())); servers.sort(GAME_SERVER_SORTER); if (_showInProgress) { - // TODO MAKE + buildInProgressPage(servers); } else { - buildMainPage(servers); + buildJoinablePage(servers); } } - private void buildMainPage(List servers) + private void buildJoinablePage(List servers) { + int inProgress = servers.size(); + // Filter servers servers.removeIf(server -> { @@ -80,6 +119,9 @@ public class ServerSelectionPage extends ShopPageBase= STARTING_SLOT + MAX_SHOWN_SERVERS) + if (slot >= STARTING_JOIN_SLOT + MAX_SHOWN_SERVERS) { break; } @@ -110,19 +152,45 @@ public class ServerSelectionPage extends ShopPageBase - { - _showInProgress = !_showInProgress; - refresh(); - }); + }, LineFormat.LORE)), new SwapViewButton()); + } + + private void buildInProgressPage(List servers) + { + // Filter servers + servers.removeIf(server -> + { + GameDisplayStatus status = server.getInfo().getStatus(); + return status != GameDisplayStatus.IN_PROGRESS && status != GameDisplayStatus.CLOSING; + }); + + // Go back + addRow(0, (byte) 7, new ItemBuilder(Material.BED) + .setTitle(C.cGreenB + "Go Back") + .setLore(UtilText.splitLinesToArray(new String[] + { + "", + C.cWhite + C.Line + "Click to Go Back", + }, LineFormat.LORE)), new SwapViewButton()); + + int slot = STARTING_PROGRESS_SLOT; + + for (GameServer server : servers) + { + addServer(slot++, server); + + if (slot >= getSize() - 1) + { + break; + } + } } private void addRow(int row, byte glassData, ItemBuilder builder, IButton button) @@ -141,6 +209,8 @@ public class ServerSelectionPage extends ShopPageBase { // TODO select server }); } + private class SwapViewButton implements IButton + { + @Override + public void onClick(Player player, ClickType clickType) + { + _showInProgress = !_showInProgress; + refresh(); + playAcceptSound(player); + } + } + + @EventHandler + public void closeIfIdle(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOW || !UtilTime.elapsed(_openedAt, MAX_VIEWING_TIME)) + { + return; + } + + getPlayer().closeInventory(); + } + private String timeString(int time) { + time = Math.max(0, time); + return time + " Second" + (time == 1 ? "" : "s") + "..."; } }