package nautilus.game.arcade.managers; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import mineplex.core.common.Rank; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.gui.privateServer.PrivateServerShop; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; public class GameHostManager implements Listener { private ArrayList ultraGames = new ArrayList(); private ArrayList heroGames = new ArrayList(); private ArrayList legendGames = new ArrayList(); ArcadeManager Manager; private Player _host; private Rank _hostRank; private long _serverStartTime = System.currentTimeMillis(); private long _serverExpireTime = 21600000; private long _lastOnline = System.currentTimeMillis(); private long _expireTime = 300000; private boolean _hostExpired = false; private HashSet _onlineAdmins = new HashSet(); private HashSet _adminList = new HashSet(); private HashSet _whitelist = new HashSet(); private HashSet _blacklist = new HashSet(); private PrivateServerShop _shop; private boolean _isEventServer = false; private HashMap _permissionMap = new HashMap(); public GameHostManager(ArcadeManager manager) { Manager = manager; _shop = new PrivateServerShop(manager, manager.GetClients(), manager.GetDonation()); Manager.getPluginManager().registerEvents(this, Manager.getPlugin()); //Ultra Games ultraGames.add(GameType.Smash); ultraGames.add(GameType.BaconBrawl); ultraGames.add(GameType.DeathTag); ultraGames.add(GameType.DragonEscape); ultraGames.add(GameType.Dragons); ultraGames.add(GameType.Micro); ultraGames.add(GameType.Paintball); ultraGames.add(GameType.Quiver); ultraGames.add(GameType.Runner); ultraGames.add(GameType.Sheep); ultraGames.add(GameType.Snake); ultraGames.add(GameType.SneakyAssassins); ultraGames.add(GameType.TurfWars); ultraGames.add(GameType.Spleef); //Hero Games heroGames.add(GameType.ChampionsDominate); heroGames.add(GameType.ChampionsTDM); heroGames.add(GameType.HideSeek); heroGames.add(GameType.Draw); //Legend Games legendGames.add(GameType.Bridge); legendGames.add(GameType.SurvivalGames); legendGames.add(GameType.CastleSiege); legendGames.add(GameType.WitherAssault); legendGames.add(GameType.Wizards); legendGames.add(GameType.Build); legendGames.add(GameType.UHC); legendGames.add(GameType.MineStrike); legendGames.add(GameType.SnowFight); legendGames.add(GameType.Gravity); legendGames.add(GameType.Barbarians); legendGames.add(GameType.OldMineWare); legendGames.add(GameType.SmashDomination); // Team variants legendGames.add(GameType.DragonEscapeTeams); legendGames.add(GameType.DragonsTeams); legendGames.add(GameType.QuiverTeams); legendGames.add(GameType.SmashTeams); legendGames.add(GameType.SpleefTeams); legendGames.add(GameType.SurvivalGamesTeams); //Config Defaults if (Manager.GetHost() != null && Manager.GetHost().length() > 0) { setDefaultConfig(); } } @EventHandler public void updateHost(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; //No Host - Not MPS if (Manager.GetHost() == null || Manager.GetHost().length() == 0) return; // Set as event server if (Manager.GetGame() != null && Manager.GetGame().GetType() == GameType.Event) { setEventServer(true); } // Admins update for (Player player : UtilServer.getPlayers()) { if (player.equals(_host) || _adminList.contains(player.getName()) || Manager.GetClients().Get(player).GetRank().Has(Rank.ADMIN)) { if (Manager.GetGame() == null || Manager.GetGame().GetState() == GameState.Recruit) giveAdminItem(player); } if (player.equals(_host) || (isAdmin(player, false) && isEventServer())) _lastOnline = System.currentTimeMillis(); } } @EventHandler public void adminJoin(PlayerJoinEvent event) { if (!isPrivateServer()) return; if (Manager.GetHost().equals(event.getPlayer().getName())) { _host = event.getPlayer(); _hostRank = Manager.GetClients().Get(_host).GetRank(); System.out.println("Game Host Joined."); if (isEventServer()) worldeditPermissionSet(event.getPlayer(), true); } else if (isAdmin(event.getPlayer(), false)) { System.out.println("Admin Joined."); _onlineAdmins.add(event.getPlayer()); if (isEventServer()) worldeditPermissionSet(event.getPlayer(), true); } } @EventHandler public void adminQuit(PlayerQuitEvent event) { if (!isPrivateServer()) return; if (isHost(event.getPlayer())) { System.out.println("Game Host Quit."); _host = null; if (isEventServer()) worldeditPermissionSet(event.getPlayer(), false); } else if (isAdmin(event.getPlayer(), false)) { _onlineAdmins.remove(event.getPlayer()); if (isEventServer()) worldeditPermissionSet(event.getPlayer(), false); } } public void worldeditPermissionSet(Player player, boolean hasPermission) { if (!_permissionMap.containsKey(player) || _permissionMap.get(player) != hasPermission) { for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) { player.addAttachment(plugin, "worldedit.*", hasPermission); } _permissionMap.put(player, hasPermission); UtilPlayer.message(player, "World Edit Permissions: " + F.tf(hasPermission)); } } @EventHandler public void updateHostExpired(UpdateEvent event) { if (!isPrivateServer()) return; if (event.getType() != UpdateType.FAST) return; if (Manager.GetGame() != null && Manager.GetGame().GetState() != GameState.Recruit) return; if (_hostExpired) return; if (UtilTime.elapsed(_lastOnline, _expireTime)) setHostExpired(true, Manager.GetServerConfig().HostName + " has abandoned the server. Thanks for playing!"); else if (UtilTime.elapsed(_serverStartTime, _serverExpireTime)) setHostExpired(true, "This server has expired! Thank you for playing!"); } public boolean isHostExpired() { if (!isPrivateServer()) return false; return _hostExpired; } public void setHostExpired(boolean expired, String string) { for (Player other : UtilServer.getPlayers()) { UtilPlayer.message(other, C.cGold + C.Bold + string); other.playSound(other.getLocation(), Sound.ENDERDRAGON_GROWL, 10f, 1f); Manager.GetPortal().sendPlayerToServer(other, "Lobby"); } _hostExpired = expired; } private void giveAdminItem(Player player) { if (Manager.GetGame() == null) return; if (UtilGear.isMat(player.getInventory().getItem(8), Material.SPECKLED_MELON)) return; if (player.getOpenInventory().getType() != InventoryType.CRAFTING && player.getOpenInventory().getType() != InventoryType.CREATIVE) return; player.getInventory().setItem(8, ItemStackFactory.Instance.CreateStack(Material.SPECKLED_MELON, (byte)0, 1, C.cGreen + C.Bold + "/menu")); } private void removeAdminItem(Player player) { if (player.getInventory().getItem(8) != null && player.getInventory().getItem(8).getType() == Material.SPECKLED_MELON) { player.getInventory().setItem(8, null); } } public HashSet getWhitelist() { return _whitelist; } public HashSet getBlacklist() { return _blacklist; } public HashSet getAdminList() { return _adminList; } @EventHandler public void menuCommand(PlayerCommandPreprocessEvent event) { if (!isPrivateServer()) return; if (!isAdmin(event.getPlayer(), true)) return; if (!event.getMessage().toLowerCase().startsWith("/menu")) return; openMenu(event.getPlayer()); } @EventHandler public void menuInteract(PlayerInteractEvent event) { if (!isPrivateServer()) return; if (!isAdmin(event.getPlayer(), true)) return; if (!UtilGear.isMat(event.getPlayer().getItemInHand(), Material.SPECKLED_MELON)) return; openMenu(event.getPlayer()); event.setCancelled(true); } private void openMenu(Player player) { _shop.attemptShopOpen(player); } public boolean isAdmin(Player player, boolean includeStaff) { return player.equals(_host) || _adminList.contains(player.getName()) || (includeStaff && Manager.GetClients().Get(player).GetRank().Has(Rank.ADMIN)); } public boolean isHost(Player player) { return player.getName().equals(Manager.GetHost()); } public boolean isPrivateServer() { return Manager.GetHost() != null && Manager.GetHost().length() > 0; } @EventHandler public void whitelistCommand(PlayerCommandPreprocessEvent event) { if (_host == null || !event.getPlayer().equals(_host)) return; if (!event.getMessage().toLowerCase().startsWith("/whitelist ")) return; String[] args = event.getMessage().split(" "); for (int i=1 ; i getAvailableGames(Player player) { ArrayList games = new ArrayList(); if (hasRank(Rank.ULTRA)) games.addAll(ultraGames); if (hasRank(Rank.HERO)) games.addAll(heroGames); if (hasRank(Rank.LEGEND)) games.addAll(legendGames); return games; } public void ban(Player player) { _blacklist.add(player.getName()); Manager.GetPortal().sendToHub(player, "You were removed from this Mineplex Private Server."); } @EventHandler public void kickBlacklist(UpdateEvent event) { if (event.getType() != UpdateType.SEC) return; for (Player player : UtilServer.getPlayers()) { if (_blacklist.contains(player.getName())) { Manager.GetPortal().sendToHub(player, "You were removed from this Mineplex Private Server."); } } } public void giveAdmin(Player player) { _adminList.add(player.getName()); _onlineAdmins.add(player); UtilPlayer.message(player, F.main("Server", "You were given admin privileges.")); if (isEventServer()) worldeditPermissionSet(player, true); } public void removeAdmin(String playerName) { _adminList.remove(playerName); Player player = UtilPlayer.searchExact(playerName); if (player != null) { _onlineAdmins.remove(player); removeAdminItem(player); if (_shop.isPlayerInShop(player)) { player.closeInventory(); } UtilPlayer.message(player, F.main("Server", "Your admin privileges were removed.")); player.setGameMode(GameMode.SURVIVAL); if (isEventServer()) worldeditPermissionSet(player, false); } } public boolean isAdminOnline() { return _onlineAdmins.isEmpty(); } public void setDefaultConfig() { Manager.GetServerConfig().HotbarInventory = false; Manager.GetServerConfig().RewardAchievements = false; Manager.GetServerConfig().RewardGems = false; Manager.GetServerConfig().RewardItems = false; Manager.GetServerConfig().RewardStats = false; Manager.GetServerConfig().GameAutoStart = true; Manager.GetServerConfig().GameTimeout = true; Manager.GetServerConfig().PlayerKickIdle = true; Manager.GetServerConfig().TeamForceBalance = true; } public int getMaxPlayerCap() { if (hasRank(Rank.SNR_MODERATOR) || _hostRank == Rank.YOUTUBE || _hostRank == Rank.TWITCH) return 100; else if (hasRank(Rank.LEGEND)) return 40; else if (hasRank(Rank.HERO)) return 12; else return 4; } @EventHandler public void setHostDebug(PlayerCommandPreprocessEvent event) { if (!event.getPlayer().isOp()) return; if (!event.getMessage().toLowerCase().startsWith("/sethost ")) return; Manager.GetServerConfig().HostName = event.getMessage().split(" ")[1]; event.getPlayer().sendMessage("Set host to: " + event.getMessage().split(" ")[1]); _host = Bukkit.getPlayerExact(Manager.GetServerConfig().HostName); if (_host != null) _hostRank = Manager.GetClients().Get(_host).GetRank(); setDefaultConfig(); event.setCancelled(true); } @EventHandler public void setEventGame(PlayerCommandPreprocessEvent event) { if (!isEventServer() || Manager.GetGame() == null) return; if (!isAdmin(event.getPlayer(), false)) return; if (!event.getMessage().toLowerCase().startsWith("/e set ") && !event.getMessage().toLowerCase().equals("/e set")) return; String[] args = event.getMessage().split(" "); //Parse Game if (args.length >= 3) { ArrayList matches = new ArrayList(); for (GameType type : GameType.values()) { if (type.toString().toLowerCase().equals(args[2])) { matches.clear(); matches.add(type); break; } if (type.toString().toLowerCase().contains(args[2])) { matches.add(type); } } if (matches.size() == 0) { event.getPlayer().sendMessage("No results for: " + args[2]); return; } if (matches.size() > 1) { event.getPlayer().sendMessage("Matched multiple games;"); for (GameType cur : matches) event.getPlayer().sendMessage(cur.toString()); return; } GameType type = matches.get(0); Manager.GetGame().setGame(type, event.getPlayer(), true); } else { Manager.GetGame().setGame(GameType.Event, event.getPlayer(), true); } //Map Pref if (args.length >= 4) { Manager.GetGameCreationManager().MapPref = args[3]; UtilPlayer.message(event.getPlayer(), C.cAqua + C.Bold + "Map Preference: " + ChatColor.RESET + args[2]); } event.setCancelled(true); } @EventHandler public void playerJoin(PlayerJoinEvent event) { if (!isPrivateServer()) return; if (_blacklist.contains(event.getPlayer().getName())) { Manager.GetPortal().sendToHub(event.getPlayer(), "You were kicked from this Mineplex Private Server."); return; } String serverName = Manager.getPlugin().getConfig().getString("serverstatus.name"); UtilPlayer.message(event.getPlayer(), ChatColor.BOLD + "Welcome to Mineplex Private Servers!"); UtilPlayer.message(event.getPlayer(), C.Bold + "Friends can connect with " + C.cGreen + C.Bold + "/server " + serverName); } public boolean isEventServer() { return _isEventServer; } public void setEventServer(boolean var) { _isEventServer = var; } }