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