diff --git a/MobArena.jar b/MobArena.jar index 3597022..debd674 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/src/com/garbagemule/MobArena/AbstractArena.java b/src/com/garbagemule/MobArena/AbstractArena.java new file mode 100644 index 0000000..f7a6122 --- /dev/null +++ b/src/com/garbagemule/MobArena/AbstractArena.java @@ -0,0 +1,40 @@ +package com.garbagemule.MobArena; + +import org.bukkit.entity.Player; + +public abstract class AbstractArena +{ + /** + * Start the arena session. + * This method should warp all players to their respective warp points, start all + * needed timers, clear/populate all sets and lists, and flag all booleans. + */ + public abstract void startArena(); + + /** + * Stop the arena session. + * Distribute rewards, clean up arena floor and reset everything to how it was before + * the arena session was started. + */ + public abstract void endArena(); + + /** + * Player joins the arena/lobby. + */ + public abstract void playerJoin(Player p); + + /** + * Player leaves the arena/lobby. + */ + public abstract void playerLeave(Player p); + + /** + * Player dies in the arena. + */ + public abstract void playerDeath(Player p); + + /** + * Player signals that they are ready. + */ + public abstract void playerReady(Player p); +} diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index 06e05a1..fc0bcfa 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -885,6 +885,9 @@ public class Arena { Material mat = b.getType(); + if (mat == Material.LAVA) b.setType(Material.STATIONARY_LAVA); + else if (mat == Material.WATER) b.setType(Material.STATIONARY_WATER); + if (mat == Material.WOODEN_DOOR || mat == Material.IRON_DOOR_BLOCK || mat == Material.FIRE || mat == Material.CAKE_BLOCK || mat == Material.WATER || mat == Material.LAVA) { blocks.remove(b); @@ -1111,28 +1114,21 @@ public class Arena } public void onPlayerInteract(PlayerInteractEvent event) - { - /*if (running && livePlayers.contains(event.getPlayer())) + { + if (!livePlayers.contains(event.getPlayer())) + return; + + if (running) { - Player p = event.getPlayer(); - Action a = event.getAction(); - if (a == Action.RIGHT_CLICK_AIR || a == Action.RIGHT_CLICK_BLOCK) - { - if (p.getItemInHand().getType() == Material.BOW) - p.shootArrow(); - event.setUseItemInHand(Result.DENY); - event.setCancelled(true); - } + if (event.hasBlock() && event.getClickedBlock().getType() == Material.SAPLING) + addTrunkAndLeaves(event.getClickedBlock()); return; - }*/ + } - if (running || !livePlayers.contains(event.getPlayer())) - return; - - Player p = event.getPlayer(); Action a = event.getAction(); - if ((a == Action.RIGHT_CLICK_AIR) || (a == Action.RIGHT_CLICK_BLOCK)) - { + Player p = event.getPlayer(); + if (a == Action.RIGHT_CLICK_AIR || a == Action.RIGHT_CLICK_BLOCK) + { event.setUseItemInHand(Result.DENY); event.setCancelled(true); } @@ -1363,16 +1359,39 @@ public class Arena public void delayRestoreInventory(final Player p, final String method) { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, - new Runnable() + new Runnable() + { + public void run() { - public void run() - { - if (method.equals("restoreInventory")) - MAUtils.restoreInventory(p); - else if (method.equals("giveRewards")) - MAUtils.giveRewards(p, rewardMap.get(p), plugin); - } - }, 10); + if (method.equals("restoreInventory")) + MAUtils.restoreInventory(p); + else if (method.equals("giveRewards")) + MAUtils.giveRewards(p, rewardMap.get(p), plugin); + } + }, 10); + } + + public void addTrunkAndLeaves(Block b) + { + final int x = b.getX(); + final int y = b.getY(); + final int z = b.getZ(); + + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, + new Runnable() + { + public void run() + { + List result = new LinkedList(); + for (int i = x-2; i <= x+2; i++) + for (int j = y; j <= y+10; j++) + for (int k = z-2; k <= z+2; k++) + if (world.getBlockAt(i,j,k).getType() == Material.LOG || world.getBlockAt(i,j,k).getType() == Material.LEAVES) + result.add(world.getBlockAt(i,j,k)); + + if (running) blocks.addAll(result); + } + }, 10); } public boolean canAfford(Player p) diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index 9dd8225..1e70d8f 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -396,6 +396,40 @@ public class MACommands implements CommandExecutor return true; } + /* + * Kick player from whichever arena they are in. + */ + if (base.equals("kick")) + { + if (!console && !(player && plugin.has(p, "mobarena.admin.kick")) && !op) + { + MAUtils.tellPlayer(sender, MAMessages.get(Msg.MISC_NO_ACCESS)); + return true; + } + + if (arg1.isEmpty()) + { + MAUtils.tellPlayer(sender, "Usage: /ma kick "); + return true; + } + + Arena arena = am.getArenaWithPlayer(arg1); + if (arena == null) + { + MAUtils.tellPlayer(sender, "That player is not in an arena."); + return true; + } + else + { + Player pl = server.getPlayer(arg1); + am.arenaMap.remove(pl); + arena.playerLeave(pl); + MAUtils.tellPlayer(sender, "Player '" + arg1 + "' was kicked from arena '" + arena.configName() + "'."); + MAUtils.tellPlayer(pl, "You were kicked by " + ((player) ? p.getName() : "the server.")); + return true; + } + } + /* * Restore a player's inventory. */ diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index 41f96be..f7aa58d 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -180,6 +180,9 @@ public class MASpawnThread implements Runnable LivingEntity e = arena.world.spawnCreature(loc,mob); arena.monsters.add(e); + if (mob == CreatureType.WOLF) + ((Wolf)e).setOwner(null); + // Grab a random target. Creature c = (Creature) e; c.setTarget(getClosestPlayer(e)); @@ -253,7 +256,7 @@ public class MASpawnThread implements Runnable arena.monsters.add(e); if (slime) ((Slime)e).setSize(2); - if (wolf) ((Wolf)e).setAngry(true); + if (wolf) { ((Wolf)e).setAngry(true); ((Wolf)e).setOwner(null); } if (ghast) ((Ghast)e).setHealth(Math.min(noOfPlayers*25, 200)); if (creeper) ((Creeper)e).setPowered(true); @@ -358,7 +361,6 @@ public class MASpawnThread implements Runnable continue; } dist = p.getLocation().distanceSquared(e.getLocation()); - //double dist = MAUtils.distance(p.getLocation(), e.getLocation()); if (dist < current && dist < MobArena.MIN_PLAYER_DISTANCE) { current = dist; @@ -377,6 +379,9 @@ public class MASpawnThread implements Runnable LivingEntity target; for (Entity e : arena.monsters) { + if (!(e instanceof Creature)) + continue; + c = (Creature) e; target = c.getTarget(); diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 0b66ee3..020890b 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -173,7 +173,7 @@ public class MAUtils public static List makeItemStackList(String string) { List result = new LinkedList(); - if (string == null) return result; + if (string == null || string.isEmpty()) return result; // Trim commas and whitespace, and split items by commas string = string.trim();