package crazypants.enderio.item; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.common.MinecraftForge; import org.lwjgl.opengl.GL11; import com.enderio.core.api.client.render.IWidgetIcon; import com.enderio.core.client.handlers.ClientHandler; import com.enderio.core.client.render.RenderUtil; import com.enderio.core.common.vecmath.Vector4f; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import crazypants.enderio.api.tool.IConduitControl; import crazypants.enderio.conduit.ConduitDisplayMode; import crazypants.enderio.config.Config; public class YetaWrenchOverlayRenderer { private ConduitDisplayMode cachedMode = ConduitDisplayMode.ALL; private int displayTickCount; private long lastTick; public YetaWrenchOverlayRenderer() { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void renderOverlay(RenderGameOverlayEvent event) { ItemStack equippedWrench = getEquippedWrench(); if(equippedWrench != null && event.type == ElementType.ALL) { doRenderOverlay(event, equippedWrench); } } private ItemStack getEquippedWrench() { EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack equipped = player.getCurrentEquippedItem(); if (equipped != null && equipped.getItem() instanceof IConduitControl) { return ((IConduitControl) equipped.getItem()).showOverlay(equipped, player) ? equipped : null; } return null; } private void doRenderOverlay(RenderGameOverlayEvent event, ItemStack equippedWrench) { ConduitDisplayMode mode = ConduitDisplayMode.getDisplayMode(equippedWrench); if (mode != cachedMode) { cachedMode = mode; displayTickCount = 20; lastTick = ClientHandler.getTicksElapsed(); } ScaledResolution res = event.resolution; Tessellator tess = Tessellator.instance; int modeCount = ConduitDisplayMode.registrySize(); Iterable<ConduitDisplayMode> renderable = ConduitDisplayMode.getRenderableModes(); switch (Config.yetaWrenchOverlayMode) { case 0: if (displayTickCount > 0) { if (lastTick < ClientHandler.getTicksElapsed()) { lastTick++; displayTickCount--; } int x = res.getScaledWidth() / 2 - 8; int y = res.getScaledHeight() / 2 - 24; // TODO when I've not been up for 16 hrs, clean this up IWidgetIcon widget = mode.getWidgetSelected(); RenderUtil.bindTexture(widget.getMap().getTexture()); widget.getMap().render(widget, x, y, true); int size = 12; widget = mode.previous().getWidgetSelected(); RenderUtil.bindTexture(widget.getMap().getTexture()); widget.getMap().render(widget, x - 18 + (16 - size), y + (16 - size), size, size, 0, true); widget = mode.next().getWidgetSelected(); RenderUtil.bindTexture(widget.getMap().getTexture()); widget.getMap().render(widget, x + 18, y + (16 - size), size, size, 0, true); } else { int x = res.getScaledWidth() - 20; int y = res.getScaledHeight() - 20; IWidgetIcon widget = mode.getWidgetSelected(); RenderUtil.bindTexture(widget.getMap().getTexture()); widget.getMap().render(widget, x, y, true); } break; case 1: int size = 16; int padding = 2; int inset = (int) (size / 1.5); int offsetX = res.getScaledWidth() - inset - 1; int offsetY = res.getScaledHeight() - modeCount * (size + padding) - padding; inset = size - inset; int x = offsetX + 2; int y = offsetY - (padding * 2); int height = (modeCount * (size + padding)) + (padding * 3); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glShadeModel(GL11.GL_SMOOTH); tess.startDrawingQuads(); tess.setColorRGBA_F(0, 0, 0, 0.2f); tess.addVertex(x, y, -5); tess.addVertex(x, y + height, -5); Vector4f color = new Vector4f(0, 0, 0, 1); tess.setColorRGBA_F(color.x, color.y, color.z, color.w); tess.addVertex(x + size, y + height, -5); tess.addVertex(x + size, y, -5); tess.draw(); tess.setColorOpaque_I(0xFFFFFF); GL11.glShadeModel(GL11.GL_FLAT); y += padding * 2; x -= 2; if (mode == ConduitDisplayMode.ALL) { x -= inset; } GL11.glEnable(GL11.GL_TEXTURE_2D); tess.startDrawingQuads(); for (ConduitDisplayMode toRender : renderable) { IWidgetIcon widget = mode == ConduitDisplayMode.ALL ? toRender.getWidgetSelected() : toRender.getWidgetUnselected(); RenderUtil.bindTexture(widget.getMap().getTexture()); if (toRender == mode) { widget = toRender.getWidgetSelected(); widget.getMap().render(widget, x - inset, y); } else { widget.getMap().render(widget, x, y); } y += size + padding; } tess.draw(); break; case 2: offsetX = res.getScaledWidth() - (modeCount * 8) - 16; y = res.getScaledHeight() - 40; x = offsetX; if (modeCount % 2 == 1) { x += 8; } int count = 0; tess.startDrawingQuads(); for (ConduitDisplayMode toRender : renderable) { IWidgetIcon widget = mode == ConduitDisplayMode.ALL || toRender == mode ? toRender.getWidgetSelected() : toRender.getWidgetUnselected(); RenderUtil.bindTexture(widget.getMap().getTexture()); widget.getMap().render(widget, x, y); x += 16; if (count == modeCount / 2 - 1) { x = offsetX; y += 16; } count++; } tess.draw(); } } }