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.ArrayList;
006    import java.util.Iterator;
007    import java.util.List;
008    import net.minecraft.client.gui.GuiButton;
009    import net.minecraft.client.gui.GuiTextField;
010    import net.minecraft.client.gui.achievement.GuiAchievements;
011    import net.minecraft.client.gui.achievement.GuiStats;
012    import net.minecraft.client.renderer.InventoryEffectRenderer;
013    import net.minecraft.client.renderer.RenderHelper;
014    import net.minecraft.creativetab.CreativeTabs;
015    import net.minecraft.enchantment.Enchantment;
016    import net.minecraft.entity.player.EntityPlayer;
017    import net.minecraft.entity.player.InventoryPlayer;
018    import net.minecraft.inventory.Container;
019    import net.minecraft.inventory.InventoryBasic;
020    import net.minecraft.inventory.Slot;
021    import net.minecraft.item.Item;
022    import net.minecraft.item.ItemStack;
023    import net.minecraft.stats.AchievementList;
024    import net.minecraft.util.StringTranslate;
025    import org.lwjgl.input.Keyboard;
026    import org.lwjgl.input.Mouse;
027    import org.lwjgl.opengl.GL11;
028    import org.lwjgl.opengl.GL12;
029    
030    @SideOnly(Side.CLIENT)
031    public class GuiContainerCreative extends InventoryEffectRenderer
032    {
033        private static InventoryBasic inventory = new InventoryBasic("tmp", 45);
034    
035        /** Currently selected creative inventory tab index. */
036        private static int selectedTabIndex = CreativeTabs.tabBlock.getTabIndex();
037    
038        /** Amount scrolled in Creative mode inventory (0 = top, 1 = bottom) */
039        private float currentScroll = 0.0F;
040    
041        /** True if the scrollbar is being dragged */
042        private boolean isScrolling = false;
043    
044        /**
045         * True if the left mouse button was held down last time drawScreen was called.
046         */
047        private boolean wasClicking;
048        private GuiTextField searchField;
049        private List field_74236_u;
050        private Slot field_74235_v = null;
051        private boolean field_74234_w = false;
052        private CreativeCrafting field_82324_x;
053        private static int tabPage = 0;
054        private int maxPages = 0;
055    
056        public GuiContainerCreative(EntityPlayer par1EntityPlayer)
057        {
058            super(new ContainerCreative(par1EntityPlayer));
059            par1EntityPlayer.openContainer = this.inventorySlots;
060            this.allowUserInput = true;
061            par1EntityPlayer.addStat(AchievementList.openInventory, 1);
062            this.ySize = 136;
063            this.xSize = 195;
064        }
065    
066        /**
067         * Called from the main game loop to update the screen.
068         */
069        public void updateScreen()
070        {
071            if (!this.mc.playerController.isInCreativeMode())
072            {
073                this.mc.displayGuiScreen(new GuiInventory(this.mc.thePlayer));
074            }
075        }
076    
077        protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4)
078        {
079            this.field_74234_w = true;
080            boolean var5 = par4 == 1;
081            InventoryPlayer var6;
082            ItemStack var7;
083    
084            if (par1Slot != null)
085            {
086                if (par1Slot == this.field_74235_v && var5)
087                {
088                    for (int var10 = 0; var10 < this.mc.thePlayer.inventoryContainer.getInventory().size(); ++var10)
089                    {
090                        this.mc.playerController.sendSlotPacket((ItemStack)null, var10);
091                    }
092                }
093                else if (selectedTabIndex == CreativeTabs.tabInventory.getTabIndex())
094                {
095                    if (par1Slot == this.field_74235_v)
096                    {
097                        this.mc.thePlayer.inventory.setItemStack((ItemStack)null);
098                    }
099                    else
100                    {
101                        this.mc.thePlayer.inventoryContainer.slotClick(SlotCreativeInventory.func_75240_a((SlotCreativeInventory)par1Slot).slotNumber, par3, par4, this.mc.thePlayer);
102                        this.mc.thePlayer.inventoryContainer.updateCraftingResults();
103                    }
104                }
105                else if (par1Slot.inventory == inventory)
106                {
107                    var6 = this.mc.thePlayer.inventory;
108                    var7 = var6.getItemStack();
109                    ItemStack var8 = par1Slot.getStack();
110                    ItemStack var9;
111    
112                    if (par4 == 2)
113                    {
114                        if (var8 != null && par3 >= 0 && par3 < 9)
115                        {
116                            var9 = var8.copy();
117                            var9.stackSize = var9.getMaxStackSize();
118                            this.mc.thePlayer.inventory.setInventorySlotContents(par3, var9);
119                            this.mc.thePlayer.inventoryContainer.updateCraftingResults();
120                        }
121    
122                        return;
123                    }
124    
125                    if (par4 == 3)
126                    {
127                        if (var6.getItemStack() == null && par1Slot.getHasStack())
128                        {
129                            var9 = par1Slot.getStack().copy();
130                            var9.stackSize = var9.getMaxStackSize();
131                            var6.setItemStack(var9);
132                        }
133    
134                        return;
135                    }
136    
137                    if (var7 != null && var8 != null && var7.isItemEqual(var8))
138                    {
139                        if (par3 == 0)
140                        {
141                            if (var5)
142                            {
143                                var7.stackSize = var7.getMaxStackSize();
144                            }
145                            else if (var7.stackSize < var7.getMaxStackSize())
146                            {
147                                ++var7.stackSize;
148                            }
149                        }
150                        else if (var7.stackSize <= 1)
151                        {
152                            var6.setItemStack((ItemStack)null);
153                        }
154                        else
155                        {
156                            --var7.stackSize;
157                        }
158                    }
159                    else if (var8 != null && var7 == null)
160                    {
161                        var6.setItemStack(ItemStack.copyItemStack(var8));
162                        var7 = var6.getItemStack();
163    
164                        if (var5)
165                        {
166                            var7.stackSize = var7.getMaxStackSize();
167                        }
168                    }
169                    else
170                    {
171                        var6.setItemStack((ItemStack)null);
172                    }
173                }
174                else
175                {
176                    this.inventorySlots.slotClick(par1Slot.slotNumber, par3, par4, this.mc.thePlayer);
177                    ItemStack var11 = this.inventorySlots.getSlot(par1Slot.slotNumber).getStack();
178                    this.mc.playerController.sendSlotPacket(var11, par1Slot.slotNumber - this.inventorySlots.inventorySlots.size() + 9 + 36);
179                }
180            }
181            else
182            {
183                var6 = this.mc.thePlayer.inventory;
184    
185                if (var6.getItemStack() != null)
186                {
187                    if (par3 == 0)
188                    {
189                        this.mc.thePlayer.dropPlayerItem(var6.getItemStack());
190                        this.mc.playerController.func_78752_a(var6.getItemStack());
191                        var6.setItemStack((ItemStack)null);
192                    }
193    
194                    if (par3 == 1)
195                    {
196                        var7 = var6.getItemStack().splitStack(1);
197                        this.mc.thePlayer.dropPlayerItem(var7);
198                        this.mc.playerController.func_78752_a(var7);
199    
200                        if (var6.getItemStack().stackSize == 0)
201                        {
202                            var6.setItemStack((ItemStack)null);
203                        }
204                    }
205                }
206            }
207        }
208    
209        /**
210         * Adds the buttons (and other controls) to the screen in question.
211         */
212        public void initGui()
213        {
214            if (this.mc.playerController.isInCreativeMode())
215            {
216                super.initGui();
217                this.controlList.clear();
218                Keyboard.enableRepeatEvents(true);
219                this.searchField = new GuiTextField(this.fontRenderer, this.guiLeft + 82, this.guiTop + 6, 89, this.fontRenderer.FONT_HEIGHT);
220                this.searchField.setMaxStringLength(15);
221                this.searchField.setEnableBackgroundDrawing(false);
222                this.searchField.setVisible(false);
223                this.searchField.setTextColor(16777215);
224                int var1 = selectedTabIndex;
225                selectedTabIndex = -1;
226                this.func_74227_b(CreativeTabs.creativeTabArray[var1]);
227                this.field_82324_x = new CreativeCrafting(this.mc);
228                this.mc.thePlayer.inventoryContainer.addCraftingToCrafters(this.field_82324_x);
229                int tabCount = CreativeTabs.creativeTabArray.length;
230                if (tabCount > 12)
231                {
232                    controlList.add(new GuiButton(101, guiLeft,              guiTop - 50, 20, 20, "<"));
233                    controlList.add(new GuiButton(102, guiLeft + xSize - 20, guiTop - 50, 20, 20, ">"));
234                    maxPages = ((tabCount - 12) / 10) + 1;
235                }
236            }
237            else
238            {
239                this.mc.displayGuiScreen(new GuiInventory(this.mc.thePlayer));
240            }
241        }
242    
243        /**
244         * Called when the screen is unloaded. Used to disable keyboard repeat events
245         */
246        public void onGuiClosed()
247        {
248            super.onGuiClosed();
249    
250            if (this.mc.thePlayer != null && this.mc.thePlayer.inventory != null)
251            {
252                this.mc.thePlayer.inventoryContainer.removeCraftingFromCrafters(this.field_82324_x);
253            }
254    
255            Keyboard.enableRepeatEvents(false);
256        }
257    
258        /**
259         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
260         */
261        protected void keyTyped(char par1, int par2)
262        {
263            if (selectedTabIndex != CreativeTabs.tabAllSearch.getTabIndex())
264            {
265                if (Keyboard.isKeyDown(this.mc.gameSettings.keyBindChat.keyCode))
266                {
267                    this.func_74227_b(CreativeTabs.tabAllSearch);
268                }
269                else
270                {
271                    super.keyTyped(par1, par2);
272                }
273            }
274            else
275            {
276                if (this.field_74234_w)
277                {
278                    this.field_74234_w = false;
279                    this.searchField.setText("");
280                }
281    
282                if (!this.func_82319_a(par2))
283                {
284                    if (this.searchField.textboxKeyTyped(par1, par2))
285                    {
286                        this.updateCreativeSearch();
287                    }
288                    else
289                    {
290                        super.keyTyped(par1, par2);
291                    }
292                }
293            }
294        }
295    
296        private void updateCreativeSearch()
297        {
298            ContainerCreative var1 = (ContainerCreative)this.inventorySlots;
299            var1.itemList.clear();
300            Item[] var2 = Item.itemsList;
301            int var3 = var2.length;
302            int var4;
303    
304            for (var4 = 0; var4 < var3; ++var4)
305            {
306                Item var5 = var2[var4];
307    
308                if (var5 != null && var5.getCreativeTab() != null)
309                {
310                    var5.getSubItems(var5.shiftedIndex, (CreativeTabs)null, var1.itemList);
311                }
312            }
313    
314            Enchantment[] var8 = Enchantment.enchantmentsList;
315            var3 = var8.length;
316    
317            for (var4 = 0; var4 < var3; ++var4)
318            {
319                Enchantment var12 = var8[var4];
320    
321                if (var12 != null && var12.type != null)
322                {
323                    Item.field_92053_bW.func_92113_a(var12, var1.itemList);
324                }
325            }
326    
327            Iterator var9 = var1.itemList.iterator();
328            String var10 = this.searchField.getText().toLowerCase();
329    
330            while (var9.hasNext())
331            {
332                ItemStack var11 = (ItemStack)var9.next();
333                boolean var13 = false;
334                Iterator var6 = var11.getTooltip(this.mc.thePlayer, this.mc.gameSettings.advancedItemTooltips).iterator();
335    
336                while (true)
337                {
338                    if (var6.hasNext())
339                    {
340                        String var7 = (String)var6.next();
341    
342                        if (!var7.toLowerCase().contains(var10))
343                        {
344                            continue;
345                        }
346    
347                        var13 = true;
348                    }
349    
350                    if (!var13)
351                    {
352                        var9.remove();
353                    }
354    
355                    break;
356                }
357            }
358    
359            this.currentScroll = 0.0F;
360            var1.scrollTo(0.0F);
361        }
362    
363        /**
364         * Draw the foreground layer for the GuiContainer (everything in front of the items)
365         */
366        protected void drawGuiContainerForegroundLayer(int par1, int par2)
367        {
368            CreativeTabs var3 = CreativeTabs.creativeTabArray[selectedTabIndex];
369    
370            if (var3 != null && var3.drawInForegroundOfTab())
371            {
372                this.fontRenderer.drawString(var3.getTranslatedTabLabel(), 8, 6, 4210752);
373            }
374        }
375    
376        /**
377         * Called when the mouse is clicked.
378         */
379        protected void mouseClicked(int par1, int par2, int par3)
380        {
381            if (par3 == 0)
382            {
383                int var4 = par1 - this.guiLeft;
384                int var5 = par2 - this.guiTop;
385                CreativeTabs[] var6 = CreativeTabs.creativeTabArray;
386                int var7 = var6.length;
387    
388                for (int var8 = 0; var8 < var7; ++var8)
389                {
390                    CreativeTabs var9 = var6[var8];
391    
392                    if (var9 != null && func_74232_a(var9, var4, var5))
393                    {
394                        this.func_74227_b(var9);
395                        return;
396                    }
397                }
398            }
399    
400            super.mouseClicked(par1, par2, par3);
401        }
402    
403        /**
404         * returns (if you are not on the inventoryTab) and (the flag isn't set) and( you have more than 1 page of items)
405         */
406        private boolean needsScrollBars()
407        {
408            if (CreativeTabs.creativeTabArray[selectedTabIndex] == null) return false;
409            return selectedTabIndex != CreativeTabs.tabInventory.getTabIndex() && CreativeTabs.creativeTabArray[selectedTabIndex].shouldHidePlayerInventory() && ((ContainerCreative)this.inventorySlots).hasMoreThan1PageOfItemsInList();
410        }
411    
412        private void func_74227_b(CreativeTabs par1CreativeTabs)
413        {
414            if (par1CreativeTabs == null)
415            {
416                return;
417            }
418    
419            int var2 = selectedTabIndex;
420            selectedTabIndex = par1CreativeTabs.getTabIndex();
421            ContainerCreative var3 = (ContainerCreative)this.inventorySlots;
422            var3.itemList.clear();
423            par1CreativeTabs.displayAllReleventItems(var3.itemList);
424    
425            if (par1CreativeTabs == CreativeTabs.tabInventory)
426            {
427                Container var4 = this.mc.thePlayer.inventoryContainer;
428    
429                if (this.field_74236_u == null)
430                {
431                    this.field_74236_u = var3.inventorySlots;
432                }
433    
434                var3.inventorySlots = new ArrayList();
435    
436                for (int var5 = 0; var5 < var4.inventorySlots.size(); ++var5)
437                {
438                    SlotCreativeInventory var6 = new SlotCreativeInventory(this, (Slot)var4.inventorySlots.get(var5), var5);
439                    var3.inventorySlots.add(var6);
440                    int var7;
441                    int var8;
442                    int var9;
443    
444                    if (var5 >= 5 && var5 < 9)
445                    {
446                        var7 = var5 - 5;
447                        var8 = var7 / 2;
448                        var9 = var7 % 2;
449                        var6.xDisplayPosition = 9 + var8 * 54;
450                        var6.yDisplayPosition = 6 + var9 * 27;
451                    }
452                    else if (var5 >= 0 && var5 < 5)
453                    {
454                        var6.yDisplayPosition = -2000;
455                        var6.xDisplayPosition = -2000;
456                    }
457                    else if (var5 < var4.inventorySlots.size())
458                    {
459                        var7 = var5 - 9;
460                        var8 = var7 % 9;
461                        var9 = var7 / 9;
462                        var6.xDisplayPosition = 9 + var8 * 18;
463    
464                        if (var5 >= 36)
465                        {
466                            var6.yDisplayPosition = 112;
467                        }
468                        else
469                        {
470                            var6.yDisplayPosition = 54 + var9 * 18;
471                        }
472                    }
473                }
474    
475                this.field_74235_v = new Slot(inventory, 0, 173, 112);
476                var3.inventorySlots.add(this.field_74235_v);
477            }
478            else if (var2 == CreativeTabs.tabInventory.getTabIndex())
479            {
480                var3.inventorySlots = this.field_74236_u;
481                this.field_74236_u = null;
482            }
483    
484            if (this.searchField != null)
485            {
486                if (par1CreativeTabs == CreativeTabs.tabAllSearch)
487                {
488                    this.searchField.setVisible(true);
489                    this.searchField.setCanLoseFocus(false);
490                    this.searchField.setFocused(true);
491                    this.searchField.setText("");
492                    this.updateCreativeSearch();
493                }
494                else
495                {
496                    this.searchField.setVisible(false);
497                    this.searchField.setCanLoseFocus(true);
498                    this.searchField.setFocused(false);
499                }
500            }
501    
502            this.currentScroll = 0.0F;
503            var3.scrollTo(0.0F);
504        }
505    
506        /**
507         * Handles mouse input.
508         */
509        public void handleMouseInput()
510        {
511            super.handleMouseInput();
512            int var1 = Mouse.getEventDWheel();
513    
514            if (var1 != 0 && this.needsScrollBars())
515            {
516                int var2 = ((ContainerCreative)this.inventorySlots).itemList.size() / 9 - 5 + 1;
517    
518                if (var1 > 0)
519                {
520                    var1 = 1;
521                }
522    
523                if (var1 < 0)
524                {
525                    var1 = -1;
526                }
527    
528                this.currentScroll = (float)((double)this.currentScroll - (double)var1 / (double)var2);
529    
530                if (this.currentScroll < 0.0F)
531                {
532                    this.currentScroll = 0.0F;
533                }
534    
535                if (this.currentScroll > 1.0F)
536                {
537                    this.currentScroll = 1.0F;
538                }
539    
540                ((ContainerCreative)this.inventorySlots).scrollTo(this.currentScroll);
541            }
542        }
543    
544        /**
545         * Draws the screen and all the components in it.
546         */
547        public void drawScreen(int par1, int par2, float par3)
548        {
549            boolean var4 = Mouse.isButtonDown(0);
550            int var5 = this.guiLeft;
551            int var6 = this.guiTop;
552            int var7 = var5 + 175;
553            int var8 = var6 + 18;
554            int var9 = var7 + 14;
555            int var10 = var8 + 112;
556    
557            if (!this.wasClicking && var4 && par1 >= var7 && par2 >= var8 && par1 < var9 && par2 < var10)
558            {
559                this.isScrolling = this.needsScrollBars();
560            }
561    
562            if (!var4)
563            {
564                this.isScrolling = false;
565            }
566    
567            this.wasClicking = var4;
568    
569            if (this.isScrolling)
570            {
571                this.currentScroll = ((float)(par2 - var8) - 7.5F) / ((float)(var10 - var8) - 15.0F);
572    
573                if (this.currentScroll < 0.0F)
574                {
575                    this.currentScroll = 0.0F;
576                }
577    
578                if (this.currentScroll > 1.0F)
579                {
580                    this.currentScroll = 1.0F;
581                }
582    
583                ((ContainerCreative)this.inventorySlots).scrollTo(this.currentScroll);
584            }
585    
586            super.drawScreen(par1, par2, par3);
587            CreativeTabs[] var11 = CreativeTabs.creativeTabArray;
588            int start = tabPage * 10;
589            int var12 = Math.min(var11.length, ((tabPage + 1) * 10) + 2);
590            if (tabPage != 0) start += 2;
591            boolean rendered = false;
592    
593            for (int var13 = start; var13 < var12; ++var13)
594            {
595                CreativeTabs var14 = var11[var13];
596    
597                if (var14 != null && renderCreativeInventoryHoveringText(var14, par1, par2))
598                {
599                    rendered = true;
600                    break;
601                }
602            }
603    
604            if (!rendered && !renderCreativeInventoryHoveringText(CreativeTabs.tabAllSearch, par1, par2))
605            {
606                renderCreativeInventoryHoveringText(CreativeTabs.tabInventory, par1, par2);
607            }
608    
609            if (this.field_74235_v != null && selectedTabIndex == CreativeTabs.tabInventory.getTabIndex() && this.func_74188_c(this.field_74235_v.xDisplayPosition, this.field_74235_v.yDisplayPosition, 16, 16, par1, par2))
610            {
611                this.drawCreativeTabHoveringText(StringTranslate.getInstance().translateKey("inventory.binSlot"), par1, par2);
612            }
613    
614            if (maxPages != 0)
615            {
616                String page = String.format("%d / %d", tabPage + 1, maxPages + 1);
617                int width = fontRenderer.getStringWidth(page);
618                GL11.glDisable(GL11.GL_LIGHTING);
619                this.zLevel = 300.0F;
620                itemRenderer.zLevel = 300.0F;
621                fontRenderer.drawString(page, guiLeft + (xSize / 2) - (width / 2), guiTop - 44, -1);
622                this.zLevel = 0.0F;
623                itemRenderer.zLevel = 0.0F;
624            }
625    
626            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
627            GL11.glDisable(GL11.GL_LIGHTING);
628        }
629    
630        /**
631         * Draw the background layer for the GuiContainer (everything behind the items)
632         */
633        protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
634        {
635            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
636            RenderHelper.enableGUIStandardItemLighting();
637            int var4 = this.mc.renderEngine.getTexture("/gui/allitems.png");
638            CreativeTabs var5 = CreativeTabs.creativeTabArray[selectedTabIndex];
639            int var6 = this.mc.renderEngine.getTexture("/gui/creative_inv/" + var5.getBackgroundImageName());
640            CreativeTabs[] var7 = CreativeTabs.creativeTabArray;
641            int var8 = var7.length;
642            int var9;
643    
644            int start = tabPage * 10;
645            var8 = Math.min(var7.length, ((tabPage + 1) * 10 + 2));
646            if (tabPage != 0) start += 2;
647    
648            for (var9 = start; var9 < var8; ++var9)
649            {
650                CreativeTabs var10 = var7[var9];
651                this.mc.renderEngine.bindTexture(var4);
652    
653                if (var10 != null && var10.getTabIndex() != selectedTabIndex)
654                {
655                    this.renderCreativeTab(var10);
656                }
657            }
658    
659            if (tabPage != 0)
660            {
661                if (var5 != CreativeTabs.tabAllSearch)
662                {
663                    mc.renderEngine.bindTexture(var4);
664                    renderCreativeTab(CreativeTabs.tabAllSearch);
665                }
666                if (var5 != CreativeTabs.tabInventory)
667                {
668                    mc.renderEngine.bindTexture(var4);
669                    renderCreativeTab(CreativeTabs.tabInventory);
670                }
671            }
672    
673            this.mc.renderEngine.bindTexture(var6);
674            this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
675            this.searchField.drawTextBox();
676            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
677            int var11 = this.guiLeft + 175;
678            var8 = this.guiTop + 18;
679            var9 = var8 + 112;
680            this.mc.renderEngine.bindTexture(var4);
681    
682            if (var5.shouldHidePlayerInventory())
683            {
684                this.drawTexturedModalRect(var11, var8 + (int)((float)(var9 - var8 - 17) * this.currentScroll), 232 + (this.needsScrollBars() ? 0 : 12), 0, 12, 15);
685            }
686    
687            if (var5 == null || var5.getTabPage() != tabPage)
688            {
689                if (var5 != CreativeTabs.tabAllSearch && var5 != CreativeTabs.tabInventory)
690                {
691                    return;
692                }
693            }
694    
695            this.renderCreativeTab(var5);
696    
697            if (var5 == CreativeTabs.tabInventory)
698            {
699                GuiInventory.func_74223_a(this.mc, this.guiLeft + 43, this.guiTop + 45, 20, (float)(this.guiLeft + 43 - par2), (float)(this.guiTop + 45 - 30 - par3));
700            }
701        }
702    
703        protected boolean func_74232_a(CreativeTabs par1CreativeTabs, int par2, int par3)
704        {
705            if (par1CreativeTabs.getTabPage() != tabPage)
706            {
707                if (par1CreativeTabs != CreativeTabs.tabAllSearch &&
708                    par1CreativeTabs != CreativeTabs.tabInventory)
709                {
710                    return false;
711                }
712            }
713    
714            int var4 = par1CreativeTabs.getTabColumn();
715            int var5 = 28 * var4;
716            byte var6 = 0;
717    
718            if (var4 == 5)
719            {
720                var5 = this.xSize - 28 + 2;
721            }
722            else if (var4 > 0)
723            {
724                var5 += var4;
725            }
726    
727            int var7;
728    
729            if (par1CreativeTabs.isTabInFirstRow())
730            {
731                var7 = var6 - 32;
732            }
733            else
734            {
735                var7 = var6 + this.ySize;
736            }
737    
738            return par2 >= var5 && par2 <= var5 + 28 && par3 >= var7 && par3 <= var7 + 32;
739        }
740    
741        /**
742         * Renders the creative inventory hovering text if mouse is over it. Returns true if did render or false otherwise.
743         * Params: current creative tab to be checked, current mouse x position, current mouse y position.
744         */
745        protected boolean renderCreativeInventoryHoveringText(CreativeTabs par1CreativeTabs, int par2, int par3)
746        {
747            int var4 = par1CreativeTabs.getTabColumn();
748            int var5 = 28 * var4;
749            byte var6 = 0;
750    
751            if (var4 == 5)
752            {
753                var5 = this.xSize - 28 + 2;
754            }
755            else if (var4 > 0)
756            {
757                var5 += var4;
758            }
759    
760            int var7;
761    
762            if (par1CreativeTabs.isTabInFirstRow())
763            {
764                var7 = var6 - 32;
765            }
766            else
767            {
768                var7 = var6 + this.ySize;
769            }
770    
771            if (this.func_74188_c(var5 + 3, var7 + 3, 23, 27, par2, par3))
772            {
773                this.drawCreativeTabHoveringText(par1CreativeTabs.getTranslatedTabLabel(), par2, par3);
774                return true;
775            }
776            else
777            {
778                return false;
779            }
780        }
781    
782        /**
783         * Renders passed creative inventory tab into the screen.
784         */
785        protected void renderCreativeTab(CreativeTabs par1CreativeTabs)
786        {
787            boolean var2 = par1CreativeTabs.getTabIndex() == selectedTabIndex;
788            boolean var3 = par1CreativeTabs.isTabInFirstRow();
789            int var4 = par1CreativeTabs.getTabColumn();
790            int var5 = var4 * 28;
791            int var6 = 0;
792            int var7 = this.guiLeft + 28 * var4;
793            int var8 = this.guiTop;
794            byte var9 = 32;
795    
796            if (var2)
797            {
798                var6 += 32;
799            }
800    
801            if (var4 == 5)
802            {
803                var7 = this.guiLeft + this.xSize - 28;
804            }
805            else if (var4 > 0)
806            {
807                var7 += var4;
808            }
809    
810            if (var3)
811            {
812                var8 -= 28;
813            }
814            else
815            {
816                var6 += 64;
817                var8 += this.ySize - 4;
818            }
819    
820            GL11.glDisable(GL11.GL_LIGHTING);
821            this.drawTexturedModalRect(var7, var8, var5, var6, 28, var9);
822            this.zLevel = 100.0F;
823            itemRenderer.zLevel = 100.0F;
824            var7 += 6;
825            var8 += 8 + (var3 ? 1 : -1);
826            GL11.glEnable(GL11.GL_LIGHTING);
827            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
828            ItemStack var10 = par1CreativeTabs.getIconItemStack();
829            itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, var10, var7, var8);
830            itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var10, var7, var8);
831            GL11.glDisable(GL11.GL_LIGHTING);
832            itemRenderer.zLevel = 0.0F;
833            this.zLevel = 0.0F;
834        }
835    
836        /**
837         * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
838         */
839        protected void actionPerformed(GuiButton par1GuiButton)
840        {
841            if (par1GuiButton.id == 0)
842            {
843                this.mc.displayGuiScreen(new GuiAchievements(this.mc.statFileWriter));
844            }
845    
846            if (par1GuiButton.id == 1)
847            {
848                this.mc.displayGuiScreen(new GuiStats(this, this.mc.statFileWriter));
849            }
850    
851            if (par1GuiButton.id == 101)
852            {
853                tabPage = Math.max(tabPage - 1, 0);
854            }
855            else if (par1GuiButton.id == 102)
856            {
857                tabPage = Math.min(tabPage + 1, maxPages);
858            }
859        }
860    
861        public int func_74230_h()
862        {
863            return selectedTabIndex;
864        }
865    
866        /**
867         * Returns the creative inventory
868         */
869        static InventoryBasic getInventory()
870        {
871            return inventory;
872        }
873    }