diff --git a/resources/res/settings.yml b/resources/res/settings.yml index 3b674b2..451ff35 100644 --- a/resources/res/settings.yml +++ b/resources/res/settings.yml @@ -33,3 +33,4 @@ spout-class-select: false player-time-in-arena: world auto-ignite-tnt: false auto-start-timer: 0 +use-class-chests: false diff --git a/src/com/garbagemule/MobArena/ArenaClass.java b/src/com/garbagemule/MobArena/ArenaClass.java index 828fa8a..0febd52 100644 --- a/src/com/garbagemule/MobArena/ArenaClass.java +++ b/src/com/garbagemule/MobArena/ArenaClass.java @@ -244,6 +244,10 @@ public class ArenaClass return pets; } + public boolean hasUnbreakableWeapons() { + return unbreakableWeapons; + } + /** * Used by isWeapon() to determine if an ItemStack is a weapon type. */ @@ -256,7 +260,7 @@ public class ArenaClass * @param stack an ItemStack * @return true, if the item is a weapon */ - private boolean isWeapon(ItemStack stack) { + public boolean isWeapon(ItemStack stack) { int id = stack.getTypeId(); for (int type : weaponTypes) { diff --git a/src/com/garbagemule/MobArena/ArenaImpl.java b/src/com/garbagemule/MobArena/ArenaImpl.java index 75f748d..a3554ca 100644 --- a/src/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/com/garbagemule/MobArena/ArenaImpl.java @@ -27,6 +27,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.potion.PotionEffect; +import com.garbagemule.MobArena.ArenaClass.ArmorType; import com.garbagemule.MobArena.autostart.AutoStartTimer; import com.garbagemule.MobArena.events.*; import com.garbagemule.MobArena.framework.Arena; @@ -977,6 +978,46 @@ public class ArenaImpl implements Arena arenaClass.grantItems(p); } + @Override + public void assignClassGiveInv(Player p, String className, ItemStack[] contents) { + ArenaPlayer arenaPlayer = arenaPlayerMap.get(p); + ArenaClass arenaClass = classes.get(className); + + if (arenaPlayer == null || arenaClass == null) { + return; + } + + inventoryManager.clearInventory(p); + arenaPlayer.setArenaClass(arenaClass); + + PlayerInventory inv = p.getInventory(); + + // Check the last four slots to see if they are armor items + for (int i = contents.length-1; i > contents.length-5; i--) { + if (contents[i] == null) continue; + ArmorType type = ArmorType.getType(contents[i]); + switch (type) { + case HELMET: inv.setHelmet(contents[i]); break; + case CHESTPLATE: inv.setChestplate(contents[i]); break; + case LEGGINGS: inv.setLeggings(contents[i]); break; + case BOOTS: inv.setBoots(contents[i]); break; + default: + continue; + } + contents[i] = null; + } + + // Check the remaining slots for weapons + if (arenaClass.hasUnbreakableWeapons()) { + for (ItemStack stack : contents) { + if (stack != null && arenaClass.isWeapon(stack)) { + stack.setDurability(Short.MIN_VALUE); + } + } + } + p.getInventory().setContents(contents); + } + @Override public void addRandomPlayer(Player p) { randoms.add(p); diff --git a/src/com/garbagemule/MobArena/ArenaListener.java b/src/com/garbagemule/MobArena/ArenaListener.java index 10e1354..12ae8a6 100644 --- a/src/com/garbagemule/MobArena/ArenaListener.java +++ b/src/com/garbagemule/MobArena/ArenaListener.java @@ -98,7 +98,8 @@ public class ArenaListener pvpOn, // pvp-enabled in config pvpEnabled = false, // activated on first wave foodRegen, - lockFoodLevel; + lockFoodLevel, + useClassChests; @SuppressWarnings("unused") private boolean allowTeleport, canShare, @@ -131,6 +132,7 @@ public class ArenaListener this.allowTeleport = s.getBoolean("allow-teleporting", false); this.canShare = s.getBoolean("share-items-in-arena", true); this.autoIgniteTNT = s.getBoolean("auto-ignite-tnt", false); + this.useClassChests = s.getBoolean("use-class-chests", false); this.classLimits = arena.getClassLimitManager(); @@ -814,7 +816,7 @@ public class ArenaListener classLimits.playerPickedClass(newAC); // Delay the inventory stuff to ensure that right-clicking works. - delayAssignClass(p, className); + delayAssignClass(p, className, sign); } /*private boolean cansPlayerJoinClass(ArenaClass ac, Player p) { @@ -829,10 +831,38 @@ public class ArenaListener return true; }*/ - private void delayAssignClass(final Player p, final String className) { + private void delayAssignClass(final Player p, final String className, final Sign sign) { plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin,new Runnable() { public void run() { if (!className.equalsIgnoreCase("random")) { + if (useClassChests) { + BlockFace backwards = ((org.bukkit.material.Sign) sign.getData()).getFacing().getOppositeFace(); + Block blockBelow = sign.getBlock(); + Block blockBehind = blockBelow.getRelative(backwards); + + Block blockChest = null; + for (int i = 0; i < 6; i++) { + if (blockBelow.getType() == Material.CHEST) { + blockChest = blockBelow; + break; + } + if (blockBehind.getType() == Material.CHEST) { + blockChest = blockBehind; + break; + } + blockBelow = blockBelow.getRelative(BlockFace.DOWN); + blockBehind = blockBehind.getRelative(BlockFace.DOWN); + } + + if (blockChest != null) { + InventoryHolder holder = (InventoryHolder) blockChest.getState(); + ItemStack[] contents = holder.getInventory().getContents(); + arena.assignClassGiveInv(p, className, contents); + p.getInventory().setContents(contents); + Messenger.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, TextUtils.camelCase(className), arena.getClassLogo(className)); + return; + } + } arena.assignClass(p, className); Messenger.tellPlayer(p, Msg.LOBBY_CLASS_PICKED, TextUtils.camelCase(className), arena.getClassLogo(className)); } diff --git a/src/com/garbagemule/MobArena/framework/Arena.java b/src/com/garbagemule/MobArena/framework/Arena.java index 2a73079..fed2064 100644 --- a/src/com/garbagemule/MobArena/framework/Arena.java +++ b/src/com/garbagemule/MobArena/framework/Arena.java @@ -179,6 +179,8 @@ public interface Arena public void assignClass(Player p, String className); + public void assignClassGiveInv(Player p, String className, ItemStack[] contents); + public void addRandomPlayer(Player p); public void assignRandomClass(Player p);