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    import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED;
007    import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D;
008    import net.minecraftforge.client.IItemRenderer;
009    import net.minecraftforge.client.MinecraftForgeClient;
010    
011    @SideOnly(Side.CLIENT)
012    public class RenderBiped extends RenderLiving
013    {
014        protected ModelBiped modelBipedMain;
015        protected float field_77070_b;
016        protected ModelBiped field_82423_g;
017        protected ModelBiped field_82425_h;
018        public static String[] field_82424_k = new String[] {"cloth", "chain", "iron", "diamond", "gold"};
019    
020        public RenderBiped(ModelBiped par1ModelBiped, float par2)
021        {
022            this(par1ModelBiped, par2, 1.0F);
023        }
024    
025        public RenderBiped(ModelBiped par1ModelBiped, float par2, float par3)
026        {
027            super(par1ModelBiped, par2);
028            this.modelBipedMain = par1ModelBiped;
029            this.field_77070_b = par3;
030            this.func_82421_b();
031        }
032    
033        protected void func_82421_b()
034        {
035            this.field_82423_g = new ModelBiped(1.0F);
036            this.field_82425_h = new ModelBiped(0.5F);
037        }
038    
039        /**
040         * Queries whether should render the specified pass or not.
041         */
042        protected int shouldRenderPass(EntityLiving par1EntityLiving, int par2, float par3)
043        {
044            ItemStack var4 = par1EntityLiving.func_82169_q(3 - par2);
045    
046            if (var4 != null)
047            {
048                Item var5 = var4.getItem();
049    
050                if (var5 instanceof ItemArmor)
051                {
052                    ItemArmor var6 = (ItemArmor)var5;
053                    this.loadTexture("/armor/" + field_82424_k[var6.renderIndex] + "_" + (par2 == 2 ? 2 : 1) + ".png");
054                    ModelBiped var7 = par2 == 2 ? this.field_82425_h : this.field_82423_g;
055                    var7.bipedHead.showModel = par2 == 0;
056                    var7.bipedHeadwear.showModel = par2 == 0;
057                    var7.bipedBody.showModel = par2 == 1 || par2 == 2;
058                    var7.bipedRightArm.showModel = par2 == 1;
059                    var7.bipedLeftArm.showModel = par2 == 1;
060                    var7.bipedRightLeg.showModel = par2 == 2 || par2 == 3;
061                    var7.bipedLeftLeg.showModel = par2 == 2 || par2 == 3;
062                    this.setRenderPassModel(var7);
063    
064                    if (var7 != null)
065                    {
066                        var7.onGround = this.mainModel.onGround;
067                    }
068    
069                    if (var7 != null)
070                    {
071                        var7.isRiding = this.mainModel.isRiding;
072                    }
073    
074                    if (var7 != null)
075                    {
076                        var7.isChild = this.mainModel.isChild;
077                    }
078    
079                    float var8 = 1.0F;
080    
081                    if (var6.func_82812_d() == EnumArmorMaterial.CLOTH)
082                    {
083                        int var9 = var6.func_82814_b(var4);
084                        float var10 = (float)(var9 >> 16 & 255) / 255.0F;
085                        float var11 = (float)(var9 >> 8 & 255) / 255.0F;
086                        float var12 = (float)(var9 & 255) / 255.0F;
087                        GL11.glColor3f(var8 * var10, var8 * var11, var8 * var12);
088    
089                        if (var4.isItemEnchanted())
090                        {
091                            return 31;
092                        }
093    
094                        return 16;
095                    }
096    
097                    GL11.glColor3f(var8, var8, var8);
098    
099                    if (var4.isItemEnchanted())
100                    {
101                        return 15;
102                    }
103    
104                    return 1;
105                }
106            }
107    
108            return -1;
109        }
110    
111        protected void func_82408_c(EntityLiving par1EntityLiving, int par2, float par3)
112        {
113            ItemStack var4 = par1EntityLiving.func_82169_q(3 - par2);
114    
115            if (var4 != null)
116            {
117                Item var5 = var4.getItem();
118    
119                if (var5 instanceof ItemArmor)
120                {
121                    ItemArmor var6 = (ItemArmor)var5;
122                    this.loadTexture("/armor/" + field_82424_k[var6.renderIndex] + "_" + (par2 == 2 ? 2 : 1) + "_b.png");
123                    float var7 = 1.0F;
124                    GL11.glColor3f(var7, var7, var7);
125                }
126            }
127        }
128    
129        public void doRenderLiving(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9)
130        {
131            float var10 = 1.0F;
132            GL11.glColor3f(var10, var10, var10);
133            ItemStack var11 = par1EntityLiving.getHeldItem();
134            this.func_82420_a(par1EntityLiving, var11);
135            double var12 = par4 - (double)par1EntityLiving.yOffset;
136    
137            if (par1EntityLiving.isSneaking() && !(par1EntityLiving instanceof EntityPlayerSP))
138            {
139                var12 -= 0.125D;
140            }
141    
142            super.doRenderLiving(par1EntityLiving, par2, var12, par6, par8, par9);
143            this.field_82423_g.aimedBow = this.field_82425_h.aimedBow = this.modelBipedMain.aimedBow = false;
144            this.field_82423_g.isSneak = this.field_82425_h.isSneak = this.modelBipedMain.isSneak = false;
145            this.field_82423_g.heldItemRight = this.field_82425_h.heldItemRight = this.modelBipedMain.heldItemRight = 0;
146        }
147    
148        protected void func_82420_a(EntityLiving par1EntityLiving, ItemStack par2ItemStack)
149        {
150            this.field_82423_g.heldItemRight = this.field_82425_h.heldItemRight = this.modelBipedMain.heldItemRight = par2ItemStack != null ? 1 : 0;
151            this.field_82423_g.isSneak = this.field_82425_h.isSneak = this.modelBipedMain.isSneak = par1EntityLiving.isSneaking();
152        }
153    
154        protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2)
155        {
156            float var3 = 1.0F;
157            GL11.glColor3f(var3, var3, var3);
158            super.renderEquippedItems(par1EntityLiving, par2);
159            ItemStack var4 = par1EntityLiving.getHeldItem();
160            ItemStack var5 = par1EntityLiving.func_82169_q(3);
161            float var6;
162    
163            if (var5 != null)
164            {
165                GL11.glPushMatrix();
166                this.modelBipedMain.bipedHead.postRender(0.0625F);
167    
168                IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var5, EQUIPPED);
169                boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var5, BLOCK_3D));
170    
171                if (var5.getItem() instanceof ItemBlock)
172                {
173                    if (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var5.itemID].getRenderType()))
174                    {
175                        var6 = 0.625F;
176                        GL11.glTranslatef(0.0F, -0.25F, 0.0F);
177                        GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
178                        GL11.glScalef(var6, -var6, -var6);
179                    }
180    
181                    this.renderManager.itemRenderer.renderItem(par1EntityLiving, var5, 0);
182                }
183                else if (var5.getItem().shiftedIndex == Item.field_82799_bQ.shiftedIndex)
184                {
185                    var6 = 1.0625F;
186                    GL11.glScalef(var6, -var6, -var6);
187                    String var7 = "";
188    
189                    if (var5.hasTagCompound() && var5.getTagCompound().hasKey("SkullOwner"))
190                    {
191                        var7 = var5.getTagCompound().getString("SkullOwner");
192                    }
193    
194                    TileEntitySkullRenderer.field_82397_a.func_82393_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, var5.getItemDamage(), var7);
195                }
196    
197                GL11.glPopMatrix();
198            }
199    
200            if (var4 != null)
201            {
202                GL11.glPushMatrix();
203    
204                if (this.mainModel.isChild)
205                {
206                    var6 = 0.5F;
207                    GL11.glTranslatef(0.0F, 0.625F, 0.0F);
208                    GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F);
209                    GL11.glScalef(var6, var6, var6);
210                }
211    
212                this.modelBipedMain.bipedRightArm.postRender(0.0625F);
213                GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
214    
215                IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var4, EQUIPPED);
216                boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var4, BLOCK_3D));
217    
218                if (var4.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var4.itemID].getRenderType())))
219                {
220                    var6 = 0.5F;
221                    GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
222                    var6 *= 0.75F;
223                    GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
224                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
225                    GL11.glScalef(var6, -var6, var6);
226                }
227                else if (var4.itemID == Item.bow.shiftedIndex)
228                {
229                    var6 = 0.625F;
230                    GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
231                    GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F);
232                    GL11.glScalef(var6, -var6, var6);
233                    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
234                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
235                }
236                else if (Item.itemsList[var4.itemID].isFull3D())
237                {
238                    var6 = 0.625F;
239    
240                    if (Item.itemsList[var4.itemID].shouldRotateAroundWhenRendering())
241                    {
242                        GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
243                        GL11.glTranslatef(0.0F, -0.125F, 0.0F);
244                    }
245    
246                    this.func_82422_c();
247                    GL11.glScalef(var6, -var6, var6);
248                    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
249                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
250                }
251                else
252                {
253                    var6 = 0.375F;
254                    GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
255                    GL11.glScalef(var6, var6, var6);
256                    GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
257                    GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
258                    GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
259                }
260    
261                this.renderManager.itemRenderer.renderItem(par1EntityLiving, var4, 0);
262    
263                if (var4.getItem().requiresMultipleRenderPasses())
264                {
265                    for (int x = 1; x < var4.getItem().getRenderPasses(var4.getItemDamage()); x++)
266                    {
267                        this.renderManager.itemRenderer.renderItem(par1EntityLiving, var4, x);
268                    }
269                }
270    
271                GL11.glPopMatrix();
272            }
273        }
274    
275        protected void func_82422_c()
276        {
277            GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
278        }
279    
280        /**
281         * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
282         * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
283         * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
284         * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
285         */
286        public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
287        {
288            this.doRenderLiving((EntityLiving)par1Entity, par2, par4, par6, par8, par9);
289        }
290    }