    001    package net.minecraft.src;
    002
    003    public abstract class Enchantment
    004    {
    005        public static final Enchantment[] enchantmentsList = new Enchantment[256];
    006
    007        /** Converts environmental damage to armour damage */
    008        public static final Enchantment protection = new EnchantmentProtection(0, 10, 0);
    009
    010        /** Protection against fire */
    011        public static final Enchantment fireProtection = new EnchantmentProtection(1, 5, 1);
    012
    013        /** Less fall damage */
    014        public static final Enchantment featherFalling = new EnchantmentProtection(2, 5, 2);
    015
    016        /** Protection against explosions */
    017        public static final Enchantment blastProtection = new EnchantmentProtection(3, 2, 3);
    018
    019        /** Protection against projectile entities (e.g. arrows) */
    020        public static final Enchantment projectileProtection = new EnchantmentProtection(4, 5, 4);
    021
    022        /**
    023         * Decreases the rate of air loss underwater; increases time between damage while suffocating
    024         */
    025        public static final Enchantment respiration = new EnchantmentOxygen(5, 2);
    026
    027        /** Increases underwater mining rate */
    028        public static final Enchantment aquaAffinity = new EnchantmentWaterWorker(6, 2);
    029
    030        /** Extra damage to mobs */
    031        public static final Enchantment sharpness = new EnchantmentDamage(16, 10, 0);
    032
    033        /** Extra damage to zombies, zombie pigmen and skeletons */
    034        public static final Enchantment smite = new EnchantmentDamage(17, 5, 1);
    035
    036        /** Extra damage to spiders, cave spiders and silverfish */
    037        public static final Enchantment baneOfArthropods = new EnchantmentDamage(18, 5, 2);
    038
    039        /** Knocks mob and players backwards upon hit */
    040        public static final Enchantment knockback = new EnchantmentKnockback(19, 5);
    041
    042        /** Lights mobs on fire */
    043        public static final Enchantment fireAspect = new EnchantmentFireAspect(20, 2);
    044
    045        /** Mobs have a chance to drop more loot */
    046        public static final Enchantment looting = new EnchantmentLootBonus(21, 2, EnumEnchantmentType.weapon);
    047
    048        /** Faster resource gathering while in use */
    049        public static final Enchantment efficiency = new EnchantmentDigging(32, 10);
    050
    051        /**
    052         * Blocks mined will drop themselves, even if it should drop something else (e.g. stone will drop stone, not
    053         * cobblestone)
    054         */
    055        public static final Enchantment silkTouch = new EnchantmentUntouching(33, 1);
    056
    057        /**
    058         * Sometimes, the tool's durability will not be spent when the tool is used
    059         */
    060        public static final Enchantment unbreaking = new EnchantmentDurability(34, 5);
    061
    062        /** Can multiply the drop rate of items from blocks */
    063        public static final Enchantment fortune = new EnchantmentLootBonus(35, 2, EnumEnchantmentType.digger);
    064
    065        /** Power enchantment for bows, add's extra damage to arrows. */
    066        public static final Enchantment power = new EnchantmentArrowDamage(48, 10);
    067
    068        /**
    069         * Knockback enchantments for bows, the arrows will knockback the target when hit.
    070         */
    071        public static final Enchantment punch = new EnchantmentArrowKnockback(49, 2);
    072
    073        /**
    074         * Flame enchantment for bows. Arrows fired by the bow will be on fire. Any target hit will also set on fire.
    075         */
    076        public static final Enchantment flame = new EnchantmentArrowFire(50, 2);
    077
    078        /**
    079         * Infinity enchantment for bows. The bow will not consume arrows anymore, but will still required at least one
    080         * arrow on inventory use the bow.
    081         */
    082        public static final Enchantment infinity = new EnchantmentArrowInfinite(51, 1);
    083        public final int effectId;
    084        private final int weight;
    085
    086        /** The EnumEnchantmentType given to this Enchantment. */
    087        public EnumEnchantmentType type;
    088
    089        /** Used in localisation and stats. */
    090        protected String name;
    091
    092        protected Enchantment(int par1, int par2, EnumEnchantmentType par3EnumEnchantmentType)
    093        {
    094            this.effectId = par1;
    095            this.weight = par2;
    096            this.type = par3EnumEnchantmentType;
    097
    098            if (enchantmentsList[par1] != null)
    099            {
    100                throw new IllegalArgumentException("Duplicate enchantment id!");
    101            }
    102            else
    103            {
    104                enchantmentsList[par1] = this;
    105            }
    106        }
    107
    108        public int getWeight()
    109        {
    110            return this.weight;
    111        }
    112
    113        /**
    114         * Returns the minimum level that the enchantment can have.
    115         */
    116        public int getMinLevel()
    117        {
    118            return 1;
    119        }
    120
    121        /**
    122         * Returns the maximum level that the enchantment can have.
    123         */
    124        public int getMaxLevel()
    125        {
    126            return 1;
    127        }
    128
    129        /**
    130         * Returns the minimal value of enchantability needed on the enchantment level passed.
    131         */
    132        public int getMinEnchantability(int par1)
    133        {
    134            return 1 + par1 * 10;
    135        }
    136
    137        /**
    138         * Returns the maximum value of enchantability nedded on the enchantment level passed.
    139         */
    140        public int getMaxEnchantability(int par1)
    141        {
    142            return this.getMinEnchantability(par1) + 5;
    143        }
    144
    145        /**
    146         * Calculates de damage protection of the enchantment based on level and damage source passed.
    147         */
    148        public int calcModifierDamage(int par1, DamageSource par2DamageSource)
    149        {
    150            return 0;
    151        }
    152
    153        /**
    154         * Calculates de (magic) damage done by the enchantment on a living entity based on level and entity passed.
    155         */
    156        public int calcModifierLiving(int par1, EntityLiving par2EntityLiving)
    157        {
    158            return 0;
    159        }
    160
    161        /**
    162         * Determines if the enchantment passed can be applyied together with this enchantment.
    163         */
    164        public boolean canApplyTogether(Enchantment par1Enchantment)
    165        {
    166            return this != par1Enchantment;
    167        }
    168
    169        /**
    170         * Sets the enchantment name
    171         */
    172        public Enchantment setName(String par1Str)
    173        {
    174            this.name = par1Str;
    175            return this;
    176        }
    177
    178        /**
    179         * Return the name of key in translation table of this enchantment.
    180         */
    181        public String getName()
    182        {
    183            return "enchantment." + this.name;
    184        }
    185
    186        /**
    187         * Returns the correct traslated name of the enchantment and the level in roman numbers.
    188         */
    189        public String getTranslatedName(int par1)
    190        {
    191            String var2 = StatCollector.translateToLocal(this.getName());
    192            return var2 + " " + StatCollector.translateToLocal("enchantment.level." + par1);
    193        }
    194
    195        /**
    196        * Called to determine if this enchantment can be applied to a ItemStack
    197        * @param item The ItemStack that the enchantment might be put on
    198        * @return True if the item is valid, false otherwise
    199        */
    200        public boolean canEnchantItem(ItemStack item)
    201        {
    202            return type.canEnchantItem(item.getItem());
    203        }
    204    }