    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    }