001 package net.minecraft.enchantment;
002
003 import net.minecraft.entity.Entity;
004 import net.minecraft.util.DamageSource;
005 import net.minecraft.util.MathHelper;
006
007 public class EnchantmentProtection extends Enchantment
008 {
009 /** Holds the name to be translated of each protection type. */
010 private static final String[] protectionName = new String[] {"all", "fire", "fall", "explosion", "projectile"};
011
012 /**
013 * Holds the base factor of enchantability needed to be able to use the enchant.
014 */
015 private static final int[] baseEnchantability = new int[] {1, 10, 5, 5, 3};
016
017 /**
018 * Holds how much each level increased the enchantability factor to be able to use this enchant.
019 */
020 private static final int[] levelEnchantability = new int[] {11, 8, 6, 8, 6};
021
022 /**
023 * Used on the formula of base enchantability, this is the 'window' factor of values to be able to use thing
024 * enchant.
025 */
026 private static final int[] thresholdEnchantability = new int[] {20, 12, 10, 12, 15};
027
028 /**
029 * Defines the type of protection of the enchantment, 0 = all, 1 = fire, 2 = fall (feather fall), 3 = explosion and
030 * 4 = projectile.
031 */
032 public final int protectionType;
033
034 public EnchantmentProtection(int par1, int par2, int par3)
035 {
036 super(par1, par2, EnumEnchantmentType.armor);
037 this.protectionType = par3;
038
039 if (par3 == 2)
040 {
041 this.type = EnumEnchantmentType.armor_feet;
042 }
043 }
044
045 /**
046 * Returns the minimal value of enchantability needed on the enchantment level passed.
047 */
048 public int getMinEnchantability(int par1)
049 {
050 return baseEnchantability[this.protectionType] + (par1 - 1) * levelEnchantability[this.protectionType];
051 }
052
053 /**
054 * Returns the maximum value of enchantability nedded on the enchantment level passed.
055 */
056 public int getMaxEnchantability(int par1)
057 {
058 return this.getMinEnchantability(par1) + thresholdEnchantability[this.protectionType];
059 }
060
061 /**
062 * Returns the maximum level that the enchantment can have.
063 */
064 public int getMaxLevel()
065 {
066 return 4;
067 }
068
069 /**
070 * Calculates de damage protection of the enchantment based on level and damage source passed.
071 */
072 public int calcModifierDamage(int par1, DamageSource par2DamageSource)
073 {
074 if (par2DamageSource.canHarmInCreative())
075 {
076 return 0;
077 }
078 else
079 {
080 float var3 = (float)(6 + par1 * par1) / 3.0F;
081 return this.protectionType == 0 ? MathHelper.floor_float(var3 * 0.75F) : (this.protectionType == 1 && par2DamageSource.isFireDamage() ? MathHelper.floor_float(var3 * 1.25F) : (this.protectionType == 2 && par2DamageSource == DamageSource.fall ? MathHelper.floor_float(var3 * 2.5F) : ((this.protectionType != 3 || par2DamageSource != DamageSource.explosion) && par2DamageSource != DamageSource.explosion2 ? (this.protectionType == 4 && par2DamageSource.isProjectile() ? MathHelper.floor_float(var3 * 1.5F) : 0) : MathHelper.floor_float(var3 * 1.5F))));
082 }
083 }
084
085 /**
086 * Return the name of key in translation table of this enchantment.
087 */
088 public String getName()
089 {
090 return "enchantment.protect." + protectionName[this.protectionType];
091 }
092
093 /**
094 * Determines if the enchantment passed can be applyied together with this enchantment.
095 */
096 public boolean canApplyTogether(Enchantment par1Enchantment)
097 {
098 if (par1Enchantment instanceof EnchantmentProtection)
099 {
100 EnchantmentProtection var2 = (EnchantmentProtection)par1Enchantment;
101 return var2.protectionType == this.protectionType ? false : this.protectionType == 2 || var2.protectionType == 2;
102 }
103 else
104 {
105 return super.canApplyTogether(par1Enchantment);
106 }
107 }
108
109 public static int func_92041_a(Entity par0Entity, int par1)
110 {
111 int var2 = EnchantmentHelper.getMaxEnchantmentLevel(Enchantment.fireProtection.effectId, par0Entity.getLastActiveItems());
112
113 if (var2 > 0)
114 {
115 par1 -= MathHelper.floor_float((float)par1 * (float)var2 * 0.15F);
116 }
117
118 return par1;
119 }
120
121 public static double func_92040_a(Entity par0Entity, double par1)
122 {
123 int var3 = EnchantmentHelper.getMaxEnchantmentLevel(Enchantment.blastProtection.effectId, par0Entity.getLastActiveItems());
124
125 if (var3 > 0)
126 {
127 par1 -= (double)MathHelper.floor_double(par1 * (double)((float)var3 * 0.15F));
128 }
129
130 return par1;
131 }
132 }