001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.io.DataInputStream;
006    import java.io.DataOutputStream;
007    import java.io.IOException;
008    import java.util.ArrayList;
009    
010    public class MerchantRecipeList extends ArrayList
011    {
012        public MerchantRecipeList() {}
013    
014        public MerchantRecipeList(NBTTagCompound par1NBTTagCompound)
015        {
016            this.readRecipiesFromTags(par1NBTTagCompound);
017        }
018    
019        /**
020         * can par1,par2 be used to in crafting recipe par3
021         */
022        public MerchantRecipe canRecipeBeUsed(ItemStack par1ItemStack, ItemStack par2ItemStack, int par3)
023        {
024            if (par3 > 0 && par3 < this.size())
025            {
026                MerchantRecipe var4 = (MerchantRecipe)this.get(par3);
027    
028                if (par1ItemStack.itemID == var4.getItemToBuy().itemID && (par2ItemStack == null && !var4.hasSecondItemToBuy() || var4.hasSecondItemToBuy() && par2ItemStack != null && var4.getSecondItemToBuy().itemID == par2ItemStack.itemID))
029                {
030                    if (par1ItemStack.stackSize >= var4.getItemToBuy().stackSize && (!var4.hasSecondItemToBuy() || par2ItemStack.stackSize >= var4.getSecondItemToBuy().stackSize))
031                    {
032                        return var4;
033                    }
034    
035                    return null;
036                }
037            }
038    
039            for (int var6 = 0; var6 < this.size(); ++var6)
040            {
041                MerchantRecipe var5 = (MerchantRecipe)this.get(var6);
042    
043                if (par1ItemStack.itemID == var5.getItemToBuy().itemID && par1ItemStack.stackSize >= var5.getItemToBuy().stackSize && (!var5.hasSecondItemToBuy() && par2ItemStack == null || var5.hasSecondItemToBuy() && par2ItemStack != null && var5.getSecondItemToBuy().itemID == par2ItemStack.itemID && par2ItemStack.stackSize >= var5.getSecondItemToBuy().stackSize))
044                {
045                    return var5;
046                }
047            }
048    
049            return null;
050        }
051    
052        /**
053         * checks if there is a recipie for the same ingredients already on the list, and replaces it. otherwise, adds it
054         */
055        public void addToListWithCheck(MerchantRecipe par1MerchantRecipe)
056        {
057            for (int var2 = 0; var2 < this.size(); ++var2)
058            {
059                MerchantRecipe var3 = (MerchantRecipe)this.get(var2);
060    
061                if (par1MerchantRecipe.hasSameIDsAs(var3))
062                {
063                    if (par1MerchantRecipe.hasSameItemsAs(var3))
064                    {
065                        this.set(var2, par1MerchantRecipe);
066                    }
067    
068                    return;
069                }
070            }
071    
072            this.add(par1MerchantRecipe);
073        }
074    
075        public void writeRecipiesToStream(DataOutputStream par1DataOutputStream) throws IOException
076        {
077            par1DataOutputStream.writeByte((byte)(this.size() & 255));
078    
079            for (int var2 = 0; var2 < this.size(); ++var2)
080            {
081                MerchantRecipe var3 = (MerchantRecipe)this.get(var2);
082                Packet.writeItemStack(var3.getItemToBuy(), par1DataOutputStream);
083                Packet.writeItemStack(var3.getItemToSell(), par1DataOutputStream);
084                ItemStack var4 = var3.getSecondItemToBuy();
085                par1DataOutputStream.writeBoolean(var4 != null);
086    
087                if (var4 != null)
088                {
089                    Packet.writeItemStack(var4, par1DataOutputStream);
090                }
091            }
092        }
093    
094        @SideOnly(Side.CLIENT)
095        public static MerchantRecipeList readRecipiesFromStream(DataInputStream par0DataInputStream) throws IOException
096        {
097            MerchantRecipeList var1 = new MerchantRecipeList();
098            int var2 = par0DataInputStream.readByte() & 255;
099    
100            for (int var3 = 0; var3 < var2; ++var3)
101            {
102                ItemStack var4 = Packet.readItemStack(par0DataInputStream);
103                ItemStack var5 = Packet.readItemStack(par0DataInputStream);
104                ItemStack var6 = null;
105    
106                if (par0DataInputStream.readBoolean())
107                {
108                    var6 = Packet.readItemStack(par0DataInputStream);
109                }
110    
111                var1.add(new MerchantRecipe(var4, var6, var5));
112            }
113    
114            return var1;
115        }
116    
117        public void readRecipiesFromTags(NBTTagCompound par1NBTTagCompound)
118        {
119            NBTTagList var2 = par1NBTTagCompound.getTagList("Recipes");
120    
121            for (int var3 = 0; var3 < var2.tagCount(); ++var3)
122            {
123                NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
124                this.add(new MerchantRecipe(var4));
125            }
126        }
127    
128        public NBTTagCompound getRecipiesAsTags()
129        {
130            NBTTagCompound var1 = new NBTTagCompound();
131            NBTTagList var2 = new NBTTagList("Recipes");
132    
133            for (int var3 = 0; var3 < this.size(); ++var3)
134            {
135                MerchantRecipe var4 = (MerchantRecipe)this.get(var3);
136                var2.appendTag(var4.writeToTags());
137            }
138    
139            var1.setTag("Recipes", var2);
140            return var1;
141        }
142    }