package net.minecraft.client.renderer.tileentity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureCompass; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.world.storage.MapData; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderItemFrame extends Render { private static final ResourceLocation mapBackgroundTextures = new ResourceLocation("textures/map/map_background.png"); private final RenderBlocks field_147916_f = new RenderBlocks(); private final Minecraft field_147917_g = Minecraft.getMinecraft(); private IIcon field_94147_f; private static final String __OBFID = "CL_00001002"; public void updateIcons(IIconRegister p_94143_1_) { this.field_94147_f = p_94143_1_.registerIcon("itemframe_background"); } /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(EntityItemFrame p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { GL11.glPushMatrix(); double d3 = p_76986_1_.posX - p_76986_2_ - 0.5D; double d4 = p_76986_1_.posY - p_76986_4_ - 0.5D; double d5 = p_76986_1_.posZ - p_76986_6_ - 0.5D; int i = p_76986_1_.field_146063_b + Direction.offsetX[p_76986_1_.hangingDirection]; int j = p_76986_1_.field_146064_c; int k = p_76986_1_.field_146062_d + Direction.offsetZ[p_76986_1_.hangingDirection]; GL11.glTranslated((double)i - d3, (double)j - d4, (double)k - d5); if (p_76986_1_.getDisplayedItem() != null && p_76986_1_.getDisplayedItem().getItem() == Items.filled_map) { this.func_147915_b(p_76986_1_); } else { this.renderFrameItemAsBlock(p_76986_1_); } this.func_82402_b(p_76986_1_); GL11.glPopMatrix(); this.func_147914_a(p_76986_1_, p_76986_2_ + (double)((float)Direction.offsetX[p_76986_1_.hangingDirection] * 0.3F), p_76986_4_ - 0.25D, p_76986_6_ + (double)((float)Direction.offsetZ[p_76986_1_.hangingDirection] * 0.3F)); } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(EntityItemFrame p_110775_1_) { return null; } private void func_147915_b(EntityItemFrame p_147915_1_) { GL11.glPushMatrix(); GL11.glRotatef(p_147915_1_.rotationYaw, 0.0F, 1.0F, 0.0F); this.renderManager.renderEngine.bindTexture(TextureMap.locationBlocksTexture); Block block = Blocks.planks; float f = 0.0625F; float f1 = 1.0F; float f2 = f1 / 2.0F; GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2 + 0.0625F), (double)(0.5F - f2 + 0.0625F), (double)f, (double)(0.5F + f2 - 0.0625F), (double)(0.5F + f2 - 0.0625F)); this.field_147916_f.setOverrideBlockTexture(this.field_94147_f); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); this.field_147916_f.clearOverrideBlockTexture(); this.field_147916_f.unlockBlockBounds(); GL11.glPopMatrix(); this.field_147916_f.setOverrideBlockTexture(Blocks.planks.getIcon(1, 2)); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F - f2), (double)(f + 1.0E-4F), (double)(f + 0.5F - f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F + f2 - f), (double)(0.5F - f2), (double)(f + 1.0E-4F), (double)(0.5F + f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F - f2), (double)f, (double)(0.5F + f2), (double)(f + 0.5F - f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F + f2 - f), (double)f, (double)(0.5F + f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); this.field_147916_f.unlockBlockBounds(); this.field_147916_f.clearOverrideBlockTexture(); GL11.glPopMatrix(); } /** * Render the item frame's item as a block. */ private void renderFrameItemAsBlock(EntityItemFrame p_82403_1_) { GL11.glPushMatrix(); GL11.glRotatef(p_82403_1_.rotationYaw, 0.0F, 1.0F, 0.0F); this.renderManager.renderEngine.bindTexture(TextureMap.locationBlocksTexture); Block block = Blocks.planks; float f = 0.0625F; float f1 = 0.75F; float f2 = f1 / 2.0F; GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2 + 0.0625F), (double)(0.5F - f2 + 0.0625F), (double)(f * 0.5F), (double)(0.5F + f2 - 0.0625F), (double)(0.5F + f2 - 0.0625F)); this.field_147916_f.setOverrideBlockTexture(this.field_94147_f); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); this.field_147916_f.clearOverrideBlockTexture(); this.field_147916_f.unlockBlockBounds(); GL11.glPopMatrix(); this.field_147916_f.setOverrideBlockTexture(Blocks.planks.getIcon(1, 2)); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F - f2), (double)(f + 1.0E-4F), (double)(f + 0.5F - f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F + f2 - f), (double)(0.5F - f2), (double)(f + 1.0E-4F), (double)(0.5F + f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F - f2), (double)f, (double)(0.5F + f2), (double)(f + 0.5F - f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); GL11.glPushMatrix(); this.field_147916_f.overrideBlockBounds(0.0D, (double)(0.5F - f2), (double)(0.5F + f2 - f), (double)f, (double)(0.5F + f2), (double)(0.5F + f2)); this.field_147916_f.renderBlockAsItem(block, 0, 1.0F); GL11.glPopMatrix(); this.field_147916_f.unlockBlockBounds(); this.field_147916_f.clearOverrideBlockTexture(); GL11.glPopMatrix(); } private void func_82402_b(EntityItemFrame p_82402_1_) { ItemStack itemstack = p_82402_1_.getDisplayedItem(); if (itemstack != null) { EntityItem entityitem = new EntityItem(p_82402_1_.worldObj, 0.0D, 0.0D, 0.0D, itemstack); Item item = entityitem.getEntityItem().getItem(); entityitem.getEntityItem().stackSize = 1; entityitem.hoverStart = 0.0F; GL11.glPushMatrix(); GL11.glTranslatef(-0.453125F * (float)Direction.offsetX[p_82402_1_.hangingDirection], -0.18F, -0.453125F * (float)Direction.offsetZ[p_82402_1_.hangingDirection]); GL11.glRotatef(180.0F + p_82402_1_.rotationYaw, 0.0F, 1.0F, 0.0F); GL11.glRotatef((float)(-90 * p_82402_1_.getRotation()), 0.0F, 0.0F, 1.0F); switch (p_82402_1_.getRotation()) { case 1: GL11.glTranslatef(-0.16F, -0.16F, 0.0F); break; case 2: GL11.glTranslatef(0.0F, -0.32F, 0.0F); break; case 3: GL11.glTranslatef(0.16F, -0.16F, 0.0F); } net.minecraftforge.client.event.RenderItemInFrameEvent event = new net.minecraftforge.client.event.RenderItemInFrameEvent(p_82402_1_, this); if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) { if (item == Items.filled_map) { this.renderManager.renderEngine.bindTexture(mapBackgroundTextures); Tessellator tessellator = Tessellator.instance; GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); float f = 0.0078125F; GL11.glScalef(f, f, f); switch (p_82402_1_.getRotation()) { case 0: GL11.glTranslatef(-64.0F, -87.0F, -1.5F); break; case 1: GL11.glTranslatef(-66.5F, -84.5F, -1.5F); break; case 2: GL11.glTranslatef(-64.0F, -82.0F, -1.5F); break; case 3: GL11.glTranslatef(-61.5F, -84.5F, -1.5F); } GL11.glNormal3f(0.0F, 0.0F, -1.0F); MapData mapdata = Items.filled_map.getMapData(entityitem.getEntityItem(), p_82402_1_.worldObj); GL11.glTranslatef(0.0F, 0.0F, -1.0F); if (mapdata != null) { this.field_147917_g.entityRenderer.getMapItemRenderer().func_148250_a(mapdata, true); } } else { if (item == Items.compass) { TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager(); texturemanager.bindTexture(TextureMap.locationItemsTexture); TextureAtlasSprite textureatlassprite1 = ((TextureMap)texturemanager.getTexture(TextureMap.locationItemsTexture)).getAtlasSprite(Items.compass.getIconIndex(entityitem.getEntityItem()).getIconName()); if (textureatlassprite1 instanceof TextureCompass) { TextureCompass texturecompass = (TextureCompass)textureatlassprite1; double d0 = texturecompass.currentAngle; double d1 = texturecompass.angleDelta; texturecompass.currentAngle = 0.0D; texturecompass.angleDelta = 0.0D; texturecompass.updateCompass(p_82402_1_.worldObj, p_82402_1_.posX, p_82402_1_.posZ, (double)MathHelper.wrapAngleTo180_float((float)(180 + p_82402_1_.hangingDirection * 90)), false, true); texturecompass.currentAngle = d0; texturecompass.angleDelta = d1; } } RenderItem.renderInFrame = true; RenderManager.instance.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); RenderItem.renderInFrame = false; if (item == Items.compass) { TextureAtlasSprite textureatlassprite = ((TextureMap)Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.locationItemsTexture)).getAtlasSprite(Items.compass.getIconIndex(entityitem.getEntityItem()).getIconName()); if (textureatlassprite.getFrameCount() > 0) { textureatlassprite.updateAnimation(); } } } } GL11.glPopMatrix(); } } protected void func_147914_a(EntityItemFrame p_147914_1_, double p_147914_2_, double p_147914_4_, double p_147914_6_) { if (Minecraft.isGuiEnabled() && p_147914_1_.getDisplayedItem() != null && p_147914_1_.getDisplayedItem().hasDisplayName() && this.renderManager.field_147941_i == p_147914_1_) { float f = 1.6F; float f1 = 0.016666668F * f; double d3 = p_147914_1_.getDistanceSqToEntity(this.renderManager.livingPlayer); float f2 = p_147914_1_.isSneaking() ? 32.0F : 64.0F; if (d3 < (double)(f2 * f2)) { String s = p_147914_1_.getDisplayedItem().getDisplayName(); if (p_147914_1_.isSneaking()) { FontRenderer fontrenderer = this.getFontRendererFromRenderManager(); GL11.glPushMatrix(); GL11.glTranslatef((float)p_147914_2_ + 0.0F, (float)p_147914_4_ + p_147914_1_.height + 0.5F, (float)p_147914_6_); GL11.glNormal3f(0.0F, 1.0F, 0.0F); GL11.glRotatef(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); GL11.glRotatef(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); GL11.glScalef(-f1, -f1, f1); GL11.glDisable(GL11.GL_LIGHTING); GL11.glTranslatef(0.0F, 0.25F / f1, 0.0F); GL11.glDepthMask(false); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); Tessellator tessellator = Tessellator.instance; GL11.glDisable(GL11.GL_TEXTURE_2D); tessellator.startDrawingQuads(); int i = fontrenderer.getStringWidth(s) / 2; tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F); tessellator.addVertex((double)(-i - 1), -1.0D, 0.0D); tessellator.addVertex((double)(-i - 1), 8.0D, 0.0D); tessellator.addVertex((double)(i + 1), 8.0D, 0.0D); tessellator.addVertex((double)(i + 1), -1.0D, 0.0D); tessellator.draw(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(true); fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, 0, 553648127); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_BLEND); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glPopMatrix(); } else { this.renderLivingLabel(p_147914_1_, s, p_147914_2_, p_147914_4_, p_147914_6_, 64); } } } } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return this.getEntityTexture((EntityItemFrame)p_110775_1_); } /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { this.doRender((EntityItemFrame)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); } }