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 }