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.fireDamage() ? 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    }