001    package net.minecraft.item;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.List;
006    import java.util.Random;
007    import net.minecraft.enchantment.Enchantment;
008    import net.minecraft.enchantment.EnchantmentData;
009    import net.minecraft.entity.player.EntityPlayer;
010    import net.minecraft.nbt.NBTTagCompound;
011    import net.minecraft.nbt.NBTTagList;
012    import net.minecraft.util.MathHelper;
013    import net.minecraft.util.WeightedRandomChestContent;
014    
015    public class ItemEnchantedBook extends Item
016    {
017        public ItemEnchantedBook(int par1)
018        {
019            super(par1);
020        }
021    
022        @SideOnly(Side.CLIENT)
023        public boolean hasEffect(ItemStack par1ItemStack)
024        {
025            return true;
026        }
027    
028        /**
029         * Checks isDamagable and if it cannot be stacked
030         */
031        public boolean isItemTool(ItemStack par1ItemStack)
032        {
033            return false;
034        }
035    
036        @SideOnly(Side.CLIENT)
037    
038        /**
039         * Return an item rarity from EnumRarity
040         */
041        public EnumRarity getRarity(ItemStack par1ItemStack)
042        {
043            return this.func_92056_g(par1ItemStack).tagCount() > 0 ? EnumRarity.uncommon : super.getRarity(par1ItemStack);
044        }
045    
046        public NBTTagList func_92056_g(ItemStack par1ItemStack)
047        {
048            return par1ItemStack.stackTagCompound != null && par1ItemStack.stackTagCompound.hasKey("StoredEnchantments") ? (NBTTagList)par1ItemStack.stackTagCompound.getTag("StoredEnchantments") : new NBTTagList();
049        }
050    
051        @SideOnly(Side.CLIENT)
052    
053        /**
054         * allows items to add custom lines of information to the mouseover description
055         */
056        public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
057        {
058            super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4);
059            NBTTagList var5 = this.func_92056_g(par1ItemStack);
060    
061            if (var5 != null)
062            {
063                for (int var6 = 0; var6 < var5.tagCount(); ++var6)
064                {
065                    short var7 = ((NBTTagCompound)var5.tagAt(var6)).getShort("id");
066                    short var8 = ((NBTTagCompound)var5.tagAt(var6)).getShort("lvl");
067    
068                    if (Enchantment.enchantmentsList[var7] != null)
069                    {
070                        par3List.add(Enchantment.enchantmentsList[var7].getTranslatedName(var8));
071                    }
072                }
073            }
074        }
075    
076        public void func_92060_a(ItemStack par1ItemStack, EnchantmentData par2EnchantmentData)
077        {
078            NBTTagList var3 = this.func_92056_g(par1ItemStack);
079            boolean var4 = true;
080    
081            for (int var5 = 0; var5 < var3.tagCount(); ++var5)
082            {
083                NBTTagCompound var6 = (NBTTagCompound)var3.tagAt(var5);
084    
085                if (var6.getShort("id") == par2EnchantmentData.enchantmentobj.effectId)
086                {
087                    if (var6.getShort("lvl") < par2EnchantmentData.enchantmentLevel)
088                    {
089                        var6.setShort("lvl", (short)par2EnchantmentData.enchantmentLevel);
090                    }
091    
092                    var4 = false;
093                    break;
094                }
095            }
096    
097            if (var4)
098            {
099                NBTTagCompound var7 = new NBTTagCompound();
100                var7.setShort("id", (short)par2EnchantmentData.enchantmentobj.effectId);
101                var7.setShort("lvl", (short)par2EnchantmentData.enchantmentLevel);
102                var3.appendTag(var7);
103            }
104    
105            if (!par1ItemStack.hasTagCompound())
106            {
107                par1ItemStack.setTagCompound(new NBTTagCompound());
108            }
109    
110            par1ItemStack.getTagCompound().setTag("StoredEnchantments", var3);
111        }
112    
113        public ItemStack func_92057_a(EnchantmentData par1EnchantmentData)
114        {
115            ItemStack var2 = new ItemStack(this);
116            this.func_92060_a(var2, par1EnchantmentData);
117            return var2;
118        }
119    
120        @SideOnly(Side.CLIENT)
121        public void func_92113_a(Enchantment par1Enchantment, List par2List)
122        {
123            for (int var3 = par1Enchantment.getMinLevel(); var3 <= par1Enchantment.getMaxLevel(); ++var3)
124            {
125                par2List.add(this.func_92057_a(new EnchantmentData(par1Enchantment, var3)));
126            }
127        }
128    
129        public ItemStack func_92055_a(Random par1Random)
130        {
131            Enchantment var2 = Enchantment.field_92038_c[par1Random.nextInt(Enchantment.field_92038_c.length)];
132            ItemStack var3 = new ItemStack(this.itemID, 1, 0);
133            int var4 = MathHelper.getRandomIntegerInRange(par1Random, var2.getMinLevel(), var2.getMaxLevel());
134            this.func_92060_a(var3, new EnchantmentData(var2, var4));
135            return var3;
136        }
137    
138        public WeightedRandomChestContent func_92059_b(Random par1Random)
139        {
140            return this.func_92058_a(par1Random, 1, 1, 1);
141        }
142    
143        public WeightedRandomChestContent func_92058_a(Random par1, int par2, int par3, int par4)
144        {
145            Enchantment var5 = Enchantment.field_92038_c[par1.nextInt(Enchantment.field_92038_c.length)];
146            ItemStack var6 = new ItemStack(this.itemID, 1, 0);
147            int var7 = MathHelper.getRandomIntegerInRange(par1, var5.getMinLevel(), var5.getMaxLevel());
148            this.func_92060_a(var6, new EnchantmentData(var5, var7));
149            return new WeightedRandomChestContent(var6, par2, par3, par4);
150        }
151    }