package com.someluigi.slperiph.ccportable.client; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.RenderEngine; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import com.someluigi.slperiph.SLPMod; import com.someluigi.slperiph.ccportable.gfx.TerminalRenderer; import com.someluigi.slperiph.ccportable.shared.ContainerTerminal; import com.someluigi.slperiph.ccportable.shared.ContainerTerminal.TerminalTab; import com.someluigi.slperiph.ccportable.shared.Terminal; public class GuiTerminal extends GuiContainer{ protected static final ItemStack CRYSTAL_TAB_ICON = new ItemStack( SLPMod.itemQuartz ); protected static TerminalRenderer renderer; static{ renderer = new TerminalRenderer( Minecraft.getMinecraft().renderEngine, Tessellator.instance ); } protected ContainerTerminal terminal; protected TerminalTab activeTab; protected boolean allowInventory = false; public GuiTerminal(ContainerTerminal container) { super( container ); terminal = container; xSize = 356; ySize = 214; } /* * Events */ public void initGui() { Keyboard.enableRepeatEvents(true); super.initGui(); } public void onGuiClosed() { Keyboard.enableRepeatEvents(false); super.onGuiClosed(); } /* * Helpers */ protected int getTabAt( int x, int y ){ int lX = x - guiLeft -8; int lY = y - guiTop -26; if ( 0 <= lX && lX <= 24 && 0 < lY ){ //Click at the tab bar int id = lY / 25; if ( 0 <= id && id < 6 ) return id; } return -1; } protected void setActiveTab( int index ){ if ( terminal.isValidTarget(index) ){ TerminalTab target = terminal.tabs[index]; if ( !target.isLinked ) return; terminal.setActiveTab(index); activeTab = target; } } protected TerminalTab getActiveTab(){ if ( terminal.activeTabID == -1 ) return null; return terminal.tabs[terminal.activeTabID]; } /* * Rendering */ public void drawScreen(int mX, int mY, float delta) { super.drawDefaultBackground(); RenderEngine engine = mc.renderEngine; Tessellator buff = Tessellator.instance; //Bind the texture engine.bindTexture("/slp-gui/term.png"); //Background buff.setTranslation(guiLeft, guiTop, 0); buff.startDrawingQuads(); buff.addVertexWithUV(0, 0, 0, 0, 0); buff.addVertexWithUV(0, 256, 0, 0, 1); buff.addVertexWithUV(386, 256, 0, 0.75, 1); buff.addVertexWithUV(386, 0, 0, 0.75, 0); buff.draw(); //Draw tab leafs buff.setTranslation(guiLeft +8, guiTop +26, 0); int anchorX = 0; int anchorY = 0; float uOff = 0; //0.125f; for ( int index = 0; index <= 5; index++ ){ TerminalTab tab = terminal.tabs[index]; if ( index == terminal.activeTabID ){ tab.isHilighted = false; uOff = 0.125f; } else { uOff = 0; } buff.startDrawingQuads(); buff.setColorOpaque_I( tab.getColor() ); buff.addVertexWithUV(0, anchorY, 0, 0.75, uOff); buff.addVertexWithUV(0, anchorY +32, 0, 0.75, uOff + 0.125); buff.addVertexWithUV(32, anchorY +32, 0, 0.8125, uOff + 0.125); buff.addVertexWithUV(32, anchorY, 0, 0.8125, uOff); buff.draw(); anchorY += 25; } buff.setTranslation(0, 0, 0); //Render tab content, if any TerminalTab tab = getActiveTab(); if ( tab != null && tab.terminal != null ){ anchorX = guiLeft +35; anchorY = guiTop +23; //Render terminal renderer.renderTerminal(tab.terminal, anchorX, anchorY); } //Render static info anchorX = guiLeft +8; anchorY = guiTop +6; fontRenderer.drawString("Wireless Terminal", anchorX, anchorY, 4210752); //TODO: Battery support //anchorX += 270; //fontRenderer.drawString("Batt: [||||.] 89%", anchorX, anchorY, 4210752); //Render tab icons RenderHelper.enableGUIStandardItemLighting(); anchorX = guiLeft +12; anchorY = guiTop +30; for ( int index = 0; index <= 5; index++ ){ itemRenderer.renderItemIntoGUI(fontRenderer, engine, terminal.tabs[index].getIcon(), anchorX, anchorY); anchorY += 25; } //Render standard inventory if ( allowInventory ) drawInventory(delta, mX, mY); //Render inventory icon anchorY = guiTop +184; RenderHelper.disableStandardItemLighting(); itemRenderer.renderItemIntoGUI(fontRenderer, engine, CRYSTAL_TAB_ICON, anchorX, anchorY); //Render tab overlay info int overTab = getTabAt(mX, mY); if ( overTab != -1 ) drawCreativeTabHoveringText( terminal.tabs[overTab].getTooltip(), mX, mY); } protected void drawInventory( float delta, int mX, int mY ){ RenderEngine engine = mc.renderEngine; Tessellator buff = Tessellator.instance; //Bind the texture engine.bindTexture("/slp-gui/term.png"); //Standard item model RenderHelper.disableStandardItemLighting(); //Draw the leaflet buff.setTranslation(guiLeft +8, guiTop +114, 0); buff.startDrawingQuads(); buff.addVertexWithUV(0, 0, 0, 1, 0); buff.addVertexWithUV(0, 90, 0, 422f/512f, 0); buff.addVertexWithUV(256, 90, 0, 422f/512f, 1); buff.addVertexWithUV(256, 0, 0, 1, 1); buff.draw(); buff.setTranslation(0, 0, 0); //Draw slots super.drawScreen(mX, mY, delta); } //Overrides - Empty, so the inventory renderer won't mess with it protected void drawGuiContainerBackgroundLayer(float delta, int mX, int mY) { } public void drawDefaultBackground() { } /* * Input */ protected void mouseClicked(int x, int y, int button) { //Inventory toggle if ( isPointInRegion( 8, 180, 24, 24, x, y ) ){ allowInventory = !allowInventory; return; } //Tab change int tabIndex = getTabAt(x, y); if ( tabIndex != -1 ){ setActiveTab(tabIndex); return; } //Terminal input if ( handleMouseClick(x, y, button) ) return; super.mouseClicked(x, y, button); } //Override slot clicks protected void handleMouseClick(Slot slot, int index, int p0, int p1) { if ( allowInventory ) super.handleMouseClick(slot, index, p0, p1); } /* * TODO: Clean up this mess! * * Computer events */ protected int mButtonHeld = -1; protected int mButtonPressX = -1; protected int mButtonPressY = -1; protected boolean handleMouseClick( int x, int y, int button ){ //Ignore out of bounds events if ( !isPointInRegion(36, 24, 310, 180, x, y) ) return false; int activeTabID = terminal.activeTabID; if ( !allowInventory && activeTabID != -1 ){ Terminal term = terminal.tabs[activeTabID].terminal; if ( term != null ){ int charX = ( x - guiLeft - 36 ) / TerminalRenderer.FONT_WIDTH; int charY = ( y - guiTop - 26 ) / 9; charX = Math.min( Math.max(charX, 0), term.w -1); charY = Math.min( Math.max(charY, 0), term.h -1); mButtonHeld = button; mButtonPressX = charX; mButtonPressY = charY; terminal.sendMouseEvent(activeTabID, button, charX, charY); } return true; } return false; } public void handleMouseInput() { super.handleMouseInput(); //Don't process events on inactive tab int activeTabID = terminal.activeTabID; if ( allowInventory || activeTabID == -1 ) return; //Handle mouse events if ( mButtonHeld != -1 && !Mouse.isButtonDown(mButtonHeld) ) mButtonHeld = -1; int deltaWheel = Mouse.getDWheel(); //No events, skip the rest if ( mButtonHeld == -1 && deltaWheel == 0 ) return; //Calculate terminal coordinates int scrX = Mouse.getEventX() * width / mc.displayWidth; int scrY = height - Mouse.getEventY() * height / mc.displayHeight; //Ignore out of bounds events if ( !isPointInRegion(36, 24, 310, 180, scrX, scrY) ) return; //Char events Terminal term = terminal.tabs[activeTabID].terminal; int charX = ( scrX - guiLeft - 36 ) / TerminalRenderer.FONT_WIDTH; int charY = ( scrY - guiTop - 26 ) / 9; charX = Math.min( Math.max(charX, 0), term.w -1); charY = Math.min( Math.max(charY, 0), term.h -1); //Send events to the computers if ( deltaWheel > 0 ){ terminal.sendMouseEvent(activeTabID, 3, charX, charY); } else if ( deltaWheel < 0 ) { terminal.sendMouseEvent(activeTabID, 4, charX, charY); } if ( mButtonHeld != -1 && ( mButtonPressX != charX || mButtonPressY != charY ) ){ terminal.sendMouseEvent(activeTabID, mButtonHeld +5, charX, charY); mButtonPressX = charX; mButtonPressY = charY; } } protected void keyTyped(char chr, int index) { if ( index == Keyboard.KEY_ESCAPE ){ super.keyTyped(chr, index); return; } terminal.sendKeyEvent(terminal.activeTabID, chr, index); } }