/// <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; }