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