001package net.minecraft.village;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.io.DataInputStream;
006import java.io.DataOutputStream;
007import java.io.IOException;
008import java.util.ArrayList;
009import net.minecraft.item.ItemStack;
010import net.minecraft.nbt.NBTTagCompound;
011import net.minecraft.nbt.NBTTagList;
012import net.minecraft.network.packet.Packet;
013
014public 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 merchantrecipe = (MerchantRecipe)this.get(par3);
031            return par1ItemStack.itemID == merchantrecipe.getItemToBuy().itemID && (par2ItemStack == null && !merchantrecipe.hasSecondItemToBuy() || merchantrecipe.hasSecondItemToBuy() && par2ItemStack != null && merchantrecipe.getSecondItemToBuy().itemID == par2ItemStack.itemID) && par1ItemStack.stackSize >= merchantrecipe.getItemToBuy().stackSize && (!merchantrecipe.hasSecondItemToBuy() || par2ItemStack.stackSize >= merchantrecipe.getSecondItemToBuy().stackSize) ? merchantrecipe : null;
032        }
033        else
034        {
035            for (int j = 0; j < this.size(); ++j)
036            {
037                MerchantRecipe merchantrecipe1 = (MerchantRecipe)this.get(j);
038
039                if (par1ItemStack.itemID == merchantrecipe1.getItemToBuy().itemID && par1ItemStack.stackSize >= merchantrecipe1.getItemToBuy().stackSize && (!merchantrecipe1.hasSecondItemToBuy() && par2ItemStack == null || merchantrecipe1.hasSecondItemToBuy() && par2ItemStack != null && merchantrecipe1.getSecondItemToBuy().itemID == par2ItemStack.itemID && par2ItemStack.stackSize >= merchantrecipe1.getSecondItemToBuy().stackSize))
040                {
041                    return merchantrecipe1;
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 i = 0; i < this.size(); ++i)
055        {
056            MerchantRecipe merchantrecipe1 = (MerchantRecipe)this.get(i);
057
058            if (par1MerchantRecipe.hasSameIDsAs(merchantrecipe1))
059            {
060                if (par1MerchantRecipe.hasSameItemsAs(merchantrecipe1))
061                {
062                    this.set(i, 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 i = 0; i < this.size(); ++i)
077        {
078            MerchantRecipe merchantrecipe = (MerchantRecipe)this.get(i);
079            Packet.writeItemStack(merchantrecipe.getItemToBuy(), par1DataOutputStream);
080            Packet.writeItemStack(merchantrecipe.getItemToSell(), par1DataOutputStream);
081            ItemStack itemstack = merchantrecipe.getSecondItemToBuy();
082            par1DataOutputStream.writeBoolean(itemstack != null);
083
084            if (itemstack != null)
085            {
086                Packet.writeItemStack(itemstack, par1DataOutputStream);
087            }
088
089            par1DataOutputStream.writeBoolean(merchantrecipe.func_82784_g());
090        }
091    }
092
093    @SideOnly(Side.CLIENT)
094    public static MerchantRecipeList readRecipiesFromStream(DataInputStream par0DataInputStream) throws IOException
095    {
096        MerchantRecipeList merchantrecipelist = new MerchantRecipeList();
097        int i = par0DataInputStream.readByte() & 255;
098
099        for (int j = 0; j < i; ++j)
100        {
101            ItemStack itemstack = Packet.readItemStack(par0DataInputStream);
102            ItemStack itemstack1 = Packet.readItemStack(par0DataInputStream);
103            ItemStack itemstack2 = null;
104
105            if (par0DataInputStream.readBoolean())
106            {
107                itemstack2 = Packet.readItemStack(par0DataInputStream);
108            }
109
110            boolean flag = par0DataInputStream.readBoolean();
111            MerchantRecipe merchantrecipe = new MerchantRecipe(itemstack, itemstack2, itemstack1);
112
113            if (flag)
114            {
115                merchantrecipe.func_82785_h();
116            }
117
118            merchantrecipelist.add(merchantrecipe);
119        }
120
121        return merchantrecipelist;
122    }
123
124    public void readRecipiesFromTags(NBTTagCompound par1NBTTagCompound)
125    {
126        NBTTagList nbttaglist = par1NBTTagCompound.getTagList("Recipes");
127
128        for (int i = 0; i < nbttaglist.tagCount(); ++i)
129        {
130            NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.tagAt(i);
131            this.add(new MerchantRecipe(nbttagcompound1));
132        }
133    }
134
135    public NBTTagCompound getRecipiesAsTags()
136    {
137        NBTTagCompound nbttagcompound = new NBTTagCompound();
138        NBTTagList nbttaglist = new NBTTagList("Recipes");
139
140        for (int i = 0; i < this.size(); ++i)
141        {
142            MerchantRecipe merchantrecipe = (MerchantRecipe)this.get(i);
143            nbttaglist.appendTag(merchantrecipe.writeToTags());
144        }
145
146        nbttagcompound.setTag("Recipes", nbttaglist);
147        return nbttagcompound;
148    }
149}