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