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