package net.minecraft.client.gui.inventory; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.achievement.GuiAchievements; import net.minecraft.client.gui.achievement.GuiStats; import net.minecraft.client.renderer.InventoryEffectRenderer; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryBasic; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.AchievementList; import net.minecraft.util.StringTranslate; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @SideOnly(Side.CLIENT) public class GuiContainerCreative extends InventoryEffectRenderer { private static InventoryBasic inventory = new InventoryBasic("tmp", 45); /** Currently selected creative inventory tab index. */ private static int selectedTabIndex = CreativeTabs.tabBlock.getTabIndex(); /** Amount scrolled in Creative mode inventory (0 = top, 1 = bottom) */ private float currentScroll = 0.0F; /** True if the scrollbar is being dragged */ private boolean isScrolling = false; /** * True if the left mouse button was held down last time drawScreen was called. */ private boolean wasClicking; private GuiTextField searchField; /** * Used to back up the ContainerCreative's inventory slots before filling it with the player's inventory slots for * the inventory tab. */ private List backupContainerSlots; private Slot field_74235_v = null; private boolean field_74234_w = false; private CreativeCrafting field_82324_x; private static int tabPage = 0; private int maxPages = 0; public GuiContainerCreative(EntityPlayer par1EntityPlayer) { super(new ContainerCreative(par1EntityPlayer)); par1EntityPlayer.openContainer = this.inventorySlots; this.allowUserInput = true; par1EntityPlayer.addStat(AchievementList.openInventory, 1); this.ySize = 136; this.xSize = 195; } /** * Called from the main game loop to update the screen. */ public void updateScreen() { if (!this.mc.playerController.isInCreativeMode()) { this.mc.displayGuiScreen(new GuiInventory(this.mc.thePlayer)); } } protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4) { this.field_74234_w = true; boolean var5 = par4 == 1; InventoryPlayer var6; ItemStack var7; if (par1Slot != null) { if (par1Slot == this.field_74235_v && var5) { for (int var10 = 0; var10 < this.mc.thePlayer.inventoryContainer.getInventory().size(); ++var10) { this.mc.playerController.sendSlotPacket((ItemStack)null, var10); } } else if (selectedTabIndex == CreativeTabs.tabInventory.getTabIndex()) { if (par1Slot == this.field_74235_v) { this.mc.thePlayer.inventory.setItemStack((ItemStack)null); } else { this.mc.thePlayer.inventoryContainer.slotClick(SlotCreativeInventory.func_75240_a((SlotCreativeInventory)par1Slot).slotNumber, par3, par4, this.mc.thePlayer); this.mc.thePlayer.inventoryContainer.detectAndSendChanges(); } } else if (par1Slot.inventory == inventory) { var6 = this.mc.thePlayer.inventory; var7 = var6.getItemStack(); ItemStack var8 = par1Slot.getStack(); ItemStack var9; if (par4 == 2) { if (var8 != null && par3 >= 0 && par3 < 9) { var9 = var8.copy(); var9.stackSize = var9.getMaxStackSize(); this.mc.thePlayer.inventory.setInventorySlotContents(par3, var9); this.mc.thePlayer.inventoryContainer.detectAndSendChanges(); } return; } if (par4 == 3) { if (var6.getItemStack() == null && par1Slot.getHasStack()) { var9 = par1Slot.getStack().copy(); var9.stackSize = var9.getMaxStackSize(); var6.setItemStack(var9); } return; } if (var7 != null && var8 != null && var7.isItemEqual(var8)) { if (par3 == 0) { if (var5) { var7.stackSize = var7.getMaxStackSize(); } else if (var7.stackSize < var7.getMaxStackSize()) { ++var7.stackSize; } } else if (var7.stackSize <= 1) { var6.setItemStack((ItemStack)null); } else { --var7.stackSize; } } else if (var8 != null && var7 == null) { var6.setItemStack(ItemStack.copyItemStack(var8)); var7 = var6.getItemStack(); if (var5) { var7.stackSize = var7.getMaxStackSize(); } } else { var6.setItemStack((ItemStack)null); } } else { this.inventorySlots.slotClick(par1Slot.slotNumber, par3, par4, this.mc.thePlayer); ItemStack var11 = this.inventorySlots.getSlot(par1Slot.slotNumber).getStack(); this.mc.playerController.sendSlotPacket(var11, par1Slot.slotNumber - this.inventorySlots.inventorySlots.size() + 9 + 36); } } else { var6 = this.mc.thePlayer.inventory; if (var6.getItemStack() != null) { if (par3 == 0) { this.mc.thePlayer.dropPlayerItem(var6.getItemStack()); this.mc.playerController.func_78752_a(var6.getItemStack()); var6.setItemStack((ItemStack)null); } if (par3 == 1) { var7 = var6.getItemStack().splitStack(1); this.mc.thePlayer.dropPlayerItem(var7); this.mc.playerController.func_78752_a(var7); if (var6.getItemStack().stackSize == 0) { var6.setItemStack((ItemStack)null); } } } } } /** * Adds the buttons (and other controls) to the screen in question. */ public void initGui() { if (this.mc.playerController.isInCreativeMode()) { super.initGui(); this.controlList.clear(); Keyboard.enableRepeatEvents(true); this.searchField = new GuiTextField(this.fontRenderer, this.guiLeft + 82, this.guiTop + 6, 89, this.fontRenderer.FONT_HEIGHT); this.searchField.setMaxStringLength(15); this.searchField.setEnableBackgroundDrawing(false); this.searchField.setVisible(false); this.searchField.setTextColor(16777215); int var1 = selectedTabIndex; selectedTabIndex = -1; this.setCurrentCreativeTab(CreativeTabs.creativeTabArray[var1]); this.field_82324_x = new CreativeCrafting(this.mc); this.mc.thePlayer.inventoryContainer.addCraftingToCrafters(this.field_82324_x); int tabCount = CreativeTabs.creativeTabArray.length; if (tabCount > 12) { controlList.add(new GuiButton(101, guiLeft, guiTop - 50, 20, 20, "<")); controlList.add(new GuiButton(102, guiLeft + xSize - 20, guiTop - 50, 20, 20, ">")); maxPages = ((tabCount - 12) / 10) + 1; } } else { this.mc.displayGuiScreen(new GuiInventory(this.mc.thePlayer)); } } /** * Called when the screen is unloaded. Used to disable keyboard repeat events */ public void onGuiClosed() { super.onGuiClosed(); if (this.mc.thePlayer != null && this.mc.thePlayer.inventory != null) { this.mc.thePlayer.inventoryContainer.removeCraftingFromCrafters(this.field_82324_x); } Keyboard.enableRepeatEvents(false); } /** * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e). */ protected void keyTyped(char par1, int par2) { if (selectedTabIndex != CreativeTabs.tabAllSearch.getTabIndex()) { if (Keyboard.isKeyDown(this.mc.gameSettings.keyBindChat.keyCode)) { this.setCurrentCreativeTab(CreativeTabs.tabAllSearch); } else { super.keyTyped(par1, par2); } } else { if (this.field_74234_w) { this.field_74234_w = false; this.searchField.setText(""); } if (!this.checkHotbarKeys(par2)) { if (this.searchField.textboxKeyTyped(par1, par2)) { this.updateCreativeSearch(); } else { super.keyTyped(par1, par2); } } } } private void updateCreativeSearch() { ContainerCreative var1 = (ContainerCreative)this.inventorySlots; var1.itemList.clear(); Item[] var2 = Item.itemsList; int var3 = var2.length; int var4; for (var4 = 0; var4 < var3; ++var4) { Item var5 = var2[var4]; if (var5 != null && var5.getCreativeTab() != null) { var5.getSubItems(var5.itemID, (CreativeTabs)null, var1.itemList); } } Enchantment[] var8 = Enchantment.enchantmentsList; var3 = var8.length; for (var4 = 0; var4 < var3; ++var4) { Enchantment var12 = var8[var4]; if (var12 != null && var12.type != null) { Item.field_92053_bW.func_92113_a(var12, var1.itemList); } } Iterator var9 = var1.itemList.iterator(); String var10 = this.searchField.getText().toLowerCase(); while (var9.hasNext()) { ItemStack var11 = (ItemStack)var9.next(); boolean var13 = false; Iterator var6 = var11.getTooltip(this.mc.thePlayer, this.mc.gameSettings.advancedItemTooltips).iterator(); while (true) { if (var6.hasNext()) { String var7 = (String)var6.next(); if (!var7.toLowerCase().contains(var10)) { continue; } var13 = true; } if (!var13) { var9.remove(); } break; } } this.currentScroll = 0.0F; var1.scrollTo(0.0F); } /** * Draw the foreground layer for the GuiContainer (everything in front of the items) */ protected void drawGuiContainerForegroundLayer(int par1, int par2) { CreativeTabs var3 = CreativeTabs.creativeTabArray[selectedTabIndex]; if (var3 != null && var3.drawInForegroundOfTab()) { this.fontRenderer.drawString(var3.getTranslatedTabLabel(), 8, 6, 4210752); } } /** * Called when the mouse is clicked. */ protected void mouseClicked(int par1, int par2, int par3) { if (par3 == 0) { int var4 = par1 - this.guiLeft; int var5 = par2 - this.guiTop; CreativeTabs[] var6 = CreativeTabs.creativeTabArray; int var7 = var6.length; for (int var8 = 0; var8 < var7; ++var8) { CreativeTabs var9 = var6[var8]; if (var9 != null && func_74232_a(var9, var4, var5)) { this.setCurrentCreativeTab(var9); return; } } } super.mouseClicked(par1, par2, par3); } /** * returns (if you are not on the inventoryTab) and (the flag isn't set) and( you have more than 1 page of items) */ private boolean needsScrollBars() { if (CreativeTabs.creativeTabArray[selectedTabIndex] == null) return false; return selectedTabIndex != CreativeTabs.tabInventory.getTabIndex() && CreativeTabs.creativeTabArray[selectedTabIndex].shouldHidePlayerInventory() && ((ContainerCreative)this.inventorySlots).hasMoreThan1PageOfItemsInList(); } private void setCurrentCreativeTab(CreativeTabs par1CreativeTabs) { if (par1CreativeTabs == null) { return; } int var2 = selectedTabIndex; selectedTabIndex = par1CreativeTabs.getTabIndex(); ContainerCreative var3 = (ContainerCreative)this.inventorySlots; var3.itemList.clear(); par1CreativeTabs.displayAllReleventItems(var3.itemList); if (par1CreativeTabs == CreativeTabs.tabInventory) { Container var4 = this.mc.thePlayer.inventoryContainer; if (this.backupContainerSlots == null) { this.backupContainerSlots = var3.inventorySlots; } var3.inventorySlots = new ArrayList(); for (int var5 = 0; var5 < var4.inventorySlots.size(); ++var5) { SlotCreativeInventory var6 = new SlotCreativeInventory(this, (Slot)var4.inventorySlots.get(var5), var5); var3.inventorySlots.add(var6); int var7; int var8; int var9; if (var5 >= 5 && var5 < 9) { var7 = var5 - 5; var8 = var7 / 2; var9 = var7 % 2; var6.xDisplayPosition = 9 + var8 * 54; var6.yDisplayPosition = 6 + var9 * 27; } else if (var5 >= 0 && var5 < 5) { var6.yDisplayPosition = -2000; var6.xDisplayPosition = -2000; } else if (var5 < var4.inventorySlots.size()) { var7 = var5 - 9; var8 = var7 % 9; var9 = var7 / 9; var6.xDisplayPosition = 9 + var8 * 18; if (var5 >= 36) { var6.yDisplayPosition = 112; } else { var6.yDisplayPosition = 54 + var9 * 18; } } } this.field_74235_v = new Slot(inventory, 0, 173, 112); var3.inventorySlots.add(this.field_74235_v); } else if (var2 == CreativeTabs.tabInventory.getTabIndex()) { var3.inventorySlots = this.backupContainerSlots; this.backupContainerSlots = null; } if (this.searchField != null) { if (par1CreativeTabs == CreativeTabs.tabAllSearch) { this.searchField.setVisible(true); this.searchField.setCanLoseFocus(false); this.searchField.setFocused(true); this.searchField.setText(""); this.updateCreativeSearch(); } else { this.searchField.setVisible(false); this.searchField.setCanLoseFocus(true); this.searchField.setFocused(false); } } this.currentScroll = 0.0F; var3.scrollTo(0.0F); } /** * Handles mouse input. */ public void handleMouseInput() { super.handleMouseInput(); int var1 = Mouse.getEventDWheel(); if (var1 != 0 && this.needsScrollBars()) { int var2 = ((ContainerCreative)this.inventorySlots).itemList.size() / 9 - 5 + 1; if (var1 > 0) { var1 = 1; } if (var1 < 0) { var1 = -1; } this.currentScroll = (float)((double)this.currentScroll - (double)var1 / (double)var2); if (this.currentScroll < 0.0F) { this.currentScroll = 0.0F; } if (this.currentScroll > 1.0F) { this.currentScroll = 1.0F; } ((ContainerCreative)this.inventorySlots).scrollTo(this.currentScroll); } } /** * Draws the screen and all the components in it. */ public void drawScreen(int par1, int par2, float par3) { boolean var4 = Mouse.isButtonDown(0); int var5 = this.guiLeft; int var6 = this.guiTop; int var7 = var5 + 175; int var8 = var6 + 18; int var9 = var7 + 14; int var10 = var8 + 112; if (!this.wasClicking && var4 && par1 >= var7 && par2 >= var8 && par1 < var9 && par2 < var10) { this.isScrolling = this.needsScrollBars(); } if (!var4) { this.isScrolling = false; } this.wasClicking = var4; if (this.isScrolling) { this.currentScroll = ((float)(par2 - var8) - 7.5F) / ((float)(var10 - var8) - 15.0F); if (this.currentScroll < 0.0F) { this.currentScroll = 0.0F; } if (this.currentScroll > 1.0F) { this.currentScroll = 1.0F; } ((ContainerCreative)this.inventorySlots).scrollTo(this.currentScroll); } super.drawScreen(par1, par2, par3); CreativeTabs[] var11 = CreativeTabs.creativeTabArray; int start = tabPage * 10; int var12 = Math.min(var11.length, ((tabPage + 1) * 10) + 2); if (tabPage != 0) start += 2; boolean rendered = false; for (int var13 = start; var13 < var12; ++var13) { CreativeTabs var14 = var11[var13]; if (var14 != null && renderCreativeInventoryHoveringText(var14, par1, par2)) { rendered = true; break; } } if (!rendered && !renderCreativeInventoryHoveringText(CreativeTabs.tabAllSearch, par1, par2)) { renderCreativeInventoryHoveringText(CreativeTabs.tabInventory, par1, par2); } if (this.field_74235_v != null && selectedTabIndex == CreativeTabs.tabInventory.getTabIndex() && this.isPointInRegion(this.field_74235_v.xDisplayPosition, this.field_74235_v.yDisplayPosition, 16, 16, par1, par2)) { this.drawCreativeTabHoveringText(StringTranslate.getInstance().translateKey("inventory.binSlot"), par1, par2); } if (maxPages != 0) { String page = String.format("%d / %d", tabPage + 1, maxPages + 1); int width = fontRenderer.getStringWidth(page); GL11.glDisable(GL11.GL_LIGHTING); this.zLevel = 300.0F; itemRenderer.zLevel = 300.0F; fontRenderer.drawString(page, guiLeft + (xSize / 2) - (width / 2), guiTop - 44, -1); this.zLevel = 0.0F; itemRenderer.zLevel = 0.0F; } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); } /** * Draw the background layer for the GuiContainer (everything behind the items) */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); RenderHelper.enableGUIStandardItemLighting(); int var4 = this.mc.renderEngine.getTexture("/gui/allitems.png"); CreativeTabs var5 = CreativeTabs.creativeTabArray[selectedTabIndex]; int var6 = this.mc.renderEngine.getTexture("/gui/creative_inv/" + var5.getBackgroundImageName()); CreativeTabs[] var7 = CreativeTabs.creativeTabArray; int var8 = var7.length; int var9; int start = tabPage * 10; var8 = Math.min(var7.length, ((tabPage + 1) * 10 + 2)); if (tabPage != 0) start += 2; for (var9 = start; var9 < var8; ++var9) { CreativeTabs var10 = var7[var9]; this.mc.renderEngine.bindTexture(var4); if (var10 != null && var10.getTabIndex() != selectedTabIndex) { this.renderCreativeTab(var10); } } if (tabPage != 0) { if (var5 != CreativeTabs.tabAllSearch) { mc.renderEngine.bindTexture(var4); renderCreativeTab(CreativeTabs.tabAllSearch); } if (var5 != CreativeTabs.tabInventory) { mc.renderEngine.bindTexture(var4); renderCreativeTab(CreativeTabs.tabInventory); } } this.mc.renderEngine.bindTexture(var6); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); this.searchField.drawTextBox(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int var11 = this.guiLeft + 175; var8 = this.guiTop + 18; var9 = var8 + 112; this.mc.renderEngine.bindTexture(var4); if (var5.shouldHidePlayerInventory()) { this.drawTexturedModalRect(var11, var8 + (int)((float)(var9 - var8 - 17) * this.currentScroll), 232 + (this.needsScrollBars() ? 0 : 12), 0, 12, 15); } if (var5 == null || var5.getTabPage() != tabPage) { if (var5 != CreativeTabs.tabAllSearch && var5 != CreativeTabs.tabInventory) { return; } } this.renderCreativeTab(var5); if (var5 == CreativeTabs.tabInventory) { GuiInventory.RenderPlayer(this.mc, this.guiLeft + 43, this.guiTop + 45, 20, (float)(this.guiLeft + 43 - par2), (float)(this.guiTop + 45 - 30 - par3)); } } protected boolean func_74232_a(CreativeTabs par1CreativeTabs, int par2, int par3) { if (par1CreativeTabs.getTabPage() != tabPage) { if (par1CreativeTabs != CreativeTabs.tabAllSearch && par1CreativeTabs != CreativeTabs.tabInventory) { return false; } } int var4 = par1CreativeTabs.getTabColumn(); int var5 = 28 * var4; byte var6 = 0; if (var4 == 5) { var5 = this.xSize - 28 + 2; } else if (var4 > 0) { var5 += var4; } int var7; if (par1CreativeTabs.isTabInFirstRow()) { var7 = var6 - 32; } else { var7 = var6 + this.ySize; } return par2 >= var5 && par2 <= var5 + 28 && par3 >= var7 && par3 <= var7 + 32; } /** * Renders the creative inventory hovering text if mouse is over it. Returns true if did render or false otherwise. * Params: current creative tab to be checked, current mouse x position, current mouse y position. */ protected boolean renderCreativeInventoryHoveringText(CreativeTabs par1CreativeTabs, int par2, int par3) { int var4 = par1CreativeTabs.getTabColumn(); int var5 = 28 * var4; byte var6 = 0; if (var4 == 5) { var5 = this.xSize - 28 + 2; } else if (var4 > 0) { var5 += var4; } int var7; if (par1CreativeTabs.isTabInFirstRow()) { var7 = var6 - 32; } else { var7 = var6 + this.ySize; } if (this.isPointInRegion(var5 + 3, var7 + 3, 23, 27, par2, par3)) { this.drawCreativeTabHoveringText(par1CreativeTabs.getTranslatedTabLabel(), par2, par3); return true; } else { return false; } } /** * Renders passed creative inventory tab into the screen. */ protected void renderCreativeTab(CreativeTabs par1CreativeTabs) { boolean var2 = par1CreativeTabs.getTabIndex() == selectedTabIndex; boolean var3 = par1CreativeTabs.isTabInFirstRow(); int var4 = par1CreativeTabs.getTabColumn(); int var5 = var4 * 28; int var6 = 0; int var7 = this.guiLeft + 28 * var4; int var8 = this.guiTop; byte var9 = 32; if (var2) { var6 += 32; } if (var4 == 5) { var7 = this.guiLeft + this.xSize - 28; } else if (var4 > 0) { var7 += var4; } if (var3) { var8 -= 28; } else { var6 += 64; var8 += this.ySize - 4; } GL11.glDisable(GL11.GL_LIGHTING); this.drawTexturedModalRect(var7, var8, var5, var6, 28, var9); this.zLevel = 100.0F; itemRenderer.zLevel = 100.0F; var7 += 6; var8 += 8 + (var3 ? 1 : -1); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); ItemStack var10 = par1CreativeTabs.getIconItemStack(); itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, var10, var7, var8); itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var10, var7, var8); GL11.glDisable(GL11.GL_LIGHTING); itemRenderer.zLevel = 0.0F; this.zLevel = 0.0F; } /** * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). */ protected void actionPerformed(GuiButton par1GuiButton) { if (par1GuiButton.id == 0) { this.mc.displayGuiScreen(new GuiAchievements(this.mc.statFileWriter)); } if (par1GuiButton.id == 1) { this.mc.displayGuiScreen(new GuiStats(this, this.mc.statFileWriter)); } if (par1GuiButton.id == 101) { tabPage = Math.max(tabPage - 1, 0); } else if (par1GuiButton.id == 102) { tabPage = Math.min(tabPage + 1, maxPages); } } public int func_74230_h() { return selectedTabIndex; } /** * Returns the creative inventory */ static InventoryBasic getInventory() { return inventory; } }