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