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    }