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.getCreeperFlashIntensity(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.getCreeperFlashIntensity(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.getHasActivePotion())
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    }