diff --git a/changelog.md b/changelog.md index 495c7fa..1ba1a96 100644 --- a/changelog.md +++ b/changelog.md @@ -12,6 +12,7 @@ These changes will (most likely) be included in the next version. ## [Unreleased] - Like the other user commands, the permission for `/ma ready` now defaults to true. +- Unbreakable weapons and armor now use the unbreakable item flag instead of item durability and on-hit repairs. This means that MobArena's unbreakable items are now compatible with plugins that depend on special durability values, such as QualityArmory. ## [0.103] - 2018-08-28 - It is now possible to add a fixed delay (in seconds) between waves with the new per-arena setting `next-wave-delay`. diff --git a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java index 856cdd3..d0b3253 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java @@ -47,6 +47,7 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.potion.PotionEffect; @@ -1168,6 +1169,9 @@ public class ArenaImpl implements Arena int last = contents.length-1; if (contents[last] != null) { helmet = contents[last].clone(); + if (arenaClass.hasUnbreakableArmor()) { + makeUnbreakable(helmet); + } contents[last] = null; } @@ -1177,6 +1181,10 @@ public class ArenaImpl implements Arena ArmorType type = ArmorType.getType(contents[i]); if (type == null || type == ArmorType.HELMET) continue; + ItemStack stack = contents[i].clone(); + if (arenaClass.hasUnbreakableArmor()) { + makeUnbreakable(stack); + } switch (type) { case CHESTPLATE: chestplate = contents[i].clone(); break; case LEGGINGS: leggings = contents[i].clone(); break; @@ -1190,6 +1198,12 @@ public class ArenaImpl implements Arena ItemStack fifth = contents[contents.length - 5]; if (fifth != null) { offhand = fifth.clone(); + if (arenaClass.hasUnbreakableWeapons() && ArenaClass.isWeapon(fifth)) { + makeUnbreakable(offhand); + } + if (arenaClass.hasUnbreakableArmor() && ArmorType.getType(fifth) != null) { + makeUnbreakable(offhand); + } contents[contents.length - 5] = null; } @@ -1197,7 +1211,7 @@ public class ArenaImpl implements Arena if (arenaClass.hasUnbreakableWeapons()) { for (ItemStack stack : contents) { if (stack != null && arenaClass.isWeapon(stack)) { - stack.setDurability(Short.MIN_VALUE); + makeUnbreakable(stack); } } } @@ -1216,6 +1230,12 @@ public class ArenaImpl implements Arena autoReady(p); } + private void makeUnbreakable(ItemStack stack) { + ItemMeta meta = stack.getItemMeta(); + meta.setUnbreakable(true); + stack.setItemMeta(meta); + } + private void autoReady(Player p) { if (settings.getBoolean("auto-ready", false)) { if (autoStartTimer.getRemaining() <= 0) { diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index 3f2f009..97cf979 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -87,7 +87,6 @@ import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.material.Attachable; import org.bukkit.material.Bed; import org.bukkit.material.Door; @@ -708,10 +707,7 @@ public class ArenaListener } } - // Repair weapons if necessary - if (damager instanceof Player) { - repairWeapon((Player) damager); - } else if (damager instanceof TNTPrimed) { + if (damager instanceof TNTPrimed) { damager = getPlanter(damager); } } @@ -764,9 +760,6 @@ public class ArenaListener } if (arena.inArena(player)) { - // Repair armor if necessary - repairArmor(player); - // Cancel PvP damage if disabled if (!pvpEnabled && damager instanceof Player && !damager.equals(player)) { event.setCancelled(true); @@ -849,51 +842,6 @@ public class ArenaListener } } - private static final EnumSet REPAIRABLE_TYPES = EnumSet.of( - // Tools and swords - Material.GOLDEN_AXE, Material.GOLDEN_HOE, Material.GOLDEN_PICKAXE, Material.GOLDEN_SHOVEL, Material.GOLDEN_SWORD, - Material.WOODEN_AXE, Material.WOODEN_HOE, Material.WOODEN_PICKAXE, Material.WOODEN_SHOVEL, Material.WOODEN_SWORD, - Material.STONE_AXE, Material.STONE_HOE, Material.STONE_PICKAXE, Material.STONE_SHOVEL, Material.STONE_SWORD, - Material.IRON_AXE, Material.IRON_HOE, Material.IRON_PICKAXE, Material.IRON_SHOVEL, Material.IRON_SWORD, - Material.DIAMOND_AXE, Material.DIAMOND_HOE, Material.DIAMOND_PICKAXE, Material.DIAMOND_SHOVEL, Material.DIAMOND_SWORD, - // Armor - Material.LEATHER_HELMET, Material.LEATHER_CHESTPLATE, Material.LEATHER_LEGGINGS, Material.LEATHER_BOOTS, - Material.GOLDEN_HELMET, Material.GOLDEN_CHESTPLATE, Material.GOLDEN_LEGGINGS, Material.GOLDEN_BOOTS, - Material.CHAINMAIL_HELMET, Material.CHAINMAIL_CHESTPLATE, Material.CHAINMAIL_LEGGINGS, Material.CHAINMAIL_BOOTS, - Material.IRON_HELMET, Material.IRON_CHESTPLATE, Material.IRON_LEGGINGS, Material.IRON_BOOTS, - Material.DIAMOND_HELMET, Material.DIAMOND_CHESTPLATE, Material.DIAMOND_LEGGINGS, Material.DIAMOND_BOOTS, - // Misc - Material.BOW, Material.FLINT_AND_STEEL, Material.FISHING_ROD, Material.SHEARS, Material.CARROT_ON_A_STICK, Material.SHIELD - ); - - private void repairWeapon(Player p) { - ArenaPlayer ap = arena.getArenaPlayer(p); - if (ap != null) { - ArenaClass ac = ap.getArenaClass(); - if (ac != null && ac.hasUnbreakableWeapons()) { - repair(p.getInventory().getItemInMainHand()); - repair(p.getInventory().getItemInOffHand()); - } - } - } - - private void repairArmor(Player p) { - ArenaClass ac = arena.getArenaPlayer(p).getArenaClass(); - if (ac != null && ac.hasUnbreakableArmor()) { - PlayerInventory inv = p.getInventory(); - repair(inv.getHelmet()); - repair(inv.getChestplate()); - repair(inv.getLeggings()); - repair(inv.getBoots()); - } - } - - private void repair(ItemStack stack) { - if (stack != null && REPAIRABLE_TYPES.contains(stack.getType())) { - stack.setDurability((short) 0); - } - } - public void onEntityCombust(EntityCombustEvent event) { if (monsters.getMonsters().contains(event.getEntity())) { if (event instanceof EntityCombustByBlockEvent || event instanceof EntityCombustByEntityEvent) {