001    package net.minecraft.client.gui.inventory;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.List;
006    import net.minecraft.client.Minecraft;
007    import net.minecraft.client.gui.GuiScreen;
008    import net.minecraft.client.renderer.OpenGlHelper;
009    import net.minecraft.client.renderer.RenderHelper;
010    import net.minecraft.client.renderer.entity.RenderItem;
011    import net.minecraft.entity.player.InventoryPlayer;
012    import net.minecraft.inventory.Container;
013    import net.minecraft.inventory.Slot;
014    import net.minecraft.item.ItemStack;
015    import net.minecraft.util.MathHelper;
016    import org.lwjgl.input.Keyboard;
017    import org.lwjgl.opengl.GL11;
018    import org.lwjgl.opengl.GL12;
019    
020    @SideOnly(Side.CLIENT)
021    public abstract class GuiContainer extends GuiScreen
022    {
023        /** Stacks renderer. Icons, stack size, health, etc... */
024        protected static RenderItem itemRenderer = new RenderItem();
025    
026        /** The X size of the inventory window in pixels. */
027        protected int xSize = 176;
028    
029        /** The Y size of the inventory window in pixels. */
030        protected int ySize = 166;
031    
032        /** A list of the players inventory slots. */
033        public Container inventorySlots;
034    
035        /**
036         * Starting X position for the Gui. Inconsistent use for Gui backgrounds.
037         */
038        protected int guiLeft;
039    
040        /**
041         * Starting Y position for the Gui. Inconsistent use for Gui backgrounds.
042         */
043        protected int guiTop;
044        private Slot theSlot;
045    
046        /** Used when touchscreen is enabled */
047        private Slot clickedSlot = null;
048    
049        /** Used when touchscreen is enabled */
050        private boolean isRightMouseClick = false;
051    
052        /** Used when touchscreen is enabled */
053        private ItemStack draggedStack = null;
054        private int field_85049_r = 0;
055        private int field_85048_s = 0;
056        private Slot returningStackDestSlot = null;
057        private long returningStackTime = 0L;
058    
059        /** Used when touchscreen is enabled */
060        private ItemStack returningStack = null;
061        private Slot field_92033_y = null;
062        private long field_92032_z = 0L;
063    
064        public GuiContainer(Container par1Container)
065        {
066            this.inventorySlots = par1Container;
067        }
068    
069        /**
070         * Adds the buttons (and other controls) to the screen in question.
071         */
072        public void initGui()
073        {
074            super.initGui();
075            this.mc.thePlayer.openContainer = this.inventorySlots;
076            this.guiLeft = (this.width - this.xSize) / 2;
077            this.guiTop = (this.height - this.ySize) / 2;
078        }
079    
080        /**
081         * Draws the screen and all the components in it.
082         */
083        public void drawScreen(int par1, int par2, float par3)
084        {
085            this.drawDefaultBackground();
086            int var4 = this.guiLeft;
087            int var5 = this.guiTop;
088            this.drawGuiContainerBackgroundLayer(par3, par1, par2);
089            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
090            RenderHelper.disableStandardItemLighting();
091            GL11.glDisable(GL11.GL_LIGHTING);
092            GL11.glDisable(GL11.GL_DEPTH_TEST);
093            super.drawScreen(par1, par2, par3);
094            RenderHelper.enableGUIStandardItemLighting();
095            GL11.glPushMatrix();
096            GL11.glTranslatef((float)var4, (float)var5, 0.0F);
097            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
098            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
099            this.theSlot = null;
100            short var6 = 240;
101            short var7 = 240;
102            OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var6 / 1.0F, (float)var7 / 1.0F);
103            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
104            int var9;
105    
106            for (int var13 = 0; var13 < this.inventorySlots.inventorySlots.size(); ++var13)
107            {
108                Slot var14 = (Slot)this.inventorySlots.inventorySlots.get(var13);
109                this.drawSlotInventory(var14);
110    
111                if (this.isMouseOverSlot(var14, par1, par2))
112                {
113                    this.theSlot = var14;
114                    GL11.glDisable(GL11.GL_LIGHTING);
115                    GL11.glDisable(GL11.GL_DEPTH_TEST);
116                    int var8 = var14.xDisplayPosition;
117                    var9 = var14.yDisplayPosition;
118                    this.drawGradientRect(var8, var9, var8 + 16, var9 + 16, -2130706433, -2130706433);
119                    GL11.glEnable(GL11.GL_LIGHTING);
120                    GL11.glEnable(GL11.GL_DEPTH_TEST);
121                }
122            }
123    
124            this.drawGuiContainerForegroundLayer(par1, par2);
125            InventoryPlayer var15 = this.mc.thePlayer.inventory;
126            ItemStack var16 = this.draggedStack == null ? var15.getItemStack() : this.draggedStack;
127    
128            if (var16 != null)
129            {
130                byte var18 = 8;
131                var9 = this.draggedStack == null ? 8 : 16;
132    
133                if (this.draggedStack != null && this.isRightMouseClick)
134                {
135                    var16 = var16.copy();
136                    var16.stackSize = MathHelper.ceiling_float_int((float)var16.stackSize / 2.0F);
137                }
138    
139                this.drawItemStack(var16, par1 - var4 - var18, par2 - var5 - var9);
140            }
141    
142            if (this.returningStack != null)
143            {
144                float var17 = (float)(Minecraft.getSystemTime() - this.returningStackTime) / 100.0F;
145    
146                if (var17 >= 1.0F)
147                {
148                    var17 = 1.0F;
149                    this.returningStack = null;
150                }
151    
152                var9 = this.returningStackDestSlot.xDisplayPosition - this.field_85049_r;
153                int var10 = this.returningStackDestSlot.yDisplayPosition - this.field_85048_s;
154                int var11 = this.field_85049_r + (int)((float)var9 * var17);
155                int var12 = this.field_85048_s + (int)((float)var10 * var17);
156                this.drawItemStack(this.returningStack, var11, var12);
157            }
158    
159            if (var15.getItemStack() == null && this.theSlot != null && this.theSlot.getHasStack())
160            {
161                ItemStack var19 = this.theSlot.getStack();
162                this.drawItemStackTooltip(var19, par1 - var4 + 8, par2 - var5 + 8);
163            }
164    
165            GL11.glPopMatrix();
166            GL11.glEnable(GL11.GL_LIGHTING);
167            GL11.glEnable(GL11.GL_DEPTH_TEST);
168            RenderHelper.enableStandardItemLighting();
169        }
170    
171        private void drawItemStack(ItemStack par1ItemStack, int par2, int par3)
172        {
173            GL11.glTranslatef(0.0F, 0.0F, 32.0F);
174            this.zLevel = 200.0F;
175            itemRenderer.zLevel = 200.0F;
176            itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, par1ItemStack, par2, par3);
177            itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, par1ItemStack, par2, par3 - (this.draggedStack == null ? 0 : 8));
178            this.zLevel = 0.0F;
179            itemRenderer.zLevel = 0.0F;
180        }
181    
182        protected void drawItemStackTooltip(ItemStack par1ItemStack, int par2, int par3)
183        {
184            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
185            RenderHelper.disableStandardItemLighting();
186            GL11.glDisable(GL11.GL_LIGHTING);
187            GL11.glDisable(GL11.GL_DEPTH_TEST);
188            List var4 = par1ItemStack.getTooltip(this.mc.thePlayer, this.mc.gameSettings.advancedItemTooltips);
189    
190            if (!var4.isEmpty())
191            {
192                int var5 = 0;
193                int var6;
194                int var7;
195    
196                for (var6 = 0; var6 < var4.size(); ++var6)
197                {
198                    var7 = this.fontRenderer.getStringWidth((String)var4.get(var6));
199    
200                    if (var7 > var5)
201                    {
202                        var5 = var7;
203                    }
204                }
205    
206                var6 = par2 + 12;
207                var7 = par3 - 12;
208                int var9 = 8;
209    
210                if (var4.size() > 1)
211                {
212                    var9 += 2 + (var4.size() - 1) * 10;
213                }
214    
215                if (this.guiTop + var7 + var9 + 6 > this.height)
216                {
217                    var7 = this.height - var9 - this.guiTop - 6;
218                }
219    
220                this.zLevel = 300.0F;
221                itemRenderer.zLevel = 300.0F;
222                int var10 = -267386864;
223                this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, var10, var10);
224                this.drawGradientRect(var6 - 3, var7 + var9 + 3, var6 + var5 + 3, var7 + var9 + 4, var10, var10);
225                this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 + var9 + 3, var10, var10);
226                this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var9 + 3, var10, var10);
227                this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, var7 + var9 + 3, var10, var10);
228                int var11 = 1347420415;
229                int var12 = (var11 & 16711422) >> 1 | var11 & -16777216;
230                this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, var7 + var9 + 3 - 1, var11, var12);
231                this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, var7 + var9 + 3 - 1, var11, var12);
232                this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, var11, var11);
233                this.drawGradientRect(var6 - 3, var7 + var9 + 2, var6 + var5 + 3, var7 + var9 + 3, var12, var12);
234    
235                for (int var13 = 0; var13 < var4.size(); ++var13)
236                {
237                    String var14 = (String)var4.get(var13);
238    
239                    if (var13 == 0)
240                    {
241                        var14 = "\u00a7" + Integer.toHexString(par1ItemStack.getRarity().rarityColor) + var14;
242                    }
243                    else
244                    {
245                        var14 = "\u00a77" + var14;
246                    }
247    
248                    this.fontRenderer.drawStringWithShadow(var14, var6, var7, -1);
249    
250                    if (var13 == 0)
251                    {
252                        var7 += 2;
253                    }
254    
255                    var7 += 10;
256                }
257    
258                this.zLevel = 0.0F;
259                itemRenderer.zLevel = 0.0F;
260            }
261        }
262    
263        /**
264         * Draws the text when mouse is over creative inventory tab. Params: current creative tab to be checked, current
265         * mouse x position, current mouse y position.
266         */
267        protected void drawCreativeTabHoveringText(String par1Str, int par2, int par3)
268        {
269            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
270            RenderHelper.disableStandardItemLighting();
271            GL11.glDisable(GL11.GL_LIGHTING);
272            GL11.glDisable(GL11.GL_DEPTH_TEST);
273            int var4 = this.fontRenderer.getStringWidth(par1Str);
274            int var5 = par2 + 12;
275            int var6 = par3 - 12;
276            byte var8 = 8;
277            this.zLevel = 300.0F;
278            itemRenderer.zLevel = 300.0F;
279            int var9 = -267386864;
280            this.drawGradientRect(var5 - 3, var6 - 4, var5 + var4 + 3, var6 - 3, var9, var9);
281            this.drawGradientRect(var5 - 3, var6 + var8 + 3, var5 + var4 + 3, var6 + var8 + 4, var9, var9);
282            this.drawGradientRect(var5 - 3, var6 - 3, var5 + var4 + 3, var6 + var8 + 3, var9, var9);
283            this.drawGradientRect(var5 - 4, var6 - 3, var5 - 3, var6 + var8 + 3, var9, var9);
284            this.drawGradientRect(var5 + var4 + 3, var6 - 3, var5 + var4 + 4, var6 + var8 + 3, var9, var9);
285            int var10 = 1347420415;
286            int var11 = (var10 & 16711422) >> 1 | var10 & -16777216;
287            this.drawGradientRect(var5 - 3, var6 - 3 + 1, var5 - 3 + 1, var6 + var8 + 3 - 1, var10, var11);
288            this.drawGradientRect(var5 + var4 + 2, var6 - 3 + 1, var5 + var4 + 3, var6 + var8 + 3 - 1, var10, var11);
289            this.drawGradientRect(var5 - 3, var6 - 3, var5 + var4 + 3, var6 - 3 + 1, var10, var10);
290            this.drawGradientRect(var5 - 3, var6 + var8 + 2, var5 + var4 + 3, var6 + var8 + 3, var11, var11);
291            this.fontRenderer.drawStringWithShadow(par1Str, var5, var6, -1);
292            this.zLevel = 0.0F;
293            itemRenderer.zLevel = 0.0F;
294            GL11.glEnable(GL11.GL_LIGHTING);
295            GL11.glEnable(GL11.GL_DEPTH_TEST);
296            RenderHelper.enableStandardItemLighting();
297            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
298        }
299    
300        /**
301         * Draw the foreground layer for the GuiContainer (everything in front of the items)
302         */
303        protected void drawGuiContainerForegroundLayer(int par1, int par2) {}
304    
305        /**
306         * Draw the background layer for the GuiContainer (everything behind the items)
307         */
308        protected abstract void drawGuiContainerBackgroundLayer(float var1, int var2, int var3);
309    
310        /**
311         * Draws an inventory slot
312         */
313        protected void drawSlotInventory(Slot par1Slot)
314        {
315            int var2 = par1Slot.xDisplayPosition;
316            int var3 = par1Slot.yDisplayPosition;
317            ItemStack var4 = par1Slot.getStack();
318            boolean var5 = par1Slot == this.clickedSlot && this.draggedStack != null && !this.isRightMouseClick;
319    
320            if (par1Slot == this.clickedSlot && this.draggedStack != null && this.isRightMouseClick && var4 != null)
321            {
322                var4 = var4.copy();
323                var4.stackSize /= 2;
324            }
325    
326            this.zLevel = 100.0F;
327            itemRenderer.zLevel = 100.0F;
328    
329            if (var4 == null)
330            {
331                int var6 = par1Slot.getBackgroundIconIndex();
332    
333                if (var6 >= 0)
334                {
335                    GL11.glDisable(GL11.GL_LIGHTING);
336                    this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture(par1Slot.getBackgroundIconTexture()));
337                    this.drawTexturedModalRect(var2, var3, var6 % 16 * 16, var6 / 16 * 16, 16, 16);
338                    GL11.glEnable(GL11.GL_LIGHTING);
339                    var5 = true;
340                }
341            }
342    
343            if (!var5)
344            {
345                GL11.glEnable(GL11.GL_DEPTH_TEST);
346                itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, var4, var2, var3);
347                itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var4, var2, var3);
348            }
349    
350            itemRenderer.zLevel = 0.0F;
351            this.zLevel = 0.0F;
352        }
353    
354        /**
355         * Returns the slot at the given coordinates or null if there is none.
356         */
357        private Slot getSlotAtPosition(int par1, int par2)
358        {
359            for (int var3 = 0; var3 < this.inventorySlots.inventorySlots.size(); ++var3)
360            {
361                Slot var4 = (Slot)this.inventorySlots.inventorySlots.get(var3);
362    
363                if (this.isMouseOverSlot(var4, par1, par2))
364                {
365                    return var4;
366                }
367            }
368    
369            return null;
370        }
371    
372        /**
373         * Called when the mouse is clicked.
374         */
375        protected void mouseClicked(int par1, int par2, int par3)
376        {
377            super.mouseClicked(par1, par2, par3);
378            boolean var4 = par3 == this.mc.gameSettings.keyBindPickBlock.keyCode + 100;
379    
380            if (par3 == 0 || par3 == 1 || var4)
381            {
382                Slot var5 = this.getSlotAtPosition(par1, par2);
383                int var6 = this.guiLeft;
384                int var7 = this.guiTop;
385                boolean var8 = par1 < var6 || par2 < var7 || par1 >= var6 + this.xSize || par2 >= var7 + this.ySize;
386                int var9 = -1;
387    
388                if (var5 != null)
389                {
390                    var9 = var5.slotNumber;
391                }
392    
393                if (var8)
394                {
395                    var9 = -999;
396                }
397    
398                if (this.mc.gameSettings.touchscreen && var8 && this.mc.thePlayer.inventory.getItemStack() == null)
399                {
400                    this.mc.displayGuiScreen((GuiScreen)null);
401                    return;
402                }
403    
404                if (var9 != -1)
405                {
406                    if (this.mc.gameSettings.touchscreen)
407                    {
408                        if (var5 != null && var5.getHasStack())
409                        {
410                            this.clickedSlot = var5;
411                            this.draggedStack = null;
412                            this.isRightMouseClick = par3 == 1;
413                        }
414                        else
415                        {
416                            this.clickedSlot = null;
417                        }
418                    }
419                    else if (var4)
420                    {
421                        this.handleMouseClick(var5, var9, par3, 3);
422                    }
423                    else
424                    {
425                        boolean var10 = var9 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54));
426                        this.handleMouseClick(var5, var9, par3, var10 ? 1 : 0);
427                    }
428                }
429            }
430        }
431    
432        protected void func_85041_a(int par1, int par2, int par3, long par4)
433        {
434            if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
435            {
436                if (par3 == 0 || par3 == 1)
437                {
438                    Slot var6 = this.getSlotAtPosition(par1, par2);
439    
440                    if (this.draggedStack == null)
441                    {
442                        if (var6 != this.clickedSlot)
443                        {
444                            this.draggedStack = this.clickedSlot.getStack().copy();
445                        }
446                    }
447                    else if (this.draggedStack.stackSize > 1 && var6 != null && this.func_92031_b(var6))
448                    {
449                        long var7 = Minecraft.getSystemTime();
450    
451                        if (this.field_92033_y == var6)
452                        {
453                            if (var7 - this.field_92032_z > 500L)
454                            {
455                                this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
456                                this.handleMouseClick(var6, var6.slotNumber, 1, 0);
457                                this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
458                                this.field_92032_z = var7 + 750L;
459                                --this.draggedStack.stackSize;
460                            }
461                        }
462                        else
463                        {
464                            this.field_92033_y = var6;
465                            this.field_92032_z = var7;
466                        }
467                    }
468                }
469            }
470        }
471    
472        /**
473         * Called when the mouse is moved or a mouse button is released.  Signature: (mouseX, mouseY, which) which==-1 is
474         * mouseMove, which==0 or which==1 is mouseUp
475         */
476        protected void mouseMovedOrUp(int par1, int par2, int par3)
477        {
478            if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
479            {
480                if (par3 == 0 || par3 == 1)
481                {
482                    Slot var4 = this.getSlotAtPosition(par1, par2);
483                    int var5 = this.guiLeft;
484                    int var6 = this.guiTop;
485                    boolean var7 = par1 < var5 || par2 < var6 || par1 >= var5 + this.xSize || par2 >= var6 + this.ySize;
486                    int var8 = -1;
487    
488                    if (var4 != null)
489                    {
490                        var8 = var4.slotNumber;
491                    }
492    
493                    if (var7)
494                    {
495                        var8 = -999;
496                    }
497    
498                    if (this.draggedStack == null && var4 != this.clickedSlot)
499                    {
500                        this.draggedStack = this.clickedSlot.getStack();
501                    }
502    
503                    boolean var9 = this.func_92031_b(var4);
504    
505                    if (var8 != -1 && this.draggedStack != null && var9)
506                    {
507                        this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, par3, 0);
508                        this.handleMouseClick(var4, var8, 0, 0);
509    
510                        if (this.mc.thePlayer.inventory.getItemStack() != null)
511                        {
512                            this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, par3, 0);
513                            this.field_85049_r = par1 - var5;
514                            this.field_85048_s = par2 - var6;
515                            this.returningStackDestSlot = this.clickedSlot;
516                            this.returningStack = this.draggedStack;
517                            this.returningStackTime = Minecraft.getSystemTime();
518                        }
519                        else
520                        {
521                            this.returningStack = null;
522                        }
523                    }
524                    else if (this.draggedStack != null)
525                    {
526                        this.field_85049_r = par1 - var5;
527                        this.field_85048_s = par2 - var6;
528                        this.returningStackDestSlot = this.clickedSlot;
529                        this.returningStack = this.draggedStack;
530                        this.returningStackTime = Minecraft.getSystemTime();
531                    }
532    
533                    this.draggedStack = null;
534                    this.clickedSlot = null;
535                }
536            }
537        }
538    
539        private boolean func_92031_b(Slot par1Slot)
540        {
541            boolean var2 = par1Slot == null || !par1Slot.getHasStack();
542    
543            if (par1Slot != null && par1Slot.getHasStack() && this.draggedStack != null && ItemStack.areItemStackTagsEqual(par1Slot.getStack(), this.draggedStack))
544            {
545                var2 |= par1Slot.getStack().stackSize + this.draggedStack.stackSize <= this.draggedStack.getMaxStackSize();
546            }
547    
548            return var2;
549        }
550    
551        /**
552         * Returns if the passed mouse position is over the specified slot.
553         */
554        private boolean isMouseOverSlot(Slot par1Slot, int par2, int par3)
555        {
556            return this.isPointInRegion(par1Slot.xDisplayPosition, par1Slot.yDisplayPosition, 16, 16, par2, par3);
557        }
558    
559        /**
560         * Args: left, top, width, height, pointX, pointY. Note: left, top are local to Gui, pointX, pointY are local to
561         * screen
562         */
563        protected boolean isPointInRegion(int par1, int par2, int par3, int par4, int par5, int par6)
564        {
565            int var7 = this.guiLeft;
566            int var8 = this.guiTop;
567            par5 -= var7;
568            par6 -= var8;
569            return par5 >= par1 - 1 && par5 < par1 + par3 + 1 && par6 >= par2 - 1 && par6 < par2 + par4 + 1;
570        }
571    
572        protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4)
573        {
574            if (par1Slot != null)
575            {
576                par2 = par1Slot.slotNumber;
577            }
578    
579            this.mc.playerController.windowClick(this.inventorySlots.windowId, par2, par3, par4, this.mc.thePlayer);
580        }
581    
582        /**
583         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
584         */
585        protected void keyTyped(char par1, int par2)
586        {
587            if (par2 == 1 || par2 == this.mc.gameSettings.keyBindInventory.keyCode)
588            {
589                this.mc.thePlayer.closeScreen();
590            }
591    
592            this.checkHotbarKeys(par2);
593    
594            if (par2 == this.mc.gameSettings.keyBindPickBlock.keyCode && this.theSlot != null && this.theSlot.getHasStack())
595            {
596                this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, this.ySize, 3);
597            }
598        }
599    
600        /**
601         * This function is what controls the hotbar shortcut check when you press a number key when hovering a stack.
602         */
603        protected boolean checkHotbarKeys(int par1)
604        {
605            if (this.mc.thePlayer.inventory.getItemStack() == null && this.theSlot != null)
606            {
607                for (int var2 = 0; var2 < 9; ++var2)
608                {
609                    if (par1 == 2 + var2)
610                    {
611                        this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, var2, 2);
612                        return true;
613                    }
614                }
615            }
616    
617            return false;
618        }
619    
620        /**
621         * Called when the screen is unloaded. Used to disable keyboard repeat events
622         */
623        public void onGuiClosed()
624        {
625            if (this.mc.thePlayer != null)
626            {
627                this.inventorySlots.onCraftGuiClosed(this.mc.thePlayer);
628            }
629        }
630    
631        /**
632         * Returns true if this GUI should pause the game when it is displayed in single-player
633         */
634        public boolean doesGuiPauseGame()
635        {
636            return false;
637        }
638    
639        /**
640         * Called from the main game loop to update the screen.
641         */
642        public void updateScreen()
643        {
644            super.updateScreen();
645    
646            if (!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead)
647            {
648                this.mc.thePlayer.closeScreen();
649            }
650        }
651    }