001    package net.minecraft.client.renderer;
002    
003    import cpw.mods.fml.client.TextureFXManager;
004    import cpw.mods.fml.relauncher.Side;
005    import cpw.mods.fml.relauncher.SideOnly;
006    import net.minecraft.block.Block;
007    import net.minecraft.block.material.Material;
008    import net.minecraft.client.Minecraft;
009    import net.minecraft.client.entity.EntityClientPlayerMP;
010    import net.minecraft.client.entity.EntityPlayerSP;
011    import net.minecraft.client.gui.MapItemRenderer;
012    import net.minecraft.client.renderer.entity.Render;
013    import net.minecraft.client.renderer.entity.RenderManager;
014    import net.minecraft.client.renderer.entity.RenderPlayer;
015    import net.minecraft.entity.EntityLiving;
016    import net.minecraft.item.EnumAction;
017    import net.minecraft.item.Item;
018    import net.minecraft.item.ItemBlock;
019    import net.minecraft.item.ItemMap;
020    import net.minecraft.item.ItemStack;
021    import net.minecraft.util.MathHelper;
022    import net.minecraft.world.storage.MapData;
023    import org.lwjgl.opengl.GL11;
024    import org.lwjgl.opengl.GL12;
025    
026    import net.minecraftforge.client.ForgeHooksClient;
027    import net.minecraftforge.client.IItemRenderer;
028    import net.minecraftforge.client.MinecraftForgeClient;
029    import static net.minecraftforge.client.IItemRenderer.ItemRenderType.*;
030    import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.*;
031    
032    @SideOnly(Side.CLIENT)
033    public class ItemRenderer
034    {
035        /** A reference to the Minecraft object. */
036        private Minecraft mc;
037        private ItemStack itemToRender = null;
038    
039        /**
040         * How far the current item has been equipped (0 disequipped and 1 fully up)
041         */
042        private float equippedProgress = 0.0F;
043        private float prevEquippedProgress = 0.0F;
044    
045        /** Instance of RenderBlocks. */
046        private RenderBlocks renderBlocksInstance = new RenderBlocks();
047        public final MapItemRenderer mapItemRenderer;
048    
049        /** The index of the currently held item (0-8, or -1 if not yet updated) */
050        private int equippedItemSlot = -1;
051    
052        public ItemRenderer(Minecraft par1Minecraft)
053        {
054            this.mc = par1Minecraft;
055            this.mapItemRenderer = new MapItemRenderer(par1Minecraft.fontRenderer, par1Minecraft.gameSettings, par1Minecraft.renderEngine);
056        }
057    
058        /**
059         * Renders the item stack for being in an entity's hand Args: itemStack
060         */
061        public void renderItem(EntityLiving par1EntityLiving, ItemStack par2ItemStack, int par3)
062        {
063            GL11.glPushMatrix();
064    
065            IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par2ItemStack, EQUIPPED);
066    
067            if (customRenderer != null)
068            {
069                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile()));
070                ForgeHooksClient.renderEquippedItem(customRenderer, renderBlocksInstance, par1EntityLiving, par2ItemStack);
071            }
072            else if (par2ItemStack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[par2ItemStack.itemID].getRenderType()))
073            {
074                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile()));
075                this.renderBlocksInstance.renderBlockAsItem(Block.blocksList[par2ItemStack.itemID], par2ItemStack.getItemDamage(), 1.0F);
076            }
077            else
078            {
079                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile()));
080    
081                Tessellator var5 = Tessellator.instance;
082                int var6 = par1EntityLiving.getItemIcon(par2ItemStack, par3);
083                float var7 = ((float)(var6 % 16 * 16) + 0.0F) / 256.0F;
084                float var8 = ((float)(var6 % 16 * 16) + 15.99F) / 256.0F;
085                float var9 = ((float)(var6 / 16 * 16) + 0.0F) / 256.0F;
086                float var10 = ((float)(var6 / 16 * 16) + 15.99F) / 256.0F;
087                float var11 = 0.0F;
088                float var12 = 0.3F;
089                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
090                GL11.glTranslatef(-var11, -var12, 0.0F);
091                float var13 = 1.5F;
092                GL11.glScalef(var13, var13, var13);
093                GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
094                GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
095                GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F);
096                renderItemIn2D(var5, var8, var9, var7, var10, 0.0625F);
097    
098                if (par2ItemStack != null && par2ItemStack.hasEffect() && par3 == 0)
099                {
100                    GL11.glDepthFunc(GL11.GL_EQUAL);
101                    GL11.glDisable(GL11.GL_LIGHTING);
102                    this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture("%blur%/misc/glint.png"));
103                    GL11.glEnable(GL11.GL_BLEND);
104                    GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
105                    float var14 = 0.76F;
106                    GL11.glColor4f(0.5F * var14, 0.25F * var14, 0.8F * var14, 1.0F);
107                    GL11.glMatrixMode(GL11.GL_TEXTURE);
108                    GL11.glPushMatrix();
109                    float var15 = 0.125F;
110                    GL11.glScalef(var15, var15, var15);
111                    float var16 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F;
112                    GL11.glTranslatef(var16, 0.0F, 0.0F);
113                    GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F);
114                    renderItemIn2D(var5, 0.0F, 0.0F, 1.0F, 1.0F, 0.0625F);
115                    GL11.glPopMatrix();
116                    GL11.glPushMatrix();
117                    GL11.glScalef(var15, var15, var15);
118                    var16 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F;
119                    GL11.glTranslatef(-var16, 0.0F, 0.0F);
120                    GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F);
121                    renderItemIn2D(var5, 0.0F, 0.0F, 1.0F, 1.0F, 0.0625F);
122                    GL11.glPopMatrix();
123                    GL11.glMatrixMode(GL11.GL_MODELVIEW);
124                    GL11.glDisable(GL11.GL_BLEND);
125                    GL11.glEnable(GL11.GL_LIGHTING);
126                    GL11.glDepthFunc(GL11.GL_LEQUAL);
127                }
128    
129                GL11.glDisable(GL12.GL_RESCALE_NORMAL);
130            }
131    
132            GL11.glPopMatrix();
133        }
134    
135        /**
136         * Renders an item held in hand as a 2D texture with thickness
137         */
138        public static void renderItemIn2D(Tessellator par0Tessellator, float par1, float par2, float par3, float par4, float par5)
139        {
140            float var6 = 1.0F;
141            par0Tessellator.startDrawingQuads();
142            par0Tessellator.setNormal(0.0F, 0.0F, 1.0F);
143            par0Tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)par1, (double)par4);
144            par0Tessellator.addVertexWithUV((double)var6, 0.0D, 0.0D, (double)par3, (double)par4);
145            par0Tessellator.addVertexWithUV((double)var6, 1.0D, 0.0D, (double)par3, (double)par2);
146            par0Tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)par1, (double)par2);
147            par0Tessellator.draw();
148            par0Tessellator.startDrawingQuads();
149            par0Tessellator.setNormal(0.0F, 0.0F, -1.0F);
150            par0Tessellator.addVertexWithUV(0.0D, 1.0D, (double)(0.0F - par5), (double)par1, (double)par2);
151            par0Tessellator.addVertexWithUV((double)var6, 1.0D, (double)(0.0F - par5), (double)par3, (double)par2);
152            par0Tessellator.addVertexWithUV((double)var6, 0.0D, (double)(0.0F - par5), (double)par3, (double)par4);
153            par0Tessellator.addVertexWithUV(0.0D, 0.0D, (double)(0.0F - par5), (double)par1, (double)par4);
154            par0Tessellator.draw();
155            par0Tessellator.startDrawingQuads();
156            par0Tessellator.setNormal(-1.0F, 0.0F, 0.0F);
157            int var7;
158            float var8;
159            float var9;
160            float var10;
161    
162            /* Gets the width/16 of the currently bound texture, used
163             * to fix the side rendering issues on textures != 16 */
164            int tileSize = TextureFXManager.instance().getTextureDimensions(GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)).width / 16;
165    
166            float tx = 1.0f / (32 * tileSize);
167            float tz = 1.0f /  tileSize;
168    
169            for (var7 = 0; var7 < tileSize; ++var7)
170            {
171                var8 = (float)var7 / tileSize;
172                var9 = par1 + (par3 - par1) * var8 - tx;
173                var10 = var6 * var8;
174                par0Tessellator.addVertexWithUV((double)var10, 0.0D, (double)(0.0F - par5), (double)var9, (double)par4);
175                par0Tessellator.addVertexWithUV((double)var10, 0.0D, 0.0D, (double)var9, (double)par4);
176                par0Tessellator.addVertexWithUV((double)var10, 1.0D, 0.0D, (double)var9, (double)par2);
177                par0Tessellator.addVertexWithUV((double)var10, 1.0D, (double)(0.0F - par5), (double)var9, (double)par2);
178            }
179    
180            par0Tessellator.draw();
181            par0Tessellator.startDrawingQuads();
182            par0Tessellator.setNormal(1.0F, 0.0F, 0.0F);
183    
184            for (var7 = 0; var7 < tileSize; ++var7)
185            {
186                var8 = (float)var7 / tileSize;
187                var9 = par1 + (par3 - par1) * var8 - tx;
188                var10 = var6 * var8 + tz;
189                par0Tessellator.addVertexWithUV((double)var10, 1.0D, (double)(0.0F - par5), (double)var9, (double)par2);
190                par0Tessellator.addVertexWithUV((double)var10, 1.0D, 0.0D, (double)var9, (double)par2);
191                par0Tessellator.addVertexWithUV((double)var10, 0.0D, 0.0D, (double)var9, (double)par4);
192                par0Tessellator.addVertexWithUV((double)var10, 0.0D, (double)(0.0F - par5), (double)var9, (double)par4);
193            }
194    
195            par0Tessellator.draw();
196            par0Tessellator.startDrawingQuads();
197            par0Tessellator.setNormal(0.0F, 1.0F, 0.0F);
198    
199            for (var7 = 0; var7 < tileSize; ++var7)
200            {
201                var8 = (float)var7 / tileSize;
202                var9 = par4 + (par2 - par4) * var8 - tx;
203                var10 = var6 * var8 + tz;
204                par0Tessellator.addVertexWithUV(0.0D, (double)var10, 0.0D, (double)par1, (double)var9);
205                par0Tessellator.addVertexWithUV((double)var6, (double)var10, 0.0D, (double)par3, (double)var9);
206                par0Tessellator.addVertexWithUV((double)var6, (double)var10, (double)(0.0F - par5), (double)par3, (double)var9);
207                par0Tessellator.addVertexWithUV(0.0D, (double)var10, (double)(0.0F - par5), (double)par1, (double)var9);
208            }
209    
210            par0Tessellator.draw();
211            par0Tessellator.startDrawingQuads();
212            par0Tessellator.setNormal(0.0F, -1.0F, 0.0F);
213    
214            for (var7 = 0; var7 < tileSize; ++var7)
215            {
216                var8 = (float)var7 / tileSize;
217                var9 = par4 + (par2 - par4) * var8 - tx;
218                var10 = var6 * var8;
219                par0Tessellator.addVertexWithUV((double)var6, (double)var10, 0.0D, (double)par3, (double)var9);
220                par0Tessellator.addVertexWithUV(0.0D, (double)var10, 0.0D, (double)par1, (double)var9);
221                par0Tessellator.addVertexWithUV(0.0D, (double)var10, (double)(0.0F - par5), (double)par1, (double)var9);
222                par0Tessellator.addVertexWithUV((double)var6, (double)var10, (double)(0.0F - par5), (double)par3, (double)var9);
223            }
224    
225            par0Tessellator.draw();
226        }
227    
228        /**
229         * Renders the active item in the player's hand when in first person mode. Args: partialTickTime
230         */
231        public void renderItemInFirstPerson(float par1)
232        {
233            float var2 = this.prevEquippedProgress + (this.equippedProgress - this.prevEquippedProgress) * par1;
234            EntityClientPlayerMP var3 = this.mc.thePlayer;
235            float var4 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * par1;
236            GL11.glPushMatrix();
237            GL11.glRotatef(var4, 1.0F, 0.0F, 0.0F);
238            GL11.glRotatef(var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * par1, 0.0F, 1.0F, 0.0F);
239            RenderHelper.enableStandardItemLighting();
240            GL11.glPopMatrix();
241            float var6;
242            float var7;
243    
244            if (var3 instanceof EntityPlayerSP)
245            {
246                EntityPlayerSP var5 = (EntityPlayerSP)var3;
247                var6 = var5.prevRenderArmPitch + (var5.renderArmPitch - var5.prevRenderArmPitch) * par1;
248                var7 = var5.prevRenderArmYaw + (var5.renderArmYaw - var5.prevRenderArmYaw) * par1;
249                GL11.glRotatef((var3.rotationPitch - var6) * 0.1F, 1.0F, 0.0F, 0.0F);
250                GL11.glRotatef((var3.rotationYaw - var7) * 0.1F, 0.0F, 1.0F, 0.0F);
251            }
252    
253            ItemStack var17 = this.itemToRender;
254            var6 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ));
255            var6 = 1.0F;
256            int var18 = this.mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ), 0);
257            int var8 = var18 % 65536;
258            int var9 = var18 / 65536;
259            OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var8 / 1.0F, (float)var9 / 1.0F);
260            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
261            float var10;
262            float var21;
263            float var20;
264    
265            if (var17 != null)
266            {
267                var18 = Item.itemsList[var17.itemID].getColorFromItemStack(var17, 0);
268                var20 = (float)(var18 >> 16 & 255) / 255.0F;
269                var21 = (float)(var18 >> 8 & 255) / 255.0F;
270                var10 = (float)(var18 & 255) / 255.0F;
271                GL11.glColor4f(var6 * var20, var6 * var21, var6 * var10, 1.0F);
272            }
273            else
274            {
275                GL11.glColor4f(var6, var6, var6, 1.0F);
276            }
277    
278            float var11;
279            float var12;
280            float var13;
281            Render var24;
282            RenderPlayer var26;
283    
284            if (var17 != null && var17.getItem() instanceof ItemMap)
285            {
286                IItemRenderer custom = MinecraftForgeClient.getItemRenderer(var17, FIRST_PERSON_MAP);
287                GL11.glPushMatrix();
288                var7 = 0.8F;
289                var20 = var3.getSwingProgress(par1);
290                var21 = MathHelper.sin(var20 * (float)Math.PI);
291                var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
292                GL11.glTranslatef(-var10 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.2F, -var21 * 0.2F);
293                var20 = 1.0F - var4 / 45.0F + 0.1F;
294    
295                if (var20 < 0.0F)
296                {
297                    var20 = 0.0F;
298                }
299    
300                if (var20 > 1.0F)
301                {
302                    var20 = 1.0F;
303                }
304    
305                var20 = -MathHelper.cos(var20 * (float)Math.PI) * 0.5F + 0.5F;
306                GL11.glTranslatef(0.0F, 0.0F * var7 - (1.0F - var2) * 1.2F - var20 * 0.5F + 0.04F, -0.9F * var7);
307                GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
308                GL11.glRotatef(var20 * -85.0F, 0.0F, 0.0F, 1.0F);
309                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
310                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getTexture()));
311    
312                for (var9 = 0; var9 < 2; ++var9)
313                {
314                    int var22 = var9 * 2 - 1;
315                    GL11.glPushMatrix();
316                    GL11.glTranslatef(-0.0F, -0.6F, 1.1F * (float)var22);
317                    GL11.glRotatef((float)(-45 * var22), 1.0F, 0.0F, 0.0F);
318                    GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F);
319                    GL11.glRotatef(59.0F, 0.0F, 0.0F, 1.0F);
320                    GL11.glRotatef((float)(-65 * var22), 0.0F, 1.0F, 0.0F);
321                    var24 = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer);
322                    var26 = (RenderPlayer)var24;
323                    var13 = 1.0F;
324                    GL11.glScalef(var13, var13, var13);
325                    var26.func_82441_a(this.mc.thePlayer);
326                    GL11.glPopMatrix();
327                }
328    
329                var21 = var3.getSwingProgress(par1);
330                var10 = MathHelper.sin(var21 * var21 * (float)Math.PI);
331                var11 = MathHelper.sin(MathHelper.sqrt_float(var21) * (float)Math.PI);
332                GL11.glRotatef(-var10 * 20.0F, 0.0F, 1.0F, 0.0F);
333                GL11.glRotatef(-var11 * 20.0F, 0.0F, 0.0F, 1.0F);
334                GL11.glRotatef(-var11 * 80.0F, 1.0F, 0.0F, 0.0F);
335                var12 = 0.38F;
336                GL11.glScalef(var12, var12, var12);
337                GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
338                GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
339                GL11.glTranslatef(-1.0F, -1.0F, 0.0F);
340                var13 = 0.015625F;
341                GL11.glScalef(var13, var13, var13);
342                this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture("/misc/mapbg.png"));
343                Tessellator var28 = Tessellator.instance;
344                GL11.glNormal3f(0.0F, 0.0F, -1.0F);
345                var28.startDrawingQuads();
346                byte var27 = 7;
347                var28.addVertexWithUV((double)(0 - var27), (double)(128 + var27), 0.0D, 0.0D, 1.0D);
348                var28.addVertexWithUV((double)(128 + var27), (double)(128 + var27), 0.0D, 1.0D, 1.0D);
349                var28.addVertexWithUV((double)(128 + var27), (double)(0 - var27), 0.0D, 1.0D, 0.0D);
350                var28.addVertexWithUV((double)(0 - var27), (double)(0 - var27), 0.0D, 0.0D, 0.0D);
351                var28.draw();
352                MapData var16 = ((ItemMap)var17.getItem()).getMapData(var17, this.mc.theWorld);
353                if (custom == null)
354                {
355                    if (var16 != null)
356                    {
357                        this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var16);
358                    }
359                }
360                else
361                {
362                    custom.renderItem(FIRST_PERSON_MAP, var17, mc.thePlayer, mc.renderEngine, var16);
363                }
364    
365                GL11.glPopMatrix();
366            }
367            else if (var17 != null)
368            {
369                GL11.glPushMatrix();
370                var7 = 0.8F;
371    
372                if (var3.getItemInUseCount() > 0)
373                {
374                    EnumAction var19 = var17.getItemUseAction();
375    
376                    if (var19 == EnumAction.eat || var19 == EnumAction.drink)
377                    {
378                        var21 = (float)var3.getItemInUseCount() - par1 + 1.0F;
379                        var10 = 1.0F - var21 / (float)var17.getMaxItemUseDuration();
380                        var11 = 1.0F - var10;
381                        var11 = var11 * var11 * var11;
382                        var11 = var11 * var11 * var11;
383                        var11 = var11 * var11 * var11;
384                        var12 = 1.0F - var11;
385                        GL11.glTranslatef(0.0F, MathHelper.abs(MathHelper.cos(var21 / 4.0F * (float)Math.PI) * 0.1F) * (float)((double)var10 > 0.2D ? 1 : 0), 0.0F);
386                        GL11.glTranslatef(var12 * 0.6F, -var12 * 0.5F, 0.0F);
387                        GL11.glRotatef(var12 * 90.0F, 0.0F, 1.0F, 0.0F);
388                        GL11.glRotatef(var12 * 10.0F, 1.0F, 0.0F, 0.0F);
389                        GL11.glRotatef(var12 * 30.0F, 0.0F, 0.0F, 1.0F);
390                    }
391                }
392                else
393                {
394                    var20 = var3.getSwingProgress(par1);
395                    var21 = MathHelper.sin(var20 * (float)Math.PI);
396                    var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
397                    GL11.glTranslatef(-var10 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.2F, -var21 * 0.2F);
398                }
399    
400                GL11.glTranslatef(0.7F * var7, -0.65F * var7 - (1.0F - var2) * 0.6F, -0.9F * var7);
401                GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
402                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
403                var20 = var3.getSwingProgress(par1);
404                var21 = MathHelper.sin(var20 * var20 * (float)Math.PI);
405                var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
406                GL11.glRotatef(-var21 * 20.0F, 0.0F, 1.0F, 0.0F);
407                GL11.glRotatef(-var10 * 20.0F, 0.0F, 0.0F, 1.0F);
408                GL11.glRotatef(-var10 * 80.0F, 1.0F, 0.0F, 0.0F);
409                var11 = 0.4F;
410                GL11.glScalef(var11, var11, var11);
411                float var14;
412                float var15;
413    
414                if (var3.getItemInUseCount() > 0)
415                {
416                    EnumAction var23 = var17.getItemUseAction();
417    
418                    if (var23 == EnumAction.block)
419                    {
420                        GL11.glTranslatef(-0.5F, 0.2F, 0.0F);
421                        GL11.glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
422                        GL11.glRotatef(-80.0F, 1.0F, 0.0F, 0.0F);
423                        GL11.glRotatef(60.0F, 0.0F, 1.0F, 0.0F);
424                    }
425                    else if (var23 == EnumAction.bow)
426                    {
427                        GL11.glRotatef(-18.0F, 0.0F, 0.0F, 1.0F);
428                        GL11.glRotatef(-12.0F, 0.0F, 1.0F, 0.0F);
429                        GL11.glRotatef(-8.0F, 1.0F, 0.0F, 0.0F);
430                        GL11.glTranslatef(-0.9F, 0.2F, 0.0F);
431                        var13 = (float)var17.getMaxItemUseDuration() - ((float)var3.getItemInUseCount() - par1 + 1.0F);
432                        var14 = var13 / 20.0F;
433                        var14 = (var14 * var14 + var14 * 2.0F) / 3.0F;
434    
435                        if (var14 > 1.0F)
436                        {
437                            var14 = 1.0F;
438                        }
439    
440                        if (var14 > 0.1F)
441                        {
442                            GL11.glTranslatef(0.0F, MathHelper.sin((var13 - 0.1F) * 1.3F) * 0.01F * (var14 - 0.1F), 0.0F);
443                        }
444    
445                        GL11.glTranslatef(0.0F, 0.0F, var14 * 0.1F);
446                        GL11.glRotatef(-335.0F, 0.0F, 0.0F, 1.0F);
447                        GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F);
448                        GL11.glTranslatef(0.0F, 0.5F, 0.0F);
449                        var15 = 1.0F + var14 * 0.2F;
450                        GL11.glScalef(1.0F, 1.0F, var15);
451                        GL11.glTranslatef(0.0F, -0.5F, 0.0F);
452                        GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
453                        GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
454                    }
455                }
456    
457                if (var17.getItem().shouldRotateAroundWhenRendering())
458                {
459                    GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
460                }
461    
462                if (var17.getItem().requiresMultipleRenderPasses())
463                {
464                    this.renderItem(var3, var17, 0);
465                    for (int x = 1; x < var17.getItem().getRenderPasses(var17.getItemDamage()); x++)
466                    {
467                        int var25 = Item.itemsList[var17.itemID].getColorFromItemStack(var17, x);
468                        var13 = (float)(var25 >> 16 & 255) / 255.0F;
469                        var14 = (float)(var25 >> 8 & 255) / 255.0F;
470                        var15 = (float)(var25 & 255) / 255.0F;
471                        GL11.glColor4f(var6 * var13, var6 * var14, var6 * var15, 1.0F);
472                        this.renderItem(var3, var17, x);
473                    }
474                }
475                else
476                {
477                    this.renderItem(var3, var17, 0);
478                }
479    
480                GL11.glPopMatrix();
481            }
482            else if (!var3.getHasActivePotion())
483            {
484                GL11.glPushMatrix();
485                var7 = 0.8F;
486                var20 = var3.getSwingProgress(par1);
487                var21 = MathHelper.sin(var20 * (float)Math.PI);
488                var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
489                GL11.glTranslatef(-var10 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.4F, -var21 * 0.4F);
490                GL11.glTranslatef(0.8F * var7, -0.75F * var7 - (1.0F - var2) * 0.6F, -0.9F * var7);
491                GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
492                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
493                var20 = var3.getSwingProgress(par1);
494                var21 = MathHelper.sin(var20 * var20 * (float)Math.PI);
495                var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
496                GL11.glRotatef(var10 * 70.0F, 0.0F, 1.0F, 0.0F);
497                GL11.glRotatef(-var21 * 20.0F, 0.0F, 0.0F, 1.0F);
498                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getTexture()));
499                GL11.glTranslatef(-1.0F, 3.6F, 3.5F);
500                GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F);
501                GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F);
502                GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
503                GL11.glScalef(1.0F, 1.0F, 1.0F);
504                GL11.glTranslatef(5.6F, 0.0F, 0.0F);
505                var24 = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer);
506                var26 = (RenderPlayer)var24;
507                var13 = 1.0F;
508                GL11.glScalef(var13, var13, var13);
509                var26.func_82441_a(this.mc.thePlayer);
510                GL11.glPopMatrix();
511            }
512    
513            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
514            RenderHelper.disableStandardItemLighting();
515        }
516    
517        /**
518         * Renders all the overlays that are in first person mode. Args: partialTickTime
519         */
520        public void renderOverlays(float par1)
521        {
522            GL11.glDisable(GL11.GL_ALPHA_TEST);
523            int var2;
524    
525            if (this.mc.thePlayer.isBurning())
526            {
527                var2 = this.mc.renderEngine.getTexture("/terrain.png");
528                GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
529                this.renderFireInFirstPerson(par1);
530            }
531    
532            if (this.mc.thePlayer.isEntityInsideOpaqueBlock())
533            {
534                var2 = MathHelper.floor_double(this.mc.thePlayer.posX);
535                int var3 = MathHelper.floor_double(this.mc.thePlayer.posY);
536                int var4 = MathHelper.floor_double(this.mc.thePlayer.posZ);
537                int var5 = this.mc.renderEngine.getTexture("/terrain.png");
538                GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5);
539                int var6 = this.mc.theWorld.getBlockId(var2, var3, var4);
540    
541                if (this.mc.theWorld.isBlockNormalCube(var2, var3, var4))
542                {
543                    this.renderInsideOfBlock(par1, Block.blocksList[var6].getBlockTextureFromSide(2));
544                }
545                else
546                {
547                    for (int var7 = 0; var7 < 8; ++var7)
548                    {
549                        float var8 = ((float)((var7 >> 0) % 2) - 0.5F) * this.mc.thePlayer.width * 0.9F;
550                        float var9 = ((float)((var7 >> 1) % 2) - 0.5F) * this.mc.thePlayer.height * 0.2F;
551                        float var10 = ((float)((var7 >> 2) % 2) - 0.5F) * this.mc.thePlayer.width * 0.9F;
552                        int var11 = MathHelper.floor_float((float)var2 + var8);
553                        int var12 = MathHelper.floor_float((float)var3 + var9);
554                        int var13 = MathHelper.floor_float((float)var4 + var10);
555    
556                        if (this.mc.theWorld.isBlockNormalCube(var11, var12, var13))
557                        {
558                            var6 = this.mc.theWorld.getBlockId(var11, var12, var13);
559                        }
560                    }
561                }
562    
563                if (Block.blocksList[var6] != null)
564                {
565                    this.renderInsideOfBlock(par1, Block.blocksList[var6].getBlockTextureFromSide(2));
566                }
567            }
568    
569            if (this.mc.thePlayer.isInsideOfMaterial(Material.water))
570            {
571                var2 = this.mc.renderEngine.getTexture("/misc/water.png");
572                GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
573                this.renderWarpedTextureOverlay(par1);
574            }
575    
576            GL11.glEnable(GL11.GL_ALPHA_TEST);
577        }
578    
579        /**
580         * Renders the texture of the block the player is inside as an overlay. Args: partialTickTime, blockTextureIndex
581         */
582        private void renderInsideOfBlock(float par1, int par2)
583        {
584            Tessellator var3 = Tessellator.instance;
585            this.mc.thePlayer.getBrightness(par1);
586            float var4 = 0.1F;
587            GL11.glColor4f(var4, var4, var4, 0.5F);
588            GL11.glPushMatrix();
589            float var5 = -1.0F;
590            float var6 = 1.0F;
591            float var7 = -1.0F;
592            float var8 = 1.0F;
593            float var9 = -0.5F;
594            float var10 = 0.0078125F;
595            float var11 = (float)(par2 % 16) / 256.0F - var10;
596            float var12 = ((float)(par2 % 16) + 15.99F) / 256.0F + var10;
597            float var13 = (float)(par2 / 16) / 256.0F - var10;
598            float var14 = ((float)(par2 / 16) + 15.99F) / 256.0F + var10;
599            var3.startDrawingQuads();
600            var3.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)var12, (double)var14);
601            var3.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)var11, (double)var14);
602            var3.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)var11, (double)var13);
603            var3.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)var12, (double)var13);
604            var3.draw();
605            GL11.glPopMatrix();
606            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
607        }
608    
609        /**
610         * Renders a texture that warps around based on the direction the player is looking. Texture needs to be bound
611         * before being called. Used for the water overlay. Args: parialTickTime
612         */
613        private void renderWarpedTextureOverlay(float par1)
614        {
615            Tessellator var2 = Tessellator.instance;
616            float var3 = this.mc.thePlayer.getBrightness(par1);
617            GL11.glColor4f(var3, var3, var3, 0.5F);
618            GL11.glEnable(GL11.GL_BLEND);
619            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
620            GL11.glPushMatrix();
621            float var4 = 4.0F;
622            float var5 = -1.0F;
623            float var6 = 1.0F;
624            float var7 = -1.0F;
625            float var8 = 1.0F;
626            float var9 = -0.5F;
627            float var10 = -this.mc.thePlayer.rotationYaw / 64.0F;
628            float var11 = this.mc.thePlayer.rotationPitch / 64.0F;
629            var2.startDrawingQuads();
630            var2.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)(var4 + var10), (double)(var4 + var11));
631            var2.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)(0.0F + var10), (double)(var4 + var11));
632            var2.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)(0.0F + var10), (double)(0.0F + var11));
633            var2.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)(var4 + var10), (double)(0.0F + var11));
634            var2.draw();
635            GL11.glPopMatrix();
636            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
637            GL11.glDisable(GL11.GL_BLEND);
638        }
639    
640        /**
641         * Renders the fire on the screen for first person mode. Arg: partialTickTime
642         */
643        private void renderFireInFirstPerson(float par1)
644        {
645            Tessellator var2 = Tessellator.instance;
646            GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.9F);
647            GL11.glEnable(GL11.GL_BLEND);
648            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
649            float var3 = 1.0F;
650    
651            for (int var4 = 0; var4 < 2; ++var4)
652            {
653                GL11.glPushMatrix();
654                int var5 = Block.fire.blockIndexInTexture + var4 * 16;
655                int var6 = (var5 & 15) << 4;
656                int var7 = var5 & 240;
657                float var8 = (float)var6 / 256.0F;
658                float var9 = ((float)var6 + 15.99F) / 256.0F;
659                float var10 = (float)var7 / 256.0F;
660                float var11 = ((float)var7 + 15.99F) / 256.0F;
661                float var12 = (0.0F - var3) / 2.0F;
662                float var13 = var12 + var3;
663                float var14 = 0.0F - var3 / 2.0F;
664                float var15 = var14 + var3;
665                float var16 = -0.5F;
666                GL11.glTranslatef((float)(-(var4 * 2 - 1)) * 0.24F, -0.3F, 0.0F);
667                GL11.glRotatef((float)(var4 * 2 - 1) * 10.0F, 0.0F, 1.0F, 0.0F);
668                var2.startDrawingQuads();
669                var2.addVertexWithUV((double)var12, (double)var14, (double)var16, (double)var9, (double)var11);
670                var2.addVertexWithUV((double)var13, (double)var14, (double)var16, (double)var8, (double)var11);
671                var2.addVertexWithUV((double)var13, (double)var15, (double)var16, (double)var8, (double)var10);
672                var2.addVertexWithUV((double)var12, (double)var15, (double)var16, (double)var9, (double)var10);
673                var2.draw();
674                GL11.glPopMatrix();
675            }
676    
677            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
678            GL11.glDisable(GL11.GL_BLEND);
679        }
680    
681        public void updateEquippedItem()
682        {
683            this.prevEquippedProgress = this.equippedProgress;
684            EntityClientPlayerMP var1 = this.mc.thePlayer;
685            ItemStack var2 = var1.inventory.getCurrentItem();
686            boolean var3 = this.equippedItemSlot == var1.inventory.currentItem && var2 == this.itemToRender;
687    
688            if (this.itemToRender == null && var2 == null)
689            {
690                var3 = true;
691            }
692    
693            if (var2 != null && this.itemToRender != null && var2 != this.itemToRender && var2.itemID == this.itemToRender.itemID && var2.getItemDamage() == this.itemToRender.getItemDamage())
694            {
695                this.itemToRender = var2;
696                var3 = true;
697            }
698    
699            float var4 = 0.4F;
700            float var5 = var3 ? 1.0F : 0.0F;
701            float var6 = var5 - this.equippedProgress;
702    
703            if (var6 < -var4)
704            {
705                var6 = -var4;
706            }
707    
708            if (var6 > var4)
709            {
710                var6 = var4;
711            }
712    
713            this.equippedProgress += var6;
714    
715            if (this.equippedProgress < 0.1F)
716            {
717                this.itemToRender = var2;
718                this.equippedItemSlot = var1.inventory.currentItem;
719            }
720        }
721    
722        public void func_78444_b()
723        {
724            this.equippedProgress = 0.0F;
725        }
726    
727        public void func_78445_c()
728        {
729            this.equippedProgress = 0.0F;
730        }
731    }