From 1673078df55f35243942bfeed9701f6899cc3c83 Mon Sep 17 00:00:00 2001 From: garbagemule Date: Tue, 13 Aug 2013 14:54:34 +0200 Subject: [PATCH] Add classchest command. The classchest command can be used to link a chest to a class directly (although still in the same world) without having to position them in a specific pillar under the signs. --- resources/plugin.yml | 2 +- src/com/garbagemule/MobArena/ArenaClass.java | 14 ++++- .../garbagemule/MobArena/ArenaListener.java | 51 +++++++++++-------- .../garbagemule/MobArena/ArenaMasterImpl.java | 4 ++ .../MobArena/commands/CommandHandler.java | 1 + 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/resources/plugin.yml b/resources/plugin.yml index 3da66d7..81fe6d3 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,7 +1,7 @@ name: MobArena author: garbagemule main: com.garbagemule.MobArena.MobArena -version: 0.95.5.15 +version: 0.95.5.16 softdepend: [Spout,Towny,Heroes,MagicSpells,Vault] commands: ma: diff --git a/src/com/garbagemule/MobArena/ArenaClass.java b/src/com/garbagemule/MobArena/ArenaClass.java index b1b7098..0c06007 100644 --- a/src/com/garbagemule/MobArena/ArenaClass.java +++ b/src/com/garbagemule/MobArena/ArenaClass.java @@ -3,6 +3,7 @@ package com.garbagemule.MobArena; import java.util.*; import java.util.Map.Entry; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -17,7 +18,8 @@ public class ArenaClass private Map perms; private Map lobbyperms; private boolean unbreakableWeapons, unbreakableArmor; - + private Location classchest; + /** * Create a new, empty arena class with the given name. * @param name the class name as it appears in the config-file @@ -243,6 +245,14 @@ public class ArenaClass } } + public Location getClassChest() { + return classchest; + } + + public void setClassChest(Location loc) { + classchest = loc; + } + public boolean hasUnbreakableWeapons() { return unbreakableWeapons; } @@ -267,7 +277,7 @@ public class ArenaClass if (stack == null) return false; return Arrays.binarySearch(weaponTypes, stack.getTypeId()) > -1; } - + /** * Used by the grantItems() method to determine the armor type of a given * ItemStack. Armor pieces are auto-equipped. diff --git a/src/com/garbagemule/MobArena/ArenaListener.java b/src/com/garbagemule/MobArena/ArenaListener.java index a12ff63..3e89b40 100644 --- a/src/com/garbagemule/MobArena/ArenaListener.java +++ b/src/com/garbagemule/MobArena/ArenaListener.java @@ -942,28 +942,37 @@ public class ArenaListener public void run() { if (!className.equalsIgnoreCase("random")) { if (useClassChests) { - BlockFace backwards = ((org.bukkit.material.Sign) sign.getData()).getFacing().getOppositeFace(); - Block blockSign = sign.getBlock(); - Block blockBelow = blockSign.getRelative(BlockFace.DOWN); - Block blockBehind = blockBelow.getRelative(backwards); - - // If the block below this sign is a class sign, swap the order - if (blockBelow.getType() == Material.WALL_SIGN || blockBelow.getType() == Material.SIGN_POST) { - String className = ChatColor.stripColor(((Sign) blockBelow.getState()).getLine(0)).toLowerCase(); - if (arena.getClasses().containsKey(className)) { - blockSign = blockBehind; // Use blockSign as a temp while swapping - blockBehind = blockBelow; - blockBelow = blockSign; + // Check for stored class chests first + ArenaClass ac = plugin.getArenaMaster().getClasses().get(className.toLowerCase()); + Location loc = ac.getClassChest(); + Block blockChest; + if (loc != null) { + blockChest = loc.getBlock(); + } else { + // Otherwise, start the search + BlockFace backwards = ((org.bukkit.material.Sign) sign.getData()).getFacing().getOppositeFace(); + Block blockSign = sign.getBlock(); + Block blockBelow = blockSign.getRelative(BlockFace.DOWN); + Block blockBehind = blockBelow.getRelative(backwards); + + // If the block below this sign is a class sign, swap the order + if (blockBelow.getType() == Material.WALL_SIGN || blockBelow.getType() == Material.SIGN_POST) { + String className = ChatColor.stripColor(((Sign) blockBelow.getState()).getLine(0)).toLowerCase(); + if (arena.getClasses().containsKey(className)) { + blockSign = blockBehind; // Use blockSign as a temp while swapping + blockBehind = blockBelow; + blockBelow = blockSign; + } } + + // TODO: Make number of searches configurable + // First check the pillar below the sign + blockChest = findChestBelow(blockBelow, 6); + + // Then, if no chest was found, check the pillar behind the sign + if (blockChest == null) blockChest = findChestBelow(blockBehind, 6); } - // TODO: Make number of searches configurable - // First check the pillar below the sign - Block blockChest = findChestBelow(blockBelow, 6); - - // Then, if no chest was found, check the pillar behind the sign - if (blockChest == null) blockChest = findChestBelow(blockBehind, 6); - // If a chest was found, get the contents if (blockChest != null) { InventoryHolder holder = (InventoryHolder) blockChest.getState(); @@ -971,9 +980,7 @@ public class ArenaListener // Guard against double-chests for now if (contents.length > 36) { ItemStack[] newContents = new ItemStack[36]; - for (int i = 0; i < 36; i++) { - newContents[i] = contents[i]; - } + System.arraycopy(contents, 0, newContents, 0, 36); contents = newContents; } arena.assignClassGiveInv(p, className, contents); diff --git a/src/com/garbagemule/MobArena/ArenaMasterImpl.java b/src/com/garbagemule/MobArena/ArenaMasterImpl.java index 0519b29..c94a477 100644 --- a/src/com/garbagemule/MobArena/ArenaMasterImpl.java +++ b/src/com/garbagemule/MobArena/ArenaMasterImpl.java @@ -358,6 +358,10 @@ public class ArenaMasterImpl implements ArenaMaster // Register the permission. registerPermission("mobarena.classes." + lowercase, PermissionDefault.TRUE).addParent("mobarena.classes", true); + // Check for class chests + Location cc = section.getLocation("classchest", null); + arenaClass.setClassChest(cc); + // Finally add the class to the classes map. classes.put(lowercase, arenaClass); return arenaClass; diff --git a/src/com/garbagemule/MobArena/commands/CommandHandler.java b/src/com/garbagemule/MobArena/commands/CommandHandler.java index cd20f7b..91c256f 100644 --- a/src/com/garbagemule/MobArena/commands/CommandHandler.java +++ b/src/com/garbagemule/MobArena/commands/CommandHandler.java @@ -198,6 +198,7 @@ public class CommandHandler implements CommandExecutor register(SpawnpointsCommand.class); register(AutoGenerateCommand.class); register(AutoDegenerateCommand.class); + register(ClassChestCommand.class); } /**