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