    001package net.minecraft.enchantment;
    002
    003import net.minecraft.entity.Entity;
    004import net.minecraft.util.DamageSource;
    005import net.minecraft.util.MathHelper;
    006
    007public class EnchantmentProtection extends Enchantment
    008{
    009    /** Holds the name to be translated of each protection type. */
    010    private static final String[] protectionName = new String[] {"all", "fire", "fall", "explosion", "projectile"};
    011
    012    /**
    013     * Holds the base factor of enchantability needed to be able to use the enchant.
    014     */
    015    private static final int[] baseEnchantability = new int[] {1, 10, 5, 5, 3};
    016
    017    /**
    018     * Holds how much each level increased the enchantability factor to be able to use this enchant.
    019     */
    020    private static final int[] levelEnchantability = new int[] {11, 8, 6, 8, 6};
    021
    022    /**
    023     * Used on the formula of base enchantability, this is the 'window' factor of values to be able to use thing
    024     * enchant.
    025     */
    026    private static final int[] thresholdEnchantability = new int[] {20, 12, 10, 12, 15};
    027
    028    /**
    029     * Defines the type of protection of the enchantment, 0 = all, 1 = fire, 2 = fall (feather fall), 3 = explosion and
    030     * 4 = projectile.
    031     */
    032    public final int protectionType;
    033
    034    public EnchantmentProtection(int par1, int par2, int par3)
    035    {
    036        super(par1, par2, EnumEnchantmentType.armor);
    037        this.protectionType = par3;
    038
    039        if (par3 == 2)
    040        {
    041            this.type = EnumEnchantmentType.armor_feet;
    042        }
    043    }
    044
    045    /**
    046     * Returns the minimal value of enchantability needed on the enchantment level passed.
    047     */
    048    public int getMinEnchantability(int par1)
    049    {
    050        return baseEnchantability[this.protectionType] + (par1 - 1) * levelEnchantability[this.protectionType];
    051    }
    052
    053    /**
    054     * Returns the maximum value of enchantability nedded on the enchantment level passed.
    055     */
    056    public int getMaxEnchantability(int par1)
    057    {
    058        return this.getMinEnchantability(par1) + thresholdEnchantability[this.protectionType];
    059    }
    060
    061    /**
    062     * Returns the maximum level that the enchantment can have.
    063     */
    064    public int getMaxLevel()
    065    {
    066        return 4;
    067    }
    068
    069    /**
    070     * Calculates de damage protection of the enchantment based on level and damage source passed.
    071     */
    072    public int calcModifierDamage(int par1, DamageSource par2DamageSource)
    073    {
    074        if (par2DamageSource.canHarmInCreative())
    075        {
    076            return 0;
    077        }
    078        else
    079        {
    080            float f = (float)(6 + par1 * par1) / 3.0F;
    081            return this.protectionType == 0 ? MathHelper.floor_float(f * 0.75F) : (this.protectionType == 1 && par2DamageSource.isFireDamage() ? MathHelper.floor_float(f * 1.25F) : (this.protectionType == 2 && par2DamageSource == DamageSource.fall ? MathHelper.floor_float(f * 2.5F) : (this.protectionType == 3 && par2DamageSource.func_94541_c() ? MathHelper.floor_float(f * 1.5F) : (this.protectionType == 4 && par2DamageSource.isProjectile() ? MathHelper.floor_float(f * 1.5F) : 0))));
    082        }
    083    }
    084
    085    /**
    086     * Return the name of key in translation table of this enchantment.
    087     */
    088    public String getName()
    089    {
    090        return "enchantment.protect." + protectionName[this.protectionType];
    091    }
    092
    093    /**
    094     * Determines if the enchantment passed can be applyied together with this enchantment.
    095     */
    096    public boolean canApplyTogether(Enchantment par1Enchantment)
    097    {
    098        if (par1Enchantment instanceof EnchantmentProtection)
    099        {
    100            EnchantmentProtection enchantmentprotection = (EnchantmentProtection)par1Enchantment;
    101            return enchantmentprotection.protectionType == this.protectionType ? false : this.protectionType == 2 || enchantmentprotection.protectionType == 2;
    102        }
    103        else
    104        {
    105            return super.canApplyTogether(par1Enchantment);
    106        }
    107    }
    108
    109    public static int func_92093_a(Entity par0Entity, int par1)
    110    {
    111        int j = EnchantmentHelper.getMaxEnchantmentLevel(Enchantment.fireProtection.effectId, par0Entity.getLastActiveItems());
    112
    113        if (j > 0)
    114        {
    115            par1 -= MathHelper.floor_float((float)par1 * (float)j * 0.15F);
    116        }
    117
    118        return par1;
    119    }
    120
    121    public static double func_92092_a(Entity par0Entity, double par1)
    122    {
    123        int i = EnchantmentHelper.getMaxEnchantmentLevel(Enchantment.blastProtection.effectId, par0Entity.getLastActiveItems());
    124
    125        if (i > 0)
    126        {
    127            par1 -= (double)MathHelper.floor_double(par1 * (double)((float)i * 0.15F));
    128        }
    129
    130        return par1;
    131    }
    132}