001package net.minecraft.client.renderer.entity;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.Random;
006import net.minecraft.block.Block;
007import net.minecraft.client.model.ModelEnderman;
008import net.minecraft.client.renderer.OpenGlHelper;
009import net.minecraft.entity.Entity;
010import net.minecraft.entity.EntityLiving;
011import net.minecraft.entity.monster.EntityEnderman;
012import org.lwjgl.opengl.GL11;
013import org.lwjgl.opengl.GL12;
014
015@SideOnly(Side.CLIENT)
016public 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.isScreaming();
036
037        if (par1EntityEnderman.isScreaming())
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}