package net.glowstone.constants; import net.glowstone.inventory.MaterialMatcher; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentTarget; import org.bukkit.inventory.ItemStack; /** * Definitions of enchantment types. */ public final class GlowEnchantment extends Enchantment { private final Impl impl; private GlowEnchantment(Impl impl) { super(impl.id); this.impl = impl; } @Override public String getName() { // nb: returns enum name, not text name return impl.name(); } @Override public int getMaxLevel() { return impl.maxLevel; } @Override public int getStartLevel() { return 1; } @Override public EnchantmentTarget getItemTarget() { return impl.target; } @Override public boolean conflictsWith(Enchantment other) { return impl.group != GROUP_NONE && impl.group == ((GlowEnchantment) other).impl.group; } @Override public boolean canEnchantItem(ItemStack item) { return impl.matcher.matches(item.getType()); } /** * Register all enchantment types with Enchantment. */ public static void register() { for (Impl impl : Impl.values()) { registerEnchantment(new GlowEnchantment(impl)); } stopAcceptingRegistrations(); } private static final MaterialMatcher SWORD_OR_AXE = new MaterialMatcher() { @Override public boolean matches(Material item) { return EnchantmentTarget.WEAPON.includes(item) || item.equals(Material.WOOD_AXE) || item.equals(Material.STONE_AXE) || item.equals(Material.IRON_AXE) || item.equals(Material.DIAMOND_AXE) || item.equals(Material.GOLD_AXE); } }; private static final MaterialMatcher BASE_TOOLS = new MaterialMatcher() { @Override public boolean matches(Material item) { return item.equals(Material.WOOD_SPADE) || item.equals(Material.STONE_SPADE) || item.equals(Material.IRON_SPADE) || item.equals(Material.DIAMOND_SPADE) || item.equals(Material.GOLD_SPADE) || item.equals(Material.WOOD_PICKAXE) || item.equals(Material.STONE_PICKAXE) || item.equals(Material.IRON_PICKAXE) || item.equals(Material.DIAMOND_PICKAXE) || item.equals(Material.GOLD_PICKAXE) || item.equals(Material.WOOD_AXE) || item.equals(Material.STONE_AXE) || item.equals(Material.IRON_AXE) || item.equals(Material.DIAMOND_AXE) || item.equals(Material.GOLD_AXE); } }; private static final MaterialMatcher DIGGING_TOOLS = new MaterialMatcher() { @Override public boolean matches(Material material) { return BASE_TOOLS.matches(material) || material == Material.SHEARS; } }; private static final MaterialMatcher ALL_THINGS = new MaterialMatcher() { @Override public boolean matches(Material material) { return EnchantmentTarget.TOOL.includes(material) || EnchantmentTarget.WEAPON.includes(material) || EnchantmentTarget.ARMOR.includes(material) || material == Material.FISHING_ROD || material == Material.BOW || material == Material.CARROT_STICK; } }; private static final int GROUP_NONE = 0; private static final int GROUP_PROTECT = 1; private static final int GROUP_ATTACK = 2; private static final int GROUP_DIG = 3; private static enum Impl { PROTECTION_ENVIRONMENTAL(0, "Protection", 4, EnchantmentTarget.ARMOR, GROUP_PROTECT), PROTECTION_FIRE(1, "Fire Protection", 4, EnchantmentTarget.ARMOR, GROUP_PROTECT), PROTECTION_FALL(2, "Feather Falling", 4, EnchantmentTarget.ARMOR_FEET, GROUP_PROTECT), PROTECTION_EXPLOSIONS(3, "Blast Protection", 4, EnchantmentTarget.ARMOR), PROTECTION_PROJECTILE(4, "Projectile Protection", 4, EnchantmentTarget.ARMOR, GROUP_PROTECT), OXYGEN(5, "Respiration", 3, EnchantmentTarget.ARMOR_HEAD), WATER_WORKER(6, "Aqua Affinity", 1, EnchantmentTarget.ARMOR_HEAD), THORNS(7, "Thorns", 3, EnchantmentTarget.ARMOR_TORSO, new MatcherAdapter(EnchantmentTarget.ARMOR)), DEPTH_STRIDER(8, "Depth Strider", 3, EnchantmentTarget.ARMOR_FEET), DAMAGE_ALL(16, "Sharpness", 5, EnchantmentTarget.WEAPON, SWORD_OR_AXE, GROUP_ATTACK), DAMAGE_UNDEAD(17, "Smite", 5, EnchantmentTarget.WEAPON, SWORD_OR_AXE, GROUP_ATTACK), DAMAGE_ARTHROPODS(18, "Bane of Arthropods", 5, EnchantmentTarget.WEAPON, SWORD_OR_AXE, GROUP_ATTACK), KNOCKBACK(19, "Knockback", 2, EnchantmentTarget.WEAPON), FIRE_ASPECT(20, "Fire Aspect", 2, EnchantmentTarget.WEAPON), LOOT_BONUS_MOBS(21, "Looting", 3, EnchantmentTarget.WEAPON), DIG_SPEED(32, "Efficiency", 5, EnchantmentTarget.TOOL, DIGGING_TOOLS), SILK_TOUCH(33, "Silk Touch", 1, EnchantmentTarget.TOOL, DIGGING_TOOLS, GROUP_DIG), DURABILITY(34, "Unbreaking", 3, EnchantmentTarget.TOOL, ALL_THINGS), LOOT_BONUS_BLOCKS(35, "Fortune", 3, EnchantmentTarget.TOOL, BASE_TOOLS, GROUP_DIG), ARROW_DAMAGE(48, "Power", 5, EnchantmentTarget.BOW), ARROW_KNOCKBACK(49, "Punch", 2, EnchantmentTarget.BOW), ARROW_FIRE(50, "Flame", 1, EnchantmentTarget.BOW), ARROW_INFINITE(51, "Infinity", 1, EnchantmentTarget.BOW), LUCK(61, "Luck of the Sea", 3, EnchantmentTarget.FISHING_ROD), LURE(62, "Lure", 3, EnchantmentTarget.FISHING_ROD); private final int id; private final String name; private final int maxLevel; private final EnchantmentTarget target; private final MaterialMatcher matcher; private final int group; Impl(int id, String name, int max, EnchantmentTarget target) { this(id, name, max, target, new MatcherAdapter(target), GROUP_NONE); } Impl(int id, String name, int max, EnchantmentTarget target, int group) { this(id, name, max, target, new MatcherAdapter(target), group); } Impl(int id, String name, int max, EnchantmentTarget target, MaterialMatcher matcher) { this(id, name, max, target, matcher, GROUP_NONE); } Impl(int id, String name, int max, EnchantmentTarget target, MaterialMatcher matcher, int group) { this.id = id; this.name = name; this.maxLevel = max; this.target = target; this.matcher = matcher; this.group = group; } } private static class MatcherAdapter implements MaterialMatcher { private final EnchantmentTarget target; public MatcherAdapter(EnchantmentTarget target) { this.target = target; } @Override public boolean matches(Material material) { return target.includes(material); } } }