    001    package net.minecraft.inventory;
    002
    003    import net.minecraft.block.Block;
    004    import net.minecraft.entity.player.EntityPlayer;
    005    import net.minecraft.entity.player.InventoryPlayer;
    006    import net.minecraft.item.ItemStack;
    007    import net.minecraft.item.crafting.CraftingManager;
    008    import net.minecraft.world.World;
    009
    010    public class ContainerWorkbench extends Container
    011    {
    012        /** The crafting matrix inventory (3x3). */
    013        public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
    014        public IInventory craftResult = new InventoryCraftResult();
    015        private World worldObj;
    016        private int posX;
    017        private int posY;
    018        private int posZ;
    019
    020        public ContainerWorkbench(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5)
    021        {
    022            this.worldObj = par2World;
    023            this.posX = par3;
    024            this.posY = par4;
    025            this.posZ = par5;
    026            this.addSlotToContainer(new SlotCrafting(par1InventoryPlayer.player, this.craftMatrix, this.craftResult, 0, 124, 35));
    027            int var6;
    028            int var7;
    029
    030            for (var6 = 0; var6 < 3; ++var6)
    031            {
    032                for (var7 = 0; var7 < 3; ++var7)
    033                {
    034                    this.addSlotToContainer(new Slot(this.craftMatrix, var7 + var6 * 3, 30 + var7 * 18, 17 + var6 * 18));
    035                }
    036            }
    037
    038            for (var6 = 0; var6 < 3; ++var6)
    039            {
    040                for (var7 = 0; var7 < 9; ++var7)
    041                {
    042                    this.addSlotToContainer(new Slot(par1InventoryPlayer, var7 + var6 * 9 + 9, 8 + var7 * 18, 84 + var6 * 18));
    043                }
    044            }
    045
    046            for (var6 = 0; var6 < 9; ++var6)
    047            {
    048                this.addSlotToContainer(new Slot(par1InventoryPlayer, var6, 8 + var6 * 18, 142));
    049            }
    050
    051            this.onCraftMatrixChanged(this.craftMatrix);
    052        }
    053
    054        /**
    055         * Callback for when the crafting matrix is changed.
    056         */
    057        public void onCraftMatrixChanged(IInventory par1IInventory)
    058        {
    059            this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix, this.worldObj));
    060        }
    061
    062        /**
    063         * Callback for when the crafting gui is closed.
    064         */
    065        public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
    066        {
    067            super.onCraftGuiClosed(par1EntityPlayer);
    068
    069            if (!this.worldObj.isRemote)
    070            {
    071                for (int var2 = 0; var2 < 9; ++var2)
    072                {
    073                    ItemStack var3 = this.craftMatrix.getStackInSlotOnClosing(var2);
    074
    075                    if (var3 != null)
    076                    {
    077                        par1EntityPlayer.dropPlayerItem(var3);
    078                    }
    079                }
    080            }
    081        }
    082
    083        public boolean canInteractWith(EntityPlayer par1EntityPlayer)
    084        {
    085            return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != Block.workbench.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
    086        }
    087
    088        /**
    089         * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
    090         */
    091        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
    092        {
    093            ItemStack var3 = null;
    094            Slot var4 = (Slot)this.inventorySlots.get(par2);
    095
    096            if (var4 != null && var4.getHasStack())
    097            {
    098                ItemStack var5 = var4.getStack();
    099                var3 = var5.copy();
    100
    101                if (par2 == 0)
    102                {
    103                    if (!this.mergeItemStack(var5, 10, 46, true))
    104                    {
    105                        return null;
    106                    }
    107
    108                    var4.onSlotChange(var5, var3);
    109                }
    110                else if (par2 >= 10 && par2 < 37)
    111                {
    112                    if (!this.mergeItemStack(var5, 37, 46, false))
    113                    {
    114                        return null;
    115                    }
    116                }
    117                else if (par2 >= 37 && par2 < 46)
    118                {
    119                    if (!this.mergeItemStack(var5, 10, 37, false))
    120                    {
    121                        return null;
    122                    }
    123                }
    124                else if (!this.mergeItemStack(var5, 10, 46, false))
    125                {
    126                    return null;
    127                }
    128
    129                if (var5.stackSize == 0)
    130                {
    131                    var4.putStack((ItemStack)null);
    132                }
    133                else
    134                {
    135                    var4.onSlotChanged();
    136                }
    137
    138                if (var5.stackSize == var3.stackSize)
    139                {
    140                    return null;
    141                }
    142
    143                var4.onPickupFromSlot(par1EntityPlayer, var5);
    144            }
    145
    146            return var3;
    147        }
    148    }