diff --git a/MobArena.jar b/MobArena.jar index d60605d..c6a9474 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/bin/plugin.yml b/bin/plugin.yml index b5cc406..1ab4980 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.93.3 +version: 0.93.4 softdepend: [MultiVerse,XcraftGate,Towny] commands: ma: diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index d1b615c..7e8cc0c 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -71,9 +71,10 @@ 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; @@ -224,9 +225,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,6 +243,9 @@ public class Arena public void forceEnd() { + if (!running) + return; + for (Player p : getAllPlayers()) { plugin.getAM().arenaMap.remove(p); @@ -262,8 +269,12 @@ public class Arena public void playerJoin(Player p, Location loc) { + // Store location and health. if (!locations.containsKey(p)) locations.put(p,loc); + if (!healthMap.containsKey(p)) + healthMap.put(p,p.getHealth()); + p.setHealth(20); // Update chunk. updateChunk(lobbyLoc); @@ -280,6 +291,13 @@ public class Arena 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(); } @@ -296,6 +314,7 @@ public class Arena p.teleport(entry); } locations.remove(p); + if (healthMap.containsKey(p)) p.setHealth(healthMap.remove(p)); // Remove from the arenaMap and all the sets. plugin.getAM().arenaMap.remove(p); @@ -310,7 +329,6 @@ public class Arena // If spectate-on-death: false, pass on to playerLeave. if (!specOnDeath) { - p.teleport(arenaLoc); playerLeave(p); return; } @@ -318,10 +336,10 @@ public class Arena // 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) + // Remove player from sets, warp to spectator area, then add to specPlayers. p.teleport(spectatorLoc); + if (healthMap.containsKey(p)) p.setHealth(healthMap.remove(p)); + removePlayer(p); specPlayers.add(p); // Update the monster targets. @@ -341,6 +359,8 @@ public class Arena { if (!locations.containsKey(p)) locations.put(p,loc); + if (!healthMap.containsKey(p)) + healthMap.put(p,p.getHealth()); MAUtils.sitPets(p); specPlayers.add(p); @@ -441,14 +461,10 @@ public class Arena new Runnable() { public void run() - { - //if (clear) - // MAUtils.clearInventory(p); - + { if (!emptyInvJoin) MAUtils.restoreInventory(p); - //if (rewardedPlayers.contains(p)) if (hadRewards) return; @@ -602,7 +618,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; @@ -969,6 +986,7 @@ public class Arena return; MAUtils.giveItems(p, entryFee, false, plugin); + hasPaid.remove(p); } /** diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index 89a6619..e14749f 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -158,7 +158,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,6 +182,13 @@ public class MACommands implements CommandExecutor if (p.isInsideVehicle()) p.leaveVehicle(); + // 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()); diff --git a/src/com/garbagemule/MobArena/MAListener.java b/src/com/garbagemule/MobArena/MAListener.java index 4dc3370..f816235 100644 --- a/src/com/garbagemule/MobArena/MAListener.java +++ b/src/com/garbagemule/MobArena/MAListener.java @@ -348,7 +348,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 +491,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 +500,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..c0cc884 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."); diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index c09314e..700a98b 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -51,7 +51,6 @@ public class MASpawnThread implements Runnable taskId = -32768; - //noOfPlayers = arena.livePlayers.size(); noOfPlayers = arena.arenaPlayers.size(); wave = 1; random = new Random(); @@ -63,6 +62,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 +71,7 @@ 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 run() @@ -130,7 +131,6 @@ 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)