diff --git a/MobArena.jar b/MobArena.jar index 961fc29..96e3ffd 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index 5e40308..67058a6 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -59,7 +59,7 @@ public class Arena protected List entryFee; // Arena sets/maps - protected Set /*livePlayers, */deadPlayers, readyPlayers, specPlayers, waitPlayers, hasPaid, arenaPlayers, lobbyPlayers, notifyPlayers, randoms; + protected Set arenaPlayers, lobbyPlayers, readyPlayers, specPlayers, waitPlayers, hasPaid, rewardedPlayers, notifyPlayers, randoms; protected Set monsters; protected Set blocks; protected Set pets; @@ -98,38 +98,37 @@ public class Arena plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena"); log = new ArenaLog(plugin, this); - arenaPlayers = new HashSet(); - lobbyPlayers = new HashSet(); - notifyPlayers = new HashSet(); - //livePlayers = new HashSet(); - deadPlayers = new HashSet(); - readyPlayers = new HashSet(); - specPlayers = new HashSet(); - waitPlayers = new HashSet(); - hasPaid = new HashSet(); - monsters = new HashSet(); - blocks = new HashSet(); - pets = new HashSet(); - petMap = new HashMap(); - classMap = new HashMap(); - randoms = new HashSet(); - rewardMap = new HashMap>(); - repairList = new LinkedList(); + arenaPlayers = new HashSet(); + lobbyPlayers = new HashSet(); + notifyPlayers = new HashSet(); + readyPlayers = new HashSet(); + specPlayers = new HashSet(); + waitPlayers = new HashSet(); + rewardedPlayers = new HashSet(); + hasPaid = new HashSet(); + monsters = new HashSet(); + blocks = new HashSet(); + pets = new HashSet(); + petMap = new HashMap(); + classMap = new HashMap(); + randoms = new HashSet(); + rewardMap = new HashMap>(); + repairList = new LinkedList(); - running = false; - edit = false; + running = false; + edit = false; - allowMonsters = world.getAllowMonsters(); - allowAnimals = world.getAllowAnimals(); - spawnMonsters = ((net.minecraft.server.World) ((CraftWorld) world).getHandle()).spawnMonsters; + allowMonsters = world.getAllowMonsters(); + allowAnimals = world.getAllowAnimals(); + spawnMonsters = ((net.minecraft.server.World) ((CraftWorld) world).getHandle()).spawnMonsters; - eventListener = new MAListener(this, plugin); + eventListener = new MAListener(this, plugin); } public boolean startArena() { // Sanity-checks - if (running || lobbyPlayers.isEmpty() || !lobbyPlayers.equals(readyPlayers)) + if (running || lobbyPlayers.isEmpty() || !readyPlayers.containsAll(lobbyPlayers)) return false; if (!softRestore && forceRestore && !serializeRegion()) return false; @@ -182,9 +181,6 @@ public class Arena if (!running || !arenaPlayers.isEmpty()) return false; - // Stop spawning. - stopSpawning(); - // Set the boolean. running = false; @@ -195,6 +191,9 @@ public class Arena log.serialize(); log.clear(); } + + // Stop spawning. + stopSpawning(); // Clean arena floor. cleanup(); @@ -210,10 +209,12 @@ public class Arena MAUtils.tellAll(this, MAMessages.get(Msg.ARENA_END), true); arenaPlayers.clear(); notifyPlayers.clear(); + rewardedPlayers.clear(); classMap.clear(); rewardMap.clear(); waveMap.clear(); killMap.clear(); + spawnThread = null; // Notify listeners. for (MobArenaListener listener : plugin.getAM().listeners) @@ -286,7 +287,7 @@ public class Arena public void playerLeave(Player p) { // Clear class inventory, restore old inventory and fork over rewards. - restoreInvAndGiveRewards(p, !specPlayers.contains(p)); + restoreInvAndGiveRewards(p, (arenaPlayers.contains(p) || lobbyPlayers.contains(p))); // Grab the player's entry location, and warp them there. Location entry = locations.get(p); @@ -305,7 +306,7 @@ public class Arena endArena(); } - public void playerDeath(final Player p) + public void playerDeath(Player p) { // If spectate-on-death: false, pass on to playerLeave. if (!specOnDeath) @@ -361,12 +362,6 @@ public class Arena specPlayers.remove(p); arenaPlayers.remove(p); lobbyPlayers.remove(p); - - // arenaPlayers is empty if lobbyPlayers isn’t, and vice versa - /*if (arenaPlayers.remove(p)) - endArena2(); - if (lobbyPlayers.remove(p)) - startArena2();*/ } private void spawnPets() @@ -409,6 +404,7 @@ public class Arena Bukkit.getServer().getScheduler().cancelTask(spawnThread.taskId); Bukkit.getServer().getScheduler().cancelTask(spawnTaskId); spawnTaskId = -1; + spawnThread = null; } // Restore spawn flags. @@ -438,18 +434,28 @@ public class Arena public void restoreInvAndGiveRewards(final Player p, final boolean clear) { 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 (clear) + // MAUtils.clearInventory(p); if (!emptyInvJoin) MAUtils.restoreInventory(p); + + //if (rewardedPlayers.contains(p)) + if (hadRewards) + return; + MAUtils.giveRewards(p, rewards, plugin); + if (running) + rewardedPlayers.add(p); } }); } @@ -465,6 +471,7 @@ public class Arena public void assignClass(Player p, String className) { petMap.remove(p); + randoms.remove(p); classMap.put(p, className); MAUtils.clearInventory(p); @@ -827,13 +834,6 @@ public class Arena return result; } - public List getDeadPlayers() - { - List result = new LinkedList(); - result.addAll(deadPlayers); - return result; - } - public void resetIdleTimer() { if (maxIdleTime <= 0 || !running) diff --git a/src/com/garbagemule/MobArena/ArenaLog.java b/src/com/garbagemule/MobArena/ArenaLog.java index 3da9500..83898aa 100644 --- a/src/com/garbagemule/MobArena/ArenaLog.java +++ b/src/com/garbagemule/MobArena/ArenaLog.java @@ -73,10 +73,7 @@ public class ArenaLog log.add(" "); // Player data - int NAME = 12; - int CLASS = 0; - int WAVE = 4; - int KILLS = 5; + 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(); diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index a603820..57a2d35 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -851,7 +851,7 @@ public class MACommands implements CommandExecutor MAUtils.tellPlayer(sender, MAMessages.get(Msg.MISC_NO_ACCESS)); return true; } - if (args.length != 3 || !arg1.matches("[0-9]+")) + if (args.length != 3 || !arg1.matches("(-)?[0-9]+")) { MAUtils.tellPlayer(sender, "Usage: /ma expandregion [up|down|out]"); return true; @@ -883,6 +883,9 @@ public class MACommands implements CommandExecutor return true; } + // In case of a "negative" region, fix it! + MAUtils.fixRegion(plugin.getConfig(), am.selectedArena.world, am.selectedArena); + MAUtils.tellPlayer(sender, "Region for '" + am.selectedArena.configName() + "' expanded " + arg2 + " by " + arg1 + " blocks."); am.selectedArena.serializeConfig(); am.selectedArena.load(plugin.getConfig()); diff --git a/src/com/garbagemule/MobArena/MAListener.java b/src/com/garbagemule/MobArena/MAListener.java index 8315c09..72b8e15 100644 --- a/src/com/garbagemule/MobArena/MAListener.java +++ b/src/com/garbagemule/MobArena/MAListener.java @@ -16,6 +16,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; @@ -96,7 +97,7 @@ public class MAListener implements ArenaListener public void onCreatureSpawn(CreatureSpawnEvent event) { - if (!arena.inRegion(event.getLocation())) + if (!arena.inRegion(event.getLocation()) || event.getSpawnReason() == SpawnReason.CUSTOM) return; // If running == true, setCancelled(false), and vice versa. diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index b4b0a7f..bac5d45 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -755,7 +755,7 @@ public class MAUtils return true; } - private static void fixRegion(Configuration config, World world, Arena arena) + public static void fixRegion(Configuration config, World world, Arena arena) { if (arena.p1 == null || arena.p2 == null) return; @@ -904,12 +904,11 @@ public class MAUtils public static void tellAll(Arena arena, String msg, boolean waitPlayers) { Set tmp = new HashSet(); - //tmp.addAll(arena.livePlayers); tmp.addAll(arena.arenaPlayers); tmp.addAll(arena.lobbyPlayers); - tmp.addAll(arena.deadPlayers); - tmp.addAll(arena.specPlayers); tmp.addAll(arena.readyPlayers); + tmp.addAll(arena.notifyPlayers); + tmp.addAll(arena.specPlayers); if (waitPlayers) tmp.addAll(arena.waitPlayers); for (Player p : tmp) tellPlayer(p, msg);