package me.maker56.survivalgames.game; import java.util.ArrayList; import java.util.List; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import me.maker56.survivalgames.Util; import me.maker56.survivalgames.SurvivalGames; import me.maker56.survivalgames.arena.Arena; import me.maker56.survivalgames.commands.messages.MessageHandler; import me.maker56.survivalgames.game.phases.CooldownPhase; import me.maker56.survivalgames.game.phases.DeathmatchPhase; import me.maker56.survivalgames.game.phases.IngamePhase; import me.maker56.survivalgames.game.phases.VotingPhase; import me.maker56.survivalgames.reset.Reset; public class GameManager { private List<Game> games = new ArrayList<>(); private static FileConfiguration cfg; public GameManager() { reinitializeDatabase(); loadAll(); } public static void reinitializeDatabase() { cfg = SurvivalGames.database; } public void createGame(Player p, String lobbyname) { String path = "Games." + lobbyname; if(cfg.contains(path)) { p.sendMessage(MessageHandler.getMessage("game-already-exists").replace("%0%", lobbyname)); return; } path += "."; FileConfiguration config = SurvivalGames.instance.getConfig(); boolean enableVoting = config.getBoolean("Default.Enable-Voting"); int lobbytime = config.getInt("Default.Lobby-Time"); int maxVotingArenas = config.getInt("Default.Max-Voting-Arenas"); int reqPlayers = config.getInt("Default.Required-Players-to-start"); cfg.set(path + "Enable-Voting", enableVoting); cfg.set(path + "Lobby-Time", lobbytime); cfg.set(path + "Max-Voting-Arenas", maxVotingArenas); cfg.set(path + "Required-Players-to-start", reqPlayers); cfg.set(path + "Lobby", Util.serializeLocation(p.getLocation(), true)); SurvivalGames.saveDataBase(); p.sendMessage(MessageHandler.getMessage("game-created").replace("%0%", lobbyname)); p.sendMessage(MessageHandler.getMessage("game-set-spawn").replace("%0%", lobbyname)); return; } public void setSpawn(Player p, String lobbyname) { if(!cfg.contains("Games." + lobbyname)) { p.sendMessage(MessageHandler.getMessage("game-not-found").replace("%0%", lobbyname)); return; } Location loc = p.getLocation(); String s = loc.getWorld().getName() + "," + loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + loc.getYaw() + "," + loc.getPitch(); cfg.set("Games." + lobbyname + ".Lobby", s); SurvivalGames.saveDataBase(); p.sendMessage(MessageHandler.getMessage("game-spawn-set").replace("%0%", lobbyname)); return; } public void loadAll() { int loaded = 0; if(cfg.contains("Games")) { for(String key : cfg.getConfigurationSection("Games.").getKeys(false)) { if(load(key)) loaded++; } } System.out.println("[SurvivalGames] " + loaded + " lobbys loaded!"); } public void unload(Game game) { if(game != null) { if(game.getPlayingUsers() > 0) game.kickall(); VotingPhase vp = game.getVotingPhrase(); if(vp != null) { vp.cancelTask(); } CooldownPhase cp = game.getCooldownPhrase(); if(cp != null) cp.cancelTask(); IngamePhase ip = game.getIngamePhrase(); if(ip != null) { ip.cancelDeathmatchTask(); ip.cancelLightningTask(); ip.cancelTask(); } DeathmatchPhase dp = game.getDeathmatch(); if(dp != null) { dp.cancelTask(); } games.remove(game); } } public boolean load(String name) { if(getGame(name) != null) { System.out.println("[SurvivalGames] Lobby " + name + " is already loaded!"); return false; } String path = "Games." + name; if(!cfg.contains(path)) { System.out.println("[SurvivalGames] Lobby " + name + " does not exist!"); return false; } path += "."; if(!cfg.contains(path + "Arenas")) { System.out.println("[SurvivalGames] Lobby " + name + " has no arenas!"); return false; } boolean reset = false; if(SurvivalGames.reset.contains("Startup-Reset." + name)) { for(String key : SurvivalGames.reset.getConfigurationSection("Startup-Reset." + name + ".").getKeys(false)) { reset = true; new Reset(Util.parseLocation(cfg.getString(path + "Arenas." + key + ".Min")).getWorld(), name, key, SurvivalGames.reset.getStringList("Startup-Reset." + name + "." + key)).start(); } } if(reset) { System.out.println("[SurvivalGames] Lobby " + name + " does not exist!"); return false; } List<Arena> arenas = new ArrayList<>(); for(String key : cfg.getConfigurationSection(path + "Arenas.").getKeys(false)) { if(!cfg.getBoolean(path + "Arenas." + key + ".Enabled")) { continue; } Arena arena = SurvivalGames.arenaManager.getArena(name, key); if(arena != null) { arenas.add(arena); } } if(arenas.size() == 0) { System.out.println("[SurvivalGames] No arena in lobby " + name + " loaded!"); return false; } if(!cfg.contains(path + "Lobby") && arenas.size() != 1) { System.out.println("[SurvivalGames] The spawn point in lobby " + name + " isn't defined!"); return false; } Location lobby = Util.parseLocation(cfg.getString(path + "Lobby")); boolean voting = cfg.getBoolean(path + "Enable-Voting"); int lobbytime = cfg.getInt(path + "Lobby-Time"); int maxVotingArenas = cfg.getInt(path + "Max-Voting-Arenas"); int reqplayers = cfg.getInt(path + "Required-Players-to-start"); boolean resetEnabled = SurvivalGames.instance.getConfig().getBoolean("Enable-Arena-Reset"); games.add(new Game(name, lobby, voting, lobbytime, maxVotingArenas, reqplayers, arenas, resetEnabled)); return true; } public List<Game> getGames() { return games; } public Game getGame(String name) { for(Game game : games) { if(game.getName().equalsIgnoreCase(name)) return game; } return null; } }