001package net.minecraft.client.renderer.tileentity;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.block.Block;
006import net.minecraft.block.BlockPistonBase;
007import net.minecraft.client.Minecraft;
008import net.minecraft.client.renderer.RenderBlocks;
009import net.minecraft.client.renderer.RenderHelper;
010import net.minecraft.client.renderer.Tessellator;
011import net.minecraft.tileentity.TileEntity;
012import net.minecraft.tileentity.TileEntityPiston;
013import net.minecraft.world.World;
014import org.lwjgl.opengl.GL11;
015
016import net.minecraftforge.client.ForgeHooksClient;
017
018@SideOnly(Side.CLIENT)
019public 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}