package minefantasy.client; import java.util.Random; import minefantasy.api.anvil.ITongs; import minefantasy.block.tileentity.TileEntityAnvil; import minefantasy.item.ItemListMF; import minefantasy.system.cfg; import minefantasy.system.data_minefantasy; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; /** * * @author Anonymous Productions * * Sources are provided for educational reasons. * though small bits of code, or methods can be used in your own creations. * * Custom renderers based off render tutorial by MC_DucksAreBest */ public class TileEntityAnvilRenderer extends TileEntitySpecialRenderer { private int metadata; public TileEntityAnvilRenderer() { model = new ModelAnvil(); } public TileEntityAnvilRenderer(int meta, TileEntityRenderer render) { model = new ModelAnvil(); this.setTileEntityRenderer(render); metadata = meta; } public void renderAModelAt(TileEntityAnvil tile, double d, double d1, double d2, float f) { for(int a = 0; a < 2; a ++) { if(shouldRender(tile, a)) { this.renderAModelAt(tile, d, d1, d2, f, a); } } } public void renderAModelAt(TileEntityAnvil tile, double d, double d1, double d2, float f, int renderPass) { if (tile != null); int i = 0; if (tile.worldObj != null) { metadata = tile.getBlockMetadata(); i = tile.direction; //this is for rotation } int j = 90 * i; if (i == 0) { j = 0; } if (i == 1) { j = 270; } if (i == 2) { j = 180; } if (i == 3) { j = 90; } if (i == 4) { j = 90; } if(renderPass == 1) { String s = tile.isBig() ? "big" : "sml"; bindTextureByName(data_minefantasy.image("/item/anvilGrid_" + s + ".png")); //texture } else { bindTextureByName(data_minefantasy.image("/item/" + getTexture(metadata) + ".png")); //texture } GL11.glPushMatrix(); //start float scale = 1.0F; float yOffset = 0F; if(!tile.isBig()) { scale = 0.75F; yOffset = 0.5F + (1F / 16F * 2); } GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.3F*scale)+yOffset, (float) d2 + 0.5F); //size GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens GL11.glPushMatrix(); if(!tile.isBig()) { GL11.glTranslatef(0F, 0.55F, 0F); } model.renderModel(tile.isBig(), 0.0625F); if(renderPass == 0) { renderItems(tile); } GL11.glPopMatrix(); GL11.glColor3f(255, 255, 255); if(renderPass == 0 && !tile.isBig()) { float scale2 = 1.0F; GL11.glScalef(scale2, scale2*0.55F, scale2); GL11.glTranslatef(0F, 17*0.0625F, 0F); bindTextureByName(data_minefantasy.image("/item/anvilBase.png")); //texture model.renderLog(0.0625F); } GL11.glPushMatrix(); GL11.glPopMatrix(); GL11.glPopMatrix(); //end } private void bindTextureByName(String image) { bindTexture(TextureHelperMF.getResource(image)); } private String getTexture(int meta) { switch(meta) { case 0: return "anvil_stone"; case 1: return "anvil_bronze"; case 2: return "anvil_bronze"; case 3: return "anvil_iron"; case 4: return "anvil_iron"; case 5: return "anvil_steel"; case 6: return "anvil_steel"; case 7: return "anvil_deep"; case 8: return "anvil_deep"; } return "anvil_iron"; } public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { renderAModelAt((TileEntityAnvil) tileentity, d, d1, d2, f); //where to render } private void renderItems(TileEntityAnvil tile) { GL11.glRotatef(180, 0F, 1F, 0F); int mX = tile.gridSize()[0]; int mY = tile.gridSize()[1]; double xStart = (tile.isBig() ? -4.5F : -4.0F)*0.0625; double yStart = (2.5F)*0.0625; float scaleBase = 0.5F; double xGap = ((0.0625*5)*scaleBase) * 4 / mX; double yGap = -((0.0625*3)*scaleBase) * 4 / mY; double yPos = -0.5D; float scale = scaleBase * 4F / (float)Math.max(mX, mY); for(int x = 0; x < mX; x ++) { for(int y = 0; y < mY; y ++) { GL11.glPushMatrix(); GL11.glTranslated(xStart + (xGap)*x, yPos, yStart + (yGap)*y); try{ renderItem(tile.getStackInSlot(y*mX + x), scale); }catch(Exception Ex) { if(cfg.renderWarnings){Minecraft.getMinecraft().thePlayer.addChatMessage("Don't put that on the anvil");} } GL11.glPopMatrix(); } } if(tile.getStackInSlot(tile.getGridSize()) != null) { boolean move = tile.canCraft() && tile.canFitResult(); renderBigItem(tile, move, tile.getStackInSlot(tile.getGridSize()), 0D, 1D, 0D); } } private ModelAnvil model; private Random random = new Random(); private void renderItem(ItemStack itemstack, float scale) { GL11.glPushMatrix(); GL11.glRotatef(-90, 1, 0, 0); GL11.glScalef((0.3F)*scale, (0.3F)*scale, (0.3F)*scale); Minecraft mc = Minecraft.getMinecraft(); if(itemstack != null && itemstack.getItem() != null) { if(itemstack.getItem() instanceof ItemBlock) { GL11.glTranslatef(0.0F, -0.1F, 0.0F); GL11.glRotatef(-180, 1, 0, 0); try { Block bl = Block.blocksList[itemstack.itemID]; if(bl != null && bl.getRenderType() == cfg.renderId) { GL11.glTranslatef(-0.25F, -0F, -0.25F); } }catch(Exception e){} } for (int k = 0; k < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++k) { GL11.glPushMatrix(); Icon index = itemstack.getItem().getIcon(itemstack, k); int colour = Item.itemsList[itemstack.itemID].getColorFromItemStack(itemstack, k); float red = (float)(colour >> 16 & 255) / 255.0F; float green = (float)(colour >> 8 & 255) / 255.0F; float blue = (float)(colour & 255) / 255.0F; float shade = 1.0F; GL11.glColor4f(red * shade, green * shade, blue * shade, 1.0F); Block block = null; if (itemstack.itemID < Block.blocksList.length) { block = Block.blocksList[itemstack.itemID]; } int i; float f4; float f5; float f6; if (itemstack.getItemSpriteNumber() == 0 && block != null) { GL11.glRotatef(90, 1, 0, 0); GL11.glTranslatef(0F, (2.5F * 0.0625F), 0F); mc.renderEngine.bindTexture(TextureMap.locationBlocksTexture); float f7 = 0.5F; GL11.glScalef(f7, f7, f7); byte b0 = 1; for (i = 0; i < b0; ++i) { GL11.glPushMatrix(); if (i > 0) { f5 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / f7; f4 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / f7; f6 = (this.random .nextFloat() * 2.0F - 1.0F) * 0.2F / f7; GL11.glTranslatef(f5, f4, f6); } f5 = 1.0F; new RenderBlocks().renderBlockAsItem(block, itemstack.getItemDamage(), f5); GL11.glPopMatrix(); } } else { Item item = itemstack.getItem(); mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); Tessellator image = Tessellator.instance; float x1 = index.getMinU(); float x2 = index.getMaxU(); float y1 = index.getMinV(); float y2 = index.getMaxV(); float xPos = 0.5F; float yPos = 0.5F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glTranslatef(-xPos, -yPos, 0.0F); float var13 = 1F; GL11.glScalef(var13, var13, var13); //GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-1F, -1F, 0.0F); ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); GL11.glPushMatrix(); if (itemstack != null && itemstack.isItemEnchanted()) { GL11.glDepthFunc(GL11.GL_EQUAL); GL11.glDisable(GL11.GL_LIGHTING); mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); float f13 = 0.76F; GL11.glColor4f(0.5F * f13, 0.25F * f13, 0.8F * f13, 1.0F); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glPushMatrix(); float f14 = 0.125F; GL11.glScalef(f14, f14, f14); float f15 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; GL11.glTranslatef(f15, 0.0F, 0.0F); GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(image, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, 0.0625F); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glScalef(f14, f14, f14); f15 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; GL11.glTranslatef(-f15, 0.0F, 0.0F); GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(image, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, 0.0625F); GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDepthFunc(GL11.GL_LEQUAL); } GL11.glPopMatrix(); } GL11.glPopMatrix(); } } GL11.glPopMatrix(); } private void renderBigItem(TileEntityAnvil tile, boolean move, ItemStack itemstack, double d, double d1, double d2) { GL11.glPushMatrix(); GL11.glTranslatef(0F, -0.7F, 0F); GL11.glScalef(0.75F, 0.75F, 0.75F); if(move) { GL11.glTranslatef(0F, 0.5F, -0.7F); GL11.glRotatef(65, 1, 0, 0); } Minecraft mc = Minecraft.getMinecraft(); if(itemstack != null && itemstack.getItem() != null) { if(tile.isItem3D(itemstack)) { GL11.glRotatef(tile.getItemRotate(itemstack), 0, 1, 0); } if(!(itemstack.getItem() instanceof ItemBlock)) { GL11.glTranslatef(0.0F, 0.3F, 0.0F); GL11.glRotatef(-90, 1, 0, 0); } else { GL11.glRotatef(180, 1, 0, 0); try { Block bl = Block.blocksList[itemstack.itemID]; if(bl != null && bl.getRenderType() == cfg.renderId) { GL11.glTranslatef(-0.25F, -0.4F, -0.25F); } }catch(Exception e){} } for (int k = 0; k < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++k) { GL11.glPushMatrix(); Icon index = itemstack.getItem().getIcon(itemstack, k); int colour = Item.itemsList[itemstack.itemID].getColorFromItemStack(itemstack, k); float red = (float)(colour >> 16 & 255) / 255.0F; float green = (float)(colour >> 8 & 255) / 255.0F; float blue = (float)(colour & 255) / 255.0F; float shade = 1.0F; GL11.glColor4f(red * shade, green * shade, blue * shade, 1.0F); Block block = null; if (itemstack.itemID < Block.blocksList.length) { block = Block.blocksList[itemstack.itemID]; } int i; float f4; float f5; float f6; if (itemstack.getItemSpriteNumber() == 0 && block != null) { GL11.glTranslatef(0F, (2.5F * 0.0625F), 0F); mc.renderEngine.bindTexture(TextureMap.locationBlocksTexture); float f7 = 0.5F; GL11.glScalef(f7, f7, f7); byte b0 = 1; for (i = 0; i < b0; ++i) { GL11.glPushMatrix(); if (i > 0) { f5 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / f7; f4 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / f7; f6 = (this.random .nextFloat() * 2.0F - 1.0F) * 0.2F / f7; GL11.glTranslatef(f5, f4, f6); } f5 = 1.0F; new RenderBlocks().renderBlockAsItem(block, itemstack.getItemDamage(), f5); GL11.glPopMatrix(); } } else { Item item = itemstack.getItem(); mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); Tessellator image = Tessellator.instance; float x1 = index.getMinU(); float x2 = index.getMaxU(); float y1 = index.getMinV(); float y2 = index.getMaxV(); float xPos = 0.5F; float yPos = 0.5F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glTranslatef(-xPos, -yPos, 0.0F); float var13 = 1F; GL11.glScalef(var13, var13, var13); //GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-1F, -1F, 0.0F); ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); GL11.glPushMatrix(); if (itemstack != null && itemstack.isItemEnchanted()) { GL11.glDepthFunc(GL11.GL_EQUAL); GL11.glDisable(GL11.GL_LIGHTING); mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); float f13 = 0.76F; GL11.glColor4f(0.5F * f13, 0.25F * f13, 0.8F * f13, 1.0F); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glPushMatrix(); float f14 = 0.125F; GL11.glScalef(f14, f14, f14); float f15 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; GL11.glTranslatef(f15, 0.0F, 0.0F); GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(image, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, 0.0625F); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glScalef(f14, f14, f14); f15 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; GL11.glTranslatef(-f15, 0.0F, 0.0F); GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); ItemRenderer.renderItemIn2D(image, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, 0.0625F); GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDepthFunc(GL11.GL_LEQUAL); } GL11.glPopMatrix(); } GL11.glPopMatrix(); } } GL11.glPopMatrix(); } private boolean shouldRender(TileEntityAnvil tile, int p) { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer sp = mc.thePlayer; if(p == 1)//GRID { return tile.worldObj != null && (tile.gridTime > 0 || sp.getHeldItem() != null && sp.getHeldItem().getItem() instanceof ITongs); } return true; } }