package org.bukkit.craftbukkit.enchantments; import org.apache.commons.lang.StringUtils; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentTarget; import org.bukkit.enchantments.EnchantmentWrapper; import org.bukkit.inventory.ItemStack; public class CraftEnchantment extends Enchantment { private final net.minecraft.enchantment.Enchantment target; public CraftEnchantment(net.minecraft.enchantment.Enchantment target) { super(target.effectId); this.target = target; } @Override public int getMaxLevel() { return target.getMaxLevel(); } @Override public int getStartLevel() { return target.getMinLevel(); } @Override public EnchantmentTarget getItemTarget() { switch(target.type) { case all: return EnchantmentTarget.ALL; case armor: return EnchantmentTarget.ARMOR; case armor_feet: return EnchantmentTarget.ARMOR_FEET; case armor_head: return EnchantmentTarget.ARMOR_HEAD; case armor_legs: return EnchantmentTarget.ARMOR_LEGS; case armor_torso: return EnchantmentTarget.ARMOR_TORSO; case digger: return EnchantmentTarget.TOOL; case weapon: return EnchantmentTarget.WEAPON; case bow: return EnchantmentTarget.BOW; case fishing_rod: return EnchantmentTarget.FISHING_ROD; default: return null; } } @Override public boolean canEnchantItem(ItemStack item) { return target.canApply(CraftItemStack.asNMSCopy(item)); } private String generatedName; @Override public String getName() { switch(target.effectId) { case 0: return "PROTECTION_ENVIRONMENTAL"; case 1: return "PROTECTION_FIRE"; case 2: return "PROTECTION_FALL"; case 3: return "PROTECTION_EXPLOSIONS"; case 4: return "PROTECTION_PROJECTILE"; case 5: return "OXYGEN"; case 6: return "WATER_WORKER"; case 7: return "THORNS"; case 16: return "DAMAGE_ALL"; case 17: return "DAMAGE_UNDEAD"; case 18: return "DAMAGE_ARTHROPODS"; case 19: return "KNOCKBACK"; case 20: return "FIRE_ASPECT"; case 21: return "LOOT_BONUS_MOBS"; case 32: return "DIG_SPEED"; case 33: return "SILK_TOUCH"; case 34: return "DURABILITY"; case 35: return "LOOT_BONUS_BLOCKS"; case 48: return "ARROW_DAMAGE"; case 49: return "ARROW_KNOCKBACK"; case 50: return "ARROW_FIRE"; case 51: return "ARROW_INFINITE"; case 61: return "LUCK"; case 62: return "LURE"; default: // Cauldron start - generate based on the class name if(generatedName != null) { return generatedName; } generatedName = generateName(target); return generatedName; // Cauldron end } } // Cauldron start - generate based on the class name private static String generateName(net.minecraft.enchantment.Enchantment target) { String candidate; Class<?> clz = target.getClass(); if(clz.getName().startsWith("net.minecraft")) { // Keep pattern for vanilla candidate = "UNKNOWN_ENCHANT_" + target.effectId; return candidate; } candidate = clz.getSimpleName(); // Make a nice name when it starts with Enchantment (e.g. EnchantmentSlowFall) if(StringUtils.containsIgnoreCase(candidate, "Enchantment")) { candidate = candidate.replaceFirst("[E|e]nchantment", ""); // Add underscores at camelCase humps candidate = candidate.replaceAll("([a-z])([A-Z])", "\1_\2").toUpperCase(); candidate = addSuffix(candidate.toUpperCase()); return candidate; } // fall back to the FQN if naming pattern is broken candidate = clz.getName(); candidate = candidate.replaceAll("([a-z])([A-Z])", "\1_\2"); candidate = candidate.replaceAll("\\.", "_"); candidate = addSuffix(candidate.toUpperCase()); return candidate; } private static String addSuffix(String enchName) { if(Enchantment.getByName(enchName) == null) { return enchName; } int suffix = 2; while(Enchantment.getByName(enchName + "_" + suffix) != null) { suffix++; } return enchName + "_" + suffix; } // Cauldron end public static net.minecraft.enchantment.Enchantment getRaw(Enchantment enchantment) { if(enchantment instanceof EnchantmentWrapper) { enchantment = ((EnchantmentWrapper) enchantment).getEnchantment(); } if(enchantment instanceof CraftEnchantment) { return ((CraftEnchantment) enchantment).target; } return null; } @Override public boolean conflictsWith(Enchantment other) { if(other instanceof EnchantmentWrapper) { other = ((EnchantmentWrapper) other).getEnchantment(); } if(!(other instanceof CraftEnchantment)) { return false; } CraftEnchantment ench = (CraftEnchantment) other; return !target.canApplyTogether(ench.target); } }