diff --git a/MobArena.jar b/MobArena.jar index 801e7f4..c2a761e 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/resources/plugin.yml b/resources/plugin.yml index 3e7bfc0..cc304cb 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.94.3.17 +version: 0.94.3.18 softdepend: [Spout,Permissions,MultiVerse,XcraftGate,Towny,Heroes,MagicSpells] commands: ma: diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index 0b3c9cf..9e41c4b 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -107,7 +107,7 @@ public class Arena protected boolean allowMonsters, allowAnimals; // Other settings - protected int repairDelay, minPlayers, maxPlayers, joinDistance; + protected int minPlayers, maxPlayers, joinDistance; protected List classes = new LinkedList(); protected Map locations = new HashMap(); protected Map healthMap = new HashMap(); @@ -900,7 +900,6 @@ public class Arena joinDistance = config.getInt(arenaPath + "max-join-distance", 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; specialModulo = config.getInt(arenaPath + "special-modulo", 4); @@ -947,7 +946,7 @@ public class Arena public void serializeConfig() { String coords = "arenas." + configName() + ".coords."; - Configuration config = plugin.getConfig(); + Configuration config = plugin.getMAConfig(); config.setProperty("arenas." + configName() + ".settings.enabled", enabled); config.setProperty("arenas." + configName() + ".settings.protect", protect); @@ -968,7 +967,7 @@ public class Arena public void deserializeConfig() { - Configuration config = plugin.getConfig(); + Configuration config = plugin.getMAConfig(); config.load(); load(config); } @@ -1112,6 +1111,16 @@ public class Arena // ////////////////////////////////////////////////////////////////////*/ + public boolean inArena(Player p) + { + return arenaPlayers.contains(p); + } + + public boolean inLobby(Player p) + { + return lobbyPlayers.contains(p); + } + public boolean isRunning() { return running; diff --git a/src/com/garbagemule/MobArena/ArenaMaster.java b/src/com/garbagemule/MobArena/ArenaMaster.java index 0384455..33f5b97 100644 --- a/src/com/garbagemule/MobArena/ArenaMaster.java +++ b/src/com/garbagemule/MobArena/ArenaMaster.java @@ -22,7 +22,6 @@ public class ArenaMaster //implements Master private MobArena plugin; private Configuration config; protected Arena selectedArena; - //protected Lobby masterLobby; // Settings protected boolean enabled, updateNotify; @@ -51,7 +50,7 @@ public class ArenaMaster //implements Master public ArenaMaster(MobArena instance) { plugin = instance; - config = plugin.getConfig(); + config = plugin.getMAConfig(); arenas = new LinkedList(); arenaMap = new HashMap(); } diff --git a/src/com/garbagemule/MobArena/MAClass.java b/src/com/garbagemule/MobArena/MAClass.java new file mode 100644 index 0000000..3eb6e55 --- /dev/null +++ b/src/com/garbagemule/MobArena/MAClass.java @@ -0,0 +1,149 @@ +package com.garbagemule.MobArena; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class MAClass +{ + private String name; + private List items, armor; + private Map perms; + + public MAClass(String name) + { + this.name = name; + this.items = new LinkedList(); + this.armor = new LinkedList(); + this.perms = new HashMap(); + } + + public MAClass(String name, List items, List armor) + { + this.name = name; + this.items = items; + this.armor = armor; + this.perms = new HashMap(); + sortArmor(); + immunizeWeapons(); + } + + public String getName() + { + return name; + } + + public List getItems() + { + return items; + } + + public void setItems(List items) + { + this.items = items; + immunizeWeapons(); + } + + public void setArmor(List armor) + { + this.armor = armor; + sortArmor(); + } + + public void setPerms(Map perms) + { + this.perms = perms; + } + + public void giveItems(Player p) + { + PlayerInventory inv = p.getInventory(); + + for (ItemStack stack : items) + { + + inv.addItem(stack.clone()); + } + } + + public void giveArmor(Player p) + { + PlayerInventory inv = p.getInventory(); + + inv.setHelmet (armor.get(0)); + inv.setChestplate(armor.get(1)); + inv.setLeggings (armor.get(2)); + inv.setBoots (armor.get(3)); + } + + private void sortArmor() + { + ItemStack s0 = null, s1 = null, s2 = null, s3 = null; + for (ItemStack stack : armor) + { + if (isHelmet(stack)) + s0 = stack; + else if (isChestplate(stack)) + s1 = stack; + else if (isLeggings(stack)) + s2 = stack; + else if (isBoots(stack)) + s3 = stack; + } + + armor.set(0, s0); + armor.set(1, s1); + armor.set(2, s2); + armor.set(3, s3); + } + + private void immunizeWeapons() + { + for (ItemStack stack : items) + { + } + } + + private boolean isHelmet(ItemStack stack) + { + return (!isChestplate(stack) && !isLeggings(stack) && !isBoots(stack)); + } + + private boolean isChestplate(ItemStack stack) + { + return matches(stack, 299, 303, 307, 311, 315); + } + + private boolean isLeggings(ItemStack stack) + { + return matches(stack, 300, 304, 308, 312, 316); + } + + private boolean isBoots(ItemStack stack) + { + return matches(stack, 301, 305, 309, 313, 317); + } + + private boolean isWeapon(ItemStack stack) + { + return matches(stack, 256, 257, 258, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 283, 284, 285, 286, + 290, 291, 292, 293, 294, 346); + } + + private boolean matches(ItemStack stack, int... ids) + { + int id = stack.getTypeId(); + + for (int i : ids) + if (id == i) + return true; + + return false; + } +} diff --git a/src/com/garbagemule/MobArena/MACommands.java b/src/com/garbagemule/MobArena/MACommands.java index 6bfb010..5061bf4 100644 --- a/src/com/garbagemule/MobArena/MACommands.java +++ b/src/com/garbagemule/MobArena/MACommands.java @@ -79,7 +79,7 @@ public class MACommands implements CommandExecutor this.am = am; server = Bukkit.getServer(); meanAdmins = (server.getPluginManager().getPlugin("Mean Admins") != null); - ALLOWED_COMMANDS = MAUtils.getAllowedCommands(plugin.getConfig()); + ALLOWED_COMMANDS = MAUtils.getAllowedCommands(plugin.getMAConfig()); } /** @@ -809,7 +809,7 @@ public class MACommands implements CommandExecutor return true; } - MAUtils.setArenaCoord(plugin.getConfig(), am.selectedArena, arg1, p.getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), am.selectedArena, arg1, p.getLocation()); MAUtils.tellPlayer(sender, "Set region point " + arg1 + " for arena '" + am.selectedArena.configName() + "'"); return true; } @@ -857,11 +857,11 @@ public class MACommands implements CommandExecutor } // In case of a "negative" region, fix it! - MAUtils.fixRegion(plugin.getConfig(), am.selectedArena.world, am.selectedArena); + MAUtils.fixRegion(plugin.getMAConfig(), am.selectedArena.world, am.selectedArena); MAUtils.tellPlayer(sender, "Region for '" + am.selectedArena.configName() + "' expanded " + arg2 + " by " + arg1 + " blocks."); am.selectedArena.serializeConfig(); - am.selectedArena.load(plugin.getConfig()); + am.selectedArena.load(plugin.getMAConfig()); return true; } @@ -938,7 +938,7 @@ public class MACommands implements CommandExecutor return true; } - MAUtils.setArenaCoord(plugin.getConfig(), am.selectedArena, arg1, p.getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), am.selectedArena, arg1, p.getLocation()); MAUtils.tellPlayer(sender, "Set lobby point " + arg1 + " for arena '" + am.selectedArena.configName() + "'"); return true; } @@ -984,7 +984,7 @@ public class MACommands implements CommandExecutor MAUtils.tellPlayer(sender, "Lobby region for '" + am.selectedArena.configName() + "' expanded " + arg2 + " by " + arg1 + " blocks."); am.selectedArena.serializeConfig(); - am.selectedArena.load(plugin.getConfig()); + am.selectedArena.load(plugin.getMAConfig()); return true; } @@ -1004,7 +1004,7 @@ public class MACommands implements CommandExecutor return true; } - MAUtils.setArenaCoord(plugin.getConfig(), am.selectedArena, arg1, p.getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), am.selectedArena, arg1, p.getLocation()); MAUtils.tellPlayer(sender, "Warp point " + arg1 + " was set for arena '" + am.selectedArena.configName() + "'"); MAUtils.tellPlayer(sender, "Type /ma checkdata to see if you're missing anything..."); return true; @@ -1022,7 +1022,7 @@ public class MACommands implements CommandExecutor } StringBuffer buffy = new StringBuffer(); - List spawnpoints = plugin.getConfig().getKeys("arenas." + am.selectedArena.configName() + ".coords.spawnpoints"); + List spawnpoints = plugin.getMAConfig().getKeys("arenas." + am.selectedArena.configName() + ".coords.spawnpoints"); if (spawnpoints != null) { @@ -1057,7 +1057,7 @@ public class MACommands implements CommandExecutor return true; } - MAUtils.setArenaCoord(plugin.getConfig(), am.selectedArena, "spawnpoints." + arg1, p.getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), am.selectedArena, "spawnpoints." + arg1, p.getLocation()); MAUtils.tellPlayer(sender, "Spawnpoint " + arg1 + " added for arena \"" + am.selectedArena.configName() + "\""); return true; } @@ -1078,7 +1078,7 @@ public class MACommands implements CommandExecutor return true; } - if (MAUtils.delArenaCoord(plugin.getConfig(), am.selectedArena, "spawnpoints." + arg1)) + if (MAUtils.delArenaCoord(plugin.getMAConfig(), am.selectedArena, "spawnpoints." + arg1)) MAUtils.tellPlayer(sender, "Spawnpoint " + arg1 + " deleted for arena '" + am.selectedArena.configName() + "'"); else MAUtils.tellPlayer(sender, "Could not find the spawnpoint " + arg1 + "for the arena '" + am.selectedArena.configName() + "'"); @@ -1094,7 +1094,7 @@ public class MACommands implements CommandExecutor } StringBuffer buffy = new StringBuffer(); - List containers = plugin.getConfig().getKeys("arenas." + am.selectedArena.configName() + ".coords.containers"); + List containers = plugin.getMAConfig().getKeys("arenas." + am.selectedArena.configName() + ".coords.containers"); if (containers != null) { @@ -1131,7 +1131,7 @@ public class MACommands implements CommandExecutor return true; } - MAUtils.setArenaCoord(plugin.getConfig(), am.selectedArena, "containers." + arg1, p.getTargetBlock(null, 50).getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), am.selectedArena, "containers." + arg1, p.getTargetBlock(null, 50).getLocation()); MAUtils.tellPlayer(sender, "Container '" + arg1 + "' added for arena \"" + am.selectedArena.configName() + "\""); return true; } @@ -1149,7 +1149,7 @@ public class MACommands implements CommandExecutor return true; } - if (MAUtils.delArenaCoord(plugin.getConfig(), am.selectedArena, "containers." + arg1)) + if (MAUtils.delArenaCoord(plugin.getMAConfig(), am.selectedArena, "containers." + arg1)) MAUtils.tellPlayer(sender, "Container '" + arg1 + "' deleted for arena '" + am.selectedArena.configName() + "'"); else MAUtils.tellPlayer(sender, "Could not find the container '" + arg1 + "' for arena '" + am.selectedArena.configName() + "'"); diff --git a/src/com/garbagemule/MobArena/MAListener.java b/src/com/garbagemule/MobArena/MAListener.java index 3947788..3c24da7 100644 --- a/src/com/garbagemule/MobArena/MAListener.java +++ b/src/com/garbagemule/MobArena/MAListener.java @@ -1,5 +1,8 @@ package com.garbagemule.MobArena; +import java.util.LinkedList; +import java.util.List; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -117,11 +120,12 @@ public class MAListener implements ArenaListener public void onBlockPlace(BlockPlaceEvent event) { - if (!arena.inRegion(event.getBlock().getLocation()) || arena.edit) + Block b = event.getBlock(); + + if (!arena.inRegion(b.getLocation()) || arena.edit) return; - Block b = event.getBlock(); - if (arena.running && arena.arenaPlayers.contains(event.getPlayer())) + if (arena.running && arena.inArena(event.getPlayer())) { arena.blocks.add(b); Material mat = b.getType(); @@ -161,7 +165,7 @@ public class MAListener implements ArenaListener public void onSignChange(SignChangeEvent event) { arena.leaderboard = new Leaderboard(plugin, arena, event.getBlock().getLocation()); - MAUtils.setArenaCoord(plugin.getConfig(), arena, "leaderboard", event.getBlock().getLocation()); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "leaderboard", event.getBlock().getLocation()); MAUtils.tellPlayer(event.getPlayer(), "Leaderboard made. Now set up the stat signs!"); } @@ -183,11 +187,10 @@ public class MAListener implements ArenaListener if (!arena.monsters.contains(event.getEntity()) && !arena.inRegionRadius(event.getLocation(), 10)) return; - event.setYield(0); arena.monsters.remove(event.getEntity()); - // Cancel if the arena isn't running or if the repair delay is 0 - if (!arena.running || arena.repairDelay == 0) + // Cancel if the arena isn't running + if (!arena.running) { event.setCancelled(true); return; @@ -196,6 +199,17 @@ public class MAListener implements ArenaListener // Uncancel, just in case. event.setCancelled(false); + // If the arena isn't destructible, just clear the blocklist. + if (!arena.softRestore && arena.protect) + { + List blocks = new LinkedList(arena.blocks); + event.blockList().retainAll(blocks); + return; + } + + if (!arena.softRestoreDrops) + event.setYield(0); + // Handle all the blocks in the block list. for (Block b : event.blockList()) { @@ -232,20 +246,6 @@ public class MAListener implements ArenaListener else arena.queueRepairable(r); } - - // If the arena isn't protected, or soft-restore is on, return. - if (!arena.protect || arena.softRestore) - return; - - // Otherwise, schedule repairs! - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, - new Runnable() - { - public void run() - { - arena.repairBlocks(); - } - }, arena.repairDelay); } @@ -266,7 +266,7 @@ public class MAListener implements ArenaListener private void onPlayerDeath(EntityDeathEvent event, Player player) { - if (arena.arenaPlayers.contains(player) || arena.lobbyPlayers.contains(player)) + if (arena.inArena(player) || arena.lobbyPlayers.contains(player)) { event.getDrops().clear(); arena.playerDeath(player); @@ -328,7 +328,7 @@ public class MAListener implements ArenaListener event.setCancelled(true); // If not in the lobby or the arena, return - else if (!arena.arenaPlayers.contains(player)) + else if (!arena.inArena(player)) return; // Cancel block explosion damage if detonate-damage: false @@ -356,14 +356,15 @@ public class MAListener implements ArenaListener { if (damager instanceof Player) { - if (!arena.arenaPlayers.contains(damager)) + Player p = (Player) damager; + if (!arena.inArena(p)) { event.setCancelled(true); return; } - arena.arenaPlayerMap.get((Player) damager).getStats().dmgDone += event.getDamage(); - arena.arenaPlayerMap.get((Player) damager).getStats().hits++; + arena.arenaPlayerMap.get(p).getStats().dmgDone += event.getDamage(); + arena.arenaPlayerMap.get(p).getStats().hits++; } else if (damager instanceof Wolf && arena.pets.contains(damager)) { @@ -442,7 +443,7 @@ public class MAListener implements ArenaListener event.setCancelled(true); else if (event.getReason() == TargetReason.CLOSEST_PLAYER) - if (!arena.arenaPlayers.contains(event.getTarget())) + if (!arena.inArena((Player) event.getTarget())) event.setCancelled(true); } } @@ -463,7 +464,7 @@ public class MAListener implements ArenaListener { if (!arena.running) return; - if (!(event.getEntity() instanceof Player) || !arena.arenaPlayers.contains((Player)event.getEntity())) + if (!(event.getEntity() instanceof Player) || !arena.inArena((Player)event.getEntity())) return; if (event.getRegainReason() == RegainReason.REGEN) @@ -472,7 +473,7 @@ public class MAListener implements ArenaListener public void onPlayerAnimation(PlayerAnimationEvent event) { - if (!arena.running || !arena.arenaPlayers.contains(event.getPlayer())) + if (!arena.running || !arena.inArena(event.getPlayer())) return; arena.arenaPlayerMap.get(event.getPlayer()).getStats().swings++; @@ -483,14 +484,14 @@ public class MAListener implements ArenaListener Player p = event.getPlayer(); // Player is in the lobby - if (arena.lobbyPlayers.contains(p)) + if (arena.inLobby(p)) { MAUtils.tellPlayer(p, Msg.LOBBY_DROP_ITEM); event.setCancelled(true); } // Player is in the arena - else if (arena.arenaPlayers.contains(p)) + else if (arena.inArena(p)) { if (!arena.shareInArena) { @@ -516,7 +517,7 @@ public class MAListener implements ArenaListener public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { - if (!arena.readyPlayers.contains(event.getPlayer()) && !arena.arenaPlayers.contains(event.getPlayer())) + if (!arena.readyPlayers.contains(event.getPlayer()) && !arena.inArena(event.getPlayer())) return; if (!arena.running) @@ -532,77 +533,83 @@ public class MAListener implements ArenaListener public void onPlayerInteract(PlayerInteractEvent event) { - if (!arena.arenaPlayers.contains(event.getPlayer()) && !arena.lobbyPlayers.contains(event.getPlayer())) - return; - - if (arena.running) - { - if (event.hasBlock() && event.getClickedBlock().getType() == Material.SAPLING) - arena.addTrunkAndLeaves(event.getClickedBlock()); - return; - } - - Action a = event.getAction(); Player p = event.getPlayer(); + if (arena.inArena(p) || !arena.inLobby(p)) + return; + + // Player is in the lobby, so disallow using items. + Action a = event.getAction(); if (a == Action.RIGHT_CLICK_AIR || a == Action.RIGHT_CLICK_BLOCK) - { + { event.setUseItemInHand(Result.DENY); event.setCancelled(true); } + // If there's no block involved, just return. + if (!event.hasBlock()) + return; + // Iron block - if (event.hasBlock() && event.getClickedBlock().getTypeId() == 42) + if (event.getClickedBlock().getTypeId() == 42) + handleReadyBlock(p); + + // Sign + else if (event.getClickedBlock().getState() instanceof Sign) { - if (arena.classMap.containsKey(p)) - { - MAUtils.tellPlayer(p, Msg.LOBBY_PLAYER_READY); - arena.playerReady(p); - } - else - { - MAUtils.tellPlayer(p, Msg.LOBBY_PICK_CLASS); - } + Sign sign = (Sign) event.getClickedBlock().getState(); + handleSign(sign, p); + } + } + + private void handleReadyBlock(Player p) + { + if (arena.classMap.containsKey(p)) + { + MAUtils.tellPlayer(p, Msg.LOBBY_PLAYER_READY); + arena.playerReady(p); + } + else MAUtils.tellPlayer(p, Msg.LOBBY_PICK_CLASS); + } + + private void handleSign(Sign sign, Player p) + { + // Check if the first line is a class name. + String className = ChatColor.stripColor(sign.getLine(0)); + if (!arena.classes.contains(className) && !className.equalsIgnoreCase("random")) + return; + + // Check for permission. + if (!plugin.has(p, "mobarena.classes." + className) && !className.equalsIgnoreCase("random")) + { + MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PERMISSION); return; } - // Sign - if (event.hasBlock() && event.getClickedBlock().getState() instanceof Sign) - { - if (a == Action.RIGHT_CLICK_BLOCK) + // Delay the inventory stuff to ensure that right-clicking works. + delayAssignClass(p, className); + } + + private void delayAssignClass(final Player p, final String className) + { + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, + new Runnable() { - MAUtils.tellPlayer(p, Msg.LOBBY_RIGHT_CLICK); - return; - } - - // 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 = ChatColor.stripColor(sign.getLine(0)); - if (!arena.classes.contains(className) && !className.equalsIgnoreCase("random")) - return; - - if (!plugin.has(p, "mobarena.classes." + className) && !className.equalsIgnoreCase("random")) - { - MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PERMISSION); - return; - } - - // Set the player's class. - arena.assignClass(p, className); - if (!className.equalsIgnoreCase("random")) - MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, className, arena.classItems.get(className).get(0).getType()); - else - MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_RANDOM); - - return; - } + public void run() + { + arena.assignClass(p, className); + + if (!className.equalsIgnoreCase("random")) + MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, className, arena.classItems.get(className).get(0).getType()); + else + MAUtils.tellPlayer(p, Msg.LOBBY_CLASS_RANDOM); + } + }); } public void onPlayerQuit(PlayerQuitEvent event) { Player p = event.getPlayer(); - if (!arena.enabled || (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p))) + if (!arena.enabled || (!arena.inArena(p) && !arena.inLobby(p))) return; arena.playerLeave(p); @@ -611,7 +618,7 @@ public class MAListener implements ArenaListener public void onPlayerKick(PlayerKickEvent event) { Player p = event.getPlayer(); - if (!arena.enabled || (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p))) + if (!arena.enabled || (!arena.inArena(p) && !arena.inLobby(p))) return; arena.playerLeave(p); @@ -621,16 +628,17 @@ public class MAListener implements ArenaListener { if (!arena.running || arena.edit || !arena.enabled || !arena.setup || arena.allowWarp) return; - - if (!arena.inRegion(event.getTo()) && !arena.inRegion(event.getFrom())) - return; - Player p = event.getPlayer(); - Location old = arena.locations.get(p); Location to = event.getTo(); Location from = event.getFrom(); - if (arena.arenaPlayers.contains(p) || arena.lobbyPlayers.contains(p) || arena.specPlayers.contains(p)) + if (!arena.inRegion(to) && !arena.inRegion(from)) + return; + + Player p = event.getPlayer(); + Location old = arena.locations.get(p); + + if (arena.inArena(p) || arena.inLobby(p) || arena.specPlayers.contains(p)) { if (arena.inRegion(from)) { @@ -666,7 +674,7 @@ public class MAListener implements ArenaListener { Player p = event.getPlayer(); - if (!arena.arenaPlayers.contains(p) && !arena.lobbyPlayers.contains(p)) + if (!arena.inArena(p) && !arena.inLobby(p)) return; String[] args = event.getMessage().split(" "); diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index b0c9cf8..64759ea 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -267,7 +267,7 @@ public class MASpawnThread implements Runnable c = (Creature) e; try { target = c.getTarget(); } catch (ClassCastException cce) { continue; } - if (target instanceof Player && arena.arenaPlayers.contains(target)) + if (target instanceof Player && arena.inArena((Player) target)) continue; c.setTarget(MAUtils.getClosestPlayer(e, arena)); diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 1133424..8e1da48 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -1590,15 +1590,15 @@ public class MAUtils world.getBlockAt(lx2-2,ly1+1,lz1+2).setType(Material.IRON_BLOCK); // Set up the monster points. - 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, 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)); - MAUtils.setArenaCoord(plugin.getConfig(), arena, "spawnpoints.s3", new Location(world, x2-3, y1+2, z1+3)); - MAUtils.setArenaCoord(plugin.getConfig(), arena, "spawnpoints.s4", new Location(world, x2-3, y1+2, z2-3)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "p1", new Location(world, x1, ly1, z1)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "p2", new Location(world, x2, y2+1, z2)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "arena", new Location(world, loc.getX(), y1+1, loc.getZ())); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "lobby", new Location(world, x1+2, ly1+1, z1+2)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "spectator", new Location(world, loc.getX(), y2+1, loc.getZ())); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "spawnpoints.s1", new Location(world, x1+3, y1+2, z1+3)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "spawnpoints.s2", new Location(world, x1+3, y1+2, z2-3)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "spawnpoints.s3", new Location(world, x2-3, y1+2, z1+3)); + MAUtils.setArenaCoord(plugin.getMAConfig(), arena, "spawnpoints.s4", new Location(world, x2-3, y1+2, z2-3)); am.updateAll(); return true; @@ -1632,7 +1632,7 @@ public class MAUtils world.getBlockAt(entry.getKey().getLocation(world)).setTypeId(entry.getValue()); } - Configuration config = plugin.getConfig(); + Configuration config = plugin.getMAConfig(); config.removeProperty("arenas." + name); config.save(); diff --git a/src/com/garbagemule/MobArena/MobArena.java b/src/com/garbagemule/MobArena/MobArena.java index 52d3076..a2d1fc2 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -202,9 +202,9 @@ public class MobArena extends JavaPlugin pm.registerEvent(Event.Type.CUSTOM_EVENT, new MagicSpellsListener(this), Priority.Normal, this); } - public Configuration getConfig() { return config; } - public ArenaMaster getAM() { return am; } // More convenient. - public ArenaMaster getArenaMaster() { return am; } + public Configuration getMAConfig() { return config; } + public ArenaMaster getAM() { return am; } // More convenient. + public ArenaMaster getArenaMaster() { return am; } public HeroManager getHeroManager() { diff --git a/src/com/garbagemule/MobArena/util/Enums.java b/src/com/garbagemule/MobArena/util/Enums.java new file mode 100644 index 0000000..63e7051 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/Enums.java @@ -0,0 +1,36 @@ +package com.garbagemule.MobArena.util; + +public class Enums +{ + /** + * Get the enum value of a string, null if it doesn't exist. + */ + public static > T getEnumFromString(Class c, String string) + { + if(c != null && string != null) + { + try + { + return Enum.valueOf(c, string.trim().toUpperCase()); + } + catch(IllegalArgumentException ex) { } + } + return null; + } + + /** + * Get the enum value of a string, null if it doesn't exist. + */ + public static > T getEnumFromStringCaseSensitive(Class c, String string) + { + if(c != null && string != null) + { + try + { + return Enum.valueOf(c, string); + } + catch(IllegalArgumentException ex) { } + } + return null; + } +} diff --git a/src/com/garbagemule/MobArena/util/ItemParser.java b/src/com/garbagemule/MobArena/util/ItemParser.java new file mode 100644 index 0000000..979f6af --- /dev/null +++ b/src/com/garbagemule/MobArena/util/ItemParser.java @@ -0,0 +1,102 @@ +package com.garbagemule.MobArena.util; + +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class ItemParser +{ + public static List parseItems(String s) + { + List result = new LinkedList(); + + String[] items = s.split(","); + for (String item : items) + { + ItemStack stack = parseItem(item.trim()); + if (stack != null) + result.add(stack); + } + + return result; + } + + public static ItemStack parseItem(String item) + { + if (item == null || item.equals("")) + return null; + + String[] parts = item.split(":"); + if (parts.length == 1) + return singleItem(parts[0]); + if (parts.length == 2) + return withAmount(parts[0], parts[1]); + if (parts.length == 3) + return withDataAndAmount(parts[0], parts[1], parts[2]); + + return null; + } + + private static ItemStack singleItem(String item) + { + Material m = getMaterial(item); + return m == null ? null : new ItemStack(m); + } + + private static ItemStack withAmount(String item, String amount) + { + Material m = getMaterial(item); + int a = getAmount(amount); + return m == null ? null : new ItemStack(m,a); + } + + private static ItemStack withDataAndAmount(String item, String data, String amount) + { + Material m = getMaterial(item.toUpperCase()); + byte d = getData(data); + int a = getAmount(amount); + + if (m == null) + return null; + + if (m.getId() == 35) + d = (byte) (15-d); + + return new ItemStack(m,a,(short)0,d); + } + + private static Material getMaterial(String item) + { + if (item.matches("[0-9]*")) + return Material.getMaterial(Integer.parseInt(item)); + + return Material.getMaterial(item.toUpperCase()); + } + + private static int getAmount(String amount) + { + if (amount.matches("[1-9][0-9]*")) + return Integer.parseInt(amount); + + return 1; + } + + private static byte getData(String data) + { + DyeColor dye = null; + + if (data.matches("[0-9]+")) + { + dye = DyeColor.getByData(Byte.parseByte(data)); + return dye == null ? 0 : dye.getData(); + } + else + { + dye = Enums.getEnumFromString(DyeColor.class, data); + return dye == null ? 0 : (byte) (15-dye.getData()); + } + } +}