Stupid git...

This commit is contained in:
Andreas Troelsen
2011-07-31 21:35:14 +02:00
parent 4c7d85193e
commit 8a5700e01e
11 changed files with 583 additions and 500 deletions
+168 -116
View File
@@ -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<Player,String> classMap;
protected Map<String,List<ItemStack>> classItems, classArmor;
protected Map<Integer,Map<Player,List<ItemStack>>> classBonuses;
protected Map<Player,List<ItemStack>> rewardMap;
protected List<ItemStack> entryFee;
// NEW IMPLEMENTATION
//
//
// Player sets
protected Set<Player> arenaPlayers, lobbyPlayers, readyPlayers, specPlayers;
// Wave stuff
//protected TreeSet<SingleWave> singleWaves;
//protected TreeSet<RecurrentWave> recurrentWaves;
protected TreeSet<Wave> singleWaves;
protected TreeSet<Wave> recurrentWaves;
//
//
// NEW IMPLEMENTATION
// Arena sets/maps
protected Set<Player> arenaPlayers, lobbyPlayers, readyPlayers, specPlayers, hasPaid, rewardedPlayers, notifyPlayers, randoms;
protected Set<Player> hasPaid, rewardedPlayers, notifyPlayers, randoms;
protected Set<LivingEntity> monsters;
protected Set<Block> blocks;
protected Set<Wolf> 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<String> classes = new LinkedList<String>();
protected Map<Player,Location> locations = new HashMap<Player,Location>();
protected Map<Player,Integer> healthMap = new HashMap<Player,Integer>();
// Logging
protected ArenaLog log;
protected List<String> classDistribution = new LinkedList<String>();
protected Map<Player,Integer> waveMap = new HashMap<Player,Integer>();
protected Map<Player,Integer> killMap = new HashMap<Player,Integer>();
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<Player>();
lobbyPlayers = new HashSet<Player>();
@@ -111,7 +122,6 @@ public class Arena
petMap = new HashMap<Player,Integer>();
classMap = new HashMap<Player,String>();
randoms = new HashSet<Player>();
rewardMap = new HashMap<Player,List<ItemStack>>();
repairList = new LinkedList<int[]>();
running = false;
@@ -148,9 +158,7 @@ public class Arena
{
p.teleport(arenaLoc);
p.setHealth(20);
rewardMap.put(p, new LinkedList<ItemStack>());
waveMap.put(p, 0);
killMap.put(p, 0);
//rewardMap.put(p, new LinkedList<ItemStack>());
}
// 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<Player> tmp = new HashSet<Player>();
//tmp.addAll(livePlayers);
tmp.addAll(lobbyPlayers);
tmp.removeAll(readyPlayers);
// Force leave.
@@ -239,11 +244,13 @@ public class Arena
public void forceEnd()
{
if (!running)
return;
Bukkit.getServer().getScheduler().cancelTask(spawnTaskId);
for (Player p : getAllPlayers())
{
plugin.getAM().arenaMap.remove(p);
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);
}
else
{
movePlayerToEntry(p);
finishWithPlayer(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.
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<ItemStack> rewards = rewardMap.get(p);
final List<ItemStack> rewards = log.players.get(p).rewards;
//final List<ItemStack> 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<Entity> tmp = new LinkedList<Entity>(monsters);
for (Entity e : tmp)
List<Entity> ms = new LinkedList<Entity>(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<Player> ps = new LinkedList<Player>(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<String> getClasses()
{
return classes;
}
/**
+91 -105
View File
@@ -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<String> log, classDistribution;
protected Timestamp startTime, endTime;
public MobArena plugin;
public Arena arena;
public Timestamp startTime, endTime;
public int lastWave;
public Map<Player,ArenaPlayer> players;
public Map<String,Integer> distribution;
public ArenaLog(MobArena plugin, Arena arena)
{
this.plugin = plugin;
this.arena = arena;
log = new LinkedList<String>();
classDistribution = new LinkedList<String>();
this.plugin = plugin;
this.arena = arena;
this.players = new HashMap<Player,ArenaPlayer>(arena.arenaPlayers.size());
this.distribution = new HashMap<String,Integer>(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<String> classList = new LinkedList<String>(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<Player,String> 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));
}
public void add(String s) { log.add(s); }
public void clear() { log.clear(); }
/**
* 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);
// 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;
}
}
@@ -49,6 +49,7 @@ public class ArenaMaster
{
plugin = instance;
config = plugin.getConfig();
arenas = new LinkedList<Arena>();
}
@@ -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);
-1
View File
@@ -1,6 +1,5 @@
package com.garbagemule.MobArena;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
+18 -4
View File
@@ -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));
+76 -55
View File
@@ -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;
if (!arena.running) return;
EntityDamageByEntityEvent e = (event instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) event : null;
Entity damager = (e != null) ? e.getDamager() : null;
Entity damagee = event.getEntity();
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
// 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);
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;
}
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;
+5 -6
View File
@@ -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)
@@ -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;
+112 -6
View File
@@ -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<SingleWave> singleWaves;
private TreeSet<RecurrentWave> 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<Entity> tmp = new LinkedList<Entity>(arena.monsters);
for (Entity e : tmp)
if (e.isDead())
arena.monsters.remove(e);
}
private void grantRewards(int wave)
{
for (Map.Entry<Integer,List<ItemStack>> 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<Wave> matches = getMatchingRecurrentWaves(wave);
if (matches.isEmpty())
w = defaultWave;
else
w = matches.last();
}
w.spawn(wave, arena.spawnpoints.values());
/*
// Otherwise, check the recurrent waves.
SortedSet<Wave> matches = getMatchingRecurrentWaves(wave);
if (matches.isEmpty())
defaultWave.spawn(wave, arena.spawnpoints.values());
else
matches.last().spawn(wave, arena.spawnpoints.values());
*/
}
private SortedSet<Wave> getMatchingRecurrentWaves(int wave)
{
TreeSet<Wave> result = new TreeSet<Wave>(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<ItemStack> 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)
{
+13 -18
View File
@@ -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 <E> String listToString(List<E> list, MobArena plugin) { return listToString(list, true, plugin); }
public static <E> String listToString(List<E> list) { return listToString(list, true, (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena")); }
/**
* Returns a String-list version of a comma-separated list.
@@ -1163,27 +1169,16 @@ public class MAUtils
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)
public static long parseDuration(String duration)
{
StringBuffer buffy = new StringBuffer();
buffy.append(s);
for (int i = s.length(); i < length; i++)
buffy.append(pad);
return buffy.toString();
}
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]);
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();
return (hrs + mins + secs) * 1000;
}
/**
* Stand back, I'm going to try science!
*/
+75 -170
View File
@@ -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,35 +37,83 @@ 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();
@@ -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!");
}
}