001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import org.lwjgl.opengl.GL11; 006 007 @SideOnly(Side.CLIENT) 008 public class RenderCreeper extends RenderLiving 009 { 010 /** The creeper model. */ 011 private ModelBase creeperModel = new ModelCreeper(2.0F); 012 013 public RenderCreeper() 014 { 015 super(new ModelCreeper(), 0.5F); 016 } 017 018 /** 019 * Updates creeper scale in prerender callback 020 */ 021 protected void updateCreeperScale(EntityCreeper par1EntityCreeper, float par2) 022 { 023 float var4 = par1EntityCreeper.setCreeperFlashTime(par2); 024 float var5 = 1.0F + MathHelper.sin(var4 * 100.0F) * var4 * 0.01F; 025 026 if (var4 < 0.0F) 027 { 028 var4 = 0.0F; 029 } 030 031 if (var4 > 1.0F) 032 { 033 var4 = 1.0F; 034 } 035 036 var4 *= var4; 037 var4 *= var4; 038 float var6 = (1.0F + var4 * 0.4F) * var5; 039 float var7 = (1.0F + var4 * 0.1F) / var5; 040 GL11.glScalef(var6, var7, var6); 041 } 042 043 /** 044 * Updates color multiplier based on creeper state called by getColorMultiplier 045 */ 046 protected int updateCreeperColorMultiplier(EntityCreeper par1EntityCreeper, float par2, float par3) 047 { 048 float var5 = par1EntityCreeper.setCreeperFlashTime(par3); 049 050 if ((int)(var5 * 10.0F) % 2 == 0) 051 { 052 return 0; 053 } 054 else 055 { 056 int var6 = (int)(var5 * 0.2F * 255.0F); 057 058 if (var6 < 0) 059 { 060 var6 = 0; 061 } 062 063 if (var6 > 255) 064 { 065 var6 = 255; 066 } 067 068 short var7 = 255; 069 short var8 = 255; 070 short var9 = 255; 071 return var6 << 24 | var7 << 16 | var8 << 8 | var9; 072 } 073 } 074 075 /** 076 * A method used to render a creeper's powered form as a pass model. 077 */ 078 protected int renderCreeperPassModel(EntityCreeper par1EntityCreeper, int par2, float par3) 079 { 080 if (par1EntityCreeper.getPowered()) 081 { 082 if (par1EntityCreeper.func_82150_aj()) 083 { 084 GL11.glDepthMask(false); 085 } 086 else 087 { 088 GL11.glDepthMask(true); 089 } 090 091 if (par2 == 1) 092 { 093 float var4 = (float)par1EntityCreeper.ticksExisted + par3; 094 this.loadTexture("/armor/power.png"); 095 GL11.glMatrixMode(GL11.GL_TEXTURE); 096 GL11.glLoadIdentity(); 097 float var5 = var4 * 0.01F; 098 float var6 = var4 * 0.01F; 099 GL11.glTranslatef(var5, var6, 0.0F); 100 this.setRenderPassModel(this.creeperModel); 101 GL11.glMatrixMode(GL11.GL_MODELVIEW); 102 GL11.glEnable(GL11.GL_BLEND); 103 float var7 = 0.5F; 104 GL11.glColor4f(var7, var7, var7, 1.0F); 105 GL11.glDisable(GL11.GL_LIGHTING); 106 GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); 107 return 1; 108 } 109 110 if (par2 == 2) 111 { 112 GL11.glMatrixMode(GL11.GL_TEXTURE); 113 GL11.glLoadIdentity(); 114 GL11.glMatrixMode(GL11.GL_MODELVIEW); 115 GL11.glEnable(GL11.GL_LIGHTING); 116 GL11.glDisable(GL11.GL_BLEND); 117 } 118 } 119 120 return -1; 121 } 122 123 protected int func_77061_b(EntityCreeper par1EntityCreeper, int par2, float par3) 124 { 125 return -1; 126 } 127 128 /** 129 * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: 130 * entityLiving, partialTickTime 131 */ 132 protected void preRenderCallback(EntityLiving par1EntityLiving, float par2) 133 { 134 this.updateCreeperScale((EntityCreeper)par1EntityLiving, par2); 135 } 136 137 /** 138 * Returns an ARGB int color back. Args: entityLiving, lightBrightness, partialTickTime 139 */ 140 protected int getColorMultiplier(EntityLiving par1EntityLiving, float par2, float par3) 141 { 142 return this.updateCreeperColorMultiplier((EntityCreeper)par1EntityLiving, par2, par3); 143 } 144 145 /** 146 * Queries whether should render the specified pass or not. 147 */ 148 protected int shouldRenderPass(EntityLiving par1EntityLiving, int par2, float par3) 149 { 150 return this.renderCreeperPassModel((EntityCreeper)par1EntityLiving, par2, par3); 151 } 152 153 protected int inheritRenderPass(EntityLiving par1EntityLiving, int par2, float par3) 154 { 155 return this.func_77061_b((EntityCreeper)par1EntityLiving, par2, par3); 156 } 157 }