001 package net.minecraft.client.renderer;
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.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 this.renderItemIn2D(var5, var8, var9, var7, var10);
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 this.renderItemIn2D(var5, 0.0F, 0.0F, 1.0F, 1.0F);
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 this.renderItemIn2D(var5, 0.0F, 0.0F, 1.0F, 1.0F);
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 private void renderItemIn2D(Tessellator par1Tessellator, float par2, float par3, float par4, float par5)
139 {
140 float var6 = 1.0F;
141 float var7 = 0.0625F;
142 par1Tessellator.startDrawingQuads();
143 par1Tessellator.setNormal(0.0F, 0.0F, 1.0F);
144 par1Tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)par2, (double)par5);
145 par1Tessellator.addVertexWithUV((double)var6, 0.0D, 0.0D, (double)par4, (double)par5);
146 par1Tessellator.addVertexWithUV((double)var6, 1.0D, 0.0D, (double)par4, (double)par3);
147 par1Tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)par2, (double)par3);
148 par1Tessellator.draw();
149 par1Tessellator.startDrawingQuads();
150 par1Tessellator.setNormal(0.0F, 0.0F, -1.0F);
151 par1Tessellator.addVertexWithUV(0.0D, 1.0D, (double)(0.0F - var7), (double)par2, (double)par3);
152 par1Tessellator.addVertexWithUV((double)var6, 1.0D, (double)(0.0F - var7), (double)par4, (double)par3);
153 par1Tessellator.addVertexWithUV((double)var6, 0.0D, (double)(0.0F - var7), (double)par4, (double)par5);
154 par1Tessellator.addVertexWithUV(0.0D, 0.0D, (double)(0.0F - var7), (double)par2, (double)par5);
155 par1Tessellator.draw();
156 par1Tessellator.startDrawingQuads();
157 par1Tessellator.setNormal(-1.0F, 0.0F, 0.0F);
158 int var8;
159 float var9;
160 float var10;
161 float var11;
162
163 /* Gets the width/16 of the currently bound texture, used
164 * to fix the side rendering issues on textures != 16 */
165 int tileSize = TextureFXManager.instance().getTextureDimensions(GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)).width / 16;
166
167 float tx = 1.0f / (32 * tileSize);
168 float tz = 1.0f / tileSize;
169
170 for (var8 = 0; var8 < tileSize; ++var8)
171 {
172 var9 = (float)var8 / tileSize;
173 var10 = par2 + (par4 - par2) * var9 - tx;
174 var11 = var6 * var9;
175 par1Tessellator.addVertexWithUV((double)var11, 0.0D, (double)(0.0F - var7), (double)var10, (double)par5);
176 par1Tessellator.addVertexWithUV((double)var11, 0.0D, 0.0D, (double)var10, (double)par5);
177 par1Tessellator.addVertexWithUV((double)var11, 1.0D, 0.0D, (double)var10, (double)par3);
178 par1Tessellator.addVertexWithUV((double)var11, 1.0D, (double)(0.0F - var7), (double)var10, (double)par3);
179 }
180
181 par1Tessellator.draw();
182 par1Tessellator.startDrawingQuads();
183 par1Tessellator.setNormal(1.0F, 0.0F, 0.0F);
184
185 for (var8 = 0; var8 < tileSize; ++var8)
186 {
187 var9 = (float)var8 / tileSize;
188 var10 = par2 + (par4 - par2) * var9 - tx;
189 var11 = var6 * var9 + tz;
190 par1Tessellator.addVertexWithUV((double)var11, 1.0D, (double)(0.0F - var7), (double)var10, (double)par3);
191 par1Tessellator.addVertexWithUV((double)var11, 1.0D, 0.0D, (double)var10, (double)par3);
192 par1Tessellator.addVertexWithUV((double)var11, 0.0D, 0.0D, (double)var10, (double)par5);
193 par1Tessellator.addVertexWithUV((double)var11, 0.0D, (double)(0.0F - var7), (double)var10, (double)par5);
194 }
195
196 par1Tessellator.draw();
197 par1Tessellator.startDrawingQuads();
198 par1Tessellator.setNormal(0.0F, 1.0F, 0.0F);
199
200 for (var8 = 0; var8 < tileSize; ++var8)
201 {
202 var9 = (float)var8 / tileSize;
203 var10 = par5 + (par3 - par5) * var9 - tx;
204 var11 = var6 * var9 + tz;
205 par1Tessellator.addVertexWithUV(0.0D, (double)var11, 0.0D, (double)par2, (double)var10);
206 par1Tessellator.addVertexWithUV((double)var6, (double)var11, 0.0D, (double)par4, (double)var10);
207 par1Tessellator.addVertexWithUV((double)var6, (double)var11, (double)(0.0F - var7), (double)par4, (double)var10);
208 par1Tessellator.addVertexWithUV(0.0D, (double)var11, (double)(0.0F - var7), (double)par2, (double)var10);
209 }
210
211 par1Tessellator.draw();
212 par1Tessellator.startDrawingQuads();
213 par1Tessellator.setNormal(0.0F, -1.0F, 0.0F);
214
215 for (var8 = 0; var8 < tileSize; ++var8)
216 {
217 var9 = (float)var8 / tileSize;
218 var10 = par5 + (par3 - par5) * var9 - tx;
219 var11 = var6 * var9;
220 par1Tessellator.addVertexWithUV((double)var6, (double)var11, 0.0D, (double)par4, (double)var10);
221 par1Tessellator.addVertexWithUV(0.0D, (double)var11, 0.0D, (double)par2, (double)var10);
222 par1Tessellator.addVertexWithUV(0.0D, (double)var11, (double)(0.0F - var7), (double)par2, (double)var10);
223 par1Tessellator.addVertexWithUV((double)var6, (double)var11, (double)(0.0F - var7), (double)par4, (double)var10);
224 }
225
226 par1Tessellator.draw();
227 }
228
229 /**
230 * Renders the active item in the player's hand when in first person mode. Args: partialTickTime
231 */
232 public void renderItemInFirstPerson(float par1)
233 {
234 float var2 = this.prevEquippedProgress + (this.equippedProgress - this.prevEquippedProgress) * par1;
235 EntityClientPlayerMP var3 = this.mc.thePlayer;
236 float var4 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * par1;
237 GL11.glPushMatrix();
238 GL11.glRotatef(var4, 1.0F, 0.0F, 0.0F);
239 GL11.glRotatef(var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * par1, 0.0F, 1.0F, 0.0F);
240 RenderHelper.enableStandardItemLighting();
241 GL11.glPopMatrix();
242 float var6;
243 float var7;
244
245 if (var3 instanceof EntityPlayerSP)
246 {
247 EntityPlayerSP var5 = (EntityPlayerSP)var3;
248 var6 = var5.prevRenderArmPitch + (var5.renderArmPitch - var5.prevRenderArmPitch) * par1;
249 var7 = var5.prevRenderArmYaw + (var5.renderArmYaw - var5.prevRenderArmYaw) * par1;
250 GL11.glRotatef((var3.rotationPitch - var6) * 0.1F, 1.0F, 0.0F, 0.0F);
251 GL11.glRotatef((var3.rotationYaw - var7) * 0.1F, 0.0F, 1.0F, 0.0F);
252 }
253
254 ItemStack var17 = this.itemToRender;
255 var6 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ));
256 var6 = 1.0F;
257 int var18 = this.mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ), 0);
258 int var8 = var18 % 65536;
259 int var9 = var18 / 65536;
260 OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var8 / 1.0F, (float)var9 / 1.0F);
261 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
262 float var10;
263 float var21;
264 float var20;
265
266 if (var17 != null)
267 {
268 var18 = Item.itemsList[var17.itemID].getColorFromItemStack(var17, 0);
269 var20 = (float)(var18 >> 16 & 255) / 255.0F;
270 var21 = (float)(var18 >> 8 & 255) / 255.0F;
271 var10 = (float)(var18 & 255) / 255.0F;
272 GL11.glColor4f(var6 * var20, var6 * var21, var6 * var10, 1.0F);
273 }
274 else
275 {
276 GL11.glColor4f(var6, var6, var6, 1.0F);
277 }
278
279 float var11;
280 float var12;
281 float var13;
282 Render var24;
283 RenderPlayer var26;
284
285 if (var17 != null && var17.getItem() instanceof ItemMap)
286 {
287 IItemRenderer custom = MinecraftForgeClient.getItemRenderer(var17, FIRST_PERSON_MAP);
288 GL11.glPushMatrix();
289 var7 = 0.8F;
290 var20 = var3.getSwingProgress(par1);
291 var21 = MathHelper.sin(var20 * (float)Math.PI);
292 var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
293 GL11.glTranslatef(-var10 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.2F, -var21 * 0.2F);
294 var20 = 1.0F - var4 / 45.0F + 0.1F;
295
296 if (var20 < 0.0F)
297 {
298 var20 = 0.0F;
299 }
300
301 if (var20 > 1.0F)
302 {
303 var20 = 1.0F;
304 }
305
306 var20 = -MathHelper.cos(var20 * (float)Math.PI) * 0.5F + 0.5F;
307 GL11.glTranslatef(0.0F, 0.0F * var7 - (1.0F - var2) * 1.2F - var20 * 0.5F + 0.04F, -0.9F * var7);
308 GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
309 GL11.glRotatef(var20 * -85.0F, 0.0F, 0.0F, 1.0F);
310 GL11.glEnable(GL12.GL_RESCALE_NORMAL);
311 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getTexture()));
312
313 for (var9 = 0; var9 < 2; ++var9)
314 {
315 int var22 = var9 * 2 - 1;
316 GL11.glPushMatrix();
317 GL11.glTranslatef(-0.0F, -0.6F, 1.1F * (float)var22);
318 GL11.glRotatef((float)(-45 * var22), 1.0F, 0.0F, 0.0F);
319 GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F);
320 GL11.glRotatef(59.0F, 0.0F, 0.0F, 1.0F);
321 GL11.glRotatef((float)(-65 * var22), 0.0F, 1.0F, 0.0F);
322 var24 = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer);
323 var26 = (RenderPlayer)var24;
324 var13 = 1.0F;
325 GL11.glScalef(var13, var13, var13);
326 var26.func_82441_a(this.mc.thePlayer);
327 GL11.glPopMatrix();
328 }
329
330 var21 = var3.getSwingProgress(par1);
331 var10 = MathHelper.sin(var21 * var21 * (float)Math.PI);
332 var11 = MathHelper.sin(MathHelper.sqrt_float(var21) * (float)Math.PI);
333 GL11.glRotatef(-var10 * 20.0F, 0.0F, 1.0F, 0.0F);
334 GL11.glRotatef(-var11 * 20.0F, 0.0F, 0.0F, 1.0F);
335 GL11.glRotatef(-var11 * 80.0F, 1.0F, 0.0F, 0.0F);
336 var12 = 0.38F;
337 GL11.glScalef(var12, var12, var12);
338 GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
339 GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
340 GL11.glTranslatef(-1.0F, -1.0F, 0.0F);
341 var13 = 0.015625F;
342 GL11.glScalef(var13, var13, var13);
343 this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture("/misc/mapbg.png"));
344 Tessellator var28 = Tessellator.instance;
345 GL11.glNormal3f(0.0F, 0.0F, -1.0F);
346 var28.startDrawingQuads();
347 byte var27 = 7;
348 var28.addVertexWithUV((double)(0 - var27), (double)(128 + var27), 0.0D, 0.0D, 1.0D);
349 var28.addVertexWithUV((double)(128 + var27), (double)(128 + var27), 0.0D, 1.0D, 1.0D);
350 var28.addVertexWithUV((double)(128 + var27), (double)(0 - var27), 0.0D, 1.0D, 0.0D);
351 var28.addVertexWithUV((double)(0 - var27), (double)(0 - var27), 0.0D, 0.0D, 0.0D);
352 var28.draw();
353 MapData var16 = ((ItemMap)var17.getItem()).getMapData(var17, this.mc.theWorld);
354 if (custom == null)
355 {
356 if (var16 != null)
357 {
358 this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var16);
359 }
360 }
361 else
362 {
363 custom.renderItem(FIRST_PERSON_MAP, var17, mc.thePlayer, mc.renderEngine, var16);
364 }
365
366 GL11.glPopMatrix();
367 }
368 else if (var17 != null)
369 {
370 GL11.glPushMatrix();
371 var7 = 0.8F;
372
373 if (var3.getItemInUseCount() > 0)
374 {
375 EnumAction var19 = var17.getItemUseAction();
376
377 if (var19 == EnumAction.eat || var19 == EnumAction.drink)
378 {
379 var21 = (float)var3.getItemInUseCount() - par1 + 1.0F;
380 var10 = 1.0F - var21 / (float)var17.getMaxItemUseDuration();
381 var11 = 1.0F - var10;
382 var11 = var11 * var11 * var11;
383 var11 = var11 * var11 * var11;
384 var11 = var11 * var11 * var11;
385 var12 = 1.0F - var11;
386 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);
387 GL11.glTranslatef(var12 * 0.6F, -var12 * 0.5F, 0.0F);
388 GL11.glRotatef(var12 * 90.0F, 0.0F, 1.0F, 0.0F);
389 GL11.glRotatef(var12 * 10.0F, 1.0F, 0.0F, 0.0F);
390 GL11.glRotatef(var12 * 30.0F, 0.0F, 0.0F, 1.0F);
391 }
392 }
393 else
394 {
395 var20 = var3.getSwingProgress(par1);
396 var21 = MathHelper.sin(var20 * (float)Math.PI);
397 var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
398 GL11.glTranslatef(-var10 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.2F, -var21 * 0.2F);
399 }
400
401 GL11.glTranslatef(0.7F * var7, -0.65F * var7 - (1.0F - var2) * 0.6F, -0.9F * var7);
402 GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
403 GL11.glEnable(GL12.GL_RESCALE_NORMAL);
404 var20 = var3.getSwingProgress(par1);
405 var21 = MathHelper.sin(var20 * var20 * (float)Math.PI);
406 var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
407 GL11.glRotatef(-var21 * 20.0F, 0.0F, 1.0F, 0.0F);
408 GL11.glRotatef(-var10 * 20.0F, 0.0F, 0.0F, 1.0F);
409 GL11.glRotatef(-var10 * 80.0F, 1.0F, 0.0F, 0.0F);
410 var11 = 0.4F;
411 GL11.glScalef(var11, var11, var11);
412 float var14;
413 float var15;
414
415 if (var3.getItemInUseCount() > 0)
416 {
417 EnumAction var23 = var17.getItemUseAction();
418
419 if (var23 == EnumAction.block)
420 {
421 GL11.glTranslatef(-0.5F, 0.2F, 0.0F);
422 GL11.glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
423 GL11.glRotatef(-80.0F, 1.0F, 0.0F, 0.0F);
424 GL11.glRotatef(60.0F, 0.0F, 1.0F, 0.0F);
425 }
426 else if (var23 == EnumAction.bow)
427 {
428 GL11.glRotatef(-18.0F, 0.0F, 0.0F, 1.0F);
429 GL11.glRotatef(-12.0F, 0.0F, 1.0F, 0.0F);
430 GL11.glRotatef(-8.0F, 1.0F, 0.0F, 0.0F);
431 GL11.glTranslatef(-0.9F, 0.2F, 0.0F);
432 var13 = (float)var17.getMaxItemUseDuration() - ((float)var3.getItemInUseCount() - par1 + 1.0F);
433 var14 = var13 / 20.0F;
434 var14 = (var14 * var14 + var14 * 2.0F) / 3.0F;
435
436 if (var14 > 1.0F)
437 {
438 var14 = 1.0F;
439 }
440
441 if (var14 > 0.1F)
442 {
443 GL11.glTranslatef(0.0F, MathHelper.sin((var13 - 0.1F) * 1.3F) * 0.01F * (var14 - 0.1F), 0.0F);
444 }
445
446 GL11.glTranslatef(0.0F, 0.0F, var14 * 0.1F);
447 GL11.glRotatef(-335.0F, 0.0F, 0.0F, 1.0F);
448 GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F);
449 GL11.glTranslatef(0.0F, 0.5F, 0.0F);
450 var15 = 1.0F + var14 * 0.2F;
451 GL11.glScalef(1.0F, 1.0F, var15);
452 GL11.glTranslatef(0.0F, -0.5F, 0.0F);
453 GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
454 GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
455 }
456 }
457
458 if (var17.getItem().shouldRotateAroundWhenRendering())
459 {
460 GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
461 }
462
463 if (var17.getItem().requiresMultipleRenderPasses())
464 {
465 this.renderItem(var3, var17, 0);
466 for (int x = 1; x < var17.getItem().getRenderPasses(var17.getItemDamage()); x++)
467 {
468 int var25 = Item.itemsList[var17.itemID].getColorFromItemStack(var17, x);
469 var13 = (float)(var25 >> 16 & 255) / 255.0F;
470 var14 = (float)(var25 >> 8 & 255) / 255.0F;
471 var15 = (float)(var25 & 255) / 255.0F;
472 GL11.glColor4f(var6 * var13, var6 * var14, var6 * var15, 1.0F);
473 this.renderItem(var3, var17, x);
474 }
475 }
476 else
477 {
478 this.renderItem(var3, var17, 0);
479 }
480
481 GL11.glPopMatrix();
482 }
483 else if (!var3.getHasActivePotion())
484 {
485 GL11.glPushMatrix();
486 var7 = 0.8F;
487 var20 = var3.getSwingProgress(par1);
488 var21 = MathHelper.sin(var20 * (float)Math.PI);
489 var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
490 GL11.glTranslatef(-var10 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI * 2.0F) * 0.4F, -var21 * 0.4F);
491 GL11.glTranslatef(0.8F * var7, -0.75F * var7 - (1.0F - var2) * 0.6F, -0.9F * var7);
492 GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
493 GL11.glEnable(GL12.GL_RESCALE_NORMAL);
494 var20 = var3.getSwingProgress(par1);
495 var21 = MathHelper.sin(var20 * var20 * (float)Math.PI);
496 var10 = MathHelper.sin(MathHelper.sqrt_float(var20) * (float)Math.PI);
497 GL11.glRotatef(var10 * 70.0F, 0.0F, 1.0F, 0.0F);
498 GL11.glRotatef(-var21 * 20.0F, 0.0F, 0.0F, 1.0F);
499 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getTexture()));
500 GL11.glTranslatef(-1.0F, 3.6F, 3.5F);
501 GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F);
502 GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F);
503 GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
504 GL11.glScalef(1.0F, 1.0F, 1.0F);
505 GL11.glTranslatef(5.6F, 0.0F, 0.0F);
506 var24 = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer);
507 var26 = (RenderPlayer)var24;
508 var13 = 1.0F;
509 GL11.glScalef(var13, var13, var13);
510 var26.func_82441_a(this.mc.thePlayer);
511 GL11.glPopMatrix();
512 }
513
514 GL11.glDisable(GL12.GL_RESCALE_NORMAL);
515 RenderHelper.disableStandardItemLighting();
516 }
517
518 /**
519 * Renders all the overlays that are in first person mode. Args: partialTickTime
520 */
521 public void renderOverlays(float par1)
522 {
523 GL11.glDisable(GL11.GL_ALPHA_TEST);
524 int var2;
525
526 if (this.mc.thePlayer.isBurning())
527 {
528 var2 = this.mc.renderEngine.getTexture("/terrain.png");
529 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
530 this.renderFireInFirstPerson(par1);
531 }
532
533 if (this.mc.thePlayer.isEntityInsideOpaqueBlock())
534 {
535 var2 = MathHelper.floor_double(this.mc.thePlayer.posX);
536 int var3 = MathHelper.floor_double(this.mc.thePlayer.posY);
537 int var4 = MathHelper.floor_double(this.mc.thePlayer.posZ);
538 int var5 = this.mc.renderEngine.getTexture("/terrain.png");
539 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5);
540 int var6 = this.mc.theWorld.getBlockId(var2, var3, var4);
541
542 if (this.mc.theWorld.isBlockNormalCube(var2, var3, var4))
543 {
544 this.renderInsideOfBlock(par1, Block.blocksList[var6].getBlockTextureFromSide(2));
545 }
546 else
547 {
548 for (int var7 = 0; var7 < 8; ++var7)
549 {
550 float var8 = ((float)((var7 >> 0) % 2) - 0.5F) * this.mc.thePlayer.width * 0.9F;
551 float var9 = ((float)((var7 >> 1) % 2) - 0.5F) * this.mc.thePlayer.height * 0.2F;
552 float var10 = ((float)((var7 >> 2) % 2) - 0.5F) * this.mc.thePlayer.width * 0.9F;
553 int var11 = MathHelper.floor_float((float)var2 + var8);
554 int var12 = MathHelper.floor_float((float)var3 + var9);
555 int var13 = MathHelper.floor_float((float)var4 + var10);
556
557 if (this.mc.theWorld.isBlockNormalCube(var11, var12, var13))
558 {
559 var6 = this.mc.theWorld.getBlockId(var11, var12, var13);
560 }
561 }
562 }
563
564 if (Block.blocksList[var6] != null)
565 {
566 this.renderInsideOfBlock(par1, Block.blocksList[var6].getBlockTextureFromSide(2));
567 }
568 }
569
570 if (this.mc.thePlayer.isInsideOfMaterial(Material.water))
571 {
572 var2 = this.mc.renderEngine.getTexture("/misc/water.png");
573 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
574 this.renderWarpedTextureOverlay(par1);
575 }
576
577 GL11.glEnable(GL11.GL_ALPHA_TEST);
578 }
579
580 /**
581 * Renders the texture of the block the player is inside as an overlay. Args: partialTickTime, blockTextureIndex
582 */
583 private void renderInsideOfBlock(float par1, int par2)
584 {
585 Tessellator var3 = Tessellator.instance;
586 this.mc.thePlayer.getBrightness(par1);
587 float var4 = 0.1F;
588 GL11.glColor4f(var4, var4, var4, 0.5F);
589 GL11.glPushMatrix();
590 float var5 = -1.0F;
591 float var6 = 1.0F;
592 float var7 = -1.0F;
593 float var8 = 1.0F;
594 float var9 = -0.5F;
595 float var10 = 0.0078125F;
596 float var11 = (float)(par2 % 16) / 256.0F - var10;
597 float var12 = ((float)(par2 % 16) + 15.99F) / 256.0F + var10;
598 float var13 = (float)(par2 / 16) / 256.0F - var10;
599 float var14 = ((float)(par2 / 16) + 15.99F) / 256.0F + var10;
600 var3.startDrawingQuads();
601 var3.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)var12, (double)var14);
602 var3.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)var11, (double)var14);
603 var3.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)var11, (double)var13);
604 var3.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)var12, (double)var13);
605 var3.draw();
606 GL11.glPopMatrix();
607 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
608 }
609
610 /**
611 * Renders a texture that warps around based on the direction the player is looking. Texture needs to be bound
612 * before being called. Used for the water overlay. Args: parialTickTime
613 */
614 private void renderWarpedTextureOverlay(float par1)
615 {
616 Tessellator var2 = Tessellator.instance;
617 float var3 = this.mc.thePlayer.getBrightness(par1);
618 GL11.glColor4f(var3, var3, var3, 0.5F);
619 GL11.glEnable(GL11.GL_BLEND);
620 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
621 GL11.glPushMatrix();
622 float var4 = 4.0F;
623 float var5 = -1.0F;
624 float var6 = 1.0F;
625 float var7 = -1.0F;
626 float var8 = 1.0F;
627 float var9 = -0.5F;
628 float var10 = -this.mc.thePlayer.rotationYaw / 64.0F;
629 float var11 = this.mc.thePlayer.rotationPitch / 64.0F;
630 var2.startDrawingQuads();
631 var2.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)(var4 + var10), (double)(var4 + var11));
632 var2.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)(0.0F + var10), (double)(var4 + var11));
633 var2.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)(0.0F + var10), (double)(0.0F + var11));
634 var2.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)(var4 + var10), (double)(0.0F + var11));
635 var2.draw();
636 GL11.glPopMatrix();
637 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
638 GL11.glDisable(GL11.GL_BLEND);
639 }
640
641 /**
642 * Renders the fire on the screen for first person mode. Arg: partialTickTime
643 */
644 private void renderFireInFirstPerson(float par1)
645 {
646 Tessellator var2 = Tessellator.instance;
647 GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.9F);
648 GL11.glEnable(GL11.GL_BLEND);
649 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
650 float var3 = 1.0F;
651
652 for (int var4 = 0; var4 < 2; ++var4)
653 {
654 GL11.glPushMatrix();
655 int var5 = Block.fire.blockIndexInTexture + var4 * 16;
656 int var6 = (var5 & 15) << 4;
657 int var7 = var5 & 240;
658 float var8 = (float)var6 / 256.0F;
659 float var9 = ((float)var6 + 15.99F) / 256.0F;
660 float var10 = (float)var7 / 256.0F;
661 float var11 = ((float)var7 + 15.99F) / 256.0F;
662 float var12 = (0.0F - var3) / 2.0F;
663 float var13 = var12 + var3;
664 float var14 = 0.0F - var3 / 2.0F;
665 float var15 = var14 + var3;
666 float var16 = -0.5F;
667 GL11.glTranslatef((float)(-(var4 * 2 - 1)) * 0.24F, -0.3F, 0.0F);
668 GL11.glRotatef((float)(var4 * 2 - 1) * 10.0F, 0.0F, 1.0F, 0.0F);
669 var2.startDrawingQuads();
670 var2.addVertexWithUV((double)var12, (double)var14, (double)var16, (double)var9, (double)var11);
671 var2.addVertexWithUV((double)var13, (double)var14, (double)var16, (double)var8, (double)var11);
672 var2.addVertexWithUV((double)var13, (double)var15, (double)var16, (double)var8, (double)var10);
673 var2.addVertexWithUV((double)var12, (double)var15, (double)var16, (double)var9, (double)var10);
674 var2.draw();
675 GL11.glPopMatrix();
676 }
677
678 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
679 GL11.glDisable(GL11.GL_BLEND);
680 }
681
682 public void updateEquippedItem()
683 {
684 this.prevEquippedProgress = this.equippedProgress;
685 EntityClientPlayerMP var1 = this.mc.thePlayer;
686 ItemStack var2 = var1.inventory.getCurrentItem();
687 boolean var3 = this.equippedItemSlot == var1.inventory.currentItem && var2 == this.itemToRender;
688
689 if (this.itemToRender == null && var2 == null)
690 {
691 var3 = true;
692 }
693
694 if (var2 != null && this.itemToRender != null && var2 != this.itemToRender && var2.itemID == this.itemToRender.itemID && var2.getItemDamage() == this.itemToRender.getItemDamage())
695 {
696 this.itemToRender = var2;
697 var3 = true;
698 }
699
700 float var4 = 0.4F;
701 float var5 = var3 ? 1.0F : 0.0F;
702 float var6 = var5 - this.equippedProgress;
703
704 if (var6 < -var4)
705 {
706 var6 = -var4;
707 }
708
709 if (var6 > var4)
710 {
711 var6 = var4;
712 }
713
714 this.equippedProgress += var6;
715
716 if (this.equippedProgress < 0.1F)
717 {
718 this.itemToRender = var2;
719 this.equippedItemSlot = var1.inventory.currentItem;
720 }
721 }
722
723 public void func_78444_b()
724 {
725 this.equippedProgress = 0.0F;
726 }
727
728 public void func_78445_c()
729 {
730 this.equippedProgress = 0.0F;
731 }
732 }