001 package net.minecraft.client.renderer.entity;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.util.Random;
006 import net.minecraft.block.Block;
007 import net.minecraft.client.Minecraft;
008 import net.minecraft.client.gui.FontRenderer;
009 import net.minecraft.client.renderer.ItemRenderer;
010 import net.minecraft.client.renderer.RenderBlocks;
011 import net.minecraft.client.renderer.RenderEngine;
012 import net.minecraft.client.renderer.Tessellator;
013 import net.minecraft.entity.Entity;
014 import net.minecraft.entity.item.EntityItem;
015 import net.minecraft.item.Item;
016 import net.minecraft.item.ItemBlock;
017 import net.minecraft.item.ItemStack;
018 import net.minecraft.util.MathHelper;
019 import org.lwjgl.opengl.GL11;
020 import org.lwjgl.opengl.GL12;
021
022 import net.minecraftforge.client.ForgeHooksClient;
023
024 @SideOnly(Side.CLIENT)
025 public class RenderItem extends Render
026 {
027 private RenderBlocks itemRenderBlocks = new RenderBlocks();
028
029 /** The RNG used in RenderItem (for bobbing itemstacks on the ground) */
030 private Random random = new Random();
031 public boolean field_77024_a = true;
032
033 /** Defines the zLevel of rendering of item on GUI. */
034 public float zLevel = 0.0F;
035 public static boolean field_82407_g = false;
036
037 public RenderItem()
038 {
039 this.shadowSize = 0.15F;
040 this.shadowOpaque = 0.75F;
041 }
042
043 /**
044 * Renders the item
045 */
046 public void doRenderItem(EntityItem par1EntityItem, double par2, double par4, double par6, float par8, float par9)
047 {
048 this.random.setSeed(187L);
049 ItemStack var10 = par1EntityItem.func_92014_d();
050
051 if (var10.getItem() != null)
052 {
053 GL11.glPushMatrix();
054 float var11 = shouldBob() ? MathHelper.sin(((float)par1EntityItem.age + par9) / 10.0F + par1EntityItem.hoverStart) * 0.1F + 0.1F : 0F;
055 float var12 = (((float)par1EntityItem.age + par9) / 20.0F + par1EntityItem.hoverStart) * (180F / (float)Math.PI);
056 byte var13 = getMiniBlockCountForItemStack(var10);
057
058 GL11.glTranslatef((float)par2, (float)par4 + var11, (float)par6);
059 GL11.glEnable(GL12.GL_RESCALE_NORMAL);
060 int var16;
061 float var19;
062 float var20;
063 float var24;
064
065 if (ForgeHooksClient.renderEntityItem(par1EntityItem, var10, var11, var12, random, renderManager.renderEngine, renderBlocks))
066 {
067 ;
068 }
069 else if (var10.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType()))
070 {
071 GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F);
072
073 if (field_82407_g)
074 {
075 GL11.glScalef(1.25F, 1.25F, 1.25F);
076 GL11.glTranslatef(0.0F, 0.05F, 0.0F);
077 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
078 }
079
080 this.loadTexture(Block.blocksList[var10.itemID].getTextureFile());
081 float var22 = 0.25F;
082 var16 = Block.blocksList[var10.itemID].getRenderType();
083
084 if (var16 == 1 || var16 == 19 || var16 == 12 || var16 == 2)
085 {
086 var22 = 0.5F;
087 }
088
089 GL11.glScalef(var22, var22, var22);
090
091 for (int var23 = 0; var23 < var13; ++var23)
092 {
093 GL11.glPushMatrix();
094
095 if (var23 > 0)
096 {
097 var24 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22;
098 var19 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22;
099 var20 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22;
100 GL11.glTranslatef(var24, var19, var20);
101 }
102
103 var24 = 1.0F;
104 this.itemRenderBlocks.renderBlockAsItem(Block.blocksList[var10.itemID], var10.getItemDamage(), var24);
105 GL11.glPopMatrix();
106 }
107 }
108 else
109 {
110 int var15;
111 float var17;
112
113 if (var10.getItem().requiresMultipleRenderPasses())
114 {
115 if (field_82407_g)
116 {
117 GL11.glScalef(0.5128205F, 0.5128205F, 0.5128205F);
118 GL11.glTranslatef(0.0F, -0.05F, 0.0F);
119 }
120 else
121 {
122 GL11.glScalef(0.5F, 0.5F, 0.5F);
123 }
124
125
126 for (var15 = 0; var15 <= var10.getItem().getRenderPasses(var10.getItemDamage()); ++var15)
127 {
128 this.loadTexture(Item.itemsList[var10.itemID].getTextureFile());
129 this.random.setSeed(187L);
130 var16 = var10.getItem().getIconIndex(var10, var15);
131 var17 = 1.0F;
132
133 if (this.field_77024_a)
134 {
135 int var18 = Item.itemsList[var10.itemID].getColorFromItemStack(var10, var15);
136 var19 = (float)(var18 >> 16 & 255) / 255.0F;
137 var20 = (float)(var18 >> 8 & 255) / 255.0F;
138 float var21 = (float)(var18 & 255) / 255.0F;
139 GL11.glColor4f(var19 * var17, var20 * var17, var21 * var17, 1.0F);
140 this.func_77020_a(par1EntityItem, var16, var13, par9, var19 * var17, var20 * var17, var21 * var17);
141 }
142 else
143 {
144 this.func_77020_a(par1EntityItem, var16, var13, par9, 1.0F, 1.0F, 1.0F);
145 }
146 }
147 }
148 else
149 {
150 if (field_82407_g)
151 {
152 GL11.glScalef(0.5128205F, 0.5128205F, 0.5128205F);
153 GL11.glTranslatef(0.0F, -0.05F, 0.0F);
154 }
155 else
156 {
157 GL11.glScalef(0.5F, 0.5F, 0.5F);
158 }
159
160 var15 = var10.getIconIndex();
161
162 this.loadTexture(var10.getItem().getTextureFile());
163
164 if (this.field_77024_a)
165 {
166 var16 = Item.itemsList[var10.itemID].getColorFromItemStack(var10, 0);
167 var17 = (float)(var16 >> 16 & 255) / 255.0F;
168 var24 = (float)(var16 >> 8 & 255) / 255.0F;
169 var19 = (float)(var16 & 255) / 255.0F;
170 var20 = 1.0F;
171 this.func_77020_a(par1EntityItem, var15, var13, par9, var17 * var20, var24 * var20, var19 * var20);
172 }
173 else
174 {
175 this.func_77020_a(par1EntityItem, var15, var13, par9, 1.0F, 1.0F, 1.0F);
176 }
177 }
178 }
179
180 GL11.glDisable(GL12.GL_RESCALE_NORMAL);
181 GL11.glPopMatrix();
182 }
183 }
184
185 private void func_77020_a(EntityItem par1EntityItem, int par2, int par3, float par4, float par5, float par6, float par7)
186 {
187 Tessellator var8 = Tessellator.instance;
188 float var9 = (float)(par2 % 16 * 16 + 0) / 256.0F;
189 float var10 = (float)(par2 % 16 * 16 + 16) / 256.0F;
190 float var11 = (float)(par2 / 16 * 16 + 0) / 256.0F;
191 float var12 = (float)(par2 / 16 * 16 + 16) / 256.0F;
192 float var13 = 1.0F;
193 float var14 = 0.5F;
194 float var15 = 0.25F;
195 float var17;
196
197 if (this.renderManager.options.fancyGraphics)
198 {
199 GL11.glPushMatrix();
200
201 if (field_82407_g)
202 {
203 GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
204 }
205 else
206 {
207 GL11.glRotatef((((float)par1EntityItem.age + par4) / 20.0F + par1EntityItem.hoverStart) * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
208 }
209
210 float var16 = 0.0625F;
211 var17 = 0.021875F;
212 ItemStack var18 = par1EntityItem.func_92014_d();
213 int var19 = var18.stackSize;
214 byte var24 = getMiniItemCountForItemStack(var18);
215
216
217 GL11.glTranslatef(-var14, -var15, -((var16 + var17) * (float)var24 / 2.0F));
218
219 for (int var20 = 0; var20 < var24; ++var20)
220 {
221 // Makes items offset when in 3D, like when in 2D, looks much better. Considered a vanilla bug...
222 if (var20 > 0 && shouldSpreadItems())
223 {
224 float x = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
225 float y = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
226 float z = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
227 GL11.glTranslatef(x, y, var16 + var17);
228 }
229 else
230 {
231 GL11.glTranslatef(0f, 0f, var16 + var17);
232 }
233
234 this.loadTexture(Item.itemsList[var18.itemID].getTextureFile());
235
236 GL11.glColor4f(par5, par6, par7, 1.0F);
237 ItemRenderer.renderItemIn2D(var8, var10, var11, var9, var12, var16);
238
239 if (var18 != null && var18.hasEffect())
240 {
241 GL11.glDepthFunc(GL11.GL_EQUAL);
242 GL11.glDisable(GL11.GL_LIGHTING);
243 this.renderManager.renderEngine.bindTexture(this.renderManager.renderEngine.getTexture("%blur%/misc/glint.png"));
244 GL11.glEnable(GL11.GL_BLEND);
245 GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
246 float var21 = 0.76F;
247 GL11.glColor4f(0.5F * var21, 0.25F * var21, 0.8F * var21, 1.0F);
248 GL11.glMatrixMode(GL11.GL_TEXTURE);
249 GL11.glPushMatrix();
250 float var22 = 0.125F;
251 GL11.glScalef(var22, var22, var22);
252 float var23 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F;
253 GL11.glTranslatef(var23, 0.0F, 0.0F);
254 GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F);
255 ItemRenderer.renderItemIn2D(var8, 0.0F, 0.0F, 1.0F, 1.0F, var16);
256 GL11.glPopMatrix();
257 GL11.glPushMatrix();
258 GL11.glScalef(var22, var22, var22);
259 var23 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F;
260 GL11.glTranslatef(-var23, 0.0F, 0.0F);
261 GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F);
262 ItemRenderer.renderItemIn2D(var8, 0.0F, 0.0F, 1.0F, 1.0F, 0.0625F);
263 GL11.glPopMatrix();
264 GL11.glMatrixMode(GL11.GL_MODELVIEW);
265 GL11.glDisable(GL11.GL_BLEND);
266 GL11.glEnable(GL11.GL_LIGHTING);
267 GL11.glDepthFunc(GL11.GL_LEQUAL);
268 }
269 }
270
271 GL11.glPopMatrix();
272 }
273 else
274 {
275 for (int var25 = 0; var25 < par3; ++var25)
276 {
277 GL11.glPushMatrix();
278
279 if (var25 > 0)
280 {
281 var17 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
282 float var27 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
283 float var26 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
284 GL11.glTranslatef(var17, var27, var26);
285 }
286
287 if (!field_82407_g)
288 {
289 GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
290 }
291
292 GL11.glColor4f(par5, par6, par7, 1.0F);
293 var8.startDrawingQuads();
294 var8.setNormal(0.0F, 1.0F, 0.0F);
295 var8.addVertexWithUV((double)(0.0F - var14), (double)(0.0F - var15), 0.0D, (double)var9, (double)var12);
296 var8.addVertexWithUV((double)(var13 - var14), (double)(0.0F - var15), 0.0D, (double)var10, (double)var12);
297 var8.addVertexWithUV((double)(var13 - var14), (double)(1.0F - var15), 0.0D, (double)var10, (double)var11);
298 var8.addVertexWithUV((double)(0.0F - var14), (double)(1.0F - var15), 0.0D, (double)var9, (double)var11);
299 var8.draw();
300 GL11.glPopMatrix();
301 }
302 }
303 }
304
305 /**
306 * Renders the item's icon or block into the UI at the specified position.
307 */
308 public void renderItemIntoGUI(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, ItemStack par3ItemStack, int par4, int par5)
309 {
310 int var6 = par3ItemStack.itemID;
311 int var7 = par3ItemStack.getItemDamage();
312 int var8 = par3ItemStack.getIconIndex();
313 int var10;
314 float var12;
315 float var13;
316 float var16;
317
318 if (par3ItemStack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[par3ItemStack.itemID].getRenderType()))
319 {
320 Block var15 = Block.blocksList[var6];
321 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(var15.getTextureFile()));
322 GL11.glPushMatrix();
323 GL11.glTranslatef((float)(par4 - 2), (float)(par5 + 3), -3.0F + this.zLevel);
324 GL11.glScalef(10.0F, 10.0F, 10.0F);
325 GL11.glTranslatef(1.0F, 0.5F, 1.0F);
326 GL11.glScalef(1.0F, 1.0F, -1.0F);
327 GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F);
328 GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
329 var10 = Item.itemsList[var6].getColorFromItemStack(par3ItemStack, 0);
330 var16 = (float)(var10 >> 16 & 255) / 255.0F;
331 var12 = (float)(var10 >> 8 & 255) / 255.0F;
332 var13 = (float)(var10 & 255) / 255.0F;
333
334 if (this.field_77024_a)
335 {
336 GL11.glColor4f(var16, var12, var13, 1.0F);
337 }
338
339 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
340 this.itemRenderBlocks.useInventoryTint = this.field_77024_a;
341 this.itemRenderBlocks.renderBlockAsItem(var15, var7, 1.0F);
342 this.itemRenderBlocks.useInventoryTint = true;
343 GL11.glPopMatrix();
344 }
345 else
346 {
347 int var9;
348
349 if (Item.itemsList[var6].requiresMultipleRenderPasses())
350 {
351 GL11.glDisable(GL11.GL_LIGHTING);
352 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Item.itemsList[var6].getTextureFile()));
353
354 for (var9 = 0; var9 < Item.itemsList[var6].getRenderPasses(var7); ++var9)
355 {
356 var10 = Item.itemsList[var6].getIconIndex(par3ItemStack, var9);
357 int var11 = Item.itemsList[var6].getColorFromItemStack(par3ItemStack, var9);
358 var12 = (float)(var11 >> 16 & 255) / 255.0F;
359 var13 = (float)(var11 >> 8 & 255) / 255.0F;
360 float var14 = (float)(var11 & 255) / 255.0F;
361
362 if (this.field_77024_a)
363 {
364 GL11.glColor4f(var12, var13, var14, 1.0F);
365 }
366
367 this.renderTexturedQuad(par4, par5, var10 % 16 * 16, var10 / 16 * 16, 16, 16);
368 }
369
370 GL11.glEnable(GL11.GL_LIGHTING);
371 }
372 else if (var8 >= 0)
373 {
374 GL11.glDisable(GL11.GL_LIGHTING);
375
376 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(par3ItemStack.getItem().getTextureFile()));
377
378 var9 = Item.itemsList[var6].getColorFromItemStack(par3ItemStack, 0);
379 float var17 = (float)(var9 >> 16 & 255) / 255.0F;
380 var16 = (float)(var9 >> 8 & 255) / 255.0F;
381 var12 = (float)(var9 & 255) / 255.0F;
382
383 if (this.field_77024_a)
384 {
385 GL11.glColor4f(var17, var16, var12, 1.0F);
386 }
387
388 this.renderTexturedQuad(par4, par5, var8 % 16 * 16, var8 / 16 * 16, 16, 16);
389 GL11.glEnable(GL11.GL_LIGHTING);
390 }
391 }
392
393 GL11.glEnable(GL11.GL_CULL_FACE);
394 }
395
396 /**
397 * Render the item's icon or block into the GUI, including the glint effect.
398 */
399 public void renderItemAndEffectIntoGUI(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, ItemStack par3ItemStack, int par4, int par5)
400 {
401 if (par3ItemStack != null)
402 {
403 if (!ForgeHooksClient.renderInventoryItem(renderBlocks, par2RenderEngine, par3ItemStack, field_77024_a, zLevel, (float)par4, (float)par5))
404 {
405 this.renderItemIntoGUI(par1FontRenderer, par2RenderEngine, par3ItemStack, par4, par5);
406 }
407
408 if (par3ItemStack != null && par3ItemStack.hasEffect())
409 {
410 GL11.glDepthFunc(GL11.GL_GREATER);
411 GL11.glDisable(GL11.GL_LIGHTING);
412 GL11.glDepthMask(false);
413 par2RenderEngine.bindTexture(par2RenderEngine.getTexture("%blur%/misc/glint.png"));
414 this.zLevel -= 50.0F;
415 GL11.glEnable(GL11.GL_BLEND);
416 GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_DST_COLOR);
417 GL11.glColor4f(0.5F, 0.25F, 0.8F, 1.0F);
418 this.func_77018_a(par4 * 431278612 + par5 * 32178161, par4 - 2, par5 - 2, 20, 20);
419 GL11.glDisable(GL11.GL_BLEND);
420 GL11.glDepthMask(true);
421 this.zLevel += 50.0F;
422 GL11.glEnable(GL11.GL_LIGHTING);
423 GL11.glDepthFunc(GL11.GL_LEQUAL);
424 }
425 }
426 }
427
428 private void func_77018_a(int par1, int par2, int par3, int par4, int par5)
429 {
430 for (int var6 = 0; var6 < 2; ++var6)
431 {
432 if (var6 == 0)
433 {
434 GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
435 }
436
437 if (var6 == 1)
438 {
439 GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
440 }
441
442 float var7 = 0.00390625F;
443 float var8 = 0.00390625F;
444 float var9 = (float)(Minecraft.getSystemTime() % (long)(3000 + var6 * 1873)) / (3000.0F + (float)(var6 * 1873)) * 256.0F;
445 float var10 = 0.0F;
446 Tessellator var11 = Tessellator.instance;
447 float var12 = 4.0F;
448
449 if (var6 == 1)
450 {
451 var12 = -1.0F;
452 }
453
454 var11.startDrawingQuads();
455 var11.addVertexWithUV((double)(par2 + 0), (double)(par3 + par5), (double)this.zLevel, (double)((var9 + (float)par5 * var12) * var7), (double)((var10 + (float)par5) * var8));
456 var11.addVertexWithUV((double)(par2 + par4), (double)(par3 + par5), (double)this.zLevel, (double)((var9 + (float)par4 + (float)par5 * var12) * var7), (double)((var10 + (float)par5) * var8));
457 var11.addVertexWithUV((double)(par2 + par4), (double)(par3 + 0), (double)this.zLevel, (double)((var9 + (float)par4) * var7), (double)((var10 + 0.0F) * var8));
458 var11.addVertexWithUV((double)(par2 + 0), (double)(par3 + 0), (double)this.zLevel, (double)((var9 + 0.0F) * var7), (double)((var10 + 0.0F) * var8));
459 var11.draw();
460 }
461 }
462
463 /**
464 * Renders the item's overlay information. Examples being stack count or damage on top of the item's image at the
465 * specified position.
466 */
467 public void renderItemOverlayIntoGUI(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, ItemStack par3ItemStack, int par4, int par5)
468 {
469 if (par3ItemStack != null)
470 {
471 if (par3ItemStack.stackSize > 1)
472 {
473 String var6 = "" + par3ItemStack.stackSize;
474 GL11.glDisable(GL11.GL_LIGHTING);
475 GL11.glDisable(GL11.GL_DEPTH_TEST);
476 par1FontRenderer.drawStringWithShadow(var6, par4 + 19 - 2 - par1FontRenderer.getStringWidth(var6), par5 + 6 + 3, 16777215);
477 GL11.glEnable(GL11.GL_LIGHTING);
478 GL11.glEnable(GL11.GL_DEPTH_TEST);
479 }
480
481 if (par3ItemStack.isItemDamaged())
482 {
483 int var11 = (int)Math.round(13.0D - (double)par3ItemStack.getItemDamageForDisplay() * 13.0D / (double)par3ItemStack.getMaxDamage());
484 int var7 = (int)Math.round(255.0D - (double)par3ItemStack.getItemDamageForDisplay() * 255.0D / (double)par3ItemStack.getMaxDamage());
485 GL11.glDisable(GL11.GL_LIGHTING);
486 GL11.glDisable(GL11.GL_DEPTH_TEST);
487 GL11.glDisable(GL11.GL_TEXTURE_2D);
488 Tessellator var8 = Tessellator.instance;
489 int var9 = 255 - var7 << 16 | var7 << 8;
490 int var10 = (255 - var7) / 4 << 16 | 16128;
491 this.renderQuad(var8, par4 + 2, par5 + 13, 13, 2, 0);
492 this.renderQuad(var8, par4 + 2, par5 + 13, 12, 1, var10);
493 this.renderQuad(var8, par4 + 2, par5 + 13, var11, 1, var9);
494 GL11.glEnable(GL11.GL_TEXTURE_2D);
495 GL11.glEnable(GL11.GL_LIGHTING);
496 GL11.glEnable(GL11.GL_DEPTH_TEST);
497 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
498 }
499 }
500 }
501
502 /**
503 * Adds a quad to the tesselator at the specified position with the set width and height and color. Args:
504 * tessellator, x, y, width, height, color
505 */
506 private void renderQuad(Tessellator par1Tessellator, int par2, int par3, int par4, int par5, int par6)
507 {
508 par1Tessellator.startDrawingQuads();
509 par1Tessellator.setColorOpaque_I(par6);
510 par1Tessellator.addVertex((double)(par2 + 0), (double)(par3 + 0), 0.0D);
511 par1Tessellator.addVertex((double)(par2 + 0), (double)(par3 + par5), 0.0D);
512 par1Tessellator.addVertex((double)(par2 + par4), (double)(par3 + par5), 0.0D);
513 par1Tessellator.addVertex((double)(par2 + par4), (double)(par3 + 0), 0.0D);
514 par1Tessellator.draw();
515 }
516
517 /**
518 * Adds a textured quad to the tesselator at the specified position with the specified texture coords, width and
519 * height. Args: x, y, u, v, width, height
520 */
521 public void renderTexturedQuad(int par1, int par2, int par3, int par4, int par5, int par6)
522 {
523 float var7 = 0.00390625F;
524 float var8 = 0.00390625F;
525 Tessellator var9 = Tessellator.instance;
526 var9.startDrawingQuads();
527 var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + par6), (double)this.zLevel, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + par6) * var8));
528 var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + par6), (double)this.zLevel, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + par6) * var8));
529 var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + 0), (double)this.zLevel, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + 0) * var8));
530 var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + 0), (double)this.zLevel, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + 0) * var8));
531 var9.draw();
532 }
533
534 /**
535 * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
536 * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
537 * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
538 * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
539 */
540 public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
541 {
542 this.doRenderItem((EntityItem)par1Entity, par2, par4, par6, par8, par9);
543 }
544
545 /* ==== Forge start ===== */
546 /**
547 * Items should spread out when rendered in 3d?
548 * @return
549 */
550 public boolean shouldSpreadItems()
551 {
552 return true;
553 }
554
555 /**
556 * Items should have a bob effect
557 * @return
558 */
559 public boolean shouldBob()
560 {
561 return true;
562 }
563
564 public byte getMiniBlockCountForItemStack(ItemStack stack)
565 {
566 byte var13 = 1;
567 if (stack.stackSize > 1)
568 {
569 var13 = 2;
570 }
571
572 if (stack.stackSize > 5)
573 {
574 var13 = 3;
575 }
576
577 if (stack.stackSize > 20)
578 {
579 var13 = 4;
580 }
581
582 if (stack.stackSize > 40)
583 {
584 var13 = 5;
585 }
586 return var13;
587 }
588
589 /**
590 * Allows for a subclass to override how many rendered items appear in a
591 * "mini item 3d stack"
592 * @param stack
593 * @return
594 */
595 public byte getMiniItemCountForItemStack(ItemStack stack)
596 {
597 byte var24;
598 int var19 = stack.stackSize;
599 if (var19 < 2)
600 {
601 var24 = 1;
602 }
603 else if (var19 < 16)
604 {
605 var24 = 2;
606 }
607 else if (var19 < 32)
608 {
609 var24 = 3;
610 }
611 else
612 {
613 var24 = 4;
614 }
615 return var24;
616 }
617 }