From aee63b2463122ae6db934f933ce0d640641f946c Mon Sep 17 00:00:00 2001 From: Garbage Mule Date: Sun, 12 Jun 2011 05:52:36 +0200 Subject: [PATCH] v0.90 - A bunch of bug-fixes, revamped config-file --- MobArena.jar | Bin 36452 -> 41879 bytes bin/plugin.yml | 2 +- .../garbagemule/MobArena/ArenaManager.java | 161 +++++++++++++----- .../garbagemule/MobArena/EntityPosition.java | 1 + .../garbagemule/MobArena/MABlockListener.java | 49 ++++-- src/com/garbagemule/MobArena/MACommands.java | 30 ++-- .../MobArena/MADamageListener.java | 20 +-- .../MobArena/MADisabledCommands.java | 1 - .../MobArena/MADisconnectListener.java | 6 - .../garbagemule/MobArena/MALobbyListener.java | 56 +++--- .../MobArena/MAMonsterListener.java | 75 +++++--- .../garbagemule/MobArena/MASpawnThread.java | 29 +--- .../MobArena/MATeleportListener.java | 36 ++-- src/com/garbagemule/MobArena/MAUtils.java | 124 +++++--------- src/com/garbagemule/MobArena/MobArena.java | 11 +- 15 files changed, 337 insertions(+), 264 deletions(-) diff --git a/MobArena.jar b/MobArena.jar index f135763ec1f1e39222b574571449768f998956a7..87b47203884b046959e880966cba1b8731692bab 100644 GIT binary patch literal 41879 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

