001    package net.minecraft.client.renderer.tileentity;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import net.minecraft.block.Block;
006    import net.minecraft.block.BlockChest;
007    import net.minecraft.client.model.ModelChest;
008    import net.minecraft.client.model.ModelLargeChest;
009    import net.minecraft.tileentity.TileEntity;
010    import net.minecraft.tileentity.TileEntityChest;
011    import org.lwjgl.opengl.GL11;
012    import org.lwjgl.opengl.GL12;
013    
014    @SideOnly(Side.CLIENT)
015    public class TileEntityChestRenderer extends TileEntitySpecialRenderer
016    {
017        /** The normal small chest model. */
018        private ModelChest chestModel = new ModelChest();
019    
020        /** The large double chest model. */
021        private ModelChest largeChestModel = new ModelLargeChest();
022    
023        /**
024         * Renders the TileEntity for the chest at a position.
025         */
026        public void renderTileEntityChestAt(TileEntityChest par1TileEntityChest, double par2, double par4, double par6, float par8)
027        {
028            int var9;
029    
030            if (!par1TileEntityChest.func_70309_m())
031            {
032                var9 = 0;
033            }
034            else
035            {
036                Block var10 = par1TileEntityChest.getBlockType();
037                var9 = par1TileEntityChest.getBlockMetadata();
038    
039                if (var10 != null && var9 == 0)
040                {
041                    ((BlockChest)var10).unifyAdjacentChests(par1TileEntityChest.getWorldObj(), par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord);
042                    var9 = par1TileEntityChest.getBlockMetadata();
043                }
044    
045                par1TileEntityChest.checkForAdjacentChests();
046            }
047    
048            if (par1TileEntityChest.adjacentChestZNeg == null && par1TileEntityChest.adjacentChestXNeg == null)
049            {
050                ModelChest var14;
051    
052                if (par1TileEntityChest.adjacentChestXPos == null && par1TileEntityChest.adjacentChestZPosition == null)
053                {
054                    var14 = this.chestModel;
055                    this.bindTextureByName("/item/chest.png");
056                }
057                else
058                {
059                    var14 = this.largeChestModel;
060                    this.bindTextureByName("/item/largechest.png");
061                }
062    
063                GL11.glPushMatrix();
064                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
065                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
066                GL11.glTranslatef((float)par2, (float)par4 + 1.0F, (float)par6 + 1.0F);
067                GL11.glScalef(1.0F, -1.0F, -1.0F);
068                GL11.glTranslatef(0.5F, 0.5F, 0.5F);
069                short var11 = 0;
070    
071                if (var9 == 2)
072                {
073                    var11 = 180;
074                }
075    
076                if (var9 == 3)
077                {
078                    var11 = 0;
079                }
080    
081                if (var9 == 4)
082                {
083                    var11 = 90;
084                }
085    
086                if (var9 == 5)
087                {
088                    var11 = -90;
089                }
090    
091                if (var9 == 2 && par1TileEntityChest.adjacentChestXPos != null)
092                {
093                    GL11.glTranslatef(1.0F, 0.0F, 0.0F);
094                }
095    
096                if (var9 == 5 && par1TileEntityChest.adjacentChestZPosition != null)
097                {
098                    GL11.glTranslatef(0.0F, 0.0F, -1.0F);
099                }
100    
101                GL11.glRotatef((float)var11, 0.0F, 1.0F, 0.0F);
102                GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
103                float var12 = par1TileEntityChest.prevLidAngle + (par1TileEntityChest.lidAngle - par1TileEntityChest.prevLidAngle) * par8;
104                float var13;
105    
106                if (par1TileEntityChest.adjacentChestZNeg != null)
107                {
108                    var13 = par1TileEntityChest.adjacentChestZNeg.prevLidAngle + (par1TileEntityChest.adjacentChestZNeg.lidAngle - par1TileEntityChest.adjacentChestZNeg.prevLidAngle) * par8;
109    
110                    if (var13 > var12)
111                    {
112                        var12 = var13;
113                    }
114                }
115    
116                if (par1TileEntityChest.adjacentChestXNeg != null)
117                {
118                    var13 = par1TileEntityChest.adjacentChestXNeg.prevLidAngle + (par1TileEntityChest.adjacentChestXNeg.lidAngle - par1TileEntityChest.adjacentChestXNeg.prevLidAngle) * par8;
119    
120                    if (var13 > var12)
121                    {
122                        var12 = var13;
123                    }
124                }
125    
126                var12 = 1.0F - var12;
127                var12 = 1.0F - var12 * var12 * var12;
128                var14.chestLid.rotateAngleX = -(var12 * (float)Math.PI / 2.0F);
129                var14.renderAll();
130                GL11.glDisable(GL12.GL_RESCALE_NORMAL);
131                GL11.glPopMatrix();
132                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
133            }
134        }
135    
136        public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8)
137        {
138            this.renderTileEntityChestAt((TileEntityChest)par1TileEntity, par2, par4, par6, par8);
139        }
140    }