001package net.minecraft.item;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.List;
006import java.util.Random;
007import net.minecraft.enchantment.Enchantment;
008import net.minecraft.enchantment.EnchantmentData;
009import net.minecraft.entity.player.EntityPlayer;
010import net.minecraft.nbt.NBTTagCompound;
011import net.minecraft.nbt.NBTTagList;
012import net.minecraft.util.MathHelper;
013import net.minecraft.util.WeightedRandomChestContent;
014
015public 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_92110_g(par1ItemStack).tagCount() > 0 ? EnumRarity.uncommon : super.getRarity(par1ItemStack);
044    }
045
046    public NBTTagList func_92110_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 nbttaglist = this.func_92110_g(par1ItemStack);
060
061        if (nbttaglist != null)
062        {
063            for (int i = 0; i < nbttaglist.tagCount(); ++i)
064            {
065                short short1 = ((NBTTagCompound)nbttaglist.tagAt(i)).getShort("id");
066                short short2 = ((NBTTagCompound)nbttaglist.tagAt(i)).getShort("lvl");
067
068                if (Enchantment.enchantmentsList[short1] != null)
069                {
070                    par3List.add(Enchantment.enchantmentsList[short1].getTranslatedName(short2));
071                }
072            }
073        }
074    }
075
076    public void func_92115_a(ItemStack par1ItemStack, EnchantmentData par2EnchantmentData)
077    {
078        NBTTagList nbttaglist = this.func_92110_g(par1ItemStack);
079        boolean flag = true;
080
081        for (int i = 0; i < nbttaglist.tagCount(); ++i)
082        {
083            NBTTagCompound nbttagcompound = (NBTTagCompound)nbttaglist.tagAt(i);
084
085            if (nbttagcompound.getShort("id") == par2EnchantmentData.enchantmentobj.effectId)
086            {
087                if (nbttagcompound.getShort("lvl") < par2EnchantmentData.enchantmentLevel)
088                {
089                    nbttagcompound.setShort("lvl", (short)par2EnchantmentData.enchantmentLevel);
090                }
091
092                flag = false;
093                break;
094            }
095        }
096
097        if (flag)
098        {
099            NBTTagCompound nbttagcompound1 = new NBTTagCompound();
100            nbttagcompound1.setShort("id", (short)par2EnchantmentData.enchantmentobj.effectId);
101            nbttagcompound1.setShort("lvl", (short)par2EnchantmentData.enchantmentLevel);
102            nbttaglist.appendTag(nbttagcompound1);
103        }
104
105        if (!par1ItemStack.hasTagCompound())
106        {
107            par1ItemStack.setTagCompound(new NBTTagCompound());
108        }
109
110        par1ItemStack.getTagCompound().setTag("StoredEnchantments", nbttaglist);
111    }
112
113    public ItemStack func_92111_a(EnchantmentData par1EnchantmentData)
114    {
115        ItemStack itemstack = new ItemStack(this);
116        this.func_92115_a(itemstack, par1EnchantmentData);
117        return itemstack;
118    }
119
120    @SideOnly(Side.CLIENT)
121    public void func_92113_a(Enchantment par1Enchantment, List par2List)
122    {
123        for (int i = par1Enchantment.getMinLevel(); i <= par1Enchantment.getMaxLevel(); ++i)
124        {
125            par2List.add(this.func_92111_a(new EnchantmentData(par1Enchantment, i)));
126        }
127    }
128
129    public ItemStack func_92109_a(Random par1Random)
130    {
131        Enchantment enchantment = Enchantment.field_92090_c[par1Random.nextInt(Enchantment.field_92090_c.length)];
132        ItemStack itemstack = new ItemStack(this.itemID, 1, 0);
133        int i = MathHelper.getRandomIntegerInRange(par1Random, enchantment.getMinLevel(), enchantment.getMaxLevel());
134        this.func_92115_a(itemstack, new EnchantmentData(enchantment, i));
135        return itemstack;
136    }
137
138    public WeightedRandomChestContent func_92114_b(Random par1Random)
139    {
140        return this.func_92112_a(par1Random, 1, 1, 1);
141    }
142
143    public WeightedRandomChestContent func_92112_a(Random par1Random, int par2, int par3, int par4)
144    {
145        Enchantment enchantment = Enchantment.field_92090_c[par1Random.nextInt(Enchantment.field_92090_c.length)];
146        ItemStack itemstack = new ItemStack(this.itemID, 1, 0);
147        int l = MathHelper.getRandomIntegerInRange(par1Random, enchantment.getMinLevel(), enchantment.getMaxLevel());
148        this.func_92115_a(itemstack, new EnchantmentData(enchantment, l));
149        return new WeightedRandomChestContent(itemstack, par2, par3, par4);
150    }
151}