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