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.block.Block;
006    import net.minecraft.client.model.ModelWitch;
007    import net.minecraft.client.renderer.RenderBlocks;
008    import net.minecraft.entity.Entity;
009    import net.minecraft.entity.EntityLiving;
010    import net.minecraft.entity.monster.EntityWitch;
011    import net.minecraft.item.Item;
012    import net.minecraft.item.ItemStack;
013    import org.lwjgl.opengl.GL11;
014    
015    @SideOnly(Side.CLIENT)
016    public class RenderWitch extends RenderLiving
017    {
018        private ModelWitch field_82414_a;
019        private int field_82413_f;
020    
021        public RenderWitch()
022        {
023            super(new ModelWitch(0.0F), 0.5F);
024            this.field_82414_a = (ModelWitch)this.mainModel;
025            this.field_82413_f = this.field_82414_a.func_82899_a();
026        }
027    
028        public void func_82412_a(EntityWitch par1EntityWitch, double par2, double par4, double par6, float par8, float par9)
029        {
030            ItemStack var10 = par1EntityWitch.getHeldItem();
031    
032            if (this.field_82414_a.func_82899_a() != this.field_82413_f)
033            {
034                System.out.println("Updating witch model");
035                this.mainModel = this.field_82414_a = new ModelWitch(0.0F);
036                this.field_82413_f = this.field_82414_a.func_82899_a();
037            }
038    
039            this.field_82414_a.field_82900_g = var10 != null;
040            super.doRenderLiving(par1EntityWitch, par2, par4, par6, par8, par9);
041        }
042    
043        protected void func_82411_a(EntityWitch par1EntityWitch, float par2)
044        {
045            float var3 = 1.0F;
046            GL11.glColor3f(var3, var3, var3);
047            super.renderEquippedItems(par1EntityWitch, par2);
048            ItemStack var4 = par1EntityWitch.getHeldItem();
049    
050            if (var4 != null)
051            {
052                GL11.glPushMatrix();
053                float var5;
054    
055                if (this.mainModel.isChild)
056                {
057                    var5 = 0.5F;
058                    GL11.glTranslatef(0.0F, 0.625F, 0.0F);
059                    GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F);
060                    GL11.glScalef(var5, var5, var5);
061                }
062    
063                this.field_82414_a.field_82898_f.postRender(0.0625F);
064                GL11.glTranslatef(-0.0625F, 0.53125F, 0.21875F);
065    
066                if (var4.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var4.itemID].getRenderType()))
067                {
068                    var5 = 0.5F;
069                    GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
070                    var5 *= 0.75F;
071                    GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
072                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
073                    GL11.glScalef(var5, -var5, var5);
074                }
075                else if (var4.itemID == Item.bow.itemID)
076                {
077                    var5 = 0.625F;
078                    GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
079                    GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F);
080                    GL11.glScalef(var5, -var5, var5);
081                    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
082                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
083                }
084                else if (Item.itemsList[var4.itemID].isFull3D())
085                {
086                    var5 = 0.625F;
087    
088                    if (Item.itemsList[var4.itemID].shouldRotateAroundWhenRendering())
089                    {
090                        GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
091                        GL11.glTranslatef(0.0F, -0.125F, 0.0F);
092                    }
093    
094                    this.func_82410_b();
095                    GL11.glScalef(var5, -var5, var5);
096                    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
097                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
098                }
099                else
100                {
101                    var5 = 0.375F;
102                    GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
103                    GL11.glScalef(var5, var5, var5);
104                    GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
105                    GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
106                    GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
107                }
108    
109                GL11.glRotatef(-15.0F, 1.0F, 0.0F, 0.0F);
110                GL11.glRotatef(40.0F, 0.0F, 0.0F, 1.0F);
111                this.renderManager.itemRenderer.renderItem(par1EntityWitch, var4, 0);
112    
113                if (var4.getItem().requiresMultipleRenderPasses())
114                {
115                    this.renderManager.itemRenderer.renderItem(par1EntityWitch, var4, 1);
116                }
117    
118                GL11.glPopMatrix();
119            }
120        }
121    
122        protected void func_82410_b()
123        {
124            GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
125        }
126    
127        protected void func_82409_b(EntityWitch par1EntityWitch, float par2)
128        {
129            float var3 = 0.9375F;
130            GL11.glScalef(var3, var3, var3);
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.func_82409_b((EntityWitch)par1EntityLiving, par2);
140        }
141    
142        protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2)
143        {
144            this.func_82411_a((EntityWitch)par1EntityLiving, par2);
145        }
146    
147        public void doRenderLiving(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9)
148        {
149            this.func_82412_a((EntityWitch)par1EntityLiving, par2, par4, par6, par8, par9);
150        }
151    
152        /**
153         * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
154         * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
155         * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
156         * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
157         */
158        public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
159        {
160            this.func_82412_a((EntityWitch)par1Entity, par2, par4, par6, par8, par9);
161        }
162    }