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