diff --git a/MobArena.jar b/MobArena.jar index 2c9ccc9..5e04d29 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/bin/plugin.yml b/bin/plugin.yml index 5a8c718..e636dfd 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.92.2 +version: 0.92.3 softdepend: [MultiVerse,XcraftGate] commands: ma: diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index f71df17..210b8e5 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -74,6 +74,7 @@ public class Arena protected Map distDefault, distSpecial; protected Map classMap; protected Map> classItems, classArmor; + protected Map>> classBonuses; protected Map> rewardMap; // Arena sets/maps @@ -99,6 +100,9 @@ public class Arena */ public Arena(String name, World world) { + if (world == null) + throw new NullPointerException("[MobArena] ERROR! World for arena '" + name + "' does not exist!"); + this.name = name; this.world = world; plugin = (MobArena) Bukkit.getServer().getPluginManager().getPlugin("MobArena"); @@ -124,11 +128,6 @@ public class Arena spawnMonsters = ((net.minecraft.server.World) ((CraftWorld) world).getHandle()).spawnMonsters; } - public Arena(String name, World world, ArenaMaster am) - { - this(name, world); - } - public void startArena() { if (running) @@ -154,7 +153,10 @@ public class Arena // Spawn pets. for (Map.Entry entry : petMap.entrySet()) { + // Remove the bones from the inventory. Player p = entry.getKey(); + p.getInventory().removeItem(new ItemStack(Material.BONE, entry.getValue())); + for (int i = 0; i < entry.getValue(); i++) { Wolf wolf = (Wolf) world.spawnCreature(p.getLocation(), CreatureType.WOLF); @@ -303,7 +305,14 @@ public class Arena { boolean clear = false; - p.teleport(locations.get(p)); + Location old = locations.get(p); + Chunk chunk = old.getWorld().getChunkAt(old); + if (!old.getWorld().isChunkLoaded(chunk)) + old.getWorld().loadChunk(chunk); + else + old.getWorld().refreshChunk(chunk.getX(), chunk.getZ()); + + p.teleport(old); locations.remove(p); // get, then remove, because of Teleport Event // Only clear the inventory if the player has class items. @@ -350,6 +359,8 @@ public class Arena } }, 10); + MAUtils.tellAll(this, MAMessages.get(Msg.PLAYER_DIED, p.getName())); + // Notify listeners. for (MobArenaListener listener : plugin.getAM().listeners) listener.onPlayerDeath(p); @@ -431,8 +442,9 @@ public class Arena private void removePets(Player p) { for (Wolf w : pets) - if (w.getOwner().equals(p)) + if (((Player) w.getOwner()).getName().equals(p.getName())) w.remove(); + petMap.remove(p); } private void removeEntities() @@ -1207,8 +1219,14 @@ public class Arena // Make sure to remove any dead/removed entities first. List tmp = new LinkedList(monsters); for (Entity e : tmp) + { + out(e.getClass().getSimpleName()); if (e.isDead()) + { + out("Removing monster"); monsters.remove(e); + } + } // Compare the current size with the previous size. if (monsters.size() < spawnThread.previousSize || spawnThread.previousSize == 0) @@ -1249,4 +1267,9 @@ public class Arena { return ((enabled && setup) ? ChatColor.GREEN : ChatColor.GRAY) + configName(); } + + private void out(String s) + { + System.out.println(s); + } } diff --git a/src/com/garbagemule/MobArena/ArenaMaster.java b/src/com/garbagemule/MobArena/ArenaMaster.java index 6b16482..d5603c9 100644 --- a/src/com/garbagemule/MobArena/ArenaMaster.java +++ b/src/com/garbagemule/MobArena/ArenaMaster.java @@ -28,6 +28,7 @@ public class ArenaMaster // Classes protected List classes; protected Map> classItems, classArmor; + protected Map>> classBonuses; protected Map arenaMap; // Location map @@ -206,9 +207,9 @@ public class ArenaMaster config.setProperty("classes.Chef.items", "stone_sword, bread:6, grilled_pork:4, mushroom_soup, cake:3, cookie:12"); config.setProperty("classes.Chef.armor", "314,315,316,317"); } - classes = config.getKeys("classes"); - classItems = MAUtils.getClassItems(config, "items"); - classArmor = MAUtils.getClassItems(config, "armor"); + classes = config.getKeys("classes"); + classItems = MAUtils.getClassItems(config, "items"); + classArmor = MAUtils.getClassItems(config, "armor"); } /** @@ -236,7 +237,7 @@ public class ArenaMaster world = Bukkit.getServer().getWorld(worldName); } - Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world, this); + Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world); arena.load(config); arenas.add(arena); } @@ -281,7 +282,7 @@ public class ArenaMaster config.save(); config.load(); - Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world, this); + Arena arena = new Arena(MAUtils.nameConfigToArena(configName), world); arena.load(config); return arena; } diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index da5bf4c..836f9f0 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -6,7 +6,6 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Chunk; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.Server; @@ -112,18 +111,6 @@ public class MACommands implements CommandExecutor // ////////////////////////////////////////////////////////////////*/ - if (base.equals("unchunk")) - { - Arena arena = am.getArenaWithName(arg1); - Chunk chunk = arena.world.getChunkAt(arena.lobbyLoc); - //arena.world.unloadChunk(chunk.getX(), chunk.getZ(), false, false); - arena.world.unloadChunk(arena.lobbyLoc.getBlockX(), arena.lobbyLoc.getBlockZ()); - arena.world.unloadChunk(chunk.getX(), chunk.getZ()); - System.out.println("Chunk: " + chunk.getX() + "," + chunk.getZ()); - System.out.println("Lobby: " + arena.lobbyLoc.getBlockX() + "," + arena.lobbyLoc.getBlockZ()); - return true; - } - /* * Player join */ @@ -299,8 +286,10 @@ public class MACommands implements CommandExecutor else { StringBuffer buffy = new StringBuffer(); + List players = new LinkedList(); for (Arena arena : am.arenas) - buffy.append(MAUtils.listToString(arena.getLivingPlayers())); + players.addAll(arena.getLivingPlayers()); + buffy.append(MAUtils.listToString(players)); MAUtils.tellPlayer(sender, MAMessages.get(Msg.MISC_LIST_PLAYERS, buffy.toString())); } return true; diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index f859df3..abf9fce 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -2,6 +2,7 @@ package com.garbagemule.MobArena; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; @@ -56,6 +57,7 @@ public class MASpawnThread implements Runnable random = new Random(); // Set up the distribution variables for the random spawner. + // Note: Updating these means MAUtils.getArenaDistributions() must also be updated! dZombies = arena.distDefault.get("zombies"); dSkeletons = dZombies + arena.distDefault.get("skeletons"); dSpiders = dSkeletons + arena.distDefault.get("spiders"); @@ -72,16 +74,18 @@ public class MASpawnThread implements Runnable } public void run() - { + { // Check if wave needs to be cleared first. If so, return! if (arena.waveClear && wave > 1) { + List tmp = new LinkedList(arena.monsters); + for (Entity e : tmp) + if (e.isDead()) + arena.monsters.remove(e); + if (!arena.monsters.isEmpty()) return; } - - // If maxIdleTime is defined, reset the timer. - //if (arena.maxIdleTime > 0) arena.resetIdleTimer(); // Check if we need to grant more rewards with the recurrent waves. for (Map.Entry> entry : arena.everyWaveMap.entrySet()) diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 9312127..fa56d81 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -97,6 +97,7 @@ public class MAUtils HELMETS_TYPE.add(Material.CHAINMAIL_HELMET); HELMETS_TYPE.add(Material.IRON_HELMET); HELMETS_TYPE.add(Material.DIAMOND_HELMET); + HELMETS_TYPE.add(Material.PUMPKIN); CHESTPLATES_TYPE.add(Material.LEATHER_CHESTPLATE); CHESTPLATES_TYPE.add(Material.GOLD_CHESTPLATE); @@ -247,33 +248,27 @@ public class MAUtils */ public static Map getArenaDistributions(Configuration config, String arena, String wave) { - //config.load(); String arenaPath = "arenas." + arena + ".waves." + wave; Map result = new HashMap(); List dists = config.getKeys(arenaPath); - // If there are no distributions yet, add them. - if (dists == null) + boolean update = false; + String[] monsters = (wave.equals("default")) ? new String[]{"zombies", "skeletons", "spiders", "creepers", "wolves"} + : new String[]{"powered-creepers", "zombie-pigmen", "slimes", "humans", "angry-wolves", "giants", "ghasts"}; + + for (String monster : monsters) { - if (wave.equals("default")) - { - config.setProperty(arenaPath + ".zombies", 10); - config.setProperty(arenaPath + ".skeletons", 10); - config.setProperty(arenaPath + ".spiders", 10); - config.setProperty(arenaPath + ".creepers", 10); - config.setProperty(arenaPath + ".wolves", 10); - } - else if (wave.equals("special")) - { - config.setProperty(arenaPath + ".powered-creepers", 10); - config.setProperty(arenaPath + ".zombie-pigmen", 10); - config.setProperty(arenaPath + ".slimes", 10); - config.setProperty(arenaPath + ".humans", 10); - config.setProperty(arenaPath + ".angry-wolves", 10); - config.setProperty(arenaPath + ".giants", 0); - config.setProperty(arenaPath + ".ghasts", 0); - } - //config.save(); + if (dists.contains(monster)) + continue; + + //if (config.getInt(arenaPath + "." + m, -1) == -1) + config.setProperty(arenaPath + "." + monster, (monster.equals("giants") || monster.equals("ghasts")) ? 0 : 10); + update = true; + } + + if (update) + { + config.save(); dists = config.getKeys(arenaPath); } @@ -289,8 +284,8 @@ public class MAUtils value = 0; config.setProperty(arenaPath + "." + monster, value); - //config.save(); } + config.save(); result.put(monster, value); } @@ -1268,7 +1263,7 @@ public class MAUtils MAUtils.setArenaCoord(plugin.getConfig(), arena, "p1", new Location(world, x1, ly1, z1)); MAUtils.setArenaCoord(plugin.getConfig(), arena, "p2", new Location(world, x2, y2+1, z2)); MAUtils.setArenaCoord(plugin.getConfig(), arena, "arena", new Location(world, loc.getX(), y1+1, loc.getZ())); - MAUtils.setArenaCoord(plugin.getConfig(), arena, "lobby", new Location(world, x1+2, y1-3, z1+2)); + MAUtils.setArenaCoord(plugin.getConfig(), arena, "lobby", new Location(world, x1+2, ly1+1, z1+2)); MAUtils.setArenaCoord(plugin.getConfig(), arena, "spectator", new Location(world, loc.getX(), y2+1, loc.getZ())); MAUtils.setArenaCoord(plugin.getConfig(), arena, "spawnpoints.s1", new Location(world, x1+3, y1+2, z1+3)); MAUtils.setArenaCoord(plugin.getConfig(), arena, "spawnpoints.s2", new Location(world, x1+3, y1+2, z2-3));