d;yamB8JZ<;ZI}@hbmAG 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 CWu^}R literal 36452 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

    aKY_W;EPgh&RBW%Uft){Iy!=9!23% zae~8*il95$|4m@T@YQ`R!7-<3&NB$hd-QE}o2nh#Lu_d{Qv*g1AjEOH%qi=0*9ClF zP_1g3(Q(fKCdkW3pG$l;m0cmcQ{6H6#)g{dPF{IPBlo4Eo#-p;rD7zQMYMtp56B z`)QZaJy{-ZAQyJvmMz@cP=fK>=Y9(8LtTkQ?(53XvpHsqjej>!Ii`Kko zLYzeY&p~x?*%GC6A&%U?(Pp!F=}}o{szEioU;n6;f6p|$Hds57f`Kvq`cD)K)qkW| z{^v#U|3z{|sl&RX4`Y4~uWT)PBAWI7Nl@As_OAt}h>cxB`I(GGA8SoAib7#Cx~4UN zXQ{4Pg2?RMLxa>kEHDN19hRwo++&;WS4X^Cw^UCQS_e*w zJ-QwPh=bJj@Z+yd|Jk)CxLs@wQ8SEtK_Fs>PeP!;))uWHx}9CZ&fdiZ8sp(b28Hz? z1JQTck$PIV43g?T$lCjXlE=ph~|3^5IV#T8zctZTE2D zE=6l<>TA`DH#TH5m^kZG2zP}F8kp8M0QGvBO}z29^IYoiQsS~StrjRuy|K5^uYGU@ zdjb%A5R2)ql*(BdkiQ@i_z{Bxt7c~;4drJ;M@VT`S`X4wFInlI*2CCq?S-8REu( zP;t9=7wmZWhIZWue5ZGj2|h=5L_;hML9yNwz#Zh}`YVzEvD=7xEG^ve$Y2w7v$}^l471AIvp2X_*C?eQqE51!_a3(cItvMUXB32^ULaxH zq=V@J6|+@qiday_{j>dffp}#=s)ZUn!ss|x?bf3niPGS8Vz~3aj&G%oC|oE+Nauol zD9Rt?3DP<<#5Y%}=7H=#e(JRICc;p}vnjRqReTQoSPW&Y&_hK;hF%0h7xnf?@F`~f z*p0bRMSqYFlZ4YrCW2S<18r&YdIcX8xTncwb|cp{1e|?M$BU#1(FhirhH2^XoIb?V zsWGI?zZhc1#9jq`;lFy7;YRkcbS@j ziup)dRh`uVSnOuN+we9#wX#KaG4Aq%kbCs#H~Nlvq_Pv%2R|Gl!jiMhhIOg45b3L? z#Rpt{FWAQuqMv$A%d(IxuMFu)(}`jO3l^NPwL&3mPx+yi z)@wm}>=f8E5uj1CBA#q(MJ>>%S`kM!1_nts1}01PxrHiUpg$>UxD3XWwy@d0r8EbcMLG(iy7263Y-K{a8 zCZ{`hwaOhN%_VE7eTA#D1OdukUE~WgpRDJUI9Fbti4#QndcPst5+lH~w<4_BhH0teZ)HzYJ;=H7XWX8xY5wUDX>5L6 zaX>C}kdaTKfG8+uD*&<*6MQM`hcsPYB=CzZpe;BOK)z0zW-u5IOQ< zjp~c!Di-$@*PE9ee<(O1&hwP}T}8G!pS4a`WGguAZ{2n6vuTp7{2p)ltV^GwaWOjuexT@_pOIyTwwDw?3Td0mDBZ>)-4Dk5Eji(S!RGaR6|HCC zD^4{CrtGXyzg>5$VAn~5Iq#2tlzEs^-&iPRIN=i~D7<*Z|MC3*hDH#0B{CzE2m|WT z?7&6JV8F=$RDc3}T|*poJ^kGD|D6H_HLBKp%So*6K;%?--d21^7-7LTLTcF z3up@-Cu6%q0NrrplZrt*QV_rj7(Dn4$9mv5y79;-+=7lfMu1+RZTOAHariO1703r| zf{w~XfGt2SNmgJ_jmYP;p(dFL=6Ef@a(XAaA1;gb?o2Wo1V<5mBPh!o+?rP)>DX2-l zI~=dc*tcY%I~;kW0JN(G0cJ+wH6Ce?3%Z%eH9csI0RiG`@tKJ-;(%-@sF8qN9YX3N bn6aN*k(&$w-mGjO88IN#W@lhfZU^xIc+@Vw diff --git a/bin/plugin.yml b/bin/plugin.yml index 6e9a539..67c25a8 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.89.2 +version: 0.90 commands: ma: description: Base command for MobArena diff --git a/src/com/garbagemule/MobArena/ArenaManager.java b/src/com/garbagemule/MobArena/ArenaManager.java index 2d9481b..4ee1c11 100644 --- a/src/com/garbagemule/MobArena/ArenaManager.java +++ b/src/com/garbagemule/MobArena/ArenaManager.java @@ -3,19 +3,23 @@ package com.garbagemule.MobArena; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.bukkit.ChatColor; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Slime; import org.bukkit.util.config.Configuration; public class ArenaManager @@ -31,7 +35,9 @@ public class ArenaManager protected static boolean isSetup = false; protected static boolean isEnabled = true; protected static boolean isProtected = true; - protected static boolean checkUpdates = true; + protected static int spawnTaskId = -1; + protected static int waveDelay, waveInterval, specialModulo, repairDelay; + protected static boolean checkUpdates, lightning; // Location variables for the arena region. protected static Location p1 = null; @@ -46,13 +52,13 @@ public class ArenaManager protected static int dPoweredCreepers, dPigZombies, dSlimes, dMonsters, dAngryWolves, dGiants, dGhasts; - // Set and Maps for storing players, their locations, items, armor, etc. + // Sets and Maps for storing players, their locations, and their rewards. protected static Set playerSet = new HashSet(); protected static Set readySet = new HashSet(); protected static Map rewardMap = new HashMap(); protected static Map locationMap = new HashMap(); - // Maps for storing class items and armor. + // Maps for storing player classes, class items and armor. protected static List classes = new ArrayList(); protected static Map classMap = new HashMap(); protected static Map classItemMap = new HashMap(); @@ -65,7 +71,6 @@ public class ArenaManager // 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(); @@ -84,10 +89,12 @@ public class ArenaManager if (instance != null) { // General variables. - config = MAUtils.getConfig(); - plugin = instance; - server = plugin.getServer(); - world = MAUtils.getWorld(); + config = MAUtils.getConfig(); + plugin = instance; + server = plugin.getServer(); + world = MAUtils.getWorld(); + lightning = MAUtils.getBoolean("settings.lightning", true); + repairDelay = MAUtils.getInt("settings.repairdelay", 5); // Class list and maps. classes = MAUtils.getClasses(); @@ -95,6 +102,9 @@ public class ArenaManager classArmorMap = MAUtils.getClassItems("armor"); // Waves and rewards. + waveDelay = MAUtils.getInt("settings.firstwavedelay", 5) * 20; + waveInterval = MAUtils.getInt("settings.waveinterval", 20) * 20; + specialModulo = MAUtils.getInt("settings.specialmodulo", 4); everyWaveMap = MAUtils.getWaveMap("every"); afterWaveMap = MAUtils.getWaveMap("after"); @@ -121,7 +131,7 @@ public class ArenaManager p1 = MAUtils.getCoords("p1"); p2 = MAUtils.getCoords("p2"); spawnpoints = MAUtils.getSpawnPoints(); - checkUpdates = MAUtils.getUpdateNotification(); + checkUpdates = MAUtils.getBoolean("settings.updatenotification", true); // Set the boolean if all variables are valid. ArenaManager.isSetup = MAUtils.verifyData(); @@ -149,6 +159,7 @@ public class ArenaManager public static void startArena() { isRunning = true; + readySet.clear(); for (Player p : playerSet) { @@ -157,7 +168,7 @@ public class ArenaManager } MASpawnThread thread = new MASpawnThread(); - server.getScheduler().scheduleSyncRepeatingTask(plugin,thread,100,400); + spawnTaskId = server.getScheduler().scheduleSyncRepeatingTask(plugin,thread,(long)waveDelay,(long)waveInterval); tellAll("Let the slaughter begin!"); } @@ -168,12 +179,13 @@ public class ArenaManager * and stops the spawning of monsters. */ public static void endArena() - { + { isRunning = false; - server.getScheduler().cancelTasks(plugin); + server.getScheduler().cancelTask(spawnTaskId); + killMonsters(); clearBlocks(); - clearDrops(); + clearEntities(); giveRewards(); // TO-DO: Fix this, maybe add a Set dead @@ -204,7 +216,7 @@ public class ArenaManager } if (isRunning) { - tellPlayer(p, "Arena in progress. Type /marena spectate to watch."); + tellPlayer(p, "Arena in progress. Type /ma spec to watch."); return; } if (!MAUtils.hasEmptyInventory(p)) @@ -231,30 +243,27 @@ public class ArenaManager * is removed from all the sets and maps. */ public static void playerLeave(Player p) - { + { if (!locationMap.containsKey(p)) { tellPlayer(p, "You are not in the arena."); return; } - if (playerSet.contains(p)) - { - playerSet.remove(p); + // This must occur before playerSet.remove(p) to avoid teleport block. + p.teleport(locationMap.get(p)); + locationMap.remove(p); + readySet.remove(p); + classMap.remove(p); + + if (playerSet.remove(p)) MAUtils.clearInventory(p); - } - - //if (readySet.contains(p)) - readySet.remove(p); - - //if (classMap.keySet().contains(p)) - classMap.remove(p); - - // This must occur after playerSet.remove(p) to avoid teleport block. - p.teleport(locationMap.remove(p)); if (isRunning && playerSet.isEmpty()) endArena(); + + if (!readySet.isEmpty() && readySet.equals(playerSet)) + startArena(); tellPlayer(p, "You left the arena. Thanks for playing!"); } @@ -267,10 +276,7 @@ public class ArenaManager readySet.add(p); if (readySet.equals(playerSet)) - { - readySet.clear(); startArena(); - } } /** @@ -360,6 +366,57 @@ public class ArenaManager tellPlayer(p, "Not ready: " + list.substring(0, list.length() - 2)); } + /** + * Forcefully starts the arena, causing all players in the + * playerSet who aren't ready to leave, and starting the + * arena for everyone else. + */ + public static void forceStart(Player p) + { + if (ArenaManager.isRunning) + { + ArenaManager.tellPlayer(p, "Arena has already started."); + return; + } + if (ArenaManager.readySet.isEmpty()) + { + ArenaManager.tellPlayer(p, "Can't force start, no players are ready."); + return; + } + + Iterator iterator = ArenaManager.playerSet.iterator(); + while (iterator.hasNext()) + { + Player player = iterator.next(); + if (!ArenaManager.readySet.contains(player)) + ArenaManager.playerLeave(player); + } + + ArenaManager.tellPlayer(p, "Forced arena start."); + } + + /** + * Forcefully ends the arena, causing all players to leave and + * all relevant sets and maps to be cleared. + */ + public static void forceEnd(Player p) + { + if (ArenaManager.playerSet.isEmpty()) + { + ArenaManager.tellPlayer(p, "No one is in the arena."); + return; + } + + Iterator iterator = ArenaManager.playerSet.iterator(); + while (iterator.hasNext()) + ArenaManager.playerLeave(iterator.next()); + + // Just for good measure. + endArena(); + + ArenaManager.tellPlayer(p, "Forced arena end."); + } + /* ///////////////////////////////////////////////////////////////////// // @@ -372,7 +429,7 @@ public class ArenaManager * Kills all monsters currently on the arena floor. */ public static void killMonsters() - { + { // Remove all monsters, then clear the Set. for (LivingEntity e : monsterSet) { @@ -389,24 +446,28 @@ public class ArenaManager { // Remove all blocks, then clear the Set. for (Block b : blockSet) - { b.setType(Material.AIR); - } + blockSet.clear(); } /** - * Removes all items on the arena floor. + * Removes all items and slimes in the arena region. */ - public static void clearDrops() + public static void clearEntities() { - // Remove all blocks, then clear the Set. - for (Item i : dropSet) - { - i.remove(); - } + Chunk c1 = world.getChunkAt(p1); + Chunk c2 = world.getChunkAt(p2); - dropSet.clear(); + /* Yes, ugly nesting, but it's necessary. This bit + * removes all the entities in the arena region without + * bloatfully iterating through all entities in the + * world. Much faster on large servers especially. */ + for (int i = c1.getX(); i <= c2.getX(); i++) + for (int j = c1.getZ(); j <= c2.getZ(); j++) + for (Entity e : world.getChunkAt(i,j).getEntities()) + if ((e instanceof Item) || (e instanceof Slime)) + e.remove(); } @@ -468,6 +529,9 @@ public class ArenaManager */ public static void tellPlayer(Player p, String msg) { + if (p == null) + return; + p.sendMessage(ChatColor.GREEN + "[MobArena] " + ChatColor.WHITE + msg); } @@ -476,9 +540,14 @@ public class ArenaManager */ public static void tellAll(String msg) { - for (Player p : playerSet) - { - tellPlayer(p, msg); - } + Chunk c1 = world.getChunkAt(p1); + Chunk c2 = world.getChunkAt(p2); + + for (int i = c1.getX(); i <= c2.getX(); i++) + for (int j = c1.getZ(); j <= c2.getZ(); j++) + for (Entity p : world.getChunkAt(i,j).getEntities()) + if (p instanceof Player) + tellPlayer((Player)p, msg); + } } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/EntityPosition.java b/src/com/garbagemule/MobArena/EntityPosition.java index d2fdd63..5ee96bb 100644 --- a/src/com/garbagemule/MobArena/EntityPosition.java +++ b/src/com/garbagemule/MobArena/EntityPosition.java @@ -8,6 +8,7 @@ import org.bukkit.World; * NOTE: I (garbagemule) DID NOT WRITE THIS CLASS (notice the author below) * @author creadri */ +@SuppressWarnings("serial") public class EntityPosition implements Serializable{ private double x; private double y; diff --git a/src/com/garbagemule/MobArena/MABlockListener.java b/src/com/garbagemule/MobArena/MABlockListener.java index 98dda83..bf2cf46 100644 --- a/src/com/garbagemule/MobArena/MABlockListener.java +++ b/src/com/garbagemule/MobArena/MABlockListener.java @@ -5,7 +5,7 @@ import org.bukkit.block.Block; import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.BlockDamageEvent; +//import org.bukkit.event.block.BlockDamageEvent; /** * This listener serves as a protection class. Blocks within @@ -15,14 +15,12 @@ import org.bukkit.event.block.BlockDamageEvent; * ArenaManager when the session ends. */ public class MABlockListener extends BlockListener -{ - private MobArena plugin; - +{ public MABlockListener(MobArena instance) { - plugin = instance; } + /* Removed for testing purposes. public void onBlockDamage(BlockDamageEvent event) { if (!ArenaManager.isSetup || !ArenaManager.isProtected) @@ -33,24 +31,37 @@ public class MABlockListener extends BlockListener if (ArenaManager.blockSet.contains(b)) return; + System.out.println("This is block damage."); + if (MAUtils.inRegion(b.getLocation())) event.setCancelled(true); } - + */ + + /** + * Prevents blocks from breaking if block protection is on. + */ public void onBlockBreak(BlockBreakEvent event) - { + { if (!ArenaManager.isSetup || !ArenaManager.isProtected) return; Block b = event.getBlock(); - if (ArenaManager.blockSet.contains(b)) + if (ArenaManager.blockSet.remove(b) || b.getType() == Material.TNT) return; + System.out.println("This is block break."); + if (MAUtils.inRegion(b.getLocation())) event.setCancelled(true); } + /** + * Adds player-placed blocks to a set for removal and item + * drop purposes. If the block is placed within the arena + * region, cancel the event if protection is on. + */ public void onBlockPlace(BlockPlaceEvent event) { if (!ArenaManager.isSetup || !ArenaManager.isProtected) @@ -58,15 +69,21 @@ public class MABlockListener extends BlockListener Block b = event.getBlock(); - if (MAUtils.inRegion(b.getLocation())) + if (!MAUtils.inRegion(b.getLocation())) + return; + + if (ArenaManager.isRunning && ArenaManager.playerSet.contains(event.getPlayer())) { - if (ArenaManager.isRunning && ArenaManager.playerSet.contains(event.getPlayer())) - { - ArenaManager.blockSet.add(b); - return; - } - - event.setCancelled(true); + ArenaManager.blockSet.add(b); + Material type = b.getType(); + + // Make sure to add the top parts of doors. + if (type == Material.WOODEN_DOOR || type == Material.IRON_DOOR_BLOCK) + ArenaManager.blockSet.add(b.getRelative(0,1,0)); + + return; } + + event.setCancelled(true); } } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index c5fe46b..0665e35 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -1,16 +1,11 @@ package com.garbagemule.MobArena; import java.util.Arrays; -import java.util.Iterator; -import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.CommandExecutor; -import org.bukkit.entity.Creature; -import org.bukkit.entity.CreatureType; -import org.bukkit.entity.LivingEntity; public class MACommands implements CommandExecutor { @@ -131,20 +126,24 @@ public class MACommands implements CommandExecutor return true; } - // ma force end + // ma force [start|end] if (cmd.equals("force")) { - if (!arg.equals("end")) + // Start arena. + if (arg.equals("start")) { - ArenaManager.tellPlayer(p, "/ma force end"); + ArenaManager.forceStart(p); + return true; + } + + // End the arena. + if (arg.equals("end")) + { + ArenaManager.forceEnd(p); return true; } - // End the arena. - Iterator iterator = ArenaManager.playerSet.iterator(); - while (iterator.hasNext()) - ArenaManager.playerLeave(iterator.next()); - ArenaManager.tellPlayer(p, "Forced arena end."); + ArenaManager.tellPlayer(p, "/ma force [start|end]"); return true; } @@ -275,7 +274,7 @@ public class MACommands implements CommandExecutor return true; } - // ma protect true/false + // ma protect [true|false] if (cmd.equals("protect")) { if (!arg.equals("true") && !arg.equals("false")) @@ -301,7 +300,8 @@ public class MACommands implements CommandExecutor return true; } } - + + // ma undo it hippie monster if (cmd.equals("undo")) { if (args.length != 4) diff --git a/src/com/garbagemule/MobArena/MADamageListener.java b/src/com/garbagemule/MobArena/MADamageListener.java index c6734b0..910977e 100644 --- a/src/com/garbagemule/MobArena/MADamageListener.java +++ b/src/com/garbagemule/MobArena/MADamageListener.java @@ -17,12 +17,9 @@ import org.bukkit.event.entity.CreatureSpawnEvent; */ // TO-DO: Perhaps implement TeamFluff's respawn-packet-code. public class MADamageListener extends EntityListener -{ - private MobArena plugin; - +{ public MADamageListener(MobArena instance) { - plugin = instance; } public void onEntityDamage(EntityDamageEvent event) @@ -76,7 +73,7 @@ public class MADamageListener extends EntityListener /** * Prevents monsters from spawning inside the arena unless - * it's running, and adds mini-slimes to the monsterSet. + * it's running. */ public void onCreatureSpawn(CreatureSpawnEvent event) { @@ -86,18 +83,7 @@ public class MADamageListener extends EntityListener if (!(event.getEntity() instanceof LivingEntity)) return; - System.out.println("This is the spawn command"); - - LivingEntity e = (LivingEntity) event.getEntity(); - - if (ArenaManager.isRunning) - { - if (!ArenaManager.monsterSet.contains(e)) - ArenaManager.monsterSet.add(e); - } - else - { + if (!ArenaManager.isRunning) 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 index cd29808..55dacc2 100644 --- a/src/com/garbagemule/MobArena/MADisabledCommands.java +++ b/src/com/garbagemule/MobArena/MADisabledCommands.java @@ -1,6 +1,5 @@ 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; diff --git a/src/com/garbagemule/MobArena/MADisconnectListener.java b/src/com/garbagemule/MobArena/MADisconnectListener.java index c44a98b..56e3059 100644 --- a/src/com/garbagemule/MobArena/MADisconnectListener.java +++ b/src/com/garbagemule/MobArena/MADisconnectListener.java @@ -1,10 +1,7 @@ package com.garbagemule.MobArena; -import java.util.List; -import java.util.Arrays; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -16,11 +13,8 @@ import org.bukkit.event.player.PlayerJoinEvent; */ public class MADisconnectListener extends PlayerListener { - private MobArena plugin; - public MADisconnectListener(MobArena instance) { - plugin = instance; } public void onPlayerQuit(PlayerQuitEvent event) diff --git a/src/com/garbagemule/MobArena/MALobbyListener.java b/src/com/garbagemule/MobArena/MALobbyListener.java index 3b8e57c..e0bf885 100644 --- a/src/com/garbagemule/MobArena/MALobbyListener.java +++ b/src/com/garbagemule/MobArena/MALobbyListener.java @@ -1,13 +1,14 @@ package com.garbagemule.MobArena; +import org.bukkit.block.Block; 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.PlayerBucketEmptyEvent; 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 @@ -15,12 +16,9 @@ import org.bukkit.event.player.PlayerPickupItemEvent; */ // TO-DO: Merge with MASignListener and MAReadyListener into MALobbyListener public class MALobbyListener extends PlayerListener -{ - private MobArena plugin; - +{ public MALobbyListener(MobArena instance) { - plugin = instance; } /** @@ -34,15 +32,31 @@ public class MALobbyListener extends PlayerListener return; if (ArenaManager.isRunning) - { - ArenaManager.dropSet.add(event.getItemDrop()); return; - } ArenaManager.tellPlayer(p, "No sharing before the arena starts!"); event.setCancelled(true); } + /** + * Adds liquid blocks to the blockset when players empty their buckets. + */ + public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) + { + if (!ArenaManager.playerSet.contains(event.getPlayer())) + return; + + if (!ArenaManager.isRunning) + { + event.getBlockClicked().getFace(event.getBlockFace()).setTypeId(0); + event.setCancelled(true); + return; + } + + Block liquid = event.getBlockClicked().getFace(event.getBlockFace()); + ArenaManager.blockSet.add(liquid); + } + /** * Checks if the player hits an iron block or a sign, or if the player * is trying to use an item. @@ -57,6 +71,15 @@ public class MALobbyListener extends PlayerListener if (!ArenaManager.playerSet.contains(p)) return; + + Action a = event.getAction(); + + // Check if player is trying to use an item. + if ((a == Action.RIGHT_CLICK_AIR) || (a == Action.RIGHT_CLICK_BLOCK)) + { + event.setUseItemInHand(Result.DENY); + event.setCancelled(true); + } // Iron block if (event.hasBlock() && event.getClickedBlock().getTypeId() == 42) @@ -76,6 +99,12 @@ public class MALobbyListener extends PlayerListener // Sign if (event.hasBlock() && event.getClickedBlock().getState() instanceof Sign) { + if (a == Action.RIGHT_CLICK_BLOCK) + { + ArenaManager.tellPlayer(p, "Punch the sign. Don't right-click."); + return; + } + // Cast the block to a sign to get the text on it. Sign sign = (Sign) event.getClickedBlock().getState(); @@ -89,16 +118,5 @@ public class MALobbyListener extends PlayerListener 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/MAMonsterListener.java b/src/com/garbagemule/MobArena/MAMonsterListener.java index 9869501..b6f25a0 100644 --- a/src/com/garbagemule/MobArena/MAMonsterListener.java +++ b/src/com/garbagemule/MobArena/MAMonsterListener.java @@ -3,6 +3,7 @@ package com.garbagemule.MobArena; import java.util.HashMap; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; import org.bukkit.event.entity.EntityListener; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityCombustEvent; @@ -23,39 +24,65 @@ public class MAMonsterListener extends EntityListener plugin = instance; } - // Creeper explosions + /** + * Handles all explosion events, also from TNT. + */ public void onEntityExplode(EntityExplodeEvent event) { /* This could be done by simply cancelling the event, but that * also cancels the explosion animation. This is a workaround. */ - if (MAUtils.inRegion(event.getLocation())) + if (!MAUtils.inRegion(event.getLocation())) + return; + + // Don't drop any blocks from the explosion. + event.setYield(0); + + // Store the blocks and their values in the map. + final HashMap blockMap = new HashMap(); + + for (Block b : event.blockList()) { - // Don't drop any blocks. - event.setYield(0); - - // Store the blocks and their values. - final HashMap blockMap = new HashMap(); - for (Block b : event.blockList()) + // Doors are wonky, so don't store them. Just smile and wave, and remove from set. + if (b.getType() == Material.WOODEN_DOOR || b.getType() == Material.IRON_DOOR_BLOCK || b.getType() == Material.CAKE_BLOCK) { - if (b.getType() == Material.CAKE_BLOCK) - blockMap.put(b, 0); - else - blockMap.put(b, b.getTypeId()); + ArenaManager.blockSet.remove(b); + continue; } - // Wait a couple of ticks, then rebuild the blocks. - ArenaManager.server.getScheduler().scheduleSyncDelayedTask(plugin, - new Runnable() - { - public void run() - { - for (Block b : blockMap.keySet()) - { - b.getLocation().getBlock().setTypeId(blockMap.get(b)); - } - } - }, 5); + // If a block is in the blockSet, make sure it drops "naturally" so Oddjob doesn't cry. + if (ArenaManager.blockSet.remove(b)) + { + ArenaManager.world.dropItemNaturally(b.getLocation(), new ItemStack(b.getTypeId(), 1)); + continue; + } + + // If a block has extra data, store it as a fourth digit (thousand). + int type = b.getTypeId() + (b.getData() * 1000); + blockMap.put(b, type); } + + // Wait a couple of ticks, then rebuild the blocks. + ArenaManager.server.getScheduler().scheduleSyncDelayedTask(plugin, + new Runnable() + { + public void run() + { + for (Block b : blockMap.keySet()) + { + int type = blockMap.get(b); + + // Modulo 1000 to get the actual type id. + b.getLocation().getBlock().setTypeId(type % 1000); + + /* If the type ID is greater than 1000, it means the block + * has extra data (stairs, levers, etc.). We subtract the + * block type data by dividing by 1000. Integer division + * always rounds by truncation. */ + if (type > 1000) + b.getLocation().getBlock().setData((byte) (type / 1000)); + } + } + }, ArenaManager.repairDelay); } // Zombie/skeleton combustion from the sun. diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index 0e7b8f2..b026c54 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -1,7 +1,5 @@ package com.garbagemule.MobArena; -import java.util.List; -import java.util.ArrayList; import java.util.Random; import org.bukkit.Location; import org.bukkit.entity.Wolf; @@ -12,8 +10,6 @@ import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.CreatureType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; /** * Core class for handling wave spawning. @@ -28,7 +24,7 @@ import org.bukkit.inventory.PlayerInventory; // TO-DO: Allow additional "default" waves. public class MASpawnThread implements Runnable { - private int wave, ran, noOfSpawnPoints, noOfPlayers; + private int wave, ran, noOfSpawnPoints, noOfPlayers, modulo; private int dZombies, dSkeletons, dSpiders, dCreepers, dWolves; private int dPoweredCreepers, dPigZombies, dSlimes, dMonsters, dAngryWolves, dGiants, dGhasts; private Random random; @@ -36,6 +32,9 @@ public class MASpawnThread implements Runnable public MASpawnThread() { + modulo = ArenaManager.specialModulo; + if (modulo <= 0) modulo = -32768; + noOfPlayers = ArenaManager.playerSet.size(); noOfSpawnPoints = ArenaManager.spawnpoints.size(); wave = 1; @@ -89,8 +88,7 @@ public class MASpawnThread implements Runnable } // Check if this is a special wave. - // TO-DO: Get this value from the config-file. - if (wave % 4 == 0) + if (wave % modulo == 0) { ArenaManager.tellAll("Get ready for wave #" + wave + "! [SPECIAL]"); specialWave(); @@ -132,9 +130,6 @@ public class MASpawnThread implements Runnable LivingEntity e = ArenaManager.world.spawnCreature(loc,mob); ArenaManager.monsterSet.add(e); - //if (mob == CreatureType.WOLF) - // ((Wolf)e).setAngry(true); - // Grab a random target. Creature c = (Creature) e; c.setTarget(getClosestPlayer(e)); @@ -165,42 +160,33 @@ public class MASpawnThread implements Runnable else return; // 5 on purpose - Ghasts act weird in Overworld. - switch (mob) - //switch (random.nextInt(5)) + switch(mob) { case CREEPER: - //mob = CreatureType.CREEPER; count = noOfPlayers * 3; break; case PIG_ZOMBIE: - //mob = CreatureType.PIG_ZOMBIE; count = noOfPlayers * 2; break; case SLIME: - //mob = CreatureType.SLIME; count = noOfPlayers * 4; slime = true; break; case MONSTER: - //mob = CreatureType.MONSTER; count = noOfPlayers + 1; break; case WOLF: - //mob = CreatureType.WOLF; count = noOfPlayers * 3; wolf = true; break; case GIANT: - //mob = CreatureType.GIANT; count = 1; break; case GHAST: - //mob = CreatureType.GHAST; count = 2; ghast = true; break; default: - //mob = CreatureType.CHICKEN; count = 50; break; } @@ -229,6 +215,9 @@ public class MASpawnThread implements Runnable c.setTarget(getClosestPlayer(e)); } + if (!ArenaManager.lightning) + return; + // Lightning, just for effect ;) for (Location spawn : ArenaManager.spawnpoints) { diff --git a/src/com/garbagemule/MobArena/MATeleportListener.java b/src/com/garbagemule/MobArena/MATeleportListener.java index ee281b1..c0a7cc2 100644 --- a/src/com/garbagemule/MobArena/MATeleportListener.java +++ b/src/com/garbagemule/MobArena/MATeleportListener.java @@ -8,33 +8,49 @@ import org.bukkit.event.player.PlayerTeleportEvent; /** * This listener prevents players from warping out of the arena, if * they are in the arena session. + * Also prevents players from warping into the arena during a session. */ // TO-DO: Fix the bug that causes the message when people get stuck in walls. public class MATeleportListener extends PlayerListener { - private MobArena plugin; - public MATeleportListener(MobArena instance) { - plugin = instance; } public void onPlayerTeleport(PlayerTeleportEvent event) { Player p = event.getPlayer(); - if (!ArenaManager.playerSet.contains(p)) - return; - Location to = event.getTo(); - if (ArenaManager.arenaLoc.equals(to) || - ArenaManager.lobbyLoc.equals(to) || - ArenaManager.spectatorLoc.equals(to)) + // If the player teleports from outside of the arena.. + if (!ArenaManager.playerSet.contains(p)) { + if (!MAUtils.inRegion(to)) + return; + + if (!ArenaManager.isRunning) + return; + + if (ArenaManager.spectatorLoc.equals(to)) + return; + + // ..into the region during a battle; cancel + ArenaManager.tellPlayer(p, "Can't warp to the arena during battle!"); + ArenaManager.tellPlayer(p, "Type /ma spec to watch."); + event.setCancelled(true); return; } - ArenaManager.tellPlayer(p, "Can't warp in arena! To leave, type /ma leave"); + // Otherwise, only warp if to is in the locationMap, or a valid warp + if (ArenaManager.locationMap.get(p).equals(to) || + ArenaManager.arenaLoc.equals(to) || + ArenaManager.lobbyLoc.equals(to) || + ArenaManager.spectatorLoc.equals(to)) + return; + + // If warp isn't valid, notify the player + ArenaManager.tellPlayer(p, "Warping not allowed in the arena!"); + ArenaManager.tellPlayer(p, "Type /ma leave to 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 e8b18d6..b855c3e 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -1,6 +1,5 @@ package com.garbagemule.MobArena; -import java.net.URL; import java.net.URI; import java.net.HttpURLConnection; import java.io.File; @@ -8,15 +7,13 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.util.Scanner; -import java.util.Arrays; import java.util.List; import java.util.LinkedList; import java.util.Map; import java.util.HashMap; import java.util.Random; +import java.util.Iterator; import org.bukkit.block.Sign; -import org.bukkit.block.BlockFace; import org.bukkit.World; import org.bukkit.Material; import org.bukkit.Location; @@ -78,7 +75,7 @@ public class MAUtils public static void giveItems(boolean reward, Player p, String... strings) { // Variables used. - ItemStack stack, current; + ItemStack stack; int id, amount; PlayerInventory inv; @@ -170,61 +167,6 @@ public class MAUtils // ///////////////////////////////////////////////////////////////////// */ - /** - * Replaces all tabs with 4 spaces in config.yml - - public static void fixConfigFile() - { - new File("plugins/MobArena").mkdir(); - File configFile = new File("plugins/MobArena/config.yml"); - - try - { - if(!configFile.exists()) - { - configFile.createNewFile(); - } - else - { - // Create an inputstream from the file - FileInputStream fis = new FileInputStream(configFile); - - // Read the file into a byte array, and make a String out of it. - byte[] bytes = new byte[(int)configFile.length()]; - fis.read(bytes); - String input = new String(bytes); - - // Close the stream. - fis.close(); - - // Replace all tabs with 4 spaces. - String output = ""; - for (char c : input.toCharArray()) - { - if (c == '\t') - output += " "; - else - output += c; - } - - // Create an outputstream from the file. - FileOutputStream fos = new FileOutputStream(configFile); - - // Write all the bytes to it. - for (byte b : output.getBytes()) - fos.write(b); - - // Close the stream. - fos.close(); - } - } - catch(Exception e) - { - System.out.println("[MobArena] ERROR: Config file could not be created."); - } - } - */ - /** * Creates a Configuration object from the config.yml file. */ @@ -249,25 +191,13 @@ public class MAUtils return new Configuration(configFile); } - public static boolean getUpdateNotification() - { - Configuration c = ArenaManager.config; - c.load(); - - boolean result = c.getBoolean("updatenotification", false); - c.setProperty("updatenotification", result); - c.save(); - - return result; - } - public static List getDisabledCommands() { Configuration c = ArenaManager.config; c.load(); - String commands = c.getString("disabledcommands", "kill"); - c.setProperty("disabledcommands", commands); + String commands = c.getString("settings.disabledcommands", "/kill"); + c.setProperty("settings.disabledcommands", commands); c.save(); List result = new LinkedList(); @@ -286,8 +216,8 @@ public class MAUtils Configuration c = ArenaManager.config; c.load(); - String world = c.getString("world", ArenaManager.server.getWorlds().get(0).getName()); - c.setProperty("world", world); + String world = c.getString("settings.world", ArenaManager.server.getWorlds().get(0).getName()); + c.setProperty("settings.world", world); c.save(); return ArenaManager.server.getWorld(world); @@ -306,11 +236,11 @@ public class MAUtils { c.setProperty("classes.Archer.items", "wood_sword, bow, arrow:128, grilled_pork"); c.setProperty("classes.Archer.armor", "298,299,300,301"); - c.setProperty("classes.Knight.items", "diamond_sword, grilled_pork"); + c.setProperty("classes.Knight.items", "diamond_sword, grilled_pork:2"); c.setProperty("classes.Knight.armor", "306,307,308,309"); - c.setProperty("classes.Tank.items", "iron_sword, grilled_pork:2"); + c.setProperty("classes.Tank.items", "iron_sword, grilled_pork:3, apple"); c.setProperty("classes.Tank.armor", "310,311,312,313"); - c.setProperty("classes.Oddjob.items", "stone_sword, flint_and_steel, netherrack:2, wood_pickaxe, wood_door, fishing_rod, apple, grilled_pork:3"); + c.setProperty("classes.Oddjob.items", "stone_sword, flint_and_steel, netherrack:2, wood_pickaxe, tnt:4, fishing_rod, apple, grilled_pork:3"); c.setProperty("classes.Oddjob.armor", "298,299,300,301"); c.setProperty("classes.Chef.items", "stone_sword, bread:6, grilled_pork:4, mushroom_soup, cake:3, cookie:12"); c.setProperty("classes.Chef.armor", "314,315,316,317"); @@ -436,7 +366,7 @@ public class MAUtils if (c.getInt("waves." + type + "." + monster, -1) == -1) { int dist = 10; - if (monster.equals("giants") || monster.equals("ghasts") || monster.equals("slimes")) + if (monster.equals("giants") || monster.equals("ghasts")) dist = 0; c.setProperty("waves." + type + "." + monster, dist); @@ -446,6 +376,36 @@ public class MAUtils return c.getInt("waves." + type + "." + monster, 0); } + /** + * Grabs an integer from the config-file. + */ + public static int getInt(String path, int def) + { + Configuration c = ArenaManager.config; + c.load(); + + int result = c.getInt(path, def); + c.setProperty(path, result); + + c.save(); + return result; + } + + /** + * Grabs a boolean from the config-file. + */ + public static boolean getBoolean(String path, boolean def) + { + Configuration c = ArenaManager.config; + c.load(); + + boolean result = c.getBoolean(path, def); + c.setProperty(path, result); + + c.save(); + return result; + } + /* ///////////////////////////////////////////////////////////////////// // @@ -842,7 +802,7 @@ public class MAUtils ArenaManager.world.getBlockAt(i,j,k).setTypeId(0); // Place the hippie signs - java.util.Iterator iterator = ArenaManager.classes.iterator(); + Iterator iterator = ArenaManager.classes.iterator(); for (int i = lx1+2; i <= lx2-2; i++) // Signs { ArenaManager.world.getBlockAt(i,ly1+1,lz2-1).setTypeIdAndData(63, (byte)0x8, false); @@ -874,7 +834,7 @@ public class MAUtils { FileInputStream fis = new FileInputStream("plugins/MobArena/precious.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); - 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 a3b0899..6713315 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -1,8 +1,6 @@ package com.garbagemule.MobArena; import java.util.List; -import java.util.Iterator; -import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.block.BlockListener; @@ -59,12 +57,13 @@ public class MobArena extends JavaPlugin 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_BUCKET_EMPTY, 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); pm.registerEvent(Event.Type.PLAYER_JOIN, discListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Normal, this); - pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this); + //pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_DAMAGE, damageListener, Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_DEATH, damageListener, Priority.Normal, this); @@ -77,10 +76,8 @@ public class MobArena extends JavaPlugin public void onDisable() { - Iterator iterator = ArenaManager.playerSet.iterator(); - while (iterator.hasNext()) - ArenaManager.playerLeave(iterator.next()); - System.out.println("WAIT! WHAT ARE YOU DOING?!"); + + ArenaManager.forceEnd(null); } } \ No newline at end of file