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