From faaff515a19d753a8b90b1fff6a4cae5e716455b Mon Sep 17 00:00:00 2001 From: Garbage Mule Date: Sun, 5 Jun 2011 06:43:52 +0200 Subject: [PATCH] v0.89 - Cleaned up some code, fixed undo command, added stuff --- MobArena.jar | Bin 32614 -> 34483 bytes bin/plugin.yml | 2 +- .../garbagemule/MobArena/ArenaManager.java | 43 ++++++-- .../MobArena/MADamageListener.java | 62 +++++++++-- .../MobArena/MADisabledCommands.java | 33 ++++++ .../garbagemule/MobArena/MALobbyListener.java | 104 ++++++++++++++++++ .../garbagemule/MobArena/MASpawnThread.java | 68 ++++++++---- .../MobArena/MATeleportListener.java | 24 ++-- src/com/garbagemule/MobArena/MAUtils.java | 65 ++++++++--- src/com/garbagemule/MobArena/MobArena.java | 16 +-- 10 files changed, 340 insertions(+), 77 deletions(-) create mode 100644 src/com/garbagemule/MobArena/MADisabledCommands.java create mode 100644 src/com/garbagemule/MobArena/MALobbyListener.java diff --git a/MobArena.jar b/MobArena.jar index 02f7b7c710990bd8bdfc124aa9c8effb86a745f3..712f56a090536b60b8e7ff8a9157ef7b14f3e2de 100644 GIT binary patch delta 24514 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 Gp8g-C#UJJX delta 22691 zcmZ6yV|$>{wk+DQZQHhO+qR94-`KW0w#|-h+fK(x$4Q^H*SR0=*>irV@dK)Aj#1;8 z&2gZo-yjIea$w--KcN3}dpn1d5O~4<2V^V$3xDbU2U5sD*#C>VAc6ptm;OrHcY=l` zxj<*^32d8GT@$$+<9_@=Izl=Fjv3BW*fY6+j9HxJF#1GMxG<_{j134r^o+4|IwgwU zV9>mnwCK8dv-!_vne{{kV=f1-98tG#x3ifP$z+6>KJS-&-#LM=T;DpcuOq8`umf$-30D{NQ-2>9uTctL(iem(>EoAbRq7Nv_1XsLm->16A`@KNE@>aVrdO1a zqDou&yG5l@dZqQ$SCeRlChab*MVIaf_Y9NWr)$?uZlSfEhi_g$6}nZg66g7Dmh4~p zKKqi45?w9Mi%GzeLggrB(~lcHzaMk<*uKwx5-jk@anI{ zGGXnXoF_8f;;FvNOa!p{HLfG6+S^o7e%lo$m}A|7GN*u9Uwoe61?sV9XbMANq_L)g zSxaxzNIb_ngQ73%mHMhA-s)&>PDiy9UKMipJ~!|x2~c_ z=M-XQuXe+=j*Ip*X@wRQW|KQXtt)YAT$NPkmcqiV0_}UmauyS+A{MaIu*0q7Bx&kJ z(!?E5BWl3#j69jZ(n@UD5t{E<4>{T?P6Ca;V!k3?;$26+5wAGu6ggp*V46D%I*d+@ zFHOTzdUP=veVFg6PFji`U1k`<%C<#)9ofpp~s5!(mkDo881T~ z@+>KBVnit}hc6CpsO~ESM$5}R`O)5ShdlY~o-+leugGNgxuD>Er{t^A6uUu`2xw;- z9sx2ndUo^G(aqvUbe)KUJp-qoypZ}neoZS$p-Zm%dODtNgHhh@4_i1`Flz@ff*ZXY zg^H@1#(}A)2BDENJu!bG|0$;2XI$JB#<;ece#qCN?EB&)a5V-NU>fqWvQjN^LyFtrcCgba2 z<)-z43&dBPqkqd?=wPQonWV0lY9YSclJehN$Y97j z&v=4xi9USC*&*dKC^$xJN#3>!-LojQ&v@_=A|4nwDg zWAhz?2D)J9PBPOJ!F1M<)$}HBuXkI!ZP4>XUivl#l%MFvO}g)R#i$H8TCE~8VOt7A zZHsBczyXAz{Q<$}WO6<1$tR6r^WE*cH(ou<9Q=tf+Ys^YCA)@p2hmHidbSlaIuh$- zh~g#g$v4xzn@D5(o^3fYE`U#k8mks)F4eFlgRbZLYghTK6?N829Zj8!_g1j-QWNmZNWGr&)UAW;TXhQxj{Lqjp_)!x|eK$ z;L7qUS&^z1FV2JR-7p>03|1`a3~}-c^WAwpIpWwv4iQGoEj(F89w@g#c626#6KmkX zDU4KGT&xZkqZX8ne&BfP3M*eQJIIm!P%#OOBRcSGI%bK>0@PFH)QU{Xc~~+po;CRv zF_Ac>%<{wNz4dkY3xB_Z2tAbWQ)IHUr>s$k9Z({a5ni+&+q^-N39h5NW=rokJS~pk zk@^={+^^cznw( z={=CzA`+}I9^BYIVA(O7hg?f#@n(>|&E3cZM#_yXVZA6YJa$M%%f~hLl&rsz) zCNZg0PB_OY0E$N;hZz0OsP=$p_q-4D%tV<@U-s81wO>A5=oUpKMu=~;#$A8lQm2V_ z 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 spawnpoints = new ArrayList(); protected static int dZombies, dSkeletons, dSpiders, dCreepers, dWolves; + protected static int dPoweredCreepers, dPigZombies, dSlimes, dMonsters, + dAngryWolves, dGiants, dGhasts; // Set and Maps for storing players, their locations, items, armor, etc. protected static Set playerSet = new HashSet(); @@ -63,9 +66,10 @@ public class ArenaManager protected static Map everyWaveMap = new HashMap(); protected static Map afterWaveMap = new HashMap(); - // Entities and blocks on MobArena floor. + // Entities, blocks and items on MobArena floor. protected static Set monsterSet = new HashSet(); protected static Set blockSet = new HashSet(); + protected static Set dropSet = new HashSet(); @@ -104,6 +108,14 @@ public class ArenaManager dSpiders = MAUtils.getDistribution("spiders"); dCreepers = MAUtils.getDistribution("creepers"); dWolves = MAUtils.getDistribution("wolves"); + + dPigZombies = MAUtils.getDistribution("poweredcreepers", "special"); + dPigZombies = MAUtils.getDistribution("zombiepigmen", "special"); + dSlimes = MAUtils.getDistribution("slimes", "special"); + dMonsters = MAUtils.getDistribution("humans", "special"); + dAngryWolves = MAUtils.getDistribution("angrywolves", "special"); + dGiants = MAUtils.getDistribution("giants", "special"); + dGhasts = MAUtils.getDistribution("ghasts", "special"); } // Convenience variables. @@ -164,6 +176,7 @@ public class ArenaManager server.getScheduler().cancelTasks(plugin); killMonsters(); clearBlocks(); + clearDrops(); giveRewards(); // TO-DO: Fix this, maybe add a Set dead @@ -234,10 +247,10 @@ public class ArenaManager MAUtils.clearInventory(p); } - if (readySet.contains(p)) + //if (readySet.contains(p)) readySet.remove(p); - if (classMap.keySet().contains(p)) + //if (classMap.keySet().contains(p)) classMap.remove(p); // This must occur after playerSet.remove(p) to avoid teleport block. @@ -276,10 +289,10 @@ public class ArenaManager p.setHealth(20); tellAll(p.getName() + " died!"); - if (playerSet.contains(p)) + //if (playerSet.contains(p)) playerSet.remove(p); - if (classMap.keySet().contains(p)) + //if (classMap.keySet().contains(p)) classMap.remove(p); if (isRunning && playerSet.isEmpty()) @@ -357,10 +370,10 @@ public class ArenaManager public static void killMonsters() { // Remove all monsters, then clear the Set. - for (LivingEntity entity : monsterSet) + for (LivingEntity e : monsterSet) { - if (!entity.isDead()) - entity.remove(); + if (!e.isDead()) + e.remove(); } monsterSet.clear(); } @@ -378,6 +391,20 @@ public class ArenaManager blockSet.clear(); } + /** + * Removes all items on the arena floor. + */ + public static void clearDrops() + { + // Remove all blocks, then clear the Set. + for (Item i : dropSet) + { + i.remove(); + } + + dropSet.clear(); + } + /* ///////////////////////////////////////////////////////////////////// // diff --git a/src/com/garbagemule/MobArena/MADamageListener.java b/src/com/garbagemule/MobArena/MADamageListener.java index d7fbd53..daf1a43 100644 --- a/src/com/garbagemule/MobArena/MADamageListener.java +++ b/src/com/garbagemule/MobArena/MADamageListener.java @@ -1,9 +1,11 @@ package com.garbagemule.MobArena; import org.bukkit.entity.Player; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.EntityListener; -import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; /** * This listener acts as a type of death-listener. @@ -45,22 +47,58 @@ public class MADamageListener extends EntityListener } /** - * Clears all player drops on death. + * Clears all player/monster drops on death. */ public void onEntityDeath(EntityDeathEvent event) - { - if (!ArenaManager.isRunning) + { + // If player, call player death and such. + if (event.getEntity() instanceof Player) + { + Player p = (Player) event.getEntity(); + + if (!ArenaManager.playerSet.contains(p)) + return; + + event.getDrops().clear(); + ArenaManager.playerDeath(p); + } + // If monster, remove from monster set + else if (event.getEntity() instanceof LivingEntity) + { + LivingEntity e = (LivingEntity) event.getEntity(); + + if (!ArenaManager.monsterSet.contains(e)) + return; + + event.getDrops().clear(); + ArenaManager.monsterSet.remove(e); + } + } + + /** + * Prevents monsters from spawning inside the arena unless + * it's running, and adds mini-slimes to the monsterSet. + */ + public void onCreatureSpawn(CreatureSpawnEvent event) + { + if (!MAUtils.inRegion(event.getLocation())) + return; + + if (!(event.getEntity() instanceof LivingEntity)) return; - if (!(event.getEntity() instanceof Player)) - return; + System.out.println("This is the spawn command"); - Player p = (Player) event.getEntity(); + LivingEntity e = (LivingEntity) event.getEntity(); - if (!ArenaManager.playerSet.contains(p)) - return; - - event.getDrops().clear(); - ArenaManager.playerDeath(p); + if (ArenaManager.isRunning) + { + if (!ArenaManager.monsterSet.contains(e)) + ArenaManager.monsterSet.add(e); + } + else + { + event.setCancelled(true); + } } } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MADisabledCommands.java b/src/com/garbagemule/MobArena/MADisabledCommands.java new file mode 100644 index 0000000..461c6b0 --- /dev/null +++ b/src/com/garbagemule/MobArena/MADisabledCommands.java @@ -0,0 +1,33 @@ +package com.garbagemule.MobArena; + +import java.util.Arrays; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +/** + * Handles the disabled commands. + */ +public class MADisabledCommands extends PlayerListener +{ + private MobArena plugin; + + public MADisabledCommands(MobArena instance) + { + plugin = instance; + } + + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) + { + Player p = event.getPlayer(); + + if (!ArenaManager.playerSet.contains(p)) + return; + + if (!Arrays.asList(plugin.DISABLED_COMMANDS).contains(event.getMessage().substring(1))) + return; + + event.setCancelled(true); + ArenaManager.tellPlayer(p, "You can't use that command in the arena!"); + } +} \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MALobbyListener.java b/src/com/garbagemule/MobArena/MALobbyListener.java new file mode 100644 index 0000000..3b8e57c --- /dev/null +++ b/src/com/garbagemule/MobArena/MALobbyListener.java @@ -0,0 +1,104 @@ +package com.garbagemule.MobArena; + +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.Event.Result; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; + +/** + * This listener prevents players from sharing class-specific + * items (read: cheating) before the arena session starts. + */ +// TO-DO: Merge with MASignListener and MAReadyListener into MALobbyListener +public class MALobbyListener extends PlayerListener +{ + private MobArena plugin; + + public MALobbyListener(MobArena instance) + { + plugin = instance; + } + + /** + * Players can only drop items when the arena session has started. + */ + public void onPlayerDropItem(PlayerDropItemEvent event) + { + Player p = event.getPlayer(); + + if (!ArenaManager.playerSet.contains(p)) + return; + + if (ArenaManager.isRunning) + { + ArenaManager.dropSet.add(event.getItemDrop()); + return; + } + + ArenaManager.tellPlayer(p, "No sharing before the arena starts!"); + event.setCancelled(true); + } + + /** + * Checks if the player hits an iron block or a sign, or if the player + * is trying to use an item. + */ + public void onPlayerInteract(PlayerInteractEvent event) + { + // Only do these checks if the arena isn't running. + if (ArenaManager.isRunning) + return; + + Player p = event.getPlayer(); + + if (!ArenaManager.playerSet.contains(p)) + return; + + // Iron block + if (event.hasBlock() && event.getClickedBlock().getTypeId() == 42) + { + if (ArenaManager.classMap.containsKey(p)) + { + ArenaManager.tellPlayer(p, "You have been flagged as ready!"); + ArenaManager.playerReady(p); + } + else + { + ArenaManager.tellPlayer(p, "You must first pick a class!"); + } + return; + } + + // Sign + if (event.hasBlock() && event.getClickedBlock().getState() instanceof Sign) + { + // Cast the block to a sign to get the text on it. + Sign sign = (Sign) event.getClickedBlock().getState(); + + // Check if the first line of the sign is a class name. + String className = sign.getLine(0); + if (!ArenaManager.classes.contains(className)) + return; + + // Set the player's class. + ArenaManager.assignClass(p, className); + ArenaManager.tellPlayer(p, "You have chosen " + className + " as your class!"); + return; + } + + // Trying to use stuff + Action a = event.getAction(); + + // Check if player is trying to use an item. + if ((a == Action.RIGHT_CLICK_AIR) || (a == Action.RIGHT_CLICK_BLOCK)) + { + if (ArenaManager.playerSet.contains(p)) + event.setUseItemInHand(Result.DENY); + return; + } + } +} \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index b001256..0e7b8f2 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Random; import org.bukkit.Location; import org.bukkit.entity.Wolf; +import org.bukkit.entity.Ghast; import org.bukkit.entity.Slime; import org.bukkit.entity.Player; import org.bukkit.entity.Creature; @@ -27,8 +28,9 @@ import org.bukkit.inventory.PlayerInventory; // TO-DO: Allow additional "default" waves. public class MASpawnThread implements Runnable { - private int wave, noOfSpawnPoints, noOfPlayers; + private int wave, ran, noOfSpawnPoints, noOfPlayers; private int dZombies, dSkeletons, dSpiders, dCreepers, dWolves; + private int dPoweredCreepers, dPigZombies, dSlimes, dMonsters, dAngryWolves, dGiants, dGhasts; private Random random; private String reward, currentRewards; @@ -45,6 +47,14 @@ public class MASpawnThread implements Runnable dSpiders = dSkeletons + ArenaManager.dSpiders; dCreepers = dSpiders + ArenaManager.dCreepers; dWolves = dCreepers + ArenaManager.dWolves; + + dPoweredCreepers = ArenaManager.dPoweredCreepers; + dPigZombies = dPoweredCreepers + ArenaManager.dPigZombies; + dSlimes = dPigZombies + ArenaManager.dSlimes; + dMonsters = dSlimes + ArenaManager.dMonsters; + dAngryWolves = dMonsters + ArenaManager.dAngryWolves; + dGiants = dAngryWolves + ArenaManager.dGiants; + dGhasts = dGiants + ArenaManager.dGhasts; } public void run() @@ -100,7 +110,6 @@ public class MASpawnThread implements Runnable private void defaultWave() { Location loc; - int ran; for (int i = 0; i < wave + noOfPlayers; i++) { @@ -139,42 +148,59 @@ public class MASpawnThread implements Runnable { Location loc; CreatureType mob; + ran = random.nextInt(dGhasts); - int ran, count; + int count; boolean slime = false; boolean wolf = false; + boolean ghast = false; + + if (ran < dPoweredCreepers) mob = CreatureType.CREEPER; + else if (ran < dPigZombies) mob = CreatureType.PIG_ZOMBIE; + else if (ran < dSlimes) mob = CreatureType.SLIME; + else if (ran < dMonsters) mob = CreatureType.MONSTER; + else if (ran < dAngryWolves) mob = CreatureType.WOLF; + else if (ran < dGiants) mob = CreatureType.GIANT; + else if (ran < dGhasts) mob = CreatureType.GHAST; + else return; // 5 on purpose - Ghasts act weird in Overworld. - switch (random.nextInt(5)) + switch (mob) + //switch (random.nextInt(5)) { - case 0: - mob = CreatureType.CREEPER; + case CREEPER: + //mob = CreatureType.CREEPER; count = noOfPlayers * 3; break; - case 1: - mob = CreatureType.PIG_ZOMBIE; + case PIG_ZOMBIE: + //mob = CreatureType.PIG_ZOMBIE; count = noOfPlayers * 2; break; - case 2: - mob = CreatureType.SLIME; + case SLIME: + //mob = CreatureType.SLIME; count = noOfPlayers * 4; slime = true; break; - case 3: - mob = CreatureType.MONSTER; + case MONSTER: + //mob = CreatureType.MONSTER; count = noOfPlayers + 1; break; - case 4: - mob = CreatureType.WOLF; + case WOLF: + //mob = CreatureType.WOLF; count = noOfPlayers * 3; wolf = true; break; - case 5: - mob = CreatureType.GHAST; - count = Math.max(1, noOfPlayers - 2); + case GIANT: + //mob = CreatureType.GIANT; + count = 1; + break; + case GHAST: + //mob = CreatureType.GHAST; + count = 2; + ghast = true; break; default: - mob = CreatureType.CHICKEN; + //mob = CreatureType.CHICKEN; count = 50; break; } @@ -185,10 +211,14 @@ public class MASpawnThread implements Runnable loc = ArenaManager.spawnpoints.get(i % noOfSpawnPoints); LivingEntity e = ArenaManager.world.spawnCreature(loc,mob); - ArenaManager.monsterSet.add(e); + if (!ArenaManager.monsterSet.contains(e)) + ArenaManager.monsterSet.add(e); + else + System.out.println("MASpawnThread - monsterSet contains this entity"); if (slime) ((Slime)e).setSize(2); if (wolf) ((Wolf)e).setAngry(true); + if (ghast) ((Ghast)e).setHealth(Math.min(noOfPlayers*25, 200)); // Slimes can't have targets, apparently. if (!(e instanceof Creature)) diff --git a/src/com/garbagemule/MobArena/MATeleportListener.java b/src/com/garbagemule/MobArena/MATeleportListener.java index 52978ec..ee281b1 100644 --- a/src/com/garbagemule/MobArena/MATeleportListener.java +++ b/src/com/garbagemule/MobArena/MATeleportListener.java @@ -22,21 +22,19 @@ public class MATeleportListener extends PlayerListener public void onPlayerTeleport(PlayerTeleportEvent event) { Player p = event.getPlayer(); - if (ArenaManager.playerSet.contains(p)) + if (!ArenaManager.playerSet.contains(p)) + return; + + Location to = event.getTo(); + + if (ArenaManager.arenaLoc.equals(to) || + ArenaManager.lobbyLoc.equals(to) || + ArenaManager.spectatorLoc.equals(to)) { - Location to = event.getTo(); - - if (ArenaManager.arenaLoc.equals(to) || - ArenaManager.lobbyLoc.equals(to) || - ArenaManager.spectatorLoc.equals(to)) - { - return; - } - - ArenaManager.tellPlayer(p, "Can't warp in arena! To leave, type /marena leave"); - event.setCancelled(true); - return; } + + ArenaManager.tellPlayer(p, "Can't warp in arena! To leave, type /ma leave"); + event.setCancelled(true); } } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 6124099..7693b8e 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -22,13 +22,18 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.util.config.Configuration; public class MAUtils -{ - public static final int[] SWORDS_ID = {267,268,272,276,283}; - public static final Material[] SWORDS_TYPE = {Material.WOOD_SWORD, - Material.STONE_SWORD, - Material.GOLD_SWORD, - Material.IRON_SWORD, - Material.DIAMOND_SWORD}; +{ + public static final List SWORDS_ID = new LinkedList(); + public static final List SWORDS_TYPE = new LinkedList(); + static + { + SWORDS_TYPE.add(Material.WOOD_SWORD); + SWORDS_TYPE.add(Material.STONE_SWORD); + SWORDS_TYPE.add(Material.GOLD_SWORD); + SWORDS_TYPE.add(Material.IRON_SWORD); + SWORDS_TYPE.add(Material.DIAMOND_SWORD); + } + /* ///////////////////////////////////////////////////////////////////// // @@ -105,14 +110,16 @@ public class MAUtils { id = Integer.parseInt(item[0]); stack = new ItemStack(id, amount); - if (!reward && Arrays.asList(SWORDS_ID).contains(id)) + //if (!reward && Arrays.asList(SWORDS_ID).contains(id)) + if (!reward && SWORDS_ID.contains(id)) stack.setDurability((short)-3276); } else { stack = makeItemStack(item[0], amount); if (stack == null) continue; - if (!reward && Arrays.asList(SWORDS_TYPE).contains(stack.getType())) + //if (!reward && Arrays.asList(SWORDS_TYPE).contains(stack.getType())) + if (!reward && SWORDS_ID.contains(stack.getTypeId())) stack.setDurability((short)-3276); } @@ -240,6 +247,25 @@ public class MAUtils return new Configuration(configFile); } + public static String[] getDisabledCommands() + { + Configuration c = ArenaManager.config; + c.load(); + + String commands = c.getString("disabledcommands", "kill"); + c.setProperty("disabledcommands", commands); + c.save(); + + String[] result = commands.split(","); + for (int i = 0; i < result.length; i++) + { + result[i] = result[i].trim(); + System.out.println(result[i]); + } + + return result; + } + /** * Grabs the world from the config-file, or the "default" world * from the list of worlds in the server object. @@ -387,21 +413,29 @@ public class MAUtils * no coefficients are found, defaults (10) are added. */ public static int getDistribution(String monster) + { + return getDistribution(monster, "default"); + } + + public static int getDistribution(String monster, String type) { Configuration c = ArenaManager.config; c.load(); - if (c.getInt("waves.default." + monster, -1) == -1) + if (c.getInt("waves." + type + "." + monster, -1) == -1) { - c.setProperty("waves.default." + monster, 10); + int dist = 10; + if (monster.equals("giants") || monster.equals("ghasts") || monster.equals("slimes")) + dist = 0; + + c.setProperty("waves." + type + "." + monster, dist); c.save(); } - return c.getInt("waves.default." + monster, -1); + return c.getInt("waves." + type + "." + monster, 0); } - /* ///////////////////////////////////////////////////////////////////// // REGION AND SETUP METHODS @@ -619,7 +653,7 @@ public class MAUtils // Get the hippie bounds. int x1 = (int)loc.getX() - radius; int x2 = (int)loc.getX() + radius; - int y1 = (int)loc.getY() - 8; + int y1 = (int)loc.getY() - 9; int y2 = (int)loc.getY() - 1; int z1 = (int)loc.getZ() - radius; int z2 = (int)loc.getZ() + radius; @@ -778,8 +812,7 @@ public class MAUtils { FileInputStream fis = new FileInputStream("plugins/MobArena/precious.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); - Object o = ois.readObject(); - preciousPatch = (HashMap) ois.readObject(); + preciousPatch = (HashMap) ois.readObject(); ois.close(); } catch (Exception e) diff --git a/src/com/garbagemule/MobArena/MobArena.java b/src/com/garbagemule/MobArena/MobArena.java index 8a288d7..7daa208 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -23,6 +23,7 @@ public class MobArena extends JavaPlugin "ready", "notready", "enabled", "force", "config", "setwarp", "addspawn", "delspawn", "setregion", "expandregion", "protect", "undo", "dooooo", "reset"}; + public String[] DISABLED_COMMANDS; public MobArena() { @@ -31,10 +32,10 @@ public class MobArena extends JavaPlugin public void onEnable() { PluginDescriptionFile pdfFile = this.getDescription(); - System.out.println(pdfFile.getName() + " v" + pdfFile.getVersion() + " enabled." ); // Initialize convenience variables in ArenaManager. ArenaManager.init(this); + DISABLED_COMMANDS = MAUtils.getDisabledCommands(); // Bind the /ma and /marena commands to MACommands. getCommand("ma").setExecutor(new MACommands()); @@ -43,9 +44,8 @@ public class MobArena extends JavaPlugin // Create event listeners. PluginManager pm = getServer().getPluginManager(); - PlayerListener signListener = new MASignListener(this); - PlayerListener dropListener = new MADropListener(this); - PlayerListener readyListener = new MAReadyListener(this); + PlayerListener commandListener = new MADisabledCommands(this); + PlayerListener lobbyListener = new MALobbyListener(this); PlayerListener teleportListener = new MATeleportListener(this); PlayerListener discListener = new MADisconnectListener(this); BlockListener blockListener = new MABlockListener(this); @@ -54,9 +54,9 @@ public class MobArena extends JavaPlugin // TO-DO: PlayerListener to check for kills/deaths. // Register events. - pm.registerEvent(Event.Type.PLAYER_INTERACT, signListener, Priority.Normal, this); - pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, dropListener, Priority.Normal, this); - pm.registerEvent(Event.Type.PLAYER_INTERACT, readyListener, Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, commandListener, Priority.Monitor, this); + pm.registerEvent(Event.Type.PLAYER_INTERACT, lobbyListener, Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_DROP_ITEM, lobbyListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_TELEPORT, teleportListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_QUIT, discListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_KICK, discListener, Priority.Normal, this); @@ -69,7 +69,7 @@ public class MobArena extends JavaPlugin pm.registerEvent(Event.Type.ENTITY_COMBUST, monsterListener, Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_TARGET, monsterListener, Priority.Normal, this); - System.out.println(pdfFile.getName() + " v" + pdfFile.getVersion() + " initialized." ); + System.out.println(pdfFile.getName() + " v" + pdfFile.getVersion() + " enabled." ); } public void onDisable()