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 }