/// <summary>
        /// Updates the blocks bounds based on its current state. Args: world, x, y, z
        /// </summary>
        public override void SetBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
        {
            TileEntityPiston tileentitypiston = GetTileEntityAtLocation(par1IBlockAccess, par2, par3, par4);

            if (tileentitypiston != null)
            {
                Block block = Block.BlocksList[tileentitypiston.GetStoredBlockID()];

                if (block == null || block == this)
                {
                    return;
                }

                block.SetBlockBoundsBasedOnState(par1IBlockAccess, par2, par3, par4);
                float f = tileentitypiston.GetProgress(0.0F);

                if (tileentitypiston.IsExtending())
                {
                    f = 1.0F - f;
                }

                int i = tileentitypiston.GetPistonOrientation();
                MinX = block.MinX - (Facing.OffsetsXForSide[i] * f);
                MinY = block.MinY - (Facing.OffsetsYForSide[i] * f);
                MinZ = block.MinZ - (Facing.OffsetsZForSide[i] * f);
                MaxX = block.MaxX - (Facing.OffsetsXForSide[i] * f);
                MaxY = block.MaxY - (Facing.OffsetsYForSide[i] * f);
                MaxZ = block.MaxZ - (Facing.OffsetsZForSide[i] * f);
            }
        }
        public override void PowerBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
        {
            IgnoreUpdates = true;
            int i = par6;

            if (par5 == 0)
            {
                if (TryExtend(par1World, par2, par3, par4, i))
                {
                    par1World.SetBlockMetadataWithNotify(par2, par3, par4, i | 8);
                    par1World.PlaySoundEffect((double)par2 + 0.5D, (double)par3 + 0.5D, (double)par4 + 0.5D, "tile.piston.out", 0.5F, par1World.Rand.NextFloat() * 0.25F + 0.6F);
                }
                else
                {
                    par1World.SetBlockMetadata(par2, par3, par4, i);
                }
            }
            else if (par5 == 1)
            {
                TileEntity tileentity = par1World.GetBlockTileEntity(par2 + Facing.OffsetsXForSide[i], par3 + Facing.OffsetsYForSide[i], par4 + Facing.OffsetsZForSide[i]);

                if (tileentity != null && (tileentity is TileEntityPiston))
                {
                    ((TileEntityPiston)tileentity).ClearPistonTileEntity();
                }

                par1World.SetBlockAndMetadata(par2, par3, par4, Block.PistonMoving.BlockID, i);
                par1World.SetBlockTileEntity(par2, par3, par4, BlockPistonMoving.GetTileEntity(BlockID, i, i, false, true));

                if (IsSticky)
                {
                    int  j    = par2 + Facing.OffsetsXForSide[i] * 2;
                    int  k    = par3 + Facing.OffsetsYForSide[i] * 2;
                    int  l    = par4 + Facing.OffsetsZForSide[i] * 2;
                    int  i1   = par1World.GetBlockId(j, k, l);
                    int  j1   = par1World.GetBlockMetadata(j, k, l);
                    bool flag = false;

                    if (i1 == Block.PistonMoving.BlockID)
                    {
                        TileEntity tileentity1 = par1World.GetBlockTileEntity(j, k, l);

                        if (tileentity1 != null && (tileentity1 is TileEntityPiston))
                        {
                            TileEntityPiston tileentitypiston = (TileEntityPiston)tileentity1;

                            if (tileentitypiston.GetPistonOrientation() == i && tileentitypiston.IsExtending())
                            {
                                tileentitypiston.ClearPistonTileEntity();
                                i1   = tileentitypiston.GetStoredBlockID();
                                j1   = tileentitypiston.GetBlockMetadata();
                                flag = true;
                            }
                        }
                    }

                    if (!flag && i1 > 0 && CanPushBlock(i1, par1World, j, k, l, false) && (Block.BlocksList[i1].GetMobilityFlag() == 0 || i1 == Block.PistonBase.BlockID || i1 == Block.PistonStickyBase.BlockID))
                    {
                        par2 += Facing.OffsetsXForSide[i];
                        par3 += Facing.OffsetsYForSide[i];
                        par4 += Facing.OffsetsZForSide[i];
                        par1World.SetBlockAndMetadata(par2, par3, par4, Block.PistonMoving.BlockID, j1);
                        par1World.SetBlockTileEntity(par2, par3, par4, BlockPistonMoving.GetTileEntity(i1, j1, i, false, false));
                        IgnoreUpdates = false;
                        par1World.SetBlockWithNotify(j, k, l, 0);
                        IgnoreUpdates = true;
                    }
                    else if (!flag)
                    {
                        IgnoreUpdates = false;
                        par1World.SetBlockWithNotify(par2 + Facing.OffsetsXForSide[i], par3 + Facing.OffsetsYForSide[i], par4 + Facing.OffsetsZForSide[i], 0);
                        IgnoreUpdates = true;
                    }
                }
                else
                {
                    IgnoreUpdates = false;
                    par1World.SetBlockWithNotify(par2 + Facing.OffsetsXForSide[i], par3 + Facing.OffsetsYForSide[i], par4 + Facing.OffsetsZForSide[i], 0);
                    IgnoreUpdates = true;
                }

                par1World.PlaySoundEffect((double)par2 + 0.5D, (double)par3 + 0.5D, (double)par4 + 0.5D, "tile.piston.in", 0.5F, par1World.Rand.NextFloat() * 0.15F + 0.6F);
            }

            IgnoreUpdates = false;
        }
        /// <summary>
        /// Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
        /// cleared to be reused)
        /// </summary>
        public override AxisAlignedBB GetCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
        {
            TileEntityPiston tileentitypiston = GetTileEntityAtLocation(par1World, par2, par3, par4);

            if (tileentitypiston == null)
            {
                return(null);
            }

            float f = tileentitypiston.GetProgress(0.0F);

            if (tileentitypiston.IsExtending())
            {
                f = 1.0F - f;
            }

            return(GetAxisAlignedBB(par1World, par2, par3, par4, tileentitypiston.GetStoredBlockID(), f, tileentitypiston.GetPistonOrientation()));
        }