001    package net.minecraft.inventory;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.entity.IMerchant;
006    import net.minecraft.entity.player.EntityPlayer;
007    import net.minecraft.entity.player.InventoryPlayer;
008    import net.minecraft.item.ItemStack;
009    import net.minecraft.world.World;
010    
011    public class ContainerMerchant extends Container
012    {
013        /** Instance of Merchant. */
014        private IMerchant theMerchant;
015        private InventoryMerchant merchantInventory;
016    
017        /** Instance of World. */
018        private final World theWorld;
019    
020        public ContainerMerchant(InventoryPlayer par1InventoryPlayer, IMerchant par2IMerchant, World par3World)
021        {
022            this.theMerchant = par2IMerchant;
023            this.theWorld = par3World;
024            this.merchantInventory = new InventoryMerchant(par1InventoryPlayer.player, par2IMerchant);
025            this.addSlotToContainer(new Slot(this.merchantInventory, 0, 36, 53));
026            this.addSlotToContainer(new Slot(this.merchantInventory, 1, 62, 53));
027            this.addSlotToContainer(new SlotMerchantResult(par1InventoryPlayer.player, par2IMerchant, this.merchantInventory, 2, 120, 53));
028            int var4;
029    
030            for (var4 = 0; var4 < 3; ++var4)
031            {
032                for (int var5 = 0; var5 < 9; ++var5)
033                {
034                    this.addSlotToContainer(new Slot(par1InventoryPlayer, var5 + var4 * 9 + 9, 8 + var5 * 18, 84 + var4 * 18));
035                }
036            }
037    
038            for (var4 = 0; var4 < 9; ++var4)
039            {
040                this.addSlotToContainer(new Slot(par1InventoryPlayer, var4, 8 + var4 * 18, 142));
041            }
042        }
043    
044        public InventoryMerchant getMerchantInventory()
045        {
046            return this.merchantInventory;
047        }
048    
049        public void addCraftingToCrafters(ICrafting par1ICrafting)
050        {
051            super.addCraftingToCrafters(par1ICrafting);
052        }
053    
054        /**
055         * Looks for changes made in the container, sends them to every listener.
056         */
057        public void detectAndSendChanges()
058        {
059            super.detectAndSendChanges();
060        }
061    
062        /**
063         * Callback for when the crafting matrix is changed.
064         */
065        public void onCraftMatrixChanged(IInventory par1IInventory)
066        {
067            this.merchantInventory.resetRecipeAndSlots();
068            super.onCraftMatrixChanged(par1IInventory);
069        }
070    
071        public void setCurrentRecipeIndex(int par1)
072        {
073            this.merchantInventory.setCurrentRecipeIndex(par1);
074        }
075    
076        @SideOnly(Side.CLIENT)
077        public void updateProgressBar(int par1, int par2) {}
078    
079        public boolean canInteractWith(EntityPlayer par1EntityPlayer)
080        {
081            return this.theMerchant.getCustomer() == par1EntityPlayer;
082        }
083    
084        /**
085         * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
086         */
087        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
088        {
089            ItemStack var3 = null;
090            Slot var4 = (Slot)this.inventorySlots.get(par2);
091    
092            if (var4 != null && var4.getHasStack())
093            {
094                ItemStack var5 = var4.getStack();
095                var3 = var5.copy();
096    
097                if (par2 == 2)
098                {
099                    if (!this.mergeItemStack(var5, 3, 39, true))
100                    {
101                        return null;
102                    }
103    
104                    var4.onSlotChange(var5, var3);
105                }
106                else if (par2 != 0 && par2 != 1)
107                {
108                    if (par2 >= 3 && par2 < 30)
109                    {
110                        if (!this.mergeItemStack(var5, 30, 39, false))
111                        {
112                            return null;
113                        }
114                    }
115                    else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(var5, 3, 30, false))
116                    {
117                        return null;
118                    }
119                }
120                else if (!this.mergeItemStack(var5, 3, 39, false))
121                {
122                    return null;
123                }
124    
125                if (var5.stackSize == 0)
126                {
127                    var4.putStack((ItemStack)null);
128                }
129                else
130                {
131                    var4.onSlotChanged();
132                }
133    
134                if (var5.stackSize == var3.stackSize)
135                {
136                    return null;
137                }
138    
139                var4.onPickupFromSlot(par1EntityPlayer, var5);
140            }
141    
142            return var3;
143        }
144    
145        /**
146         * Callback for when the crafting gui is closed.
147         */
148        public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
149        {
150            super.onCraftGuiClosed(par1EntityPlayer);
151            this.theMerchant.setCustomer((EntityPlayer)null);
152            super.onCraftGuiClosed(par1EntityPlayer);
153    
154            if (!this.theWorld.isRemote)
155            {
156                ItemStack var2 = this.merchantInventory.getStackInSlotOnClosing(0);
157    
158                if (var2 != null)
159                {
160                    par1EntityPlayer.dropPlayerItem(var2);
161                }
162    
163                var2 = this.merchantInventory.getStackInSlotOnClosing(1);
164    
165                if (var2 != null)
166                {
167                    par1EntityPlayer.dropPlayerItem(var2);
168                }
169            }
170        }
171    }