package org.ultramine.gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.List; @SideOnly(Side.CLIENT) public abstract class GuiContainer extends GuiStyled { protected static RenderItem itemRenderer = GuiUtils.itemRenderer; public Container container; protected GuiContainer() { } protected GuiContainer(Container container) { this.container = container; } @Override public void relayout() { super.relayout(); if(container != null) mc.thePlayer.openContainer = container; } protected void setContainer(Container container) { this.container = container; if(container != null) mc.thePlayer.openContainer = container; } private Slot slotHover = null; @Override protected final void drawBackground(int mx, int my) { super.drawBackground(mx, my); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); slotHover = null; for (int i = 0, s = container.inventorySlots.size(); i < s; i++) { Slot slot = (Slot)container.inventorySlots.get(i); drawSlotInventory(slot); if (this.isMouseOverSlot(slot, mx, my)) { slotHover = slot; GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_DEPTH_TEST); int var9 = slot.xDisplayPosition + guiLeft; int var10 = slot.yDisplayPosition + guiTop; GuiUtils.drawGradientRect(var9, var10, var9 + 16, var10 + 16, -2130706433, -2130706433); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); } } GL11.glDisable(GL12.GL_RESCALE_NORMAL); RenderHelper.disableStandardItemLighting(); } @Override protected void drawForeground(int mx, int my) { super.drawForeground(mx, my); InventoryPlayer inv = this.mc.thePlayer.inventory; RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); if (inv.getItemStack() != null) { itemRenderer.zLevel = 300; itemRenderer.renderItemIntoGUI(mc.fontRenderer, this.mc.renderEngine, inv.getItemStack(), mx - 8, my - 8); itemRenderer.renderItemOverlayIntoGUI(mc.fontRenderer, this.mc.renderEngine, inv.getItemStack(), mx - 8, my - 8); itemRenderer.zLevel = 0; } GL11.glDisable(GL12.GL_RESCALE_NORMAL); if (inv.getItemStack() == null && slotHover != null && slotHover.getHasStack()) { GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_DEPTH_TEST); //RenderHelper.disableStandardItemLighting(); ItemStack var22 = slotHover.getStack(); GuiUtils.drawToolTip(var22, getItemStackTooltipLines(slotHover), mx + 8, my + 8, width, height); //RenderHelper.enableStandardItemLighting(); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); } RenderHelper.disableStandardItemLighting(); } @SuppressWarnings("unchecked") protected List<String> getItemStackTooltipLines(Slot slot) { return slotHover.getStack().getTooltip(mc.thePlayer, mc.gameSettings.advancedItemTooltips); } private void drawSlotInventory(Slot par1Slot) { int var2 = par1Slot.xDisplayPosition + guiLeft; int var3 = par1Slot.yDisplayPosition + guiTop; ItemStack var4 = par1Slot.getStack(); if (var4 == null) { IIcon icon = par1Slot.getBackgroundIconIndex(); if (icon != null) { GL11.glDisable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_BLEND); // Forge: Blending needs to be enabled for this. this.mc.getTextureManager().bindTexture(TextureMap.locationItemsTexture); GuiUtils.drawTexturedModelRectFromIcon(var2, var3, icon, 16, 16); GL11.glDisable(GL11.GL_BLEND); // Forge: And clean that up GL11.glEnable(GL11.GL_LIGHTING); } } else { itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, this.mc.renderEngine, var4, var2, var3); itemRenderer.renderItemOverlayIntoGUI(mc.fontRenderer, this.mc.renderEngine, var4, var2, var3); } } private boolean isMouseOverSlot(Slot par1Slot, int par2, int par3) { int var4 = this.guiLeft; int var5 = this.guiTop; par2 -= var4; par3 -= var5; return par2 >= par1Slot.xDisplayPosition - 1 && par2 < par1Slot.xDisplayPosition + 16 + 1 && par3 >= par1Slot.yDisplayPosition - 1 && par3 < par1Slot.yDisplayPosition + 16 + 1; } private Slot getSlotAtPosition(int x, int y) { for (int var3 = 0; var3 < container.inventorySlots.size(); ++var3) { Slot var4 = (Slot)container.inventorySlots.get(var3); if (this.isMouseOverSlot(var4, x, y)) { return var4; } } return null; } @Override public void mouseClicked(int par1, int par2, int par3) { super.mouseClicked(par1, par2, par3); boolean var4 = par3 == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100; if (par3 == 0 || par3 == 1 || var4) { Slot var5 = this.getSlotAtPosition(par1, par2); int var6 = this.guiLeft; int var7 = this.guiTop; boolean var8 = par1 < var6 || par2 < var7 || par1 >= var6 + this.xSize || par2 >= var7 + this.ySize; int var9 = -1; if (var5 != null) { var9 = var5.slotNumber; } if (var8) { var9 = -999; } if (this.mc.gameSettings.touchscreen && var8 && this.mc.thePlayer.inventory.getItemStack() == null) { this.mc.displayGuiScreen((GuiScreen)null); return; } if (var9 != -1) { if (this.mc.gameSettings.touchscreen) { if (var5 != null && var5.getHasStack()) { //TODO ???? //this.clickedSlot = var5; //this.draggedStack = null; //this.isRightMouseClick = par3 == 1; } else { //this.clickedSlot = null; } } else if (var4) { this.handleMouseClick(var5, var9, par3, 3); } else { boolean var10 = var9 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54)); this.handleMouseClick(var5, var9, par3, var10 ? 1 : 0); } } } } protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4) { if (par1Slot != null) { par2 = par1Slot.slotNumber; } this.mc.playerController.windowClick(container.windowId, par2, par3, par4, this.mc.thePlayer); } @Override public void onGuiClosed() { if (mc.thePlayer != null && container != null) { container.onContainerClosed(this.mc.thePlayer); } } @Override public void keyTyped(char c, int code) { if (code == 1 || code == mc.gameSettings.keyBindInventory.getKeyCode()) { mc.thePlayer.closeScreen(); } else for (int i = 0, s = controlList.size(); i < s; ++i) { controlList.get(i).keyTyped(c, code); } } /** * Called from the main game loop to update the screen. */ @Override public void update() { super.update(); if (!this.mc.thePlayer.isEntityAlive()) { GuiUtils.closeGUI(); } } }