diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index d1b615c..77bb2c6 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -5,7 +5,6 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.sql.Timestamp; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -13,6 +12,7 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.TreeSet; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -34,6 +34,9 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.util.config.Configuration; import com.garbagemule.MobArena.MAMessages.Msg; +import com.garbagemule.MobArena.util.WaveUtils; +import com.garbagemule.MobArena.waves.Wave; +import com.garbagemule.MobArena.waves.Wave.WaveBranch; public class Arena { @@ -55,11 +58,24 @@ public class Arena protected Map classMap; protected Map> classItems, classArmor; protected Map>> classBonuses; - protected Map> rewardMap; protected List entryFee; + + // NEW IMPLEMENTATION + // + // + // Player sets + protected Set arenaPlayers, lobbyPlayers, readyPlayers, specPlayers; + // Wave stuff + //protected TreeSet singleWaves; + //protected TreeSet recurrentWaves; + protected TreeSet singleWaves; + protected TreeSet recurrentWaves; + // + // + // NEW IMPLEMENTATION // Arena sets/maps - protected Set arenaPlayers, lobbyPlayers, readyPlayers, specPlayers, hasPaid, rewardedPlayers, notifyPlayers, randoms; + protected Set hasPaid, rewardedPlayers, notifyPlayers, randoms; protected Set monsters; protected Set blocks; protected Set pets; @@ -71,17 +87,13 @@ public class Arena protected boolean allowMonsters, allowAnimals; // Other settings - protected int repairDelay, playerLimit, joinDistance; + protected int repairDelay, minPlayers, maxPlayers, joinDistance; protected List classes = new LinkedList(); protected Map locations = new HashMap(); + protected Map healthMap = new HashMap(); // Logging protected ArenaLog log; - protected List classDistribution = new LinkedList(); - protected Map waveMap = new HashMap(); - protected Map killMap = new HashMap(); - protected Timestamp startTime; - protected Timestamp endTime; protected MAListener eventListener; @@ -96,7 +108,6 @@ public class Arena this.name = name; this.world = world; plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena"); - log = new ArenaLog(plugin, this); arenaPlayers = new HashSet(); lobbyPlayers = new HashSet(); @@ -111,7 +122,6 @@ public class Arena petMap = new HashMap(); classMap = new HashMap(); randoms = new HashSet(); - rewardMap = new HashMap>(); repairList = new LinkedList(); running = false; @@ -148,9 +158,7 @@ public class Arena { p.teleport(arenaLoc); p.setHealth(20); - rewardMap.put(p, new LinkedList()); - waveMap.put(p, 0); - killMap.put(p, 0); + //rewardMap.put(p, new LinkedList()); } // Spawn pets. @@ -160,8 +168,8 @@ public class Arena startSpawning(); // Start logging - if (logging) - log.start(); + log = new ArenaLog(plugin, this); + log.start(); // Set the boolean. running = true; @@ -183,13 +191,9 @@ public class Arena // Set the boolean. running = false; - // Stop logging. - if (logging) - { - log.end(); - log.serialize(); - log.clear(); - } + log.end(); + log.saveSessionData(); + log.updateArenaTotals(); // Stop spawning. stopSpawning(); @@ -210,9 +214,7 @@ public class Arena notifyPlayers.clear(); rewardedPlayers.clear(); classMap.clear(); - rewardMap.clear(); - waveMap.clear(); - killMap.clear(); + //rewardMap.clear(); spawnThread = null; // Notify listeners. @@ -224,9 +226,12 @@ public class Arena public void forceStart() { + if (running) + return; + // Set operations. Set tmp = new HashSet(); - //tmp.addAll(livePlayers); + tmp.addAll(lobbyPlayers); tmp.removeAll(readyPlayers); // Force leave. @@ -239,12 +244,14 @@ public class Arena public void forceEnd() { - for (Player p : getAllPlayers()) - { - plugin.getAM().arenaMap.remove(p); - playerLeave(p); - } + if (!running) + return; + Bukkit.getServer().getScheduler().cancelTask(spawnTaskId); + + for (Player p : getAllPlayers()) + playerLeave(p); + for (Entity e : monsters) e.remove(); @@ -252,9 +259,7 @@ public class Arena lobbyPlayers.clear(); readyPlayers.clear(); - rewardMap.clear(); - waveMap.clear(); - killMap.clear(); + //rewardMap.clear(); monsters.clear(); spawnTaskId = -1; @@ -262,105 +267,68 @@ public class Arena public void playerJoin(Player p, Location loc) { - if (!locations.containsKey(p)) - locations.put(p,loc); - - // Update chunk. - updateChunk(lobbyLoc); - + storePlayerData(p, loc); + p.setHealth(20); MAUtils.sitPets(p); - lobbyPlayers.add(p); - p.teleport(lobbyLoc); - - // Notify listeners. - for (MobArenaListener listener : plugin.getAM().listeners) - listener.onPlayerJoin(p); + movePlayerToLobby(p); } public void playerReady(Player p) { readyPlayers.add(p); + + if (minPlayers > 0 && lobbyPlayers.size() < minPlayers) + { + MAUtils.tellPlayer(p, MAMessages.get(Msg.LOBBY_NOT_ENOUGH_PLAYERS, "" + minPlayers)); + return; + } + startArena(); } public void playerLeave(Player p) { - // Clear class inventory, restore old inventory and fork over rewards. - restoreInvAndGiveRewards(p, (arenaPlayers.contains(p) || lobbyPlayers.contains(p))); + if (arenaPlayers.contains(p) || lobbyPlayers.contains(p)) + MAUtils.clearInventory(p); - // Grab the player's entry location, and warp them there. - Location entry = locations.get(p); - if (entry != null) - { - updateChunk(entry); - p.teleport(entry); - } - locations.remove(p); - - // Remove from the arenaMap and all the sets. - plugin.getAM().arenaMap.remove(p); - removePlayer(p); - - // End the arena if conditions are met. + restoreInvAndGiveRewards(p); + if (log.players.get(p) != null) log.players.get(p).lastWave = spawnThread.wave - 1; + movePlayerToEntry(p); + finishWithPlayer(p); endArena(); } public void playerDeath(Player p) { - // If spectate-on-death: false, pass on to playerLeave. - if (!specOnDeath) + MAUtils.clearInventory(p); + restoreInvAndGiveRewards(p); + log.players.get(p).lastWave = spawnThread.wave - 1; + + if (specOnDeath) { - p.teleport(arenaLoc); - playerLeave(p); - return; + resetPlayer(p); + movePlayerToSpec(p); } - - // Clear class inventory, restore old inventory and fork over rewards. - restoreInvAndGiveRewards(p, true); - - // Remove player from sets, warp to spectator area, then add to specPlayers. - removePlayer(p); - p.teleport(arenaLoc); // This will sometimes force players to drop any items held (not confirmed) - p.teleport(spectatorLoc); - specPlayers.add(p); - - // Update the monster targets. + else + { + movePlayerToEntry(p); + finishWithPlayer(p); + } + if (running && spawnThread != null) spawnThread.updateTargets(); - // Announce and notify MAUtils.tellAll(this, MAMessages.get(Msg.PLAYER_DIED, p.getName())); - for (MobArenaListener listener : plugin.getAM().listeners) - listener.onPlayerDeath(p); - - // End the arena if conditions are met. + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { public void run() { endArena(); + }}); } public void playerSpec(Player p, Location loc) { - if (!locations.containsKey(p)) - locations.put(p,loc); - + storePlayerData(p, loc); MAUtils.sitPets(p); - specPlayers.add(p); - p.teleport(spectatorLoc); - } - - public void removePlayer(Player p) - { - // Heal and put out fire. - p.setFireTicks(0); - p.setHealth(20); - - // Remove pets. - removePets(p); - - // readyPlayers before lobbyPlayers because of startArena sanity-checks - readyPlayers.remove(p); - specPlayers.remove(p); - arenaPlayers.remove(p); - lobbyPlayers.remove(p); + movePlayerToSpec(p); } private void spawnPets() @@ -424,31 +392,26 @@ public class Arena public void playerKill(Player p) { - if (p == null || killMap.get(p) == null) + if (p == null || log.players.get(p) == null) return; - killMap.put(p, killMap.get(p) + 1); + log.players.get(p).kills++; } - public void restoreInvAndGiveRewards(final Player p, final boolean clear) + public void restoreInvAndGiveRewards(final Player p) { - final List rewards = rewardMap.get(p); + final List rewards = log.players.get(p).rewards; + //final List rewards = rewardMap.get(p); final boolean hadRewards = rewardedPlayers.contains(p); - if (clear) MAUtils.clearInventory(p); - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { public void run() - { - //if (clear) - // MAUtils.clearInventory(p); - + { if (!emptyInvJoin) MAUtils.restoreInventory(p); - //if (rewardedPlayers.contains(p)) if (hadRewards) return; @@ -459,6 +422,70 @@ public class Arena }); } + public void storePlayerData(Player p, Location loc) + { + plugin.getAM().arenaMap.put(p, this); + + if (!locations.containsKey(p)) + locations.put(p, loc); + + if (!healthMap.containsKey(p)) + healthMap.put(p, p.getHealth()); + } + + public void movePlayerToLobby(Player p) + { + updateChunk(lobbyLoc); + lobbyPlayers.add(p); + p.teleport(lobbyLoc); + } + + public void movePlayerToSpec(Player p) + { + updateChunk(spectatorLoc); + specPlayers.add(p); + p.teleport(spectatorLoc); + } + + public void movePlayerToEntry(Player p) + { + Location entry = locations.get(p); + if (entry == null) return; + + updateChunk(entry); + p.teleport(entry); + } + + private void resetPlayer(Player p) + { + if (healthMap.containsKey(p)) + p.setHealth(healthMap.remove(p)); + + removePlayer(p); + } + + public void removePlayer(Player p) + { + // Put out fire. + p.setFireTicks(0); + + // Remove pets. + removePets(p); + + // readyPlayers before lobbyPlayers because of startArena sanity-checks + readyPlayers.remove(p); + specPlayers.remove(p); + arenaPlayers.remove(p); + lobbyPlayers.remove(p); + } + + private void finishWithPlayer(Player p) + { + locations.remove(p); + plugin.getAM().arenaMap.remove(p); + resetPlayer(p); + } + /*//////////////////////////////////////////////////////////////////// @@ -602,7 +629,8 @@ public class Arena specOnDeath = config.getBoolean(arenaPath + "spectate-on-death", true); shareInArena = config.getBoolean(arenaPath + "share-items-in-arena", true); joinDistance = config.getInt(arenaPath + "max-join-distance", 0); - playerLimit = config.getInt(arenaPath + "player-limit", 0); + minPlayers = config.getInt(arenaPath + "min-players", 0); + maxPlayers = config.getInt(arenaPath + "max-players", 0); repairDelay = config.getInt(arenaPath + "repair-delay", 5); waveDelay = config.getInt(arenaPath + "first-wave-delay", 5) * 20; waveInterval = config.getInt(arenaPath + "wave-interval", 20) * 20; @@ -624,6 +652,23 @@ public class Arena spectatorLoc = MAUtils.getArenaCoord(config, world, configName, "spectator"); spawnpoints = MAUtils.getArenaSpawnpoints(config, world, configName); + // NEW WAVES + singleWaves = WaveUtils.getWaves(config, configName, WaveBranch.SINGLE); + recurrentWaves = WaveUtils.getWaves(config, configName, WaveBranch.RECURRENT); + + + System.out.println(); + System.out.println("ARENA: " + configName); + System.out.println("Single waves"); + int si = singleWaves.size(); + for (int i = 0; i < si; i++) + System.out.println("- " + singleWaves.pollFirst()); + System.out.println("Reccurent waves"); + for (Wave w : recurrentWaves) + System.out.println("- " + w); + System.out.println(); + + classes = plugin.getAM().classes; classItems = plugin.getAM().classItems; classArmor = plugin.getAM().classArmor; @@ -847,8 +892,8 @@ public class Arena public void run() { // Make sure to remove any dead/removed entities first. - List tmp = new LinkedList(monsters); - for (Entity e : tmp) + List ms = new LinkedList(monsters); + for (Entity e : ms) if (e.isDead()) monsters.remove(e); @@ -860,7 +905,8 @@ public class Arena } // Clear all player inventories, and "kill" all players. - for (Player p : arenaPlayers) + List ps = new LinkedList(arenaPlayers); + for (Player p : ps) { MAUtils.clearInventory(p); MAUtils.tellPlayer(p, MAMessages.get(Msg.FORCE_END_IDLE)); @@ -969,6 +1015,12 @@ public class Arena return; MAUtils.giveItems(p, entryFee, false, plugin); + hasPaid.remove(p); + } + + public List getClasses() + { + return classes; } /** diff --git a/src/com/garbagemule/MobArena/ArenaLog.java b/src/com/garbagemule/MobArena/ArenaLog.java index 83898aa..f7f0288 100644 --- a/src/com/garbagemule/MobArena/ArenaLog.java +++ b/src/com/garbagemule/MobArena/ArenaLog.java @@ -1,134 +1,120 @@ package com.garbagemule.MobArena; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; import java.sql.Timestamp; import java.util.Date; -import java.util.LinkedList; -import java.util.List; +import java.util.HashMap; import java.util.Map; import org.bukkit.entity.Player; +import com.garbagemule.MobArena.util.data.PlainText; +import com.garbagemule.MobArena.util.data.Totals; + public class ArenaLog { - protected MobArena plugin; - protected Arena arena; - protected List log, classDistribution; - protected Timestamp startTime, endTime; + public MobArena plugin; + public Arena arena; + public Timestamp startTime, endTime; + public int lastWave; + + public Map players; + public Map distribution; public ArenaLog(MobArena plugin, Arena arena) { - this.plugin = plugin; - this.arena = arena; - log = new LinkedList(); - classDistribution = new LinkedList(); + this.plugin = plugin; + this.arena = arena; + this.players = new HashMap(arena.arenaPlayers.size()); + this.distribution = new HashMap(arena.classes.size()); } public void start() { - startTime = new Timestamp((new Date()).getTime()); + // Populate the data maps + populatePlayerMap(); + populateDistributionMap(); - // Class distribution - int length = 0; - for (String c : plugin.getAM().classes) - if (c.length() > length) - length = c.length(); - - List classList = new LinkedList(arena.classMap.values()); - for (String c : plugin.getAM().classes) - { - int count = 0; - int id = classList.indexOf(c); - while (id != -1) - { - classList.remove(id); - count++; - id = classList.indexOf(c); - } - //int percentage = (int) (((double) count) / ((double) arena.livePlayers.size())) * 100; - int percentage = (int) (((double) count) / ((double) arena.arenaPlayers.size())) * 100; - classDistribution.add(MAUtils.padRight(c + ": ", length + 2) + MAUtils.padLeft("" + count, 2) + " (" + percentage + "%)"); - } + // Grab the current timestamp + startTime = new Timestamp((new Date()).getTime()); } public void end() { + lastWave = arena.spawnThread.wave - 1; endTime = new Timestamp((new Date()).getTime()); - - // General stuff - log.add("--------------------------------------------------- ENTRY ---"); - log.add("Start: " + startTime); - log.add("End: " + endTime); - log.add("Duration: " + MAUtils.getDuration(endTime.getTime() - startTime.getTime())); - log.add("Last wave: " + (arena.spawnThread.wave - 1)); - log.add(" "); - - // Class distribution - log.add("Class Distribution: " + plugin.getAM().classes.size() + " classes"); - for (String c : classDistribution) - log.add("- " + c); - classDistribution.clear(); - log.add(" "); - - // Player data - int NAME = 12; int CLASS = 0; int WAVE = 4; int KILLS = 5; - for (String c : plugin.getAM().classes) - if (c.length() > CLASS) - CLASS = c.length(); - - log.add("Player Data: " + arena.classMap.keySet().size() + " players"); - log.add("- " + MAUtils.padRight("Name", NAME + 2, ' ') + MAUtils.padRight("Class", CLASS + 2, ' ') + MAUtils.padRight("Wave", WAVE + 2, ' ') + MAUtils.padRight("Kills", KILLS + 2, ' ') + "Rewards"); - for (Map.Entry entry : arena.classMap.entrySet()) - { - Player p = entry.getKey(); - StringBuffer buffy = new StringBuffer(); - buffy.append(" "); - // Name - String name = (p.getName().length() <= NAME) ? p.getName() : p.getName().substring(0, NAME+1); - buffy.append(MAUtils.padRight(name, NAME + 2, ' ')); - // Class - buffy.append(MAUtils.padRight(entry.getValue(), CLASS + 2, ' ')); - // Wave - buffy.append(MAUtils.padLeft(arena.waveMap.remove(p).toString(), WAVE, ' ') + " "); - // Kills - buffy.append(MAUtils.padLeft(arena.killMap.remove(p).toString(), KILLS, ' ') + " "); - // Rewards - buffy.append(MAUtils.listToString(arena.rewardMap.get(p), plugin)); - log.add(buffy.toString()); - } - - log.add(" "); } - public void serialize() + /** + * Map players to ArenaPlayer objects. + */ + private void populatePlayerMap() { - try - { - new File(plugin.getDataFolder() + File.separator + "logs").mkdir(); - File logFile = new File(plugin.getDataFolder() + File.separator + "logs" + File.separator + arena.configName() + ".log"); - if (logFile.exists()) - logFile.createNewFile(); - - FileWriter fw = new FileWriter(logFile, true); - BufferedWriter bw = new BufferedWriter(fw); - for (String l : log) - { - bw.write(l); - bw.write(System.getProperty("line.separator")); - } - - bw.close(); - } - catch (Exception e) - { - e.printStackTrace(); - System.out.println("[MobArena] ERROR! Could not create log file!"); - return; - } + for (Player p : arena.arenaPlayers) + players.put(p, new ArenaPlayer(p, arena, plugin)); } + + /** + * Map classes to amounts of players playing as the classes. + */ + private void populateDistributionMap() + { + // Initialize the map + for (String c : arena.classes) + distribution.put(c,0); - public void add(String s) { log.add(s); } - public void clear() { log.clear(); } + // Count occurrences + for (String c : arena.classMap.values()) + distribution.put(c,distribution.get(c) + 1); + } + + /** + * Save the data of the current session according to the logging type. + */ + public void saveSessionData() + { + /* + * Call saveSessionData on the correct utility class + */ + //XML.saveSessionData(this, plugin); + //CSV.saveSessionData(this, plugin); + //YAML.saveSessionData(this, plugin); + PlainText.saveSessionData(this); + } + + public void updateArenaTotals() + { + Totals.updateArenaTotals(this); + PlainText.updateArenaTotals(this); + } + + /** + * Clear maps. + */ + public void clearSessionData() + { + players.clear(); + distribution.clear(); + } + + public Arena getArena() { return arena; } + public Timestamp getStartTime() { return startTime; } + public Timestamp getEndTime() { return endTime; } + public String getDuration() { return MAUtils.getDuration(endTime.getTime() - startTime.getTime()); } + public long getDurationLong() { return endTime.getTime() - startTime.getTime(); } + public int getLastWave() { return lastWave; } + + public void playerKill(Player p) + { + players.get(p).kills++; + } + + public void playerDamager(Player p, int damage) + { + players.get(p).dmgDone += damage; + } + + public void playerDamagee(Player p, int damage) + { + players.get(p).dmgTaken += damage; + } } diff --git a/src/com/garbagemule/MobArena/ArenaMaster.java b/src/com/garbagemule/MobArena/ArenaMaster.java index 41119e6..a40e0ac 100644 --- a/src/com/garbagemule/MobArena/ArenaMaster.java +++ b/src/com/garbagemule/MobArena/ArenaMaster.java @@ -49,6 +49,7 @@ public class ArenaMaster { plugin = instance; config = plugin.getConfig(); + arenas = new LinkedList(); } @@ -225,17 +226,14 @@ public class ArenaMaster for (String configName : config.getKeys("arenas")) { String arenaPath = "arenas." + configName + "."; - String worldName = config.getString(arenaPath + "settings.world"); + String worldName = config.getString(arenaPath + "settings.world", null); World world; - if (worldName == null) + if (worldName == null || worldName.equals("")) { System.out.println("[MobArena] ERROR! Could not find the world for arena '" + configName + "'. Using default world! Check the config-file!"); world = Bukkit.getServer().getWorlds().get(0); } - else - { - world = Bukkit.getServer().getWorld(worldName); - } + else world = Bukkit.getServer().getWorld(worldName); Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world); arena.load(config); diff --git a/src/com/garbagemule/MobArena/Lobby.java b/src/com/garbagemule/MobArena/Lobby.java index 6740175..8ff1601 100644 --- a/src/com/garbagemule/MobArena/Lobby.java +++ b/src/com/garbagemule/MobArena/Lobby.java @@ -1,6 +1,5 @@ package com.garbagemule.MobArena; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index 89a6619..8bebff5 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -61,6 +61,7 @@ public class MACommands implements CommandExecutor COMMANDS.add("delclass"); // Delete a class COMMANDS.add("auto-generate"); // Auto-generate arena COMMANDS.add("auto-degenerate"); // Restore cuboid + COMMANDS.add("lol"); } private boolean meanAdmins, showingRegion; private Server server; @@ -115,6 +116,11 @@ public class MACommands implements CommandExecutor // ////////////////////////////////////////////////////////////////*/ + if (base.equals("spawn")) + { + p.getWorld().setSpawnLocation(p.getLocation().getBlockX(), p.getLocation().getBlockY() + 1, p.getLocation().getBlockZ()); + } + /* * Player join */ @@ -158,7 +164,7 @@ public class MACommands implements CommandExecutor error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_ALREADY_PLAYING)); else if (!plugin.has(p, "mobarena.arenas." + arena.configName())) error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_ARENA_PERMISSION)); - else if (arena.playerLimit > 0 && arena.lobbyPlayers.size() >= arena.playerLimit) + else if (arena.maxPlayers > 0 && arena.lobbyPlayers.size() >= arena.maxPlayers) error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_PLAYER_LIMIT_REACHED)); else if (arena.joinDistance > 0 && !arena.inRegionRadius(p.getLocation(), arena.joinDistance)) error = MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_TOO_FAR)); @@ -182,12 +188,21 @@ public class MACommands implements CommandExecutor if (p.isInsideVehicle()) p.leaveVehicle(); - am.arenaMap.put(p,arena); + // If player is in a bed, unbed! + if (p.isSleeping()) + { + p.kickPlayer("Banned for life... Nah, just don't join from a bed ;)"); + return true; + } + + //am.arenaMap.put(p,arena); arena.playerJoin(p, p.getLocation()); MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_PLAYER_JOINED)); if (!arena.entryFee.isEmpty()) MAUtils.tellPlayer(p, MAMessages.get(Msg.JOIN_FEE_PAID, MAUtils.listToString(arena.entryFee, plugin))); + if (arena.hasPaid.contains(p)) + arena.hasPaid.remove(p); return true; } @@ -217,7 +232,7 @@ public class MACommands implements CommandExecutor return true; } - Arena arena = am.arenaMap.remove(p); + Arena arena = am.arenaMap.get(p); arena.playerLeave(p); MAUtils.tellPlayer(p, MAMessages.get(Msg.LEAVE_PLAYER_LEFT)); return true; @@ -489,7 +504,6 @@ public class MACommands implements CommandExecutor return true; } - //if (arena.livePlayers.isEmpty()) if (arena.arenaPlayers.isEmpty()) { MAUtils.tellPlayer(sender, MAMessages.get(Msg.FORCE_END_EMPTY)); diff --git a/src/com/garbagemule/MobArena/MAListener.java b/src/com/garbagemule/MobArena/MAListener.java index 4dc3370..a28d897 100644 --- a/src/com/garbagemule/MobArena/MAListener.java +++ b/src/com/garbagemule/MobArena/MAListener.java @@ -9,6 +9,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.Event.Result; @@ -27,6 +28,7 @@ import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason; +import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; @@ -253,7 +255,6 @@ public class MAListener implements ArenaListener return; event.getDrops().clear(); - arena.waveMap.put(p, arena.spawnThread.wave - 1); arena.playerDeath(p); return; } @@ -264,7 +265,7 @@ public class MAListener implements ArenaListener EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null; Entity damager = (e2 != null) ? e2.getDamager() : null; - if (e2 != null && damager instanceof Player) + if (damager instanceof Player) arena.playerKill((Player) damager); event.getDrops().clear(); @@ -275,70 +276,93 @@ public class MAListener implements ArenaListener public void onEntityDamage(EntityDamageEvent event) { - if (!arena.running) return; - - EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null; - Entity damager = (e != null) ? e.getDamager() : null; - Entity damagee = event.getEntity(); - - // Damagee - Pet Wolf - cancel all damage. - if (damagee instanceof Wolf && arena.pets.contains(damagee)) - { - if (event.getCause() == DamageCause.FIRE_TICK) - { - damagee.setFireTicks(32768); // For mcMMO + if (!arena.running) return; + + EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null; + Entity damager = (e != null) ? e.getDamager() : null; + Entity damagee = event.getEntity(); + + // Pet wolf + if (damagee instanceof Wolf && arena.pets.contains(damagee)) + { + if (damager == null) + { + damagee.setFireTicks(32768); + event.setCancelled(true); + return; + } + else if (damager instanceof Player) + event.setCancelled(true); + else + event.setDamage(0); + + return; + } + // Arena player + else if (damagee instanceof Player) + { + if (arena.lobbyPlayers.contains(damagee)) + event.setCancelled(true); + else if (!arena.arenaPlayers.contains(damagee)) + return; + else if (!arena.detDamage && event.getCause() == DamageCause.BLOCK_EXPLOSION) event.setCancelled(true); - } - if (e != null && damager instanceof Player) + else if (damager instanceof Player && !arena.pvp) + { + // if 'inLobby' fails, and 'not inArena' fails, 'inArena' is true event.setCancelled(true); - - event.setDamage(0); - return; - } - - // Damager - Pet Wolf - lower damage - if (e != null && damager instanceof Wolf && arena.pets.contains(damager)) - { - event.setDamage(1); - return; - } - - // Damagee & Damager - Player - cancel if pvp disabled - if (damagee instanceof Player && damager instanceof Player) - { - if (arena.arenaPlayers.contains(damagee) && !arena.pvp) - event.setCancelled(true); - - return; - } - - // Damagee & Damager - Monsters - cancel if no monsterInfight - if (e != null && arena.monsters.contains(damagee) && arena.monsters.contains(damager)) - { - if (!arena.monsterInfight) - event.setCancelled(true); - - return; - } - - // Creeper detonations - if (arena.inRegion(damagee.getLocation())) - { - if (!arena.detDamage || !(damagee instanceof Player) || !arena.arenaPlayers.contains((Player) damagee)) return; - - if (event.getCause() == DamageCause.BLOCK_EXPLOSION) - event.setCancelled(true); - - return; - } + } + + if (!event.isCancelled()) + arena.log.players.get((Player) damagee).dmgTaken += event.getDamage(); + } + // Other LivingEntity + else if (arena.monsters.contains(damagee)) + { + if (damager instanceof Player) + { + if (!arena.arenaPlayers.contains(damager)) + { + event.setCancelled(true); + return; + } + + arena.log.players.get((Player) damager).dmgDone += event.getDamage(); + arena.log.players.get((Player) damager).hits++; + } + else if (damager instanceof Wolf && arena.pets.contains(damager)) + { + event.setDamage(1); + arena.log.players.get((Player) ((Wolf) damager).getOwner()).dmgDone += event.getDamage(); + } + else if (damager instanceof LivingEntity) + { + if (!arena.monsterInfight) + event.setCancelled(true); + } + } } + + public void onPlayerAnimation(PlayerAnimationEvent event) + { + if (!arena.running || !arena.arenaPlayers.contains(event.getPlayer())) + return; + + arena.log.players.get(event.getPlayer()).swings++; + } public void onPlayerDropItem(PlayerDropItemEvent event) { if (arena.running && arena.shareInArena) return; Player p = event.getPlayer(); + if (p.getLocation().equals(arena.spectatorLoc)) + { + event.getItemDrop().setItemStack(new ItemStack(1, 0)); + event.setCancelled(true); + } + if (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p)) return; @@ -348,7 +372,6 @@ public class MAListener implements ArenaListener public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { - //if (!readyPlayers.contains(event.getPlayer()) && !livePlayers.contains(event.getPlayer())) if (!arena.readyPlayers.contains(event.getPlayer()) && !arena.arenaPlayers.contains(event.getPlayer())) return; @@ -492,7 +515,6 @@ public class MAListener implements ArenaListener if (arena.running && arena.inRegion(to)) { - //MAUtils.tellPlayer(p, MAMessages.get(Msg.WARP_TO_ARENA)); event.setCancelled(true); return; } @@ -502,7 +524,6 @@ public class MAListener implements ArenaListener { Player p = event.getPlayer(); - //if (!livePlayers.contains(p)) if (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p)) return; diff --git a/src/com/garbagemule/MobArena/MAMessages.java b/src/com/garbagemule/MobArena/MAMessages.java index 71e5015..1b7d52d 100644 --- a/src/com/garbagemule/MobArena/MAMessages.java +++ b/src/com/garbagemule/MobArena/MAMessages.java @@ -52,6 +52,7 @@ public class MAMessages LOBBY_CLASS_PICKED, LOBBY_CLASS_RANDOM, LOBBY_CLASS_PERMISSION, + LOBBY_NOT_ENOUGH_PLAYERS, LOBBY_PLAYER_READY, LOBBY_DROP_ITEM, LOBBY_PICK_CLASS, @@ -108,6 +109,7 @@ public class MAMessages defaults.put(Msg.LOBBY_DROP_ITEM, "No sharing allowed at this time!"); defaults.put(Msg.LOBBY_PLAYER_READY, "You have been flagged as ready!"); defaults.put(Msg.LOBBY_PICK_CLASS, "You must first pick a class!"); + defaults.put(Msg.LOBBY_NOT_ENOUGH_PLAYERS, "Not enough players to start. Need at least % players."); defaults.put(Msg.LOBBY_RIGHT_CLICK, "Punch the sign. Don't right-click."); defaults.put(Msg.LOBBY_CLASS_PICKED, "You have chosen % as your class!"); defaults.put(Msg.LOBBY_CLASS_RANDOM, "You will get a random class on arena start."); @@ -127,7 +129,7 @@ public class MAMessages /** * Initializes the msgMap by reading from the announcements-file. */ - public static void init(MobArena plugin, boolean update) + public static void init(MobArena plugin) { // Use defaults in case of any errors. msgMap = defaults; @@ -184,11 +186,6 @@ public class MAMessages } } - public static void init(MobArena plugin) - { - init(plugin, false); - } - /** * Grabs the announcement from the msgMap, and in case of * s not being null, replaces the % with s. @@ -217,6 +214,8 @@ public class MAMessages */ private static void process(String s) { + if (s.endsWith("=")) + s += " "; // Split the string by the equals-sign. String[] split = s.split("="); if (split.length != 2) diff --git a/src/com/garbagemule/MobArena/MAPlayerListener.java b/src/com/garbagemule/MobArena/MAPlayerListener.java index 1618896..635e411 100644 --- a/src/com/garbagemule/MobArena/MAPlayerListener.java +++ b/src/com/garbagemule/MobArena/MAPlayerListener.java @@ -2,6 +2,7 @@ package com.garbagemule.MobArena; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; @@ -23,6 +24,13 @@ public class MAPlayerListener extends PlayerListener this.am = am; } + public void onPlayerAnimation(PlayerAnimationEvent event) + { + if (!am.enabled) return; + for (Arena arena : am.arenas) + arena.eventListener.onPlayerAnimation(event); + } + public void onPlayerInteract(PlayerInteractEvent event) { if (!am.enabled) return; diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index c09314e..08264d0 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import org.bukkit.Location; import org.bukkit.entity.Wolf; @@ -21,6 +23,10 @@ import org.bukkit.entity.CreatureType; import org.bukkit.inventory.ItemStack; import com.garbagemule.MobArena.MAMessages.Msg; +import com.garbagemule.MobArena.util.WaveUtils; +import com.garbagemule.MobArena.waves.RecurrentWave; +import com.garbagemule.MobArena.waves.SingleWave; +import com.garbagemule.MobArena.waves.Wave; /** * Core class for handling wave spawning. @@ -30,8 +36,6 @@ import com.garbagemule.MobArena.MAMessages.Msg; * host chooses. It is possible to create default waves that consist of * only one type of monster, or ones that have no creepers, for example. */ -// TODO: Allow custom special wave monsters. -// TODO: Allow additional "default" waves. public class MASpawnThread implements Runnable { protected int wave, previousSize, taskId; @@ -42,6 +46,14 @@ public class MASpawnThread implements Runnable private MobArena plugin; private Arena arena; + // NEW WAVES + /* Single waves are waves with a frequency of 0, and they only + * spawn once. Their priority is infinity, meaning they will always + * spawn instead of recurrent waves, if the wave numbers clash. */ + private Wave defaultWave; + private TreeSet singleWaves; + private TreeSet recurrentWaves; + public MASpawnThread(MobArena plugin, Arena arena) { this.plugin = plugin; @@ -51,7 +63,6 @@ public class MASpawnThread implements Runnable taskId = -32768; - //noOfPlayers = arena.livePlayers.size(); noOfPlayers = arena.arenaPlayers.size(); wave = 1; random = new Random(); @@ -63,6 +74,7 @@ public class MASpawnThread implements Runnable dSpiders = dSkeletons + arena.distDefault.get("spiders"); dCreepers = dSpiders + arena.distDefault.get("creepers"); dWolves = dCreepers + arena.distDefault.get("wolves"); + if (dWolves < 1) { dZombies = 1; dSkeletons = 2; dSpiders = 3; dCreepers = 4; dWolves = 5; } dPoweredCreepers = arena.distSpecial.get("powered-creepers"); dPigZombies = dPoweredCreepers + arena.distSpecial.get("zombie-pigmen"); @@ -71,6 +83,98 @@ public class MASpawnThread implements Runnable dAngryWolves = dMonsters + arena.distSpecial.get("angry-wolves"); dGiants = dAngryWolves + arena.distSpecial.get("giants"); dGhasts = dGiants + arena.distSpecial.get("ghasts"); + if (dGhasts < 1) { dPoweredCreepers = 1; dPigZombies = 2; dSlimes = 3; dMonsters = 4; dAngryWolves = 5; dGiants = 5; dGhasts = 5; } + } + + public void run2() + { + // Clear out all dead monsters in the monster set. + removeDeadMonsters(); + + // If there are no players in the arena, return. + if (arena.arenaPlayers.isEmpty()) + return; + + // Check if wave needs to be cleared first. If so, return! + if (arena.waveClear && wave > 1 && !arena.monsters.isEmpty()) + return; + + // Grant rewards (if any) for this wave + grantRewards(wave); + + // Detonate creepers if needed + detonateCreepers(arena.detCreepers); + + // Find the wave to spawn + spawnWave(wave); + + wave++; + if (arena.monsters.isEmpty()) + arena.resetIdleTimer(); + } + + private void removeDeadMonsters() + { + List tmp = new LinkedList(arena.monsters); + for (Entity e : tmp) + if (e.isDead()) + arena.monsters.remove(e); + } + + private void grantRewards(int wave) + { + for (Map.Entry> entry : arena.everyWaveMap.entrySet()) + if (wave % entry.getKey() == 0) + addReward(entry.getValue()); + + if (arena.afterWaveMap.containsKey(wave)) + addReward(arena.afterWaveMap.get(wave)); + } + + private void spawnWave(int wave) + { + Wave w = null; + + // Check the first element of the single waves. + if (!singleWaves.isEmpty() && singleWaves.first().matches(wave)) + { + w = singleWaves.pollFirst(); + //singleWaves.pollFirst().spawn(wave, arena.spawnpoints.values()); + //return; + } + else + { + SortedSet matches = getMatchingRecurrentWaves(wave); + + if (matches.isEmpty()) + w = defaultWave; + else + w = matches.last(); + } + + w.spawn(wave, arena.spawnpoints.values()); + /* + // Otherwise, check the recurrent waves. + SortedSet matches = getMatchingRecurrentWaves(wave); + + if (matches.isEmpty()) + defaultWave.spawn(wave, arena.spawnpoints.values()); + else + matches.last().spawn(wave, arena.spawnpoints.values()); + */ + } + + private SortedSet getMatchingRecurrentWaves(int wave) + { + TreeSet result = new TreeSet(WaveUtils.getRecurrentComparator()); + + for (Wave w : recurrentWaves) + { + if (w.matches(wave)) + result.add(w); + } + + return result; } public void run() @@ -130,14 +234,16 @@ public class MASpawnThread implements Runnable */ private void addReward(List rewards) { - //for (Player p : arena.livePlayers) for (Player p : arena.arenaPlayers) { - if (arena.rewardMap.get(p) == null) + if (arena.log.players.get(p) == null) continue; + /*if (arena.rewardMap.get(p) == null) + continue;*/ ItemStack reward = MAUtils.getRandomReward(rewards); - arena.rewardMap.get(p).add(reward); + arena.log.players.get(p).rewards.add(reward); + //arena.rewardMap.get(p).add(reward); if (reward == null) { diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 73b9000..437602f 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -885,12 +885,17 @@ public class MAUtils // ///////////////////////////////////////////////////////////////////// */ + public static void error(String msg) + { + System.out.println("[MobArena] ERROR! " + msg); + } + /** * Sends a message to a player. */ public static boolean tellPlayer(CommandSender p, String msg) { - if (p == null) + if (p == null || msg.equals(" ")) return false; p.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg); @@ -1045,6 +1050,7 @@ public class MAUtils return buffy.toString().substring(0, buffy.length() - trimLength); } public static String listToString(List list, MobArena plugin) { return listToString(list, true, plugin); } + public static String listToString(List list) { return listToString(list, true, (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena")); } /** * Returns a String-list version of a comma-separated list. @@ -1162,27 +1168,16 @@ public class MAUtils long hrs = ((seconds - secs) - (mins * 60)) / 60 / 60; return hrs + ":" + ((mins < 10) ? "0" + mins : mins) + ":" + ((secs < 10) ? "0" + secs : secs); } - - public static String padRight(String s, int length) { return padRight(s, length, ' '); } - public static String padRight(String s, int length, char pad) - { - StringBuffer buffy = new StringBuffer(); - buffy.append(s); - for (int i = s.length(); i < length; i++) - buffy.append(pad); - return buffy.toString(); - } - - public static String padLeft(String s, int length) { return padLeft(s, length, ' '); } - public static String padLeft(String s, int length, char pad) - { - StringBuffer buffy = new StringBuffer(); - for (int i = 0; i < length - s.length(); i++) - buffy.append(pad); - buffy.append(s); - return buffy.toString(); - } + public static long parseDuration(String duration) + { + String[] elements = duration.split(":"); + long hrs = Long.parseLong(elements[0]) * 60 * 60; + long mins = Long.parseLong(elements[1]) * 60; + long secs = Long.parseLong(elements[2]); + + return (hrs + mins + secs) * 1000; + } /** * Stand back, I'm going to try science! diff --git a/src/com/garbagemule/MobArena/MobArena.java b/src/com/garbagemule/MobArena/MobArena.java index be9a23d..0b9a1a4 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -16,6 +16,7 @@ import org.bukkit.util.config.Configuration; import com.nijiko.permissions.PermissionHandler; import com.nijikokun.bukkit.Permissions.Permissions; +import com.garbagemule.MobArena.util.FileUtils; import com.garbagemule.register.payment.Method; import com.garbagemule.register.payment.Methods; @@ -36,36 +37,84 @@ public class MobArena extends JavaPlugin protected Method Method; // Global variables - protected static final double MIN_PLAYER_DISTANCE = 256.0; - protected static final int ECONOMY_MONEY_ID = -29; + public static PluginDescriptionFile desc; + public static File dir, arenaDir; + public static final double MIN_PLAYER_DISTANCE = 256.0; + public static final int ECONOMY_MONEY_ID = -29; public void onEnable() - { - PluginDescriptionFile pdfFile = this.getDescription(); + { + // Description file and data folder + desc = getDescription(); + dir = getDataFolder(); + arenaDir = new File(dir, "arenas"); + if (!dir.exists()) dir.mkdir(); + //if (!arenaDir.exists()) arenaDir.mkdir(); - // Config, messages and ArenaMaster initialization + // Create default files and initialize config-file + FileUtils.extractDefaults("config.yml", "announcements.properties"); loadConfig(); - MAMessages.init(this); + + // Download external libraries if needed. + FileUtils.fetchLibs(config); + + // Set up permissions and economy + setupPermissions(); + setupRegister(); + + // Set up the ArenaMaster and the announcements am = new ArenaMaster(this); am.initialize(); + MAMessages.init(this); - // Permissions - setupPermissions(); + // Register event listeners + registerListeners(); - // Economy - Methods = new Methods(); - if (!Methods.hasMethod() && Methods.setMethod(this)) + // Announce enable! + System.out.println("[MobArena] v" + desc.getVersion() + " enabled."); + } + + public void onDisable() + { + // TODO: Re-implement this! + /* + // Force all arenas to end. + for (Arena arena : am.arenas) + arena.forceEnd(); + am.arenaMap.clear(); + + // Permissions & Economy + permissionHandler = null; + if (Methods != null && Methods.hasMethod()) { - Method = Methods.getMethod(); - System.out.println("[MobArena] Payment method found (" + Method.getName() + " version: " + Method.getVersion() + ")"); + Methods = null; + System.out.println("[MobArena] Payment method was disabled. No longer accepting payments."); + } + */ + System.out.println("[MobArena] disabled."); + } + + private void loadConfig() + { + File file = new File(dir, "config.yml"); + if (!file.exists()) + { + System.out.println("[MobArena] ERROR! Config-file could not be created!"); + return; } + config = new Configuration(file); + config.load(); + } + + private void registerListeners() + { // Bind the /ma, /marena, and /mobarena commands to MACommands. MACommands commandExecutor = new MACommands(this, am); - getCommand("ma").setExecutor(commandExecutor); - getCommand("marena").setExecutor(commandExecutor); - getCommand("mobarena").setExecutor(commandExecutor); - + getCommand("ma").setExecutor(commandExecutor); + getCommand("marena").setExecutor(commandExecutor); + getCommand("mobarena").setExecutor(commandExecutor); + // Create event listeners. PluginManager pm = getServer().getPluginManager(); PlayerListener playerListener = new MAPlayerListener(this, am); @@ -80,6 +129,7 @@ public class MobArena extends JavaPlugin pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_KICK, playerListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_ANIMATION, playerListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Highest, this); pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Highest, this); pm.registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Priority.High, this); // mcMMO is "Highest" @@ -90,79 +140,6 @@ public class MobArena extends JavaPlugin pm.registerEvent(Event.Type.ENTITY_TARGET, entityListener, Priority.Normal, this); pm.registerEvent(Event.Type.CREATURE_SPAWN, entityListener, Priority.Highest, this); pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, playerListener, Priority.Monitor, this); - - System.out.println("[MobArena] v" + pdfFile.getVersion() + " enabled." ); - } - - public void onDisable() - { - // Force all arenas to end. - for (Arena arena : am.arenas) - arena.forceEnd(); - am.arenaMap.clear(); - - // Permissions & Economy - permissionHandler = null; - if (Methods != null && Methods.hasMethod()) - { - Methods = null; - System.out.println("[MobArena] Payment method was disabled. No longer accepting payments."); - } - - System.out.println("[MobArena] disabled."); - } - - /** - * Load the config-file and initialize the Configuration object. - */ - private void loadConfig() - { - File file = new File(this.getDataFolder(), "config.yml"); - if (!file.exists()) - { - try - { - this.getDataFolder().mkdir(); - file.createNewFile(); - } - catch (Exception e) - { - e.printStackTrace(); - return; - } - } - // TODO: Remove in v1.0 - else - { - Configuration tmp = new Configuration(file); - tmp.load(); - if (tmp.getKeys("global-settings") == null) - { - file.renameTo(new File(this.getDataFolder(), "config_OLD.yml")); - file = new File(this.getDataFolder(), "config.yml"); - try - { - this.getDataFolder().mkdir(); - file.createNewFile(); - } - catch (Exception e) - { - e.printStackTrace(); - return; - } - - config = new Configuration(file); - config.load(); - fixConfig(); - config.setHeader("# MobArena Configuration-file\r\n# Please go to https://github.com/garbagemule/MobArena/wiki/Installing-MobArena for more details."); - config.save(); - } - } - - config = new Configuration(file); - config.load(); - config.setHeader("# MobArena Configuration-file\r\n# Please go to https://github.com/garbagemule/MobArena/wiki/Installing-MobArena for more details."); - config.save(); } // Permissions stuff @@ -188,89 +165,17 @@ public class MobArena extends JavaPlugin permissionHandler = ((Permissions) permissionsPlugin).getHandler(); } + private void setupRegister() + { + Methods = new Methods(); + if (!Methods.hasMethod() && Methods.setMethod(this)) + { + Method = Methods.getMethod(); + System.out.println("[MobArena] Payment method found (" + Method.getName() + " version: " + Method.getVersion() + ")"); + } + } + public Configuration getConfig() { return config; } public ArenaMaster getAM() { return am; } // More convenient. public ArenaMaster getArenaMaster() { return am; } - - // TODO: Remove in v1.0 - private void fixConfig() - { - // If global-settings is sorted, don't do anything. - if (config.getKeys("global-settings") != null) - return; - - File oldFile = new File(this.getDataFolder(), "config_OLD.yml"); - if (!oldFile.exists()) - return; - - System.out.println("[MobArena] Config-file appears to be old. Trying to fix it..."); - - Configuration oldConfig = new Configuration(oldFile); - oldConfig.load(); - - config.setProperty("global-settings.enabled", true); - config.save(); - config.load(); - config.setProperty("global-settings.update-notification", true); - config.save(); - config.load(); - - // Copy classes - for (String s : oldConfig.getKeys("classes")) - { - config.setProperty("classes." + s + ".items", oldConfig.getString("classes." + s + ".items")); - config.setProperty("classes." + s + ".armor", oldConfig.getString("classes." + s + ".armor")); - } - config.save(); - - // Make the default arena node. - config.setProperty("arenas.default.settings.enabled", true); - config.save(); - config.load(); - config.setProperty("arenas.default.settings.world", oldConfig.getString("settings.world")); - config.save(); - config.load(); - - // Copy the coords. - for (String s : oldConfig.getKeys("coords")) - { - if (s.equals("spawnpoints")) - continue; - - StringBuffer buffy = new StringBuffer(); - buffy.append(oldConfig.getString("coords." + s + ".x")); - buffy.append(","); - buffy.append(oldConfig.getString("coords." + s + ".y")); - buffy.append(","); - buffy.append(oldConfig.getString("coords." + s + ".z")); - buffy.append(","); - buffy.append(oldConfig.getString("coords." + s + ".yaw")); - buffy.append(","); - buffy.append(oldConfig.getString("coords." + s + ".pitch")); - - config.setProperty("arenas.default.coords." + s, buffy.toString()); - } - config.save(); - config.load(); - - for (String s : oldConfig.getKeys("coords.spawnpoints")) - { - StringBuffer buffy = new StringBuffer(); - buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".x")); - buffy.append(","); - buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".y")); - buffy.append(","); - buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".z")); - buffy.append(","); - buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".yaw")); - buffy.append(","); - buffy.append(oldConfig.getString("coords.spawnpoints." + s + ".pitch")); - - config.setProperty("arenas.default.coords.spawnpoints." + s, buffy.toString()); - } - config.save(); - config.load(); - - System.out.println("[MobArena] Updated the config-file!"); - } } \ No newline at end of file