001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.util.Iterator;
006    
007    public class ContainerFurnace extends Container
008    {
009        private TileEntityFurnace furnace;
010        private int lastCookTime = 0;
011        private int lastBurnTime = 0;
012        private int lastItemBurnTime = 0;
013    
014        public ContainerFurnace(InventoryPlayer par1InventoryPlayer, TileEntityFurnace par2TileEntityFurnace)
015        {
016            this.furnace = par2TileEntityFurnace;
017            this.addSlotToContainer(new Slot(par2TileEntityFurnace, 0, 56, 17));
018            this.addSlotToContainer(new Slot(par2TileEntityFurnace, 1, 56, 53));
019            this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityFurnace, 2, 116, 35));
020            int var3;
021    
022            for (var3 = 0; var3 < 3; ++var3)
023            {
024                for (int var4 = 0; var4 < 9; ++var4)
025                {
026                    this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18));
027                }
028            }
029    
030            for (var3 = 0; var3 < 9; ++var3)
031            {
032                this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142));
033            }
034        }
035    
036        public void addCraftingToCrafters(ICrafting par1ICrafting)
037        {
038            super.addCraftingToCrafters(par1ICrafting);
039            par1ICrafting.updateCraftingInventoryInfo(this, 0, this.furnace.furnaceCookTime);
040            par1ICrafting.updateCraftingInventoryInfo(this, 1, this.furnace.furnaceBurnTime);
041            par1ICrafting.updateCraftingInventoryInfo(this, 2, this.furnace.currentItemBurnTime);
042        }
043    
044        /**
045         * Updates crafting matrix; called from onCraftMatrixChanged. Args: none
046         */
047        public void updateCraftingResults()
048        {
049            super.updateCraftingResults();
050            Iterator var1 = this.crafters.iterator();
051    
052            while (var1.hasNext())
053            {
054                ICrafting var2 = (ICrafting)var1.next();
055    
056                if (this.lastCookTime != this.furnace.furnaceCookTime)
057                {
058                    var2.updateCraftingInventoryInfo(this, 0, this.furnace.furnaceCookTime);
059                }
060    
061                if (this.lastBurnTime != this.furnace.furnaceBurnTime)
062                {
063                    var2.updateCraftingInventoryInfo(this, 1, this.furnace.furnaceBurnTime);
064                }
065    
066                if (this.lastItemBurnTime != this.furnace.currentItemBurnTime)
067                {
068                    var2.updateCraftingInventoryInfo(this, 2, this.furnace.currentItemBurnTime);
069                }
070            }
071    
072            this.lastCookTime = this.furnace.furnaceCookTime;
073            this.lastBurnTime = this.furnace.furnaceBurnTime;
074            this.lastItemBurnTime = this.furnace.currentItemBurnTime;
075        }
076    
077        @SideOnly(Side.CLIENT)
078        public void updateProgressBar(int par1, int par2)
079        {
080            if (par1 == 0)
081            {
082                this.furnace.furnaceCookTime = par2;
083            }
084    
085            if (par1 == 1)
086            {
087                this.furnace.furnaceBurnTime = par2;
088            }
089    
090            if (par1 == 2)
091            {
092                this.furnace.currentItemBurnTime = par2;
093            }
094        }
095    
096        public boolean canInteractWith(EntityPlayer par1EntityPlayer)
097        {
098            return this.furnace.isUseableByPlayer(par1EntityPlayer);
099        }
100    
101        /**
102         * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
103         */
104        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
105        {
106            ItemStack var3 = null;
107            Slot var4 = (Slot)this.inventorySlots.get(par2);
108    
109            if (var4 != null && var4.getHasStack())
110            {
111                ItemStack var5 = var4.getStack();
112                var3 = var5.copy();
113    
114                if (par2 == 2)
115                {
116                    if (!this.mergeItemStack(var5, 3, 39, true))
117                    {
118                        return null;
119                    }
120    
121                    var4.onSlotChange(var5, var3);
122                }
123                else if (par2 != 1 && par2 != 0)
124                {
125                    if (FurnaceRecipes.smelting().getSmeltingResult(var5) != null)
126                    {
127                        if (!this.mergeItemStack(var5, 0, 1, false))
128                        {
129                            return null;
130                        }
131                    }
132                    else if (TileEntityFurnace.isItemFuel(var5))
133                    {
134                        if (!this.mergeItemStack(var5, 1, 2, false))
135                        {
136                            return null;
137                        }
138                    }
139                    else if (par2 >= 3 && par2 < 30)
140                    {
141                        if (!this.mergeItemStack(var5, 30, 39, false))
142                        {
143                            return null;
144                        }
145                    }
146                    else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(var5, 3, 30, false))
147                    {
148                        return null;
149                    }
150                }
151                else if (!this.mergeItemStack(var5, 3, 39, false))
152                {
153                    return null;
154                }
155    
156                if (var5.stackSize == 0)
157                {
158                    var4.putStack((ItemStack)null);
159                }
160                else
161                {
162                    var4.onSlotChanged();
163                }
164    
165                if (var5.stackSize == var3.stackSize)
166                {
167                    return null;
168                }
169    
170                var4.onPickupFromSlot(par1EntityPlayer, var5);
171            }
172    
173            return var3;
174        }
175    }