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