001    package net.minecraft.client.renderer.tileentity;
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.block.BlockPistonBase;
007    import net.minecraft.client.Minecraft;
008    import net.minecraft.client.renderer.RenderBlocks;
009    import net.minecraft.client.renderer.RenderHelper;
010    import net.minecraft.client.renderer.Tessellator;
011    import net.minecraft.tileentity.TileEntity;
012    import net.minecraft.tileentity.TileEntityPiston;
013    import net.minecraft.world.World;
014    import org.lwjgl.opengl.GL11;
015    
016    import net.minecraftforge.client.ForgeHooksClient;
017    
018    @SideOnly(Side.CLIENT)
019    public class TileEntityRendererPiston extends TileEntitySpecialRenderer
020    {
021        /** instance of RenderBlocks used to draw the piston base and extension. */
022        private RenderBlocks blockRenderer;
023    
024        public void renderPiston(TileEntityPiston par1TileEntityPiston, double par2, double par4, double par6, float par8)
025        {
026            Block var9 = Block.blocksList[par1TileEntityPiston.getStoredBlockID()];
027    
028            if (var9 != null && par1TileEntityPiston.getProgress(par8) < 1.0F)
029            {
030                Tessellator var10 = Tessellator.instance;
031                this.bindTextureByName("/terrain.png");
032                RenderHelper.disableStandardItemLighting();
033                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
034                GL11.glEnable(GL11.GL_BLEND);
035                GL11.glDisable(GL11.GL_CULL_FACE);
036    
037                if (Minecraft.isAmbientOcclusionEnabled())
038                {
039                    GL11.glShadeModel(GL11.GL_SMOOTH);
040                }
041                else
042                {
043                    GL11.glShadeModel(GL11.GL_FLAT);
044                }
045    
046                ForgeHooksClient.beforeBlockRender(var9, blockRenderer);
047                var10.startDrawingQuads();
048                var10.setTranslation((double)((float)par2 - (float)par1TileEntityPiston.xCoord + par1TileEntityPiston.getOffsetX(par8)), (double)((float)par4 - (float)par1TileEntityPiston.yCoord + par1TileEntityPiston.getOffsetY(par8)), (double)((float)par6 - (float)par1TileEntityPiston.zCoord + par1TileEntityPiston.getOffsetZ(par8)));
049                var10.setColorOpaque(1, 1, 1);
050    
051                if (var9 == Block.pistonExtension && par1TileEntityPiston.getProgress(par8) < 0.5F)
052                {
053                    this.blockRenderer.renderPistonExtensionAllFaces(var9, par1TileEntityPiston.xCoord, par1TileEntityPiston.yCoord, par1TileEntityPiston.zCoord, false);
054                }
055                else if (par1TileEntityPiston.shouldRenderHead() && !par1TileEntityPiston.isExtending())
056                {
057                    Block.pistonExtension.setHeadTexture(((BlockPistonBase)var9).getPistonExtensionTexture());
058                    this.blockRenderer.renderPistonExtensionAllFaces(Block.pistonExtension, par1TileEntityPiston.xCoord, par1TileEntityPiston.yCoord, par1TileEntityPiston.zCoord, par1TileEntityPiston.getProgress(par8) < 0.5F);
059                    Block.pistonExtension.clearHeadTexture();
060                    var10.setTranslation((double)((float)par2 - (float)par1TileEntityPiston.xCoord), (double)((float)par4 - (float)par1TileEntityPiston.yCoord), (double)((float)par6 - (float)par1TileEntityPiston.zCoord));
061                    this.blockRenderer.renderPistonBaseAllFaces(var9, par1TileEntityPiston.xCoord, par1TileEntityPiston.yCoord, par1TileEntityPiston.zCoord);
062                }
063                else
064                {
065                    this.blockRenderer.renderBlockAllFaces(var9, par1TileEntityPiston.xCoord, par1TileEntityPiston.yCoord, par1TileEntityPiston.zCoord);
066                }
067    
068                var10.setTranslation(0.0D, 0.0D, 0.0D);
069                var10.draw();
070                ForgeHooksClient.afterBlockRender(var9, blockRenderer);
071                RenderHelper.enableStandardItemLighting();
072            }
073        }
074    
075        /**
076         * Called when the ingame world being rendered changes (e.g. on world -> nether travel) due to using one renderer
077         * per tile entity type, rather than instance
078         */
079        public void onWorldChange(World par1World)
080        {
081            this.blockRenderer = new RenderBlocks(par1World);
082        }
083    
084        public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8)
085        {
086            this.renderPiston((TileEntityPiston)par1TileEntity, par2, par4, par6, par8);
087        }
088    }