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