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 }