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