Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / craftbukkit / enchantments / CraftEnchantment.java
@vlad20012 vlad20012 on 24 Feb 2017 4 KB initial
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);
	}
}