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.model.ModelEnderman;
008    import net.minecraft.client.renderer.OpenGlHelper;
009    import net.minecraft.entity.Entity;
010    import net.minecraft.entity.EntityLiving;
011    import net.minecraft.entity.monster.EntityEnderman;
012    import org.lwjgl.opengl.GL11;
013    import org.lwjgl.opengl.GL12;
014    
015    @SideOnly(Side.CLIENT)
016    public class RenderEnderman extends RenderLiving
017    {
018        /** The model of the enderman */
019        private ModelEnderman endermanModel;
020        private Random rnd = new Random();
021    
022        public RenderEnderman()
023        {
024            super(new ModelEnderman(), 0.5F);
025            this.endermanModel = (ModelEnderman)super.mainModel;
026            this.setRenderPassModel(this.endermanModel);
027        }
028    
029        /**
030         * Renders the enderman
031         */
032        public void renderEnderman(EntityEnderman par1EntityEnderman, double par2, double par4, double par6, float par8, float par9)
033        {
034            this.endermanModel.isCarrying = par1EntityEnderman.getCarried() > 0;
035            this.endermanModel.isAttacking = par1EntityEnderman.func_70823_r();
036    
037            if (par1EntityEnderman.func_70823_r())
038            {
039                double var10 = 0.02D;
040                par2 += this.rnd.nextGaussian() * var10;
041                par6 += this.rnd.nextGaussian() * var10;
042            }
043    
044            super.doRenderLiving(par1EntityEnderman, par2, par4, par6, par8, par9);
045        }
046    
047        /**
048         * Render the block an enderman is carrying
049         */
050        protected void renderCarrying(EntityEnderman par1EntityEnderman, float par2)
051        {
052            super.renderEquippedItems(par1EntityEnderman, par2);
053    
054            if (par1EntityEnderman.getCarried() > 0)
055            {
056                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
057                GL11.glPushMatrix();
058                float var3 = 0.5F;
059                GL11.glTranslatef(0.0F, 0.6875F, -0.75F);
060                var3 *= 1.0F;
061                GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
062                GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
063                GL11.glScalef(-var3, -var3, var3);
064                int var4 = par1EntityEnderman.getBrightnessForRender(par2);
065                int var5 = var4 % 65536;
066                int var6 = var4 / 65536;
067                OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var5 / 1.0F, (float)var6 / 1.0F);
068                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
069                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
070                this.loadTexture("/terrain.png");
071                this.renderBlocks.renderBlockAsItem(Block.blocksList[par1EntityEnderman.getCarried()], par1EntityEnderman.getCarryingData(), 1.0F);
072                GL11.glPopMatrix();
073                GL11.glDisable(GL12.GL_RESCALE_NORMAL);
074            }
075        }
076    
077        /**
078         * Render the endermans eyes
079         */
080        protected int renderEyes(EntityEnderman par1EntityEnderman, int par2, float par3)
081        {
082            if (par2 != 0)
083            {
084                return -1;
085            }
086            else
087            {
088                this.loadTexture("/mob/enderman_eyes.png");
089                float var4 = 1.0F;
090                GL11.glEnable(GL11.GL_BLEND);
091                GL11.glDisable(GL11.GL_ALPHA_TEST);
092                GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
093                GL11.glDisable(GL11.GL_LIGHTING);
094    
095                if (par1EntityEnderman.getHasActivePotion())
096                {
097                    GL11.glDepthMask(false);
098                }
099                else
100                {
101                    GL11.glDepthMask(true);
102                }
103    
104                char var5 = 61680;
105                int var6 = var5 % 65536;
106                int var7 = var5 / 65536;
107                OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var6 / 1.0F, (float)var7 / 1.0F);
108                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
109                GL11.glEnable(GL11.GL_LIGHTING);
110                GL11.glColor4f(1.0F, 1.0F, 1.0F, var4);
111                return 1;
112            }
113        }
114    
115        /**
116         * Queries whether should render the specified pass or not.
117         */
118        protected int shouldRenderPass(EntityLiving par1EntityLiving, int par2, float par3)
119        {
120            return this.renderEyes((EntityEnderman)par1EntityLiving, par2, par3);
121        }
122    
123        protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2)
124        {
125            this.renderCarrying((EntityEnderman)par1EntityLiving, par2);
126        }
127    
128        public void doRenderLiving(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9)
129        {
130            this.renderEnderman((EntityEnderman)par1EntityLiving, par2, par4, par6, par8, par9);
131        }
132    
133        /**
134         * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
135         * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
136         * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
137         * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
138         */
139        public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
140        {
141            this.renderEnderman((EntityEnderman)par1Entity, par2, par4, par6, par8, par9);
142        }
143    }