001    package net.minecraft.inventory;
002    
003    import net.minecraft.entity.IMerchant;
004    import net.minecraft.entity.player.EntityPlayer;
005    import net.minecraft.item.ItemStack;
006    import net.minecraft.village.MerchantRecipe;
007    import net.minecraft.village.MerchantRecipeList;
008    
009    public class InventoryMerchant implements IInventory
010    {
011        private final IMerchant theMerchant;
012        private ItemStack[] theInventory = new ItemStack[3];
013        private final EntityPlayer thePlayer;
014        private MerchantRecipe currentRecipe;
015        private int currentRecipeIndex;
016    
017        public InventoryMerchant(EntityPlayer par1EntityPlayer, IMerchant par2IMerchant)
018        {
019            this.thePlayer = par1EntityPlayer;
020            this.theMerchant = par2IMerchant;
021        }
022    
023        /**
024         * Returns the number of slots in the inventory.
025         */
026        public int getSizeInventory()
027        {
028            return this.theInventory.length;
029        }
030    
031        /**
032         * Returns the stack in slot i
033         */
034        public ItemStack getStackInSlot(int par1)
035        {
036            return this.theInventory[par1];
037        }
038    
039        /**
040         * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
041         * new stack.
042         */
043        public ItemStack decrStackSize(int par1, int par2)
044        {
045            if (this.theInventory[par1] != null)
046            {
047                ItemStack var3;
048    
049                if (par1 == 2)
050                {
051                    var3 = this.theInventory[par1];
052                    this.theInventory[par1] = null;
053                    return var3;
054                }
055                else if (this.theInventory[par1].stackSize <= par2)
056                {
057                    var3 = this.theInventory[par1];
058                    this.theInventory[par1] = null;
059    
060                    if (this.inventoryResetNeededOnSlotChange(par1))
061                    {
062                        this.resetRecipeAndSlots();
063                    }
064    
065                    return var3;
066                }
067                else
068                {
069                    var3 = this.theInventory[par1].splitStack(par2);
070    
071                    if (this.theInventory[par1].stackSize == 0)
072                    {
073                        this.theInventory[par1] = null;
074                    }
075    
076                    if (this.inventoryResetNeededOnSlotChange(par1))
077                    {
078                        this.resetRecipeAndSlots();
079                    }
080    
081                    return var3;
082                }
083            }
084            else
085            {
086                return null;
087            }
088        }
089    
090        /**
091         * if par1 slot has changed, does resetRecipeAndSlots need to be called?
092         */
093        private boolean inventoryResetNeededOnSlotChange(int par1)
094        {
095            return par1 == 0 || par1 == 1;
096        }
097    
098        /**
099         * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
100         * like when you close a workbench GUI.
101         */
102        public ItemStack getStackInSlotOnClosing(int par1)
103        {
104            if (this.theInventory[par1] != null)
105            {
106                ItemStack var2 = this.theInventory[par1];
107                this.theInventory[par1] = null;
108                return var2;
109            }
110            else
111            {
112                return null;
113            }
114        }
115    
116        /**
117         * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
118         */
119        public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
120        {
121            this.theInventory[par1] = par2ItemStack;
122    
123            if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit())
124            {
125                par2ItemStack.stackSize = this.getInventoryStackLimit();
126            }
127    
128            if (this.inventoryResetNeededOnSlotChange(par1))
129            {
130                this.resetRecipeAndSlots();
131            }
132        }
133    
134        /**
135         * Returns the name of the inventory.
136         */
137        public String getInvName()
138        {
139            return "mob.villager";
140        }
141    
142        /**
143         * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
144         * this more of a set than a get?*
145         */
146        public int getInventoryStackLimit()
147        {
148            return 64;
149        }
150    
151        /**
152         * Do not make give this method the name canInteractWith because it clashes with Container
153         */
154        public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
155        {
156            return this.theMerchant.getCustomer() == par1EntityPlayer;
157        }
158    
159        public void openChest() {}
160    
161        public void closeChest() {}
162    
163        /**
164         * Called when an the contents of an Inventory change, usually
165         */
166        public void onInventoryChanged()
167        {
168            this.resetRecipeAndSlots();
169        }
170    
171        public void resetRecipeAndSlots()
172        {
173            this.currentRecipe = null;
174            ItemStack var1 = this.theInventory[0];
175            ItemStack var2 = this.theInventory[1];
176    
177            if (var1 == null)
178            {
179                var1 = var2;
180                var2 = null;
181            }
182    
183            if (var1 == null)
184            {
185                this.setInventorySlotContents(2, (ItemStack)null);
186            }
187            else
188            {
189                MerchantRecipeList var3 = this.theMerchant.getRecipes(this.thePlayer);
190    
191                if (var3 != null)
192                {
193                    MerchantRecipe var4 = var3.canRecipeBeUsed(var1, var2, this.currentRecipeIndex);
194    
195                    if (var4 != null && !var4.func_82784_g())
196                    {
197                        this.currentRecipe = var4;
198                        this.setInventorySlotContents(2, var4.getItemToSell().copy());
199                    }
200                    else if (var2 != null)
201                    {
202                        var4 = var3.canRecipeBeUsed(var2, var1, this.currentRecipeIndex);
203    
204                        if (var4 != null && !var4.func_82784_g())
205                        {
206                            this.currentRecipe = var4;
207                            this.setInventorySlotContents(2, var4.getItemToSell().copy());
208                        }
209                        else
210                        {
211                            this.setInventorySlotContents(2, (ItemStack)null);
212                        }
213                    }
214                    else
215                    {
216                        this.setInventorySlotContents(2, (ItemStack)null);
217                    }
218                }
219            }
220        }
221    
222        public MerchantRecipe getCurrentRecipe()
223        {
224            return this.currentRecipe;
225        }
226    
227        public void setCurrentRecipeIndex(int par1)
228        {
229            this.currentRecipeIndex = par1;
230            this.resetRecipeAndSlots();
231        }
232    }