001    package net.minecraft.inventory;
002    
003    import cpw.mods.fml.common.registry.GameRegistry;
004    import net.minecraft.entity.item.EntityXPOrb;
005    import net.minecraft.entity.player.EntityPlayer;
006    import net.minecraft.item.Item;
007    import net.minecraft.item.ItemStack;
008    import net.minecraft.item.crafting.FurnaceRecipes;
009    import net.minecraft.stats.AchievementList;
010    import net.minecraft.util.MathHelper;
011    
012    public class SlotFurnace extends Slot
013    {
014        /** The player that is using the GUI where this slot resides. */
015        private EntityPlayer thePlayer;
016        private int field_75228_b;
017    
018        public SlotFurnace(EntityPlayer par1EntityPlayer, IInventory par2IInventory, int par3, int par4, int par5)
019        {
020            super(par2IInventory, par3, par4, par5);
021            this.thePlayer = par1EntityPlayer;
022        }
023    
024        /**
025         * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
026         */
027        public boolean isItemValid(ItemStack par1ItemStack)
028        {
029            return false;
030        }
031    
032        /**
033         * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
034         * stack.
035         */
036        public ItemStack decrStackSize(int par1)
037        {
038            if (this.getHasStack())
039            {
040                this.field_75228_b += Math.min(par1, this.getStack().stackSize);
041            }
042    
043            return super.decrStackSize(par1);
044        }
045    
046        public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
047        {
048            this.onCrafting(par2ItemStack);
049            super.onPickupFromSlot(par1EntityPlayer, par2ItemStack);
050        }
051    
052        /**
053         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
054         * internal count then calls onCrafting(item).
055         */
056        protected void onCrafting(ItemStack par1ItemStack, int par2)
057        {
058            this.field_75228_b += par2;
059            this.onCrafting(par1ItemStack);
060        }
061    
062        /**
063         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
064         */
065        protected void onCrafting(ItemStack par1ItemStack)
066        {
067            par1ItemStack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.field_75228_b);
068    
069            if (!this.thePlayer.worldObj.isRemote)
070            {
071                int var2 = this.field_75228_b;
072                float var3 = FurnaceRecipes.smelting().getExperience(par1ItemStack);
073                int var4;
074    
075                if (var3 == 0.0F)
076                {
077                    var2 = 0;
078                }
079                else if (var3 < 1.0F)
080                {
081                    var4 = MathHelper.floor_float((float)var2 * var3);
082    
083                    if (var4 < MathHelper.ceiling_float_int((float)var2 * var3) && (float)Math.random() < (float)var2 * var3 - (float)var4)
084                    {
085                        ++var4;
086                    }
087    
088                    var2 = var4;
089                }
090    
091                while (var2 > 0)
092                {
093                    var4 = EntityXPOrb.getXPSplit(var2);
094                    var2 -= var4;
095                    this.thePlayer.worldObj.spawnEntityInWorld(new EntityXPOrb(this.thePlayer.worldObj, this.thePlayer.posX, this.thePlayer.posY + 0.5D, this.thePlayer.posZ + 0.5D, var4));
096                }
097            }
098    
099            this.field_75228_b = 0;
100    
101            GameRegistry.onItemSmelted(thePlayer, par1ItemStack);
102    
103            if (par1ItemStack.itemID == Item.ingotIron.itemID)
104            {
105                this.thePlayer.addStat(AchievementList.acquireIron, 1);
106            }
107    
108            if (par1ItemStack.itemID == Item.fishCooked.itemID)
109            {
110                this.thePlayer.addStat(AchievementList.cookFish, 1);
111            }
112        }
113    }