001    package net.minecraft.inventory;
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.Map;
007    import net.minecraft.block.Block;
008    import net.minecraft.enchantment.Enchantment;
009    import net.minecraft.enchantment.EnchantmentHelper;
010    import net.minecraft.entity.player.EntityPlayer;
011    import net.minecraft.entity.player.InventoryPlayer;
012    import net.minecraft.item.Item;
013    import net.minecraft.item.ItemStack;
014    import net.minecraft.world.World;
015    
016    public class ContainerRepair extends Container
017    {
018        /** Here comes out item you merged and/or renamed. */
019        private IInventory outputSlot = new InventoryCraftResult();
020    
021        /**
022         * The 2slots where you put your items in that you want to merge and/or rename.
023         */
024        private IInventory inputSlots = new InventoryRepair(this, "Repair", 2);
025        private World theWorld;
026        private int field_82861_i;
027        private int field_82858_j;
028        private int field_82859_k;
029    
030        /** The maximum cost of repairing/renaming in the anvil. */
031        public int maximumCost = 0;
032        private int field_82856_l = 0;
033        private String field_82857_m;
034    
035        /** The player that has this container open. */
036        private final EntityPlayer thePlayer;
037    
038        public ContainerRepair(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
039        {
040            this.theWorld = par2World;
041            this.field_82861_i = par3;
042            this.field_82858_j = par4;
043            this.field_82859_k = par5;
044            this.thePlayer = par6EntityPlayer;
045            this.addSlotToContainer(new Slot(this.inputSlots, 0, 27, 47));
046            this.addSlotToContainer(new Slot(this.inputSlots, 1, 76, 47));
047            this.addSlotToContainer(new SlotRepair(this, this.outputSlot, 2, 134, 47, par2World, par3, par4, par5));
048            int var7;
049    
050            for (var7 = 0; var7 < 3; ++var7)
051            {
052                for (int var8 = 0; var8 < 9; ++var8)
053                {
054                    this.addSlotToContainer(new Slot(par1InventoryPlayer, var8 + var7 * 9 + 9, 8 + var8 * 18, 84 + var7 * 18));
055                }
056            }
057    
058            for (var7 = 0; var7 < 9; ++var7)
059            {
060                this.addSlotToContainer(new Slot(par1InventoryPlayer, var7, 8 + var7 * 18, 142));
061            }
062        }
063    
064        /**
065         * Callback for when the crafting matrix is changed.
066         */
067        public void onCraftMatrixChanged(IInventory par1IInventory)
068        {
069            super.onCraftMatrixChanged(par1IInventory);
070    
071            if (par1IInventory == this.inputSlots)
072            {
073                this.func_82848_d();
074            }
075        }
076    
077        public void func_82848_d()
078        {
079            ItemStack var1 = this.inputSlots.getStackInSlot(0);
080            this.maximumCost = 0;
081            int var2 = 0;
082            byte var3 = 0;
083            int var4 = 0;
084    
085            if (var1 == null)
086            {
087                this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
088                this.maximumCost = 0;
089            }
090            else
091            {
092                ItemStack var5 = var1.copy();
093                ItemStack var6 = this.inputSlots.getStackInSlot(1);
094                Map var7 = EnchantmentHelper.getEnchantments(var5);
095                int var18 = var3 + var1.getRepairCost() + (var6 == null ? 0 : var6.getRepairCost());
096                this.field_82856_l = 0;
097                int var8;
098                int var9;
099                int var10;
100                int var12;
101                Enchantment var21;
102                Iterator var20;
103    
104                if (var6 != null)
105                {
106                    if (var5.isItemStackDamageable() && Item.itemsList[var5.itemID].getIsRepairable(var1, var6))
107                    {
108                        var8 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4);
109    
110                        if (var8 <= 0)
111                        {
112                            this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
113                            this.maximumCost = 0;
114                            return;
115                        }
116    
117                        for (var9 = 0; var8 > 0 && var9 < var6.stackSize; ++var9)
118                        {
119                            var10 = var5.getItemDamageForDisplay() - var8;
120                            var5.setItemDamage(var10);
121                            var2 += Math.max(1, var8 / 100) + var7.size();
122                            var8 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4);
123                        }
124    
125                        this.field_82856_l = var9;
126                    }
127                    else
128                    {
129                        if (var5.itemID != var6.itemID || !var5.isItemStackDamageable())
130                        {
131                            this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
132                            this.maximumCost = 0;
133                            return;
134                        }
135    
136                        if (var5.isItemStackDamageable())
137                        {
138                            var8 = var1.getMaxDamage() - var1.getItemDamageForDisplay();
139                            var9 = var6.getMaxDamage() - var6.getItemDamageForDisplay();
140                            var10 = var9 + var5.getMaxDamage() * 12 / 100;
141                            int var11 = var8 + var10;
142                            var12 = var5.getMaxDamage() - var11;
143    
144                            if (var12 < 0)
145                            {
146                                var12 = 0;
147                            }
148    
149                            if (var12 < var5.getItemDamage())
150                            {
151                                var5.setItemDamage(var12);
152                                var2 += Math.max(1, var10 / 100);
153                            }
154                        }
155    
156                        Map var19 = EnchantmentHelper.getEnchantments(var6);
157                        var20 = var19.keySet().iterator();
158    
159                        while (var20.hasNext())
160                        {
161                            var10 = ((Integer)var20.next()).intValue();
162                            var21 = Enchantment.enchantmentsList[var10];
163                            var12 = var7.containsKey(Integer.valueOf(var10)) ? ((Integer)var7.get(Integer.valueOf(var10))).intValue() : 0;
164                            int var13 = ((Integer)var19.get(Integer.valueOf(var10))).intValue();
165                            int var10000;
166    
167                            if (var12 == var13)
168                            {
169                                ++var13;
170                                var10000 = var13;
171                            }
172                            else
173                            {
174                                var10000 = Math.max(var13, var12);
175                            }
176    
177                            var13 = var10000;
178                            int var14 = var13 - var12;
179                            boolean var15 = true;
180                            Iterator var16 = var7.keySet().iterator();
181    
182                            while (var16.hasNext())
183                            {
184                                int var17 = ((Integer)var16.next()).intValue();
185    
186                                if (var17 != var10 && !var21.canApplyTogether(Enchantment.enchantmentsList[var17]))
187                                {
188                                    var15 = false;
189                                    var2 += var14;
190                                }
191                            }
192    
193                            if (var15)
194                            {
195                                if (var13 > var21.getMaxLevel())
196                                {
197                                    var13 = var21.getMaxLevel();
198                                }
199    
200                                var7.put(Integer.valueOf(var10), Integer.valueOf(var13));
201                                byte var23 = 0;
202    
203                                switch (var21.getWeight())
204                                {
205                                    case 1:
206                                        var23 = 8;
207                                        break;
208                                    case 2:
209                                        var23 = 4;
210                                    case 3:
211                                    case 4:
212                                    case 6:
213                                    case 7:
214                                    case 8:
215                                    case 9:
216                                    default:
217                                        break;
218                                    case 5:
219                                        var23 = 2;
220                                        break;
221                                    case 10:
222                                        var23 = 1;
223                                }
224    
225                                var2 += var23 * var14;
226                            }
227                        }
228                    }
229                }
230    
231                if (this.field_82857_m != null && !this.field_82857_m.equalsIgnoreCase(var1.getDisplayName()) && this.field_82857_m.length() > 0)
232                {
233                    var4 = var1.isItemStackDamageable() ? 7 : var1.stackSize * 5;
234                    var2 += var4;
235    
236                    if (var1.hasDisplayName())
237                    {
238                        var18 += var4 / 2;
239                    }
240    
241                    var5.setItemName(this.field_82857_m);
242                }
243    
244                var8 = 0;
245                byte var22;
246    
247                for (var20 = var7.keySet().iterator(); var20.hasNext(); var18 += var8 + var12 * var22)
248                {
249                    var10 = ((Integer)var20.next()).intValue();
250                    var21 = Enchantment.enchantmentsList[var10];
251                    var12 = ((Integer)var7.get(Integer.valueOf(var10))).intValue();
252                    var22 = 0;
253                    ++var8;
254    
255                    switch (var21.getWeight())
256                    {
257                        case 1:
258                            var22 = 8;
259                            break;
260                        case 2:
261                            var22 = 4;
262                        case 3:
263                        case 4:
264                        case 6:
265                        case 7:
266                        case 8:
267                        case 9:
268                        default:
269                            break;
270                        case 5:
271                            var22 = 2;
272                            break;
273                        case 10:
274                            var22 = 1;
275                    }
276                }
277    
278                this.maximumCost = var18 + var2;
279    
280                if (var2 <= 0)
281                {
282                    var5 = null;
283                }
284    
285                if (var4 == var2 && var4 > 0 && this.maximumCost >= 40)
286                {
287                    System.out.println("Naming an item only, cost too high; giving discount to cap cost to 39 levels");
288                    this.maximumCost = 39;
289                }
290    
291                if (this.maximumCost >= 40 && !this.thePlayer.capabilities.isCreativeMode)
292                {
293                    var5 = null;
294                }
295    
296                if (var5 != null)
297                {
298                    var9 = var5.getRepairCost();
299    
300                    if (var6 != null && var9 < var6.getRepairCost())
301                    {
302                        var9 = var6.getRepairCost();
303                    }
304    
305                    if (var5.hasDisplayName())
306                    {
307                        var9 -= 9;
308                    }
309    
310                    if (var9 < 0)
311                    {
312                        var9 = 0;
313                    }
314    
315                    var9 += 2;
316                    var5.setRepairCost(var9);
317                    EnchantmentHelper.setEnchantments(var7, var5);
318                }
319    
320                this.outputSlot.setInventorySlotContents(0, var5);
321                this.updateCraftingResults();
322            }
323        }
324    
325        public void addCraftingToCrafters(ICrafting par1ICrafting)
326        {
327            super.addCraftingToCrafters(par1ICrafting);
328            par1ICrafting.sendProgressBarUpdate(this, 0, this.maximumCost);
329        }
330    
331        @SideOnly(Side.CLIENT)
332        public void updateProgressBar(int par1, int par2)
333        {
334            if (par1 == 0)
335            {
336                this.maximumCost = par2;
337            }
338        }
339    
340        /**
341         * Callback for when the crafting gui is closed.
342         */
343        public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
344        {
345            super.onCraftGuiClosed(par1EntityPlayer);
346    
347            if (!this.theWorld.isRemote)
348            {
349                for (int var2 = 0; var2 < this.inputSlots.getSizeInventory(); ++var2)
350                {
351                    ItemStack var3 = this.inputSlots.getStackInSlotOnClosing(var2);
352    
353                    if (var3 != null)
354                    {
355                        par1EntityPlayer.dropPlayerItem(var3);
356                    }
357                }
358            }
359        }
360    
361        public boolean canInteractWith(EntityPlayer par1EntityPlayer)
362        {
363            return this.theWorld.getBlockId(this.field_82861_i, this.field_82858_j, this.field_82859_k) != Block.anvil.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.field_82861_i + 0.5D, (double)this.field_82858_j + 0.5D, (double)this.field_82859_k + 0.5D) <= 64.0D;
364        }
365    
366        /**
367         * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
368         */
369        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
370        {
371            ItemStack var3 = null;
372            Slot var4 = (Slot)this.inventorySlots.get(par2);
373    
374            if (var4 != null && var4.getHasStack())
375            {
376                ItemStack var5 = var4.getStack();
377                var3 = var5.copy();
378    
379                if (par2 == 2)
380                {
381                    if (!this.mergeItemStack(var5, 3, 39, true))
382                    {
383                        return null;
384                    }
385    
386                    var4.onSlotChange(var5, var3);
387                }
388                else if (par2 != 0 && par2 != 1)
389                {
390                    if (par2 >= 3 && par2 < 39 && !this.mergeItemStack(var5, 0, 2, false))
391                    {
392                        return null;
393                    }
394                }
395                else if (!this.mergeItemStack(var5, 3, 39, false))
396                {
397                    return null;
398                }
399    
400                if (var5.stackSize == 0)
401                {
402                    var4.putStack((ItemStack)null);
403                }
404                else
405                {
406                    var4.onSlotChanged();
407                }
408    
409                if (var5.stackSize == var3.stackSize)
410                {
411                    return null;
412                }
413    
414                var4.onPickupFromSlot(par1EntityPlayer, var5);
415            }
416    
417            return var3;
418        }
419    
420        public void func_82850_a(String par1Str)
421        {
422            this.field_82857_m = par1Str;
423    
424            if (this.getSlot(2).getHasStack())
425            {
426                this.getSlot(2).getStack().setItemName(this.field_82857_m);
427            }
428    
429            this.func_82848_d();
430        }
431    
432        static IInventory func_82851_a(ContainerRepair par0ContainerRepair)
433        {
434            return par0ContainerRepair.inputSlots;
435        }
436    
437        static int func_82849_b(ContainerRepair par0ContainerRepair)
438        {
439            return par0ContainerRepair.field_82856_l;
440        }
441    }