package sourcecoded.quantum.client.gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import sourcecoded.quantum.Constants; import sourcecoded.quantum.api.QuantumAPI; import sourcecoded.quantum.api.block.Colourizer; import sourcecoded.quantum.api.discovery.DiscoveryCategory; import sourcecoded.quantum.api.discovery.DiscoveryManager; import sourcecoded.quantum.api.discovery.DiscoveryRegistry; import sourcecoded.quantum.api.discovery.IDiscoveryCustomRenderer; import sourcecoded.quantum.api.event.discovery.DiscoveryUpdateEvent; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.lwjgl.opengl.GL11.*; public class GuiDiscoveryMain extends GuiScreen { public static ResourceLocation guiLocation = new ResourceLocation(Constants.MODID, "textures/gui/discoveries.png"); public static ResourceLocation guiBackground = new ResourceLocation(Constants.MODID, "textures/gui/discoveriesBackground.png"); public static ResourceLocation guiBlank = new ResourceLocation(Constants.MODID, "textures/misc/blank.png"); public int frameWidth = 256; public int frameHeight = 202; int lastMouseX; int lastMouseY; boolean mouseDone; int dragX = 0; int dragY = 0; List<List<DiscoveryCategory>> categorySets; public EntityPlayer player; boolean mouse = true; public GuiDiscoveryMain(EntityPlayer player) { QuantumAPI.eventBus.post(new DiscoveryUpdateEvent(player)); this.player = player; categorySets = new ArrayList<List<DiscoveryCategory>>(); int index = 0; int level = 0; for (Map.Entry<String, DiscoveryCategory> entry : DiscoveryRegistry.categories.entrySet()) { if (index == 4) { level++; index = 0; } if (categorySets.size() == level || categorySets.get(level) == null) categorySets.add(new ArrayList<DiscoveryCategory>()); if (!DiscoveryManager.categoryHidden(entry.getKey(), player)) { categorySets.get(level).add(entry.getValue()); index++; } } } public void keyTyped(char Char, int par2) { if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) || Keyboard.isKeyDown(Keyboard.KEY_E)) { this.mc.displayGuiScreen(null); } } public boolean doesGuiPauseGame() { return false; } public void drawScreen(int mx, int my, float par3) { this.mc.getTextureManager().bindTexture(guiBlank); GL11.glAlphaFunc(GL11.GL_GREATER, 0F); GL11.glColor4f(0F, 0F, 0F, 0.1F); this.drawTexturedModalRect(0, 0, 0, 0, this.width, this.height); GL11.glColor4f(1F, 1F, 1F, 1F); int centreW = super.width / 2; int centreH = super.height / 2; Tessellator tess = Tessellator.instance; int pad = 10; int minDragX = -10; int minDragY = 0; int maxDragX = 30; int maxDragY = 90; if (Mouse.isButtonDown(0)) { if (!mouseDone) { int xOffset = mx - lastMouseX; int yOffset = my - lastMouseY; xOffset /= 2; yOffset /= 1; dragX = Math.min(Math.max(minDragX, dragX - xOffset), maxDragX); dragY = Math.min(Math.max(minDragY, dragY - yOffset), maxDragY); } lastMouseX = mx; lastMouseY = my; mouseDone = false; } else { mouseDone = true; } this.mc.getTextureManager().bindTexture(guiBackground); this.drawTexturedModalRect(centreW - frameWidth / 2 + pad, centreH - frameHeight / 2 + pad, dragX / 3, dragY / 3, frameWidth - pad * 2, frameHeight - pad * 3); //Rendered with parallax int perOffsetX = 40; int perOffsetY = 40; int itemDiameter = 22; GL11.glDepthFunc(GL11.GL_GEQUAL); GL11.glPushMatrix(); GL11.glTranslatef(0.0F, 0.0F, -200.0F); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_COLOR_MATERIAL); GL11.glPushMatrix(); this.drawTexturedModalRect(centreW - frameWidth / 2 + pad, centreH - frameHeight / 2 + pad, dragX / 3, dragY / 3, frameWidth - pad * 2, frameHeight - pad * 3); //Rendered with parallax GL11.glPopMatrix(); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthFunc(GL11.GL_LEQUAL); for (List<DiscoveryCategory> cat : categorySets) { int totalOffset = perOffsetX * (cat.size() + 1); int yOffset = perOffsetY * categorySets.indexOf(cat); for (DiscoveryCategory meow : cat) { //Ha.... ha.... ha..... int xFactor = perOffsetX * (cat.indexOf(meow) + 1); xFactor -= (totalOffset / 2); int renderCode = 0; if (meow instanceof IDiscoveryCustomRenderer) renderCode = ((IDiscoveryCustomRenderer) meow).getRenderContext(); boolean unlocked = DiscoveryManager.categoryUnlocked(meow.getKey(), player); if (unlocked) GL11.glColor4f(1F, 1F, 1F, 1F); else GL11.glColor4f(0.5F, 0.5F, 0.5F, 1F); GL11.glEnable(GL11.GL_BLEND); int itemX = centreW - (itemDiameter / 2) + xFactor - dragX; int itemY = centreH - (itemDiameter) / 2 - 38 - dragY + yOffset; if (renderCode != 2 && renderCode != 3) { this.mc.getTextureManager().bindTexture(guiLocation); //drawTexturedModalRect(centreW - 13 + xFactor - dragX, centreH - 46 - dragY + yOffset, 26, 202, 26, 26); drawPartialQuadWithBounds(itemX, itemY, itemDiameter, itemDiameter, 26F / 256F, 202F / 256F, 52F / 256F, 228F / 256F); } if (Mouse.isButtonDown(0) && !mouse && mx >= itemX && mx <= itemX + itemDiameter && my >= itemY && my <= itemY + itemDiameter && unlocked) { //CLICKED this.mc.displayGuiScreen(new GuiDiscoveryCategory(meow, player)); } RenderItem render = new RenderItem(); if (renderCode != 1 && renderCode != 3) { if (!unlocked) GL11.glColor4f(0.3F, 0.3F, 0.3F, 1F); if (meow.icon != null) { this.mc.getTextureManager().bindTexture(meow.icon); drawFullQuadWithBounds(centreW - 8 + xFactor - dragX, centreH - 46 - dragY + yOffset, 16, 16); } else if (meow.displayStack != null) { GL11.glEnable(GL_LIGHTING); render.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), meow.displayStack, centreW - 8 + xFactor - dragX, centreH - 46 - dragY + yOffset); GL11.glDisable(GL_LIGHTING); } } if (renderCode != 0) ((IDiscoveryCustomRenderer) meow).render(xFactor - dragX, dragY + yOffset, mx, my, renderCode); itemX = centreW + xFactor - dragX; itemY = centreH - 23 - dragY + yOffset; float scale = meow.getTitleScale(); float scaleI = (float) Math.pow(scale, -1); GL11.glDisable(GL11.GL_LIGHTING); GL11.glTranslatef(itemX, itemY, 0); GL11.glScalef(scale, scale, scale); if (unlocked) drawCenteredString(this.fontRendererObj, meow.getLocalizedName(), 0, 0, meow.getTitleColour().toInteger()); else drawCenteredString(this.fontRendererObj, EnumChatFormatting.OBFUSCATED + "blah blah", 0, 0, Colourizer.GRAY.toInteger()); GL11.glScalef(scaleI, scaleI, scaleI); GL11.glTranslatef(-itemX, -itemY, 0); GL11.glDisable(GL11.GL_LIGHTING); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } } GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(guiLocation); this.drawTexturedModalRect(centreW - frameWidth / 2, centreH - frameHeight / 2, 0, 0, frameWidth, frameHeight); super.drawScreen(mx, my, par3); GL11.glPopMatrix(); mouse = Mouse.isButtonDown(0); } public void drawFullQuadWithBounds(int x, int y, int width, int height) { Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); tess.addVertexWithUV(x, y + height, this.zLevel, 0, 1); tess.addVertexWithUV(x + width, y + height, this.zLevel, 1, 1); tess.addVertexWithUV(x + width, y, this.zLevel, 1, 0); tess.addVertexWithUV(x, y, this.zLevel, 0, 0); tess.draw(); } public void drawPartialQuadWithBounds(int x, int y, int width, int height, float u, float v, float U, float V) { Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); tess.addVertexWithUV(x, y + height, this.zLevel, u, V); tess.addVertexWithUV(x + width, y + height, this.zLevel, U, V); tess.addVertexWithUV(x + width, y, this.zLevel, U, v); tess.addVertexWithUV(x, y, this.zLevel, u, v); tess.draw(); } }