    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    }