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    }