    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
    008    public class SlotMerchantResult extends Slot
    009    {
    010        /** Merchant's inventory. */
    011        private final InventoryMerchant theMerchantInventory;
    012
    013        /** The Player whos trying to buy/sell stuff. */
    014        private EntityPlayer thePlayer;
    015        private int field_75231_g;
    016
    017        /** "Instance" of the Merchant. */
    018        private final IMerchant theMerchant;
    019
    020        public SlotMerchantResult(EntityPlayer par1EntityPlayer, IMerchant par2IMerchant, InventoryMerchant par3InventoryMerchant, int par4, int par5, int par6)
    021        {
    022            super(par3InventoryMerchant, par4, par5, par6);
    023            this.thePlayer = par1EntityPlayer;
    024            this.theMerchant = par2IMerchant;
    025            this.theMerchantInventory = par3InventoryMerchant;
    026        }
    027
    028        /**
    029         * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
    030         */
    031        public boolean isItemValid(ItemStack par1ItemStack)
    032        {
    033            return false;
    034        }
    035
    036        /**
    037         * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
    038         * stack.
    039         */
    040        public ItemStack decrStackSize(int par1)
    041        {
    042            if (this.getHasStack())
    043            {
    044                this.field_75231_g += Math.min(par1, this.getStack().stackSize);
    045            }
    046
    047            return super.decrStackSize(par1);
    048        }
    049
    050        /**
    051         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
    052         * internal count then calls onCrafting(item).
    053         */
    054        protected void onCrafting(ItemStack par1ItemStack, int par2)
    055        {
    056            this.field_75231_g += par2;
    057            this.onCrafting(par1ItemStack);
    058        }
    059
    060        /**
    061         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
    062         */
    063        protected void onCrafting(ItemStack par1ItemStack)
    064        {
    065            par1ItemStack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.field_75231_g);
    066            this.field_75231_g = 0;
    067        }
    068
    069        public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
    070        {
    071            this.onCrafting(par2ItemStack);
    072            MerchantRecipe var3 = this.theMerchantInventory.getCurrentRecipe();
    073
    074            if (var3 != null)
    075            {
    076                ItemStack var4 = this.theMerchantInventory.getStackInSlot(0);
    077                ItemStack var5 = this.theMerchantInventory.getStackInSlot(1);
    078
    079                if (this.func_75230_a(var3, var4, var5) || this.func_75230_a(var3, var5, var4))
    080                {
    081                    if (var4 != null && var4.stackSize <= 0)
    082                    {
    083                        var4 = null;
    084                    }
    085
    086                    if (var5 != null && var5.stackSize <= 0)
    087                    {
    088                        var5 = null;
    089                    }
    090
    091                    this.theMerchantInventory.setInventorySlotContents(0, var4);
    092                    this.theMerchantInventory.setInventorySlotContents(1, var5);
    093                    this.theMerchant.useRecipe(var3);
    094                }
    095            }
    096        }
    097
    098        private boolean func_75230_a(MerchantRecipe par1MerchantRecipe, ItemStack par2ItemStack, ItemStack par3ItemStack)
    099        {
    100            ItemStack var4 = par1MerchantRecipe.getItemToBuy();
    101            ItemStack var5 = par1MerchantRecipe.getSecondItemToBuy();
    102
    103            if (par2ItemStack != null && par2ItemStack.itemID == var4.itemID)
    104            {
    105                if (var5 != null && par3ItemStack != null && var5.itemID == par3ItemStack.itemID)
    106                {
    107                    par2ItemStack.stackSize -= var4.stackSize;
    108                    par3ItemStack.stackSize -= var5.stackSize;
    109                    return true;
    110                }
    111
    112                if (var5 == null && par3ItemStack == null)
    113                {
    114                    par2ItemStack.stackSize -= var4.stackSize;
    115                    return true;
    116                }
    117            }
    118
    119            return false;
    120        }
    121    }