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 }