From 6df90a66ffc31c352ac7725b8221ca2c09a0f77e Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 31 Jul 2018 16:20:08 +0100 Subject: [PATCH] Reimplement the MPS selection --- .../mineplex/core/game/status/GameInfo.java | 8 +- .../mineplex/hub/server/ServerManager.java | 28 ++-- .../ui/server/MPSServerSelectionPage.java | 136 ++++++++++++++++++ .../server/ui/server/ServerSelectionPage.java | 2 +- .../server/ui/server/ServerSelectionShop.java | 3 + .../nautilus/game/arcade/ArcadeManager.java | 8 +- 6 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/MPSServerSelectionPage.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java index 93fb3d647..156cc9893 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java @@ -2,6 +2,7 @@ package mineplex.core.game.status; import mineplex.core.account.permissions.PermissionGroup; import mineplex.core.common.Constants; +import mineplex.core.game.GameDisplay; public class GameInfo { @@ -11,7 +12,8 @@ public class GameInfo return Constants.GSON.fromJson(json, GameInfo.class); } - private final String _game, _mode, _map; + private final GameDisplay _game; + private final String _mode, _map; private final int _timer; private final String[] _votingOn; private final PermissionGroup _hostRank; @@ -23,7 +25,7 @@ public class GameInfo this(null, null, null, -1, new String[0], null, GameDisplayStatus.CLOSING, GameJoinStatus.CLOSED); } - public GameInfo(String game, String mode, String map, int timer, String[] votingOn, PermissionGroup hostRank, GameDisplayStatus status, GameJoinStatus joinable) + public GameInfo(GameDisplay game, String mode, String map, int timer, String[] votingOn, PermissionGroup hostRank, GameDisplayStatus status, GameJoinStatus joinable) { _game = game; _mode = mode; @@ -35,7 +37,7 @@ public class GameInfo _joinable = joinable; } - public String getGame() + public GameDisplay getGame() { return _game; } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index 828d5d42f..c8d361777 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -96,11 +96,6 @@ public class ServerManager extends MiniPlugin private final PersonalServerManager _personalServerManager; private final Titles _titles; - // private NautHashMap> _serverKeyInfoMap = new NautHashMap>(); -// private NautHashMap _serverPlayerCounts = new NautHashMap(); -// private NautHashMap _serverNpcShopMap = new NautHashMap(); -// private NautHashMap _serverInfoMap = new NautHashMap(); -// private NautHashMap _serverUpdate = new NautHashMap(); // Maps ServerGroup name to ServerGroup private final Map _serverGroupsByName; // Maps ServerGroup NPC name to ServerGroup @@ -431,7 +426,15 @@ public class ServerManager extends MiniPlugin continue; } - Map servers = _gameServers.computeIfAbsent(serverGroup.getPrefix(), k -> new HashMap<>()); + 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()) + { + prefix = MPS_PREFIX; + } + + Map servers = _gameServers.computeIfAbsent(prefix, k -> new HashMap<>()); GameServer gameServer = servers.computeIfAbsent(serverStatus.getName(), k -> new GameServer(serverStatus)); GameInfo gameInfo; @@ -447,14 +450,6 @@ public class ServerManager extends MiniPlugin gameServer.updateStatus(serverStatus, gameInfo); - 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()) - { - prefix = MPS_PREFIX; - } - _playersPlaying.put(prefix, _playersPlaying.getOrDefault(prefix, 0) + gameServer.getServer().getPlayerCount()); } @@ -511,7 +506,7 @@ public class ServerManager extends MiniPlugin return false; case STARTING: // If the game is about to start, ignore it. The player probably won't make it in time. - return info.getTimer() < 6; + return info.getTimer() < 5; default: return true; } @@ -561,8 +556,7 @@ public class ServerManager extends MiniPlugin _serverGroupsByNPCName.clear(); _gameServers.clear(); - addServerGroup(new ServerGroup("Event", "Event Servers", "EVENT")); - addServerGroup(new ServerGroup("MPS", "Mineplex Player Servers", MPS_PREFIX)); + addServerGroup(new ServerGroup(MPS_PREFIX, "Mineplex Player Servers", MPS_PREFIX)); } public int getGroupTagPlayerCount(String tag) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/MPSServerSelectionPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/MPSServerSelectionPage.java new file mode 100644 index 000000000..aa2c8bcae --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/MPSServerSelectionPage.java @@ -0,0 +1,136 @@ +package mineplex.hub.server.ui.server; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.account.permissions.PermissionGroup; +import mineplex.core.common.util.C; +import mineplex.core.donation.DonationManager; +import mineplex.core.game.GameDisplay; +import mineplex.core.game.status.GameInfo; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.shop.page.ShopPageBase; +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 MPSServerSelectionPage extends ShopPageBase +{ + + private final ServerGroup _serverGroup; + private final boolean _ownsUltra; + + public MPSServerSelectionPage(ServerManager plugin, ServerSelectionShop shop, CoreClientManager clientManager, DonationManager donationManager, ServerGroup serverGroup, Player player) + { + super(plugin, shop, clientManager, donationManager, serverGroup.getServerNpcName(), player); + + _serverGroup = serverGroup; + _ownsUltra = clientManager.Get(player).hasPermission(Perm.JOIN_FULL); + + buildPage(); + } + + @Override + protected void buildPage() + { + List servers = new ArrayList<>(getPlugin().getServers(_serverGroup.getPrefix())); + + servers.sort((o1, o2) -> o2.getServer().getPlayerCount() - o1.getServer().getPlayerCount()); + + int slot = 18, featuredSlot = 0; + + for (GameServer server : servers) + { + MinecraftServer serverStatus = server.getServer(); + GameInfo info = server.getInfo(); + PermissionGroup hostRank = info.getHostRank(); + + if (hostRank == null) + { + continue; + } + + int thisSlot = hostRank.hasPermission(Perm.FEATURE_SERVER) ? featuredSlot++ : slot++; + + if (thisSlot >= getSize() - 1) + { + continue; + } + + GameDisplay game = info.getGame(); + ItemBuilder builder; + + if (game == null) + { + builder = new ItemBuilder(Material.REDSTONE_BLOCK); + } + else + { + builder = new ItemBuilder(game.getMaterial(), game.getMaterialData()) + .addLore( + "", + C.cYellow + "Game: " + C.Reset + game.getName() + ); + } + + if (info.getMap() != null) + { + builder.addLore(C.cYellow + "Map: " + C.Reset + info.getMap()); + } + + builder.setTitle(C.cGreenB + serverStatus.getName()) + .addLore( + C.cYellow + "Host Rank: " + hostRank.getDisplay(true, true, true, true), + C.cYellow + "Players: " + C.Reset + serverStatus.getPlayerCount() + "/" + serverStatus.getMaxPlayerCount(), + "" + ); + + String footer; + boolean canJoin; + + switch (info.getJoinable()) + { + case OPEN: + footer = "Click to Join!"; + canJoin = true; + break; + case RANKS_ONLY: + if (_ownsUltra) + { + footer = "You have ULTRA! Click to Join!"; + canJoin = true; + } + else + { + footer = "ULTRA+ can join. Visit mineplex.com/shop"; + canJoin = false; + } + break; + default: + footer = "Game is full!"; + canJoin = false; + break; + } + + builder.addLore(C.cWhite + C.Line + footer); + + addButton(thisSlot, builder.build(), (player, clickType) -> + { + if (canJoin) + { + getPlugin().selectServer(player, server); + } + else + { + playDenySound(player); + } + }); + } + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/ServerSelectionPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/ServerSelectionPage.java index b3add6d00..f009bbcbf 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/ServerSelectionPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/server/ServerSelectionPage.java @@ -271,7 +271,7 @@ public class ServerSelectionPage extends ShopPageBase case "CW4": page = new CakeWarsServerSelectionPage(getPlugin(), this, getClientManager(), getDonationManager(), serverGroup, player); break; + case "MPS": + page = new MPSServerSelectionPage(getPlugin(), this, getClientManager(), getDonationManager(), serverGroup, player); + break; default: page = getDirectServerPage(player, serverGroup.getServerNpcName(), serverGroup); break; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 868f81ecb..5b60c4053 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -80,6 +80,7 @@ import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.event.ToggleMobsEvent; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; +import mineplex.core.game.GameDisplay; import mineplex.core.game.MineplexGameManager; import mineplex.core.game.status.GameInfo; import mineplex.core.game.status.GameInfo.GameDisplayStatus; @@ -1043,7 +1044,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation } boolean nullGame = _game == null; - String game = null, mode = null, map = null; + GameDisplay game = null; + String mode = null, map = null; int timer = -1; String[] votingOn = null; PermissionGroup hostRank = null; @@ -1063,7 +1065,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation // MapVote else { - game = _game.GetName(); + game = _game.GetType().getDisplay(); mode = _game.GetMode(); map = null; } @@ -1086,7 +1088,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation // Game not null else { - game = _game.GetName(); + game = _game.GetType().getDisplay(); mode = _game.GetMode(); // Has WorldData