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 }