package me.maker56.survivalgames.arena;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import me.maker56.survivalgames.SurvivalGames;
import me.maker56.survivalgames.Util;
import me.maker56.survivalgames.commands.messages.MessageHandler;
import me.maker56.survivalgames.game.Game;
import me.maker56.survivalgames.listener.DomeListener;
import me.maker56.survivalgames.listener.SelectionListener;
import me.maker56.survivalgames.reset.Save;
import me.maker56.survivalgames.reset.Selection;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
public class ArenaManager {
private static FileConfiguration cfg = SurvivalGames.database;
public HashMap<String, String[]> selectedarena = new HashMap<>();
public static void reinitializeDatabase() {
cfg = SurvivalGames.database;
}
public Arena getArena(Location loc) {
for(Game game : SurvivalGames.gameManager.getGames()) {
for(Arena arena : game.getArenas()) {
if(arena.containsBlock(loc))
return arena;
}
}
return null;
}
// CONFIGURATION ==================================================
// ARENA SAVEN
public void save(Player p) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
Game game = SurvivalGames.gameManager.getGame(gamename);
if(game != null) {
Arena arena = game.getArena(arenaname);
if(arena != null) {
p.sendMessage(MessageHandler.getMessage("prefix") + "§cYou can only save arenas of an unloaded lobby.");
return;
}
}
Location min = Util.parseLocation(cfg.getString("Games." + gamename + ".Arenas." + arenaname + ".Min"));
Location max = Util.parseLocation(cfg.getString("Games." + gamename + ".Arenas." + arenaname + ".Max"));
if(min == null || max == null) {
p.sendMessage(MessageHandler.getMessage("prefix") + "The arena isn't defined yet.");
return;
}
Selection sel = new Selection(min, max);
p.sendMessage(MessageHandler.getMessage("prefix") + "Saveing arena... This may take a while. Laggs can occure. You'll get a message, when the save is completed.");
new Save(gamename, arenaname, sel, p.getName()).start();
}
// ARENA LÖSCHEN
public void delete(Player p) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
if(!cfg.contains("Games." + gamename)) {
p.sendMessage(MessageHandler.getMessage("game-not-found").replace("%0%", gamename));
return;
}
if(!cfg.contains("Games." + gamename + ".Arenas." + arenaname)) {
p.sendMessage(MessageHandler.getMessage("prefix") + "§cArena " + arenaname + " in lobby " + gamename + " not found!");
return;
}
Game game = SurvivalGames.gameManager.getGame(gamename);
if(game != null) {
p.sendMessage(MessageHandler.getMessage("prefix") + "§cYou can only delete arenas of an unloaded lobby.");
return;
}
cfg.set("Games." + gamename + ".Arenas." + arenaname, null);
SurvivalGames.saveDataBase();
p.sendMessage(MessageHandler.getMessage("prefix") + "Arena " + arenaname + " was deleted in lobby " + gamename + " successfull!");
}
// ARENA CHECKEN
public void check(Player p) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
p.sendMessage(MessageHandler.getMessage("prefix") + "Arena-Check: arena §e" + arenaname + "§6, lobby §e" + gamename);
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
boolean enabled = cfg.getBoolean(path + "Enabled");
if(enabled) {
p.sendMessage("§aThis arena is ready to play!");
}
int spawns = cfg.getStringList(path + "Spawns").size();
if(spawns < 2) {
p.sendMessage(" §8§l➥ §bSpawns §7(§c" + spawns + "§7) §eAt least 2 Spawns required");
} else {
p.sendMessage(" §8§l➥ §bSpawns §7(§a" + spawns + "§7) §eAt least 2 Spawns required");
}
boolean deathmatch = cfg.getBoolean(path + "Enable-Deathmatch");
int dspawns = cfg.getStringList(path + "Deathmatch-Spawns").size();
p.sendMessage(" §8§l➥ §bDeathmatch §7(§a" + deathmatch + "§7) §e(optional)");
if(deathmatch == true) {
if(dspawns < 1) {
p.sendMessage(" §8§l➥ §bDeathmatch-Spawns §7(§c" + dspawns + "§7) §eAt least 1 Deathmatch Spawn required");
} else {
p.sendMessage(" §8§l➥ §bDeathmatch-Spawns §7(§a" + dspawns + "§7) §eAt least 1 Deathmatch Spawn required");
}
}
p.sendMessage(" ");
p.sendMessage("§e§lNext step:");
if(spawns < 2) {
p.sendMessage("§aAt least are 2 Spawns required. Type §b/sg arena addspawn §ato add more spawns!");
} else if(deathmatch == true && dspawns < 1){
p.sendMessage("§aAt least are 1 Deathmatch-Spawn required. Type §b/sg arena deathmatch add §ato add more Deathmatch-Spawns!");
} else {
p.sendMessage("§aThis arena is ready to play. Just type §b/sg arena finish §ato finish the setup!");
}
}
// SETUP FINISHEN
public void finishSetup(Player p) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
if(SurvivalGames.gameManager.getGame(gamename) != null) {
p.sendMessage(MessageHandler.getMessage("prefix") + "§cYou can't add an arena to a loaded lobby. Unload the lobby first with /sg lobby unload " + gamename);
} else {
cfg.set(path + "Enabled", true);
SurvivalGames.saveDataBase();
Game game = SurvivalGames.gameManager.getGame(gamename);
if(game == null) {
SurvivalGames.gameManager.unload(game);
}
SurvivalGames.gameManager.load(gamename);
p.sendMessage(MessageHandler.getMessage("prefix") + "§aYou've finished the setup and activated the arena successfully!");
}
}
// DEATHMATCH DOME SETMIDDLE
public void setDeathmatchDomeMiddle(Player p, boolean teleport) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".Dome-Middle";
if(teleport) {
if(cfg.contains(path)) {
Location loc = Util.parseLocation(cfg.getString(path));
if(loc == null) {
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-domemiddle-notset"));
} else {
p.teleport(loc);
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-domemiddle-teleport"));
}
} else {
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-domemiddle-notset"));
}
} else {
cfg.set(path, Util.serializeLocation(p.getLocation(), false));
SurvivalGames.saveDataBase();
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-domemiddle-set"));
}
}
// DEATHMATCH DOME RADIUS
public void setDeathmatchDomeRadius(Player p, int radius, boolean show) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".Dome-Radius";
// TODO (DEATHMATCH END REACHED MESSAGE)
if(show) {
int cradius = cfg.getInt(path);
p.sendMessage(cradius == 0 ? MessageHandler.getMessage("arena-deathmatch-domeradius-disabled") : MessageHandler.getMessage("arena-deathmatch-domeradius-show").replace("%0%", Integer.valueOf(cradius).toString()));
} else {
radius = Math.abs(radius);
cfg.set(path, radius);
SurvivalGames.saveDataBase();
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-domeradius-changed").replace("%0%", Integer.valueOf(radius).toString()));
}
}
// DEATHMATCH CHANGEN
public void changeDeathmatch(Player p) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
boolean deathmatch = cfg.getBoolean(path + "Enable-Deathmatch");
if(deathmatch) {
cfg.set(path + "Enable-Deathmatch", false);
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-changed").replace("%0%", "§cFALSE"));
} else {
cfg.set(path + "Enable-Deathmatch", true);
p.sendMessage(MessageHandler.getMessage("arena-deathmatch-changed").replace("%0%", "§aTRUE"));
}
SurvivalGames.saveDataBase();
}
// SPAWN ADDEN
public void addSpawn(Player p, String type) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
List<String> l = cfg.getStringList(path + type);
Location loc = p.getLocation();
l.add(loc.getWorld().getName() + "," + loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + loc.getYaw() + "," + loc.getPitch());
cfg.set(path + type, l);
SurvivalGames.saveDataBase();
p.sendMessage(MessageHandler.getMessage("arena-spawn-added").replace("%0%", Integer.valueOf(l.size()).toString()));
}
// SPAWN REMVOVEN
public void removeSpawn(Player p, int id, String type) {
if(!selectedarena.containsKey(p.getName())) {
p.sendMessage(MessageHandler.getMessage("arena-must-select").replace("%0%", "/sg arena select <LOBBYNAME> <ARENA NAME>"));
return;
}
String gamename = selectedarena.get(p.getName())[0];
String arenaname = selectedarena.get(p.getName())[1];
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
id--;
List<String> l = cfg.getStringList(path + type);
try {
l.get(id);
} catch(IndexOutOfBoundsException e) {
id++;
p.sendMessage(MessageHandler.getMessage("arena-spawn-notfound").replace("%0%", Integer.valueOf(id).toString()));
return;
}
l.remove(id);
cfg.set(path + type, l);
SurvivalGames.saveDataBase();
id++;
p.sendMessage(MessageHandler.getMessage("arena-spawn-removed").replace("%0%", Integer.valueOf(id).toString()));
}
// ARENA ERSTELLEN
public void createArena(Player p, String arenaname, String gamename) {
if(!cfg.contains("Games." + gamename)) {
p.sendMessage(MessageHandler.getMessage("game-not-found").replace("%0%", gamename));
return;
}
if(cfg.contains("Games." + gamename + ".Arenas." + arenaname)) {
p.sendMessage(MessageHandler.getMessage("arena-already-exists").replace("%0%", arenaname).replace("%1%", gamename));
return;
}
WorldEditPlugin we = SurvivalGames.getWorldEdit();
Selection sel = null;
if(we != null) {
com.sk89q.worldedit.bukkit.selections.Selection s = we.getSelection(p);
if(s == null || s.getMinimumPoint() == null || s.getMaximumPoint() == null) {
p.sendMessage(MessageHandler.getMessage("arena-no-selection").replace("%0%", "/sg arena tools"));
return;
}
sel = new Selection(s.getMinimumPoint(), s.getMaximumPoint());
} else {
if(SelectionListener.selections.containsKey(p.getName())) {
sel = SelectionListener.selections.get(p.getName());
if(sel == null || !sel.isFullDefined()) {
p.sendMessage(MessageHandler.getMessage("arena-no-selection").replace("%0%", "/sg arena tools"));
return;
}
} else {
p.sendMessage(MessageHandler.getMessage("arena-no-selection").replace("%0%", "/sg arena tools"));
return;
}
}
int chesttype = SurvivalGames.instance.getConfig().getInt("Default.Arena.Chests.TypeID");
int chestdata = SurvivalGames.instance.getConfig().getInt("Default.Arena.Chests.Data");
String path = "Games." + gamename + ".Arenas." + arenaname + ".";
cfg.set(path + "Enabled", false);
cfg.set(path + "Grace-Period", SurvivalGames.instance.getConfig().getInt("Default.Arena.Grace-Period"));
cfg.set(path + "Min", Util.serializeLocation(sel.getMinimumLocation(), false));
cfg.set(path + "Max", Util.serializeLocation(sel.getMaximumLocation(), false));
cfg.set(path + "Allowed-Blocks", SurvivalGames.instance.getConfig().getIntegerList("Default.Arena.Allowed-Blocks"));
cfg.set(path + "Chest.TypeID", chesttype);
cfg.set(path + "Chest.Data", chestdata);
cfg.set(path + "Spawns", new ArrayList<String>());
cfg.set(path + "Enable-Deathmatch", false);
cfg.set(path + "Player-Deathmatch", SurvivalGames.instance.getConfig().getInt("Default.Arena.Player-Deathmatch-Start"));
cfg.set(path + "Auto-Deathmatch", SurvivalGames.instance.getConfig().getInt("Default.Arena.Automaticly-Deathmatch-Time"));
cfg.set(path + "Deathmatch-Spawns", new ArrayList<String>());
cfg.set(path + "Money-on-Kill", SurvivalGames.instance.getConfig().getDouble("Default.Money-on-Kill"));
cfg.set(path + "Money-on-Win", SurvivalGames.instance.getConfig().getDouble("Default.Money-on-Win"));
cfg.set(path + "Midnight-chest-refill", SurvivalGames.instance.getConfig().getBoolean("Default.Midnight-chest-refill"));
SurvivalGames.saveDataBase();
selectArena(p, arenaname, gamename);
p.sendMessage(MessageHandler.getMessage("arena-created").replace("%0%", arenaname).replace("%1%", gamename));
if(SurvivalGames.instance.getConfig().getBoolean("Enable-Arena-Reset"))
save(p);
p.sendMessage(MessageHandler.getMessage("arena-check").replace("%0%", "/sg arena check"));
return;
}
// ARENA AUSWÄHLEN
public void selectArena(Player p, String arenaname, String gamename) {
if(!cfg.contains("Games." + gamename)) {
p.sendMessage(MessageHandler.getMessage("game-not-found").replace("%0%", gamename));
return;
}
if(!cfg.contains("Games." + gamename + ".Arenas." + arenaname)) {
p.sendMessage(MessageHandler.getMessage("arena-not-found").replace("%0%", arenaname).replace("%1%", gamename));
return;
}
selectedarena.put(p.getName(), new String[] { gamename, arenaname });
p.sendMessage(MessageHandler.getMessage("arena-selected").replace("%0%", arenaname).replace("%1%", gamename));
}
// ARENA GETTEN
@SuppressWarnings("deprecation")
public Arena getArena(String game, String arenaname) {
if(!new File("plugins/SurvivalGames/reset/" + game + arenaname + ".map").exists() && SurvivalGames.instance.getConfig().getBoolean("Enable-Arena-Reset")) {
System.out.println("[SurvivalGames] Cannot load arena " + arenaname + " in lobby " + game + ": Arena map file is missing! To create a map file, select the arena first with /sg arena select " + game + " " + arenaname + " and type /sg arena save!");
return null;
}
String path = "Games." + game + ".Arenas." + arenaname + ".";
Location min = Util.parseLocation(cfg.getString(path + "Min"));
Location max = Util.parseLocation(cfg.getString(path + "Max"));
if(min == null || max == null) {
System.out.println("[SurvivalGames] Cannot load arena " + arenaname + " in lobby " + game + ": Minimum and maximum location of the arena aren't correct defined. Try to redefine it!");
return null;
}
int graceperiod = cfg.getInt(path + "Grace-Period");
Material chesttype = Material.getMaterial(cfg.getInt(path + "Chest.TypeID"));
int chestdata = cfg.getInt(path + "Chest.Data");
List<Location> spawns = new ArrayList<>();
for(String key : cfg.getStringList(path + "Spawns")) {
spawns.add(Util.parseLocation(key));
}
boolean deathmatch = cfg.getBoolean(path + "Enable-Deathmatch");
List<Location> deathmatchspawns = new ArrayList<>();
if(deathmatch) {
for(String key : cfg.getStringList(path + "Deathmatch-Spawns")) {
deathmatchspawns.add(Util.parseLocation(key));
}
}
List<Integer> allowedBlocks = cfg.getIntegerList(path + "Allowed-Blocks");
int autodeathmatch = cfg.getInt(path + "Auto-Deathmatch");
int playerdeathmatch = cfg.getInt(path + "Player-Deathmatch");
if(!cfg.contains(path + "Money-on-Kill")) {
cfg.set(path + "Money-on-Kill", SurvivalGames.instance.getConfig().getDouble("Default.Money-on-Kill"));
cfg.set(path + "Money-on-Win", SurvivalGames.instance.getConfig().getDouble("Default.Money-on-Win"));
cfg.set(path + "Midnight-chest-refill", SurvivalGames.instance.getConfig().getBoolean("Default.Midnight-chest-refill"));
SurvivalGames.saveDataBase();
}
double kill = cfg.getDouble(path + "Money-on-Kill");
double win = cfg.getDouble(path + "Money-on-Win");
boolean refill = cfg.getBoolean(path + "Midnight-chest-refill");
Location domeMiddle = Util.parseLocation(cfg.getString(path + "Dome-Middle", ""));
int domeRadius = cfg.getInt(path + "Dome-Radius", 0);
if(domeMiddle != null && domeRadius > 0) {
if(!DomeListener.isRegistered())
new DomeListener();
}
return new Arena(min, max, spawns, chesttype, chestdata, graceperiod, arenaname, game, deathmatch, deathmatchspawns, allowedBlocks, autodeathmatch, playerdeathmatch, kill, win, refill, domeMiddle, domeRadius);
}
}