package mcjty.rftools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mcjty.lib.varia.Coordinate; import mcjty.lib.varia.GlobalCoordinate; import mcjty.rftools.blocks.blockprotector.BlockProtectorTileEntity; import mcjty.rftools.items.ModItems; import mcjty.rftools.items.shapecard.ShapeCardItem; import mcjty.rftools.items.smartwrench.SmartWrenchItem; import mcjty.rftools.items.smartwrench.SmartWrenchMode; import mcjty.rftools.render.DefaultISBRH; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; import java.util.HashSet; import java.util.Set; @SideOnly(Side.CLIENT) public class RenderWorldLastEventHandler { public static void tick(RenderWorldLastEvent evt) { renderHilightedBlock(evt); renderProtectedBlocks(evt); } private static void renderProtectedBlocks(RenderWorldLastEvent evt) { Minecraft mc = Minecraft.getMinecraft(); EntityClientPlayerMP p = mc.thePlayer; ItemStack heldItem = p.getHeldItem(); if (heldItem == null) { return; } if (heldItem.getItem() == ModItems.smartWrenchItem) { if (SmartWrenchItem.getCurrentMode(heldItem) == SmartWrenchMode.MODE_SELECT) { GlobalCoordinate current = SmartWrenchItem.getCurrentBlock(heldItem); if (current != null) { if (current.getDimension() == mc.theWorld.provider.dimensionId) { TileEntity te = mc.theWorld.getTileEntity(current.getCoordinate().getX(), current.getCoordinate().getY(), current.getCoordinate().getZ()); if (te instanceof BlockProtectorTileEntity) { BlockProtectorTileEntity blockProtectorTileEntity = (BlockProtectorTileEntity) te; Set<Coordinate> coordinates = blockProtectorTileEntity.getProtectedBlocks(); if (!coordinates.isEmpty()) { renderHighlightedBlocks(evt, p, new Coordinate(te.xCoord, te.yCoord, te.zCoord), coordinates); } } } } } } else if (heldItem.getItem() == ModItems.shapeCardItem) { int mode = ShapeCardItem.getMode(heldItem); if (mode == ShapeCardItem.MODE_CORNER1 || mode == ShapeCardItem.MODE_CORNER2) { GlobalCoordinate current = ShapeCardItem.getCurrentBlock(heldItem); if (current != null && current.getDimension() == mc.theWorld.provider.dimensionId) { Set<Coordinate> coordinates = new HashSet<Coordinate>(); coordinates.add(new Coordinate(0, 0, 0)); if (mode == ShapeCardItem.MODE_CORNER2) { Coordinate cur = current.getCoordinate(); Coordinate c = ShapeCardItem.getCorner1(heldItem); if (c != null) { coordinates.add(new Coordinate(c.getX() - cur.getX(), c.getY() - cur.getY(), c.getZ() - cur.getZ())); } } renderHighlightedBlocks(evt, p, current.getCoordinate(), coordinates); } } } } private static final ResourceLocation yellowglow = new ResourceLocation(RFTools.MODID, "textures/blocks/yellowglow.png"); private static void renderHighlightedBlocks(RenderWorldLastEvent evt, EntityClientPlayerMP p, Coordinate base, Set<Coordinate> coordinates) { double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * evt.partialTicks; double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * evt.partialTicks; double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * evt.partialTicks; GL11.glPushMatrix(); GL11.glTranslated(-doubleX, -doubleY, -doubleZ); boolean depth = GL11.glIsEnabled(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_DEPTH_TEST); boolean txt2D = GL11.glIsEnabled(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_TEXTURE_2D); Tessellator tessellator = Tessellator.instance; Minecraft.getMinecraft().getTextureManager().bindTexture(yellowglow); tessellator.startDrawingQuads(); tessellator.setColorRGBA(255, 255, 255, 64); tessellator.setBrightness(240); boolean blending = GL11.glIsEnabled(GL11.GL_BLEND); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); for (Coordinate coordinate : coordinates) { float x = base.getX() + coordinate.getX(); float y = base.getY() + coordinate.getY(); float z = base.getZ() + coordinate.getZ(); tessellator.addTranslation(x, y, z); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.UP.ordinal(), 1.1f, -0.05f); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.DOWN.ordinal(), 1.1f, -0.05f); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.NORTH.ordinal(), 1.1f, -0.05f); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.SOUTH.ordinal(), 1.1f, -0.05f); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.WEST.ordinal(), 1.1f, -0.05f); DefaultISBRH.addSideFullTexture(tessellator, ForgeDirection.EAST.ordinal(), 1.1f, -0.05f); tessellator.addTranslation(-x, -y, -z); // renderProtectionBlock(tessellator, base.getX() + coordinate.getX(), base.getY() + coordinate.getY(), base.getZ() + coordinate.getZ()); } tessellator.draw(); if (!blending) { GL11.glDisable(GL11.GL_BLEND); } GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glColor3ub((byte) 128, (byte) 90, (byte) 0); GL11.glLineWidth(2); tessellator.startDrawing(GL11.GL_LINES); for (Coordinate coordinate : coordinates) { renderHighLightedBlocksOutline(tessellator, base.getX() + coordinate.getX(), base.getY() + coordinate.getY(), base.getZ() + coordinate.getZ()); } tessellator.draw(); if (depth) { GL11.glEnable(GL11.GL_DEPTH_TEST); } if (txt2D) { GL11.glEnable(GL11.GL_TEXTURE_2D); } GL11.glPopMatrix(); } private static void renderHighLightedBlocksOutline(Tessellator tessellator, float mx, float my, float mz) { tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx, my+1, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx, my+1, mz+1); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx, my+1, mz+1); } private static void renderHilightedBlock(RenderWorldLastEvent evt) { Coordinate c = RFTools.instance.clientInfo.getHilightedBlock(); if (c == null) { return; } Minecraft mc = Minecraft.getMinecraft(); long time = System.currentTimeMillis(); if (time > RFTools.instance.clientInfo.getExpireHilight()) { RFTools.instance.clientInfo.hilightBlock(null, -1); return; } if (((time / 500) & 1) == 0) { return; } EntityClientPlayerMP p = mc.thePlayer; double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * evt.partialTicks; double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * evt.partialTicks; double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * evt.partialTicks; GL11.glPushMatrix(); GL11.glColor3ub((byte)255,(byte)0,(byte)0); GL11.glLineWidth(3); GL11.glTranslated(-doubleX, -doubleY, -doubleZ); boolean depth = GL11.glIsEnabled(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_DEPTH_TEST); boolean txt2D = GL11.glIsEnabled(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_TEXTURE_2D); Tessellator tessellator = Tessellator.instance; float mx = c.getX(); float my = c.getY(); float mz = c.getZ(); tessellator.startDrawing(GL11.GL_LINES); tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx, my, mz); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx, my+1, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx+1, my+1, mz+1); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx, my+1, mz+1); tessellator.addVertex(mx, my+1, mz); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx+1, my, mz); tessellator.addVertex(mx+1, my+1, mz); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx+1, my, mz+1); tessellator.addVertex(mx, my, mz+1); tessellator.addVertex(mx, my+1, mz+1); tessellator.draw(); if (depth) { GL11.glEnable(GL11.GL_DEPTH_TEST); } if (txt2D) { GL11.glEnable(GL11.GL_TEXTURE_2D); } GL11.glPopMatrix(); } }