package nautilus.game.arcade.managers; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import mineplex.core.antihack.AntiHack; import mineplex.core.common.util.TimeUtil; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; 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; import nautilus.game.arcade.game.Game.GameState; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; public class GameCreationManager implements Listener { ArcadeManager Manager; private ArrayList _ended = new ArrayList(); private GameType _nextGame = null; private String _lastMap = ""; private ArrayList _lastGames = new ArrayList(); public String MapPref = null; public GameCreationManager(ArcadeManager manager) { Manager = manager; Manager.GetPluginManager().registerEvents(this, Manager.GetPlugin()); } public String GetLastMap() { return _lastMap; } public void SetLastMap(String file) { _lastMap = file; } @EventHandler public void NextGame(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; if (Manager.GetGameList().isEmpty()) return; while (_lastGames.size() > Manager.GetGameList().size() - 1) _lastGames.remove(_lastGames.size()-1); if (Manager.GetGame() == null && _ended.isEmpty()) { CreateGame(null); } //Archive Game if (Manager.GetGame() != null) { if (Manager.GetGame().GetState() == GameState.Dead) { HandlerList.unregisterAll(Manager.GetGame()); //Schedule Cleanup _ended.add(Manager.GetGame()); //Lobby Display Manager.GetLobby().DisplayLast(Manager.GetGame()); Manager.SetGame(null); } } //Clean Archived Games Iterator gameIterator = _ended.iterator(); while (gameIterator.hasNext()) { Game game = gameIterator.next(); HandlerList.unregisterAll(game); TimeUtil.start("GameCreationManager - Attempting Removal - " + game.GetName()); //Cleaned if (game.WorldData == null || game.WorldData.World == null) { gameIterator.remove(); } else { if (UtilTime.elapsed(game.GetStateTime(), 10000)) { TimeUtil.start("GameCreationManager - Kick Players - " + game.GetName()); for (Player player : game.WorldData.World.getPlayers()) { System.out.println("Kicking [" + player.getName() + "] with Validity [" + player.isValid() + "] with Online [" + player.isOnline() + "]"); player.kickPlayer("Dead World"); } TimeUtil.stop(); } //Clean if (game.WorldData.World.getPlayers().isEmpty()) { TimeUtil.start("GameCreationManager - Uninit World - " + game.GetName()); game.WorldData.Uninitialize(); game.WorldData = null; gameIterator.remove(); TimeUtil.stop(); }; } TimeUtil.stop(); } } private void CreateGame(GameType gameType) { //Reset Changes Manager.GetDamage().DisableDamageChanges = false; Manager.GetCreature().SetDisableCustomDrops(false); Manager.GetDamage().SetEnabled(true); Manager.GetExplosion().SetRegenerate(false); Manager.GetExplosion().SetTNTSpread(true); Manager.GetAntiStack().SetEnabled(true); HashMap pastTeams = null; //Chosen Game if (_nextGame != null) { gameType = _nextGame; _nextGame = null; System.out.println("Staff Selected GameType: " + gameType); } //Pick Game if (gameType == null) { for (int i=0 ; i<50 ; i++) { gameType = Manager.GetGameList().get(UtilMath.r(Manager.GetGameList().size())); if (!_lastGames.contains(gameType)) break; } } _lastGames.add(0, gameType); //Make Game Manager.SetGame(Manager.GetGameFactory().CreateGame(gameType, pastTeams)); if (Manager.GetGame() == null) { return; } Manager.GetLobby().DisplayNext(Manager.GetGame(), pastTeams); UtilServer.getServer().getPluginManager().registerEvents(Manager.GetGame(), Manager.GetPlugin()); } public void SetNextGameType(GameType type) { _nextGame = type; } }