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    import java.util.List;
007    import java.util.Random;
008    
009    public class ContainerEnchantment extends Container
010    {
011        /** SlotEnchantmentTable object with ItemStack to be enchanted */
012        public IInventory tableInventory = new SlotEnchantmentTable(this, "Enchant", 1);
013    
014        /** current world (for bookshelf counting) */
015        private World worldPointer;
016        private int posX;
017        private int posY;
018        private int posZ;
019        private Random rand = new Random();
020    
021        /** used as seed for EnchantmentNameParts (see GuiEnchantment) */
022        public long nameSeed;
023    
024        /** 3-member array storing the enchantment levels of each slot */
025        public int[] enchantLevels = new int[3];
026    
027        public ContainerEnchantment(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5)
028        {
029            this.worldPointer = par2World;
030            this.posX = par3;
031            this.posY = par4;
032            this.posZ = par5;
033            this.addSlotToContainer(new SlotEnchantment(this, this.tableInventory, 0, 25, 47));
034            int var6;
035    
036            for (var6 = 0; var6 < 3; ++var6)
037            {
038                for (int var7 = 0; var7 < 9; ++var7)
039                {
040                    this.addSlotToContainer(new Slot(par1InventoryPlayer, var7 + var6 * 9 + 9, 8 + var7 * 18, 84 + var6 * 18));
041                }
042            }
043    
044            for (var6 = 0; var6 < 9; ++var6)
045            {
046                this.addSlotToContainer(new Slot(par1InventoryPlayer, var6, 8 + var6 * 18, 142));
047            }
048        }
049    
050        public void addCraftingToCrafters(ICrafting par1ICrafting)
051        {
052            super.addCraftingToCrafters(par1ICrafting);
053            par1ICrafting.updateCraftingInventoryInfo(this, 0, this.enchantLevels[0]);
054            par1ICrafting.updateCraftingInventoryInfo(this, 1, this.enchantLevels[1]);
055            par1ICrafting.updateCraftingInventoryInfo(this, 2, this.enchantLevels[2]);
056        }
057    
058        /**
059         * Updates crafting matrix; called from onCraftMatrixChanged. Args: none
060         */
061        public void updateCraftingResults()
062        {
063            super.updateCraftingResults();
064            Iterator var1 = this.crafters.iterator();
065    
066            while (var1.hasNext())
067            {
068                ICrafting var2 = (ICrafting)var1.next();
069                var2.updateCraftingInventoryInfo(this, 0, this.enchantLevels[0]);
070                var2.updateCraftingInventoryInfo(this, 1, this.enchantLevels[1]);
071                var2.updateCraftingInventoryInfo(this, 2, this.enchantLevels[2]);
072            }
073        }
074    
075        @SideOnly(Side.CLIENT)
076        public void updateProgressBar(int par1, int par2)
077        {
078            if (par1 >= 0 && par1 <= 2)
079            {
080                this.enchantLevels[par1] = par2;
081            }
082            else
083            {
084                super.updateProgressBar(par1, par2);
085            }
086        }
087    
088        /**
089         * Callback for when the crafting matrix is changed.
090         */
091        public void onCraftMatrixChanged(IInventory par1IInventory)
092        {
093            if (par1IInventory == this.tableInventory)
094            {
095                ItemStack var2 = par1IInventory.getStackInSlot(0);
096                int var3;
097    
098                if (var2 != null && var2.isItemEnchantable())
099                {
100                    this.nameSeed = this.rand.nextLong();
101    
102                    if (!this.worldPointer.isRemote)
103                    {
104                        var3 = 0;
105                        int var4;
106    
107                        for (var4 = -1; var4 <= 1; ++var4)
108                        {
109                            for (int var5 = -1; var5 <= 1; ++var5)
110                            {
111                                if ((var4 != 0 || var5 != 0) && this.worldPointer.isAirBlock(this.posX + var5, this.posY, this.posZ + var4) && this.worldPointer.isAirBlock(this.posX + var5, this.posY + 1, this.posZ + var4))
112                                {
113                                    if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY, this.posZ + var4 * 2) == Block.bookShelf.blockID)
114                                    {
115                                        ++var3;
116                                    }
117    
118                                    if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY + 1, this.posZ + var4 * 2) == Block.bookShelf.blockID)
119                                    {
120                                        ++var3;
121                                    }
122    
123                                    if (var5 != 0 && var4 != 0)
124                                    {
125                                        if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY, this.posZ + var4) == Block.bookShelf.blockID)
126                                        {
127                                            ++var3;
128                                        }
129    
130                                        if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY + 1, this.posZ + var4) == Block.bookShelf.blockID)
131                                        {
132                                            ++var3;
133                                        }
134    
135                                        if (this.worldPointer.getBlockId(this.posX + var5, this.posY, this.posZ + var4 * 2) == Block.bookShelf.blockID)
136                                        {
137                                            ++var3;
138                                        }
139    
140                                        if (this.worldPointer.getBlockId(this.posX + var5, this.posY + 1, this.posZ + var4 * 2) == Block.bookShelf.blockID)
141                                        {
142                                            ++var3;
143                                        }
144                                    }
145                                }
146                            }
147                        }
148    
149                        for (var4 = 0; var4 < 3; ++var4)
150                        {
151                            this.enchantLevels[var4] = EnchantmentHelper.calcItemStackEnchantability(this.rand, var4, var3, var2);
152                        }
153    
154                        this.updateCraftingResults();
155                    }
156                }
157                else
158                {
159                    for (var3 = 0; var3 < 3; ++var3)
160                    {
161                        this.enchantLevels[var3] = 0;
162                    }
163                }
164            }
165        }
166    
167        /**
168         * enchants the item on the table using the specified slot; also deducts XP from player
169         */
170        public boolean enchantItem(EntityPlayer par1EntityPlayer, int par2)
171        {
172            ItemStack var3 = this.tableInventory.getStackInSlot(0);
173    
174            if (this.enchantLevels[par2] > 0 && var3 != null && (par1EntityPlayer.experienceLevel >= this.enchantLevels[par2] || par1EntityPlayer.capabilities.isCreativeMode))
175            {
176                if (!this.worldPointer.isRemote)
177                {
178                    List var4 = EnchantmentHelper.buildEnchantmentList(this.rand, var3, this.enchantLevels[par2]);
179    
180                    if (var4 != null)
181                    {
182                        par1EntityPlayer.removeExperience(this.enchantLevels[par2]);
183                        Iterator var5 = var4.iterator();
184    
185                        while (var5.hasNext())
186                        {
187                            EnchantmentData var6 = (EnchantmentData)var5.next();
188                            var3.addEnchantment(var6.enchantmentobj, var6.enchantmentLevel);
189                        }
190    
191                        this.onCraftMatrixChanged(this.tableInventory);
192                    }
193                }
194    
195                return true;
196            }
197            else
198            {
199                return false;
200            }
201        }
202    
203        /**
204         * Callback for when the crafting gui is closed.
205         */
206        public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
207        {
208            super.onCraftGuiClosed(par1EntityPlayer);
209    
210            if (!this.worldPointer.isRemote)
211            {
212                ItemStack var2 = this.tableInventory.getStackInSlotOnClosing(0);
213    
214                if (var2 != null)
215                {
216                    par1EntityPlayer.dropPlayerItem(var2);
217                }
218            }
219        }
220    
221        public boolean canInteractWith(EntityPlayer par1EntityPlayer)
222        {
223            return this.worldPointer.getBlockId(this.posX, this.posY, this.posZ) != Block.enchantmentTable.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
224        }
225    
226        /**
227         * Called to transfer a stack from one inventory to the other eg. when shift clicking.
228         */
229        public ItemStack transferStackInSlot(int par1)
230        {
231            ItemStack var2 = null;
232            Slot var3 = (Slot)this.inventorySlots.get(par1);
233    
234            if (var3 != null && var3.getHasStack())
235            {
236                ItemStack var4 = var3.getStack();
237                var2 = var4.copy();
238    
239                if (par1 == 0)
240                {
241                    if (!this.mergeItemStack(var4, 1, 37, true))
242                    {
243                        return null;
244                    }
245                }
246                else
247                {
248                    if (((Slot)this.inventorySlots.get(0)).getHasStack() || !((Slot)this.inventorySlots.get(0)).isItemValid(var4))
249                    {
250                        return null;
251                    }
252    
253                    if (var4.hasTagCompound() && var4.stackSize == 1)
254                    {
255                        ((Slot)this.inventorySlots.get(0)).putStack(var4.copy());
256                        var4.stackSize = 0;
257                    }
258                    else if (var4.stackSize >= 1)
259                    {
260                        ((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(var4.itemID, 1, var4.getItemDamage()));
261                        --var4.stackSize;
262                    }
263                }
264    
265                if (var4.stackSize == 0)
266                {
267                    var3.putStack((ItemStack)null);
268                }
269                else
270                {
271                    var3.onSlotChanged();
272                }
273    
274                if (var4.stackSize == var2.stackSize)
275                {
276                    return null;
277                }
278    
279                var3.onPickupFromSlot(var4);
280            }
281    
282            return var2;
283        }
284    }