package calclavia.lib.gui; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import universalelectricity.compatibility.Compatibility; import universalelectricity.core.electricity.ElectricityDisplay; import universalelectricity.core.electricity.ElectricityDisplay.ElectricUnit; import universalelectricity.core.vector.Vector2; import universalelectricity.prefab.TranslationHelper; import universalelectricity.prefab.vector.Region2; import calclavia.lib.Calclavia; import calclavia.lib.render.CalclaviaRenderHelper; public class GuiContainerBase extends GuiContainer { public ResourceLocation baseTexture; public enum SlotType { NONE, BATTERY, LIQUID, GAS, ARR_UP, ARR_DOWN, ARR_LEFT, ARR_RIGHT, ARR_UP_RIGHT, ARR_UP_LEFT, ARR_DOWN_LEFT, ARR_DOWN_RIGHT } protected int meterX = 54; protected int meterHeight = 49; protected int meterWidth = 14; protected int meterEnd = meterX + meterWidth; protected int energyMode = 0; public String tooltip = ""; protected HashMap tooltips = new HashMap(); protected int containerWidth; protected int containerHeight; public GuiContainerBase(Container container) { super(container); this.ySize = 217; this.baseTexture = Calclavia.GUI_BASE; } @Override public void initGui() { super.initGui(); } @Override public void onGuiClosed() { Keyboard.enableRepeatEvents(false); super.onGuiClosed(); } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { Iterator> it = this.tooltips.entrySet().iterator(); while (it.hasNext()) { Entry entry = it.next(); if (entry.getKey().isIn(new Vector2(mouseX - this.guiLeft, mouseY - this.guiTop))) { this.tooltip = entry.getValue(); break; } } if (this.tooltip != null && this.tooltip != "") { this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop, Calclavia.splitStringPerWord(this.tooltip, 5).toArray(new String[] {})); } this.tooltip = ""; } @Override protected void drawGuiContainerBackgroundLayer(float var1, int x, int y) { this.containerWidth = (this.width - this.xSize) / 2; this.containerHeight = (this.height - this.ySize) / 2; this.mc.renderEngine.bindTexture(this.baseTexture); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, this.xSize, this.ySize); } protected void drawBulb(int x, int y, boolean isOn) { this.mc.renderEngine.bindTexture(this.baseTexture); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); if (isOn) { this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 161, 0, 6, 6); } else { this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 161, 4, 6, 6); } } protected void drawSlot(int x, int y, ItemStack itemStack) { this.mc.renderEngine.bindTexture(this.baseTexture); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 0, 0, 18, 18); this.drawItemStack(itemStack, this.containerWidth + x, this.containerHeight + y); } protected void drawItemStack(ItemStack itemStack, int x, int y) { x += 1; y += 1; GL11.glTranslatef(0.0F, 0.0F, 32.0F); // drawTexturedModelRectFromIcon // GL11.glEnable(GL11.GL_BLEND); // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, itemStack, x, y); // GL11.glDisable(GL11.GL_BLEND); } protected void drawTextWithTooltip(String textName, String format, int x, int y, int mouseX, int mouseY) { this.drawTextWithTooltip(textName, format, x, y, mouseX, mouseY, 4210752); } protected void drawTextWithTooltip(String textName, String format, int x, int y, int mouseX, int mouseY, int color) { String name = TranslationHelper.getLocal("gui." + textName + ".name"); String text = format.replaceAll("%1", name); this.fontRenderer.drawString(text, x, y, color); String tooltip = TranslationHelper.getLocal("gui." + textName + ".tooltip"); if (tooltip != null && tooltip != "") { if (this.isPointInRegion(x, y, (int) (text.length() * 4.8), 12, mouseX, mouseY)) { this.tooltip = tooltip; } } } protected void drawTextWithTooltip(String textName, int x, int y, int mouseX, int mouseY) { this.drawTextWithTooltip(textName, "%1", x, y, mouseX, mouseY); } protected void drawSlot(int x, int y, GuiSlotType type, float r, float g, float b) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(r, g, b, 1.0F); this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 0, 0, 18, 18); if (type != GuiSlotType.NONE) { this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 0, 18 * type.ordinal(), 18, 18); } } protected void drawSlot(int x, int y, GuiSlotType type) { this.drawSlot(x, y, type, 1, 1, 1); } protected void drawSlot(int x, int y) { this.drawSlot(x, y, GuiSlotType.NONE); } protected void drawBar(int x, int y, float scale) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw background progress bar/ */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 18, 0, 22, 15); if (scale > 0) { /** * Draw white color actual progress. */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 18, 15, 22 - (int) (scale * 22), 15); } } protected void drawForce(int x, int y, float scale) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw background progress bar/ */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 54, 0, 107, 11); if (scale > 0) { /** * Draw white color actual progress. */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, meterX, 11, (int) (scale * 107), 11); } } protected void drawElectricity(int x, int y, float scale) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw background progress bar/ */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 54, 0, 107, 11); if (scale > 0) { /** * Draw white color actual progress. */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 54, 22, (int) (scale * 107), 11); } } protected void drawMeter(int x, int y, float scale, float r, float g, float b) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw the background meter. */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 40, 0, this.meterWidth, this.meterHeight); /** * Draw liquid/gas inside */ GL11.glColor4f(r, g, b, 1.0F); int actualScale = (int) ((this.meterHeight - 1) * scale); this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y + (this.meterHeight - 1 - actualScale), 40, 49, this.meterHeight - 1, actualScale); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw measurement lines */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 40, 49 * 2, this.meterWidth, this.meterHeight); } protected void drawMeter(int x, int y, float scale, FluidStack liquidStack) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); /** * Draw the background meter. */ this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 40, 0, meterWidth, meterHeight); /** * Draw liquid/gas inside */ this.displayGauge(this.containerWidth + x, this.containerHeight + y, -10, 1, 12, (int) ((meterHeight - 1) * scale), liquidStack); /** * Draw measurement lines */ this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 40, 49 * 2, meterWidth, meterHeight); } protected void drawSlot(int x, int y, SlotType type, float r, float g, float b) { this.mc.renderEngine.bindTexture(Calclavia.GUI_COMPONENTS); GL11.glColor4f(r, g, b, 1.0F); this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 0, 0, 18, 18); if (type != SlotType.NONE) { this.drawTexturedModalRect(this.containerWidth + x, this.containerHeight + y, 0, 18 * type.ordinal(), 18, 18); } } protected void drawSlot(int x, int y, SlotType type) { this.drawSlot(x, y, type, 1, 1, 1); } public void renderUniversalDisplay(int x, int y, float energy, int mouseX, int mouseY) { String display; switch (this.energyMode) { default: display = ElectricityDisplay.getDisplay(energy, ElectricUnit.WATT); break; case 1: display = ElectricityDisplay.roundDecimals(energy * Compatibility.TO_BC_RATIO) + " MJ"; break; case 2: display = ElectricityDisplay.roundDecimals(energy * Compatibility.TO_IC2_RATIO) + " EU"; break; } if (Mouse.isButtonDown(0) && this.isPointInRegion(x, y, display.length() * 5, 9, mouseX, mouseY)) { this.energyMode = (this.energyMode + 1) % 3; } this.fontRenderer.drawString(display, x, y, 4210752); } public void drawTooltip(int x, int y, String... toolTips) { if (!GuiScreen.isShiftKeyDown()) { GL11.glDisable(GL12.GL_RESCALE_NORMAL); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_DEPTH_TEST); if (toolTips != null) { int var5 = 0; int var6; int var7; for (var6 = 0; var6 < toolTips.length; ++var6) { var7 = this.fontRenderer.getStringWidth(toolTips[var6]); if (var7 > var5) { var5 = var7; } } var6 = x + 12; var7 = y - 12; int var9 = 8; if (toolTips.length > 1) { var9 += 2 + (toolTips.length - 1) * 10; } if (this.guiTop + var7 + var9 + 6 > this.height) { var7 = this.height - var9 - this.guiTop - 6; } this.zLevel = 300.0F; int var10 = -267386864; this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, var10, var10); this.drawGradientRect(var6 - 3, var7 + var9 + 3, var6 + var5 + 3, var7 + var9 + 4, var10, var10); this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 + var9 + 3, var10, var10); this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var9 + 3, var10, var10); this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, var7 + var9 + 3, var10, var10); int var11 = 1347420415; int var12 = (var11 & 16711422) >> 1 | var11 & -16777216; this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, var7 + var9 + 3 - 1, var11, var12); this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, var7 + var9 + 3 - 1, var11, var12); this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, var11, var11); this.drawGradientRect(var6 - 3, var7 + var9 + 2, var6 + var5 + 3, var7 + var9 + 3, var12, var12); for (int var13 = 0; var13 < toolTips.length; ++var13) { String var14 = toolTips[var13]; this.fontRenderer.drawStringWithShadow(var14, var6, var7, -1); var7 += 10; } this.zLevel = 0.0F; GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glEnable(GL11.GL_LIGHTING); RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); } } } /** * Based on BuildCraft */ protected void displayGauge(int j, int k, int line, int col, int width, int squaled, FluidStack liquid) { squaled -= 1; if (liquid == null) { return; } int start = 0; Icon liquidIcon = null; Fluid fluid = liquid.getFluid(); if (fluid != null && fluid.getStillIcon() != null) { liquidIcon = fluid.getStillIcon(); } CalclaviaRenderHelper.setSpriteTexture(fluid.getSpriteNumber()); if (liquidIcon != null) { while (true) { int x; if (squaled > 16) { x = 16; squaled -= 16; } else { x = squaled; squaled = 0; } this.drawTexturedModelRectFromIcon(j + col, k + line + 58 - x - start, liquidIcon, width, 16 - (16 - x)); start = start + 16; if (x == 0 || squaled == 0) { break; } } } } }