  
              if (par3ItemStack != null && par3ItemStack.hasEffect())
              {
+@@ -578,4 +541,77 @@
+     {
+         this.doRenderItem((EntityItem)par1Entity, par2, par4, par6, par8, par9);
+     }
++
++    /* ==== Forge start ===== */
++    /**
++     * Items should spread out when rendered in 3d?
++     * @return
++     */
++    public boolean shouldSpreadItems()
++    {
++        return true;
++    }
++
++    /**
++     * Items should have a bob effect
++     * @return
++     */
++    public boolean shouldBob()
++    {
++        return true;
++    }
++
++    public byte getMiniBlockCountForItemStack(ItemStack stack)
++    {
++        byte var13 = 1;
++        if (stack.stackSize > 1)
++        {
++            var13 = 2;
++        }
++
++        if (stack.stackSize > 5)
++        {
++            var13 = 3;
++        }
++
++        if (stack.stackSize > 20)
++        {
++            var13 = 4;
++        }
++
++        if (stack.stackSize > 40)
++        {
++            var13 = 5;
++        }
++        return var13;
++    }
++
++    /**
++     * Allows for a subclass to override how many rendered items appear in a
++     * "mini item 3d stack"
++     * @param stack
++     * @return
++     */
++    public byte getMiniItemCountForItemStack(ItemStack stack)
++    {
++        byte var24;
++        int var19 = stack.stackSize;
++        if (var19 < 2)
++        {
++            var24 = 1;
++        }
++        else if (var19 < 16)
++        {
++            var24 = 2;
++        }
++        else if (var19 < 32)
++        {
++            var24 = 3;
++        }
++        else
++        {
++            var24 = 4;
++        }
++        return var24;
++    }
+ }

-                if (Block.blocksList[var18.itemID] != null)
-                {
-                    this.loadTexture("/terrain.png");
-                }
-                else
-                {
-                    this.loadTexture("/gui/items.png");
-                }
+                // Makes items offset when in 3D, like when in 2D, looks much better. Considered a vanilla bug...
+                if (var20 > 0)
+                {
+                    float x = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
+                    float y = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
+                    float z = (random.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
+                    GL11.glTranslatef(x, y, var16 + var17);
+                }
+
+                this.loadTexture(Item.itemsList[var18.itemID].getTextureFile());
 
                 GL11.glColor4f(par5, par6, par7, 1.0F);
                 ItemRenderer.renderItemIn2D(var8, var10, var11, var9, var12, var16);
@@ -348,10 +347,10 @@
         float var13;
         float var16;
 

 
                 var9 = Item.itemsList[var6].getColorFromItemStack(par3ItemStack, 0);
                 float var17 = (float)(var9 >> 16 & 255) / 255.0F;
@@ -440,7 +400,10 @@
     {
         if (par3ItemStack != null)
         {
