package nautilus.game.arcade.managers; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; 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.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; 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; 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.MineStrike); //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; // 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)) _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."); } else if (isAdmin(event.getPlayer(), false)) { System.out.println("Admin Joined."); _onlineAdmins.add(event.getPlayer()); } } @EventHandler public void adminQuit(PlayerQuitEvent event) { if (!isPrivateServer()) return; if (isHost(event.getPlayer())) { System.out.println("Game Host Quit."); _host = null; } else if (isAdmin(event.getPlayer(), false)) { _onlineAdmins.remove(event.getPlayer()); } } @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(7), Material.SPECKLED_MELON)) return; if (player.getOpenInventory().getType() != InventoryType.CRAFTING && player.getOpenInventory().getType() != InventoryType.CREATIVE) return; player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.SPECKLED_MELON, (byte)0, 1, C.cGreen + C.Bold + "/menu")); } private void removeAdminItem(Player player) { if (player.getInventory().getItem(7).getType() == Material.SPECKLED_MELON) { player.getInventory().setItem(7, 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()); UtilPlayer.message(player, C.cGold + C.Bold + "You were kicked from this Mineplex Private Server."); player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 10f, 1f); Manager.GetPortal().sendPlayerToServer(player, "Lobby"); } public void giveAdmin(Player player) { _adminList.add(player.getName()); _onlineAdmins.add(player); UtilPlayer.message(player, F.main("Server", "You were given admin privileges.")); } 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.")); } } 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.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 playerJoin(PlayerJoinEvent event) { if (!isPrivateServer()) 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); } }