diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java new file mode 100644 index 000000000..76c15ed37 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/status/GameInfo.java @@ -0,0 +1,100 @@ +package mineplex.core.game.status; + +import mineplex.core.account.permissions.PermissionGroup; +import mineplex.core.common.Constants; + +public class GameInfo +{ + + public static GameInfo fromString(String json) + { + return Constants.GSON.fromJson(json, GameInfo.class); + } + + private final String _game, _mode, _map, _serverType; + private final int _timer; + private final String[] _votingOn; + private final PermissionGroup _hostRank; + private final GameDisplayStatus _status; + private final GameJoinStatus _joinable; + + public GameInfo(String game, String mode, String map, String serverType, int timer, String[] votingOn, PermissionGroup hostRank, GameDisplayStatus status, GameJoinStatus joinable) + { + _game = game; + _mode = mode; + _map = map; + _serverType = serverType; + _timer = timer; + _votingOn = votingOn; + _hostRank = hostRank; + _status = status; + _joinable = joinable; + } + + public String getGame() + { + return _game; + } + + public String getMode() + { + return _mode; + } + + public String getMap() + { + return _map; + } + + public String getServerType() + { + return _serverType; + } + + public int getTimer() + { + return _timer; + } + + public String[] getVotingOn() + { + return _votingOn; + } + + public PermissionGroup getHostRank() + { + return _hostRank; + } + + public GameDisplayStatus getStatus() + { + return _status; + } + + public GameJoinStatus getJoinable() + { + return _joinable; + } + + @Override + public String toString() + { + return Constants.GSON.toJson(this); + } + + public enum GameDisplayStatus + { + WAITING, + VOTING, + STARTING, + IN_PROGRESS, + CLOSING + } + + public enum GameJoinStatus + { + OPEN, + RANKS_ONLY, + CLOSED + } +} 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 e7f2f414d..95992dd3a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -30,6 +30,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.potion.PotionEffect; @@ -80,6 +81,9 @@ import mineplex.core.gadget.event.ToggleMobsEvent; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.game.MineplexGameManager; +import mineplex.core.game.status.GameInfo; +import mineplex.core.game.status.GameInfo.GameDisplayStatus; +import mineplex.core.game.status.GameInfo.GameJoinStatus; import mineplex.core.game.winstreaks.WinStreakManager; import mineplex.core.google.GoogleSheetsManager; import mineplex.core.hologram.HologramManager; @@ -170,6 +174,8 @@ import nautilus.game.arcade.managers.chat.GameChatManager; import nautilus.game.arcade.managers.lobby.LobbyManager; import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager; +import nautilus.game.arcade.managers.voting.Vote; +import nautilus.game.arcade.managers.voting.types.GameVote; public class ArcadeManager extends MiniPlugin implements IRelation { @@ -946,7 +952,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation public void StaffIncognito(IncognitoStatusChangeEvent event) { Player player = event.getPlayer(); - + if (event.getNewState()) //Is going into incognito { GameTeam team = _game.GetTeam(player); @@ -978,7 +984,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation { addSpectator(player, true); _specList.add(player); - + // Leave Team if (team != null) { @@ -1010,13 +1016,13 @@ public class ArcadeManager extends MiniPlugin implements IRelation } @EventHandler - public void MessageMOTD(ServerListPingEvent event) + public void motdPing(ServerListPingEvent event) { event.setMaxPlayers(_serverConfig.MaxPlayers); if (UtilServer.isTestServer(false)) { - event.setMotd(ChatColor.GOLD + "Private Mineplex Test Server"); + event.setMotd(C.cGold + "Private Mineplex Test Server"); return; } @@ -1025,59 +1031,93 @@ public class ArcadeManager extends MiniPlugin implements IRelation { if (_gameHostManager.isHostExpired()) { - event.setMotd(ChatColor.RED + "Finished"); + event.setMotd(C.cRed + "Finished"); return; } if (!GetServerConfig().PublicServer || GetServerConfig().PlayerServerWhitelist || _gameHostManager.isCommunityServer()) { - event.setMotd(ChatColor.GRAY + "Private"); + event.setMotd(C.cGray + "Private"); return; } } - String game = "Waiting For Players"; - String map = game; + boolean nullGame = _game == null; + String game = null, mode = null, map = null; + int timer = -1; + String[] votingOn = null; + PermissionGroup hostRank = null; + GameDisplayStatus status; + // Vote in progress if (_gameCreationManager.getVotingManager().isVoteInProgress()) { - game = _gameCreationManager.getNextGameType() == null ? "Voting" : _gameCreationManager.getNextGameType().getName(); - map = "Voting"; - } - else if (!_serverConfig.GameVoting && !_serverConfig.GameList.isEmpty()) - { - game = _serverConfig.GameList.get(0).getName(); - } + status = GameDisplayStatus.VOTING; - if (_game != null && _game.WorldData != null) - { - game = _game.GetName(); - map = _game.WorldData.MapName; - } - - String extrainformation = "|" + _serverConfig.ServerType + "|" + game + "|" + map; - - if (_gameHostManager.isPrivateServer() && _gameHostManager.hasPermission(Perm.FEATURED_SERVER)) - { - extrainformation += "|HostRank." + _gameHostManager.getHostRank().name(); - } - - if (_game == null || _game.GetState() == GameState.Recruit) - { - if (_game != null && _game.GetCountdown() != -1) + // Null game - GameVote + if (nullGame) { - event.setMotd(ChatColor.GREEN + "Starting in " + _game.GetCountdown() + " Seconds" + extrainformation); + game = "Voting"; + map = game; + + Vote vote = _gameCreationManager.getVotingManager().getCurrentVote(); + + if (vote instanceof GameVote) + { + votingOn = ((GameVote) vote).getValues().stream() + .map(GameType::getName) + .toArray(String[]::new); + } } + // MapVote else { - event.setMotd(ChatColor.GREEN + "Recruiting" + extrainformation); + game = _game.GetName(); + mode = _game.GetMode(); + map = "Voting"; } } - //In Progress + // No vote and game null. Staff-1 or pre game voting + else if (nullGame) + { + status = GameDisplayStatus.WAITING; + } + // Game not null else { - event.setMotd(ChatColor.YELLOW + "In Progress" + extrainformation); + game = _game.GetName(); + mode = _game.GetMode(); + map = _game.WorldData.MapName; + + // Game not in progress + if (_game.inLobby()) + { + timer = _game.GetCountdown(); + + // Counting down + if (timer != -1) + { + status = GameDisplayStatus.STARTING; + } + else + { + status = GameDisplayStatus.WAITING; + } + } + // Game in progress + else + { + status = GameDisplayStatus.IN_PROGRESS; + } } + + // MPS + if (_gameHostManager.isPrivateServer() && _gameHostManager.getHostRank().hasPermission(Perm.FEATURED_SERVER)) + { + hostRank = _gameHostManager.getHostRank(); + } + + event.setMotd(new GameInfo(game, mode, map, _serverConfig.ServerType, timer, votingOn, hostRank, status, getJoinable()).toString()); } @EventHandler @@ -1193,56 +1233,62 @@ public class ArcadeManager extends MiniPlugin implements IRelation return; } - // Reserved Slot Check - if (Bukkit.getOnlinePlayers().size() >= Bukkit.getServer().getMaxPlayers()) + GameJoinStatus joinable = getJoinable(); + + if (joinable != GameJoinStatus.OPEN) { if (client.hasPermission(Perm.JOIN_FULL_STAFF)) { event.allow(); - event.setResult(PlayerLoginEvent.Result.ALLOWED); return; } - else if (client.hasPermission(Perm.JOIN_FULL) || _donationManager.Get(player).ownsUnknownSalesPackage(_serverConfig.ServerType + " ULTRA")) + + boolean canOverflow = client.hasPermission(Perm.JOIN_FULL) || _donationManager.Get(player).ownsUnknownSalesPackage(_serverConfig.ServerType + " ULTRA"); + + if (canOverflow) { - String reason = C.Bold + "Server has reached max capacity for gameplay purposes."; - - if (_serverConfig.HardMaxPlayerCap) + if (joinable == GameJoinStatus.RANKS_ONLY) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, reason); - return; + event.allow(); } - else if (Bukkit.getServer().getOnlinePlayers().size() / Bukkit.getMaxPlayers() > 1.5) + else { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, reason); - return; + event.disallow(Result.KICK_OTHER, C.Bold + "Server has reached max capacity for gameplay purposes."); + } + } + else + { + if (joinable == GameJoinStatus.RANKS_ONLY) + { + event.disallow(Result.KICK_OTHER, C.Bold + "Server has reached max capacity for gameplay purposes."); + } + else + { + event.disallow(Result.KICK_OTHER, C.Bold + "Server Full > Purchase Ultra at www.mineplex.com/shop"); } - else if (_gameHostManager.isEventServer() && Bukkit.getServer().getOnlinePlayers().size() >= 128) - { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, reason); - return; - } - - event.allow(); - event.setResult(PlayerLoginEvent.Result.ALLOWED); - - return; } - - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server Full > Purchase Ultra at www.mineplex.com/shop"); } } - @EventHandler(priority = EventPriority.LOW) - public void AdminOP(PlayerJoinEvent event) + private GameJoinStatus getJoinable() { - if (_clientManager.Get(event.getPlayer()).hasPermission(Perm.AUTO_OP)) + if (Bukkit.getOnlinePlayers().size() >= Bukkit.getServer().getMaxPlayers()) { - event.getPlayer().setOp(true); - } - else - { - event.getPlayer().setOp(false); + if (_serverConfig.HardMaxPlayerCap || (double) Bukkit.getServer().getOnlinePlayers().size() / Bukkit.getMaxPlayers() > 1.5 || (_gameHostManager.isEventServer() && Bukkit.getServer().getOnlinePlayers().size() >= 128)) + { + return GameJoinStatus.CLOSED; + } + + return GameJoinStatus.RANKS_ONLY; } + + return GameJoinStatus.OPEN; + } + + @EventHandler(priority = EventPriority.LOW) + public void adminOP(PlayerJoinEvent event) + { + event.getPlayer().setOp(_clientManager.Get(event.getPlayer()).hasPermission(Perm.AUTO_OP)); } public boolean IsAlive(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/rejoin/RejoinModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/rejoin/RejoinModule.java index bee5b604f..fddef9f92 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/rejoin/RejoinModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/rejoin/RejoinModule.java @@ -14,7 +14,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.UtilServer; -import mineplex.core.game.region.GameRejoinManager; +import mineplex.core.game.rejoin.GameRejoinManager; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.game.GameTeam;