/// <summary>
        /// attempts to extend the piston. returns false if impossible.
        /// </summary>
        private bool TryExtend(World par1World, int par2, int par3, int par4, int par5)
        {
            int i = par2 + Facing.OffsetsXForSide[par5];
            int j = par3 + Facing.OffsetsYForSide[par5];
            int k = par4 + Facing.OffsetsZForSide[par5];
            int l = 0;

            do
            {
                if (l >= 13)
                {
                    break;
                }

                if (j <= 0 || j >= 255)
                {
                    return(false);
                }

                int j1 = par1World.GetBlockId(i, j, k);

                if (j1 == 0)
                {
                    break;
                }

                if (!CanPushBlock(j1, par1World, i, j, k, true))
                {
                    return(false);
                }

                if (Block.BlocksList[j1].GetMobilityFlag() == 1)
                {
                    Block.BlocksList[j1].DropBlockAsItem(par1World, i, j, k, par1World.GetBlockMetadata(i, j, k), 0);
                    par1World.SetBlockWithNotify(i, j, k, 0);
                    break;
                }

                if (l == 12)
                {
                    return(false);
                }

                i += Facing.OffsetsXForSide[par5];
                j += Facing.OffsetsYForSide[par5];
                k += Facing.OffsetsZForSide[par5];
                l++;
            }while (true);

            int l1;

            for (; i != par2 || j != par3 || k != par4; k = l1)
            {
                int i1 = i - Facing.OffsetsXForSide[par5];
                int k1 = j - Facing.OffsetsYForSide[par5];
                l1 = k - Facing.OffsetsZForSide[par5];
                int i2 = par1World.GetBlockId(i1, k1, l1);
                int j2 = par1World.GetBlockMetadata(i1, k1, l1);

                if (i2 == BlockID && i1 == par2 && k1 == par3 && l1 == par4)
                {
                    par1World.SetBlockAndMetadata(i, j, k, Block.PistonMoving.BlockID, par5 | (IsSticky ? 8 : 0));
                    par1World.SetBlockTileEntity(i, j, k, BlockPistonMoving.GetTileEntity(Block.PistonExtension.BlockID, par5 | (IsSticky ? 8 : 0), par5, true, false));
                }
                else
                {
                    par1World.SetBlockAndMetadata(i, j, k, Block.PistonMoving.BlockID, j2);
                    par1World.SetBlockTileEntity(i, j, k, BlockPistonMoving.GetTileEntity(i2, j2, par5, true, false));
                }

                i = i1;
                j = k1;
            }

            return(true);
        }
        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;
        }