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