diff --git a/war/src/main/java/com/tommytony/war/War.java b/war/src/main/java/com/tommytony/war/War.java index 906e024..2752b5f 100644 --- a/war/src/main/java/com/tommytony/war/War.java +++ b/war/src/main/java/com/tommytony/war/War.java @@ -338,11 +338,29 @@ public class War extends JavaPlugin { public ItemStack copyStack(ItemStack originalStack) { ItemStack copiedStack = new ItemStack(originalStack.getType(), originalStack.getAmount(), originalStack.getDurability(), new Byte(originalStack.getData().getData())); copiedStack.setDurability(originalStack.getDurability()); - for (Enchantment enchantment : originalStack.getEnchantments().keySet()) { - copiedStack.addEnchantment(Enchantment.getById(enchantment.getId()), originalStack.getEnchantments().get(enchantment)); - } + copyEnchantments(originalStack, copiedStack); + return copiedStack; } + + public void copyEnchantments(ItemStack originalStack, ItemStack copiedStack) { + for (Enchantment enchantment : originalStack.getEnchantments().keySet()) { + int level = originalStack.getEnchantments().get(enchantment); + safelyEnchant(copiedStack, enchantment, level); + } + } + + public void safelyEnchant(ItemStack target, Enchantment enchantment, int level) { + try { + if (level > enchantment.getMaxLevel()) { + target.addUnsafeEnchantment(Enchantment.getById(enchantment.getId()), level); + } else { + target.addEnchantment(Enchantment.getById(enchantment.getId()), level); + } + } catch (Exception e) { + War.war.log("Failed to apply enchantment id:" + enchantment.getId() + " level:" + level, Level.WARNING); + } + } /** * Converts the player-inventory to a loadout hashmap diff --git a/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java b/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java index d419552..b7674be 100644 --- a/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java +++ b/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java @@ -2,12 +2,14 @@ package com.tommytony.war.event; import java.util.HashMap; import java.util.List; +import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.Event.Result; @@ -228,9 +230,8 @@ public class WarPlayerListener implements Listener { ItemStack inHand = event.getItem(); if (inHand != null) { - ItemStack newItemInHand = new ItemStack(inHand.getType(), inHand.getAmount(), inHand.getDurability(), inHand.getData().getData()); - newItemInHand.setDurability(inHand.getDurability()); - newItemInHand.addEnchantments(inHand.getEnchantments()); + ItemStack newItemInHand = War.war.copyStack(inHand); + event.getPlayer().setItemInHand(newItemInHand); event.setCancelled(true); diff --git a/war/src/main/java/com/tommytony/war/mapper/LoadoutTxtMapper.java b/war/src/main/java/com/tommytony/war/mapper/LoadoutTxtMapper.java index ce19bde..b84c012 100644 --- a/war/src/main/java/com/tommytony/war/mapper/LoadoutTxtMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/LoadoutTxtMapper.java @@ -5,6 +5,8 @@ import java.util.HashMap; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import com.tommytony.war.War; + public class LoadoutTxtMapper { public static String fromLoadoutToString(HashMap loadout) { @@ -51,7 +53,7 @@ public class LoadoutTxtMapper { String[] enchantmentSplit = enchantmentStr.split(":"); int enchantId = Integer.parseInt(enchantmentSplit[0]); int level = Integer.parseInt(enchantmentSplit[1]); - item.addEnchantment(Enchantment.getById(enchantId), level); + War.war.safelyEnchant(item, Enchantment.getById(enchantId), level); } } } diff --git a/war/src/main/java/com/tommytony/war/mapper/LoadoutYmlMapper.java b/war/src/main/java/com/tommytony/war/mapper/LoadoutYmlMapper.java index 63b9d68..1b343ec 100644 --- a/war/src/main/java/com/tommytony/war/mapper/LoadoutYmlMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/LoadoutYmlMapper.java @@ -9,6 +9,8 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import com.tommytony.war.War; + public class LoadoutYmlMapper { public static void fromConfigToLoadouts(ConfigurationSection config, HashMap> loadouts) { @@ -41,7 +43,7 @@ public class LoadoutYmlMapper { if (enchantmentStringSplit.length == 2) { int enchantId = Integer.parseInt(enchantmentStringSplit[0]); int level = Integer.parseInt(enchantmentStringSplit[1]); - stack.addEnchantment(Enchantment.getById(enchantId), level); + War.war.safelyEnchant(stack, Enchantment.getById(enchantId), level); } } } diff --git a/war/src/main/java/com/tommytony/war/mapper/VolumeMapper.java b/war/src/main/java/com/tommytony/war/mapper/VolumeMapper.java index b0c15fb..2d6bf2e 100644 --- a/war/src/main/java/com/tommytony/war/mapper/VolumeMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/VolumeMapper.java @@ -252,7 +252,7 @@ public class VolumeMapper { String[] enchantmentSplit = enchantmentStr.split(":"); int enchantId = Integer.parseInt(enchantmentSplit[0]); int level = Integer.parseInt(enchantmentSplit[1]); - stack.addEnchantment(Enchantment.getById(enchantId), level); + War.war.safelyEnchant(stack, Enchantment.getById(enchantId), level); } } diff --git a/war/src/main/resources/plugin.yml b/war/src/main/resources/plugin.yml index 18fe59f..e019a3e 100644 --- a/war/src/main/resources/plugin.yml +++ b/war/src/main/resources/plugin.yml @@ -201,7 +201,7 @@ commands: /zonecfg playerloadoutasdefault:true -> the player can bring a copy of his outside-world inventory to fight, it replaces the default loadout. \\ /zonecfg reward:default -> sets the winner's reward to your current items. \\\\ Print config \\ - /zonecfg [zone-name] -print (or /zonecfg -p) -> prints out the current warzone settings. \\ + /zonecfg [zone-name] print (or /zonecfg -p) -> prints out the warzone settings. \\ aliases: - setzoneconfig teamcfg: @@ -217,7 +217,7 @@ commands: /teamcfg playerloadoutasdefault:true -> the player can bring a copy of his outside-world inventory to fight, it replaces the default loadout. \\ /teamcfg reward:default -> sets the winner's reward to your current items. \\\\ Print config \\ - /teamcfg [zone-name] -print (or /teamcfg -p) -> prints out the current team settings. \\ + /teamcfg [zone-name] print (or /teamcfg -p) -> prints out the team settings. \\ aliases: - setteamconfig zonemaker: @@ -280,7 +280,7 @@ commands: /warcfg playerloadoutasdefault:true -> the player can bring a copy of his outside-world inventory to fight, it replaces the default loadout. \\ /warcfg reward:default -> sets the winner's reward to your current items. \\\\ Print config \\ - /warcfg -print (or /warcfg -p) -> prints out the current War settings. \\ + /warcfg print (or /warcfg -p) -> prints out the current War settings. \\ aliases: - setwarconfig # Fallback