    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}