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