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    }