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