protected override int PerformInternal() { lock (_world.SyncRoot) { if (_world.sandPhysics) { Block nblock = _world.Map.GetBlock(_pos.X, _pos.Y, _nextPos); if (_firstMove) { if (_world.Map.GetBlock(_pos) != _type) { return(0); } if (_world.Map.GetBlock(_pos.X, _pos.Y, _nextPos) == Block.Air) { _world.Map.QueueUpdate(new BlockUpdate(null, _pos, Block.Air)); _world.Map.QueueUpdate(new BlockUpdate(null, (short)_pos.X, (short)_pos.Y, (short)_nextPos, _type)); _nextPos--; _firstMove = false; return(Delay); } } if (_world.Map.GetBlock(_pos.X, _pos.Y, _nextPos) != Block.Air) { return(0); } if (Physics.BlockThrough(nblock)) { _world.Map.QueueUpdate(new BlockUpdate(null, (short)_pos.X, (short)_pos.Y, (short)(_nextPos + 1), Block.Air)); _world.Map.QueueUpdate(new BlockUpdate(null, (short)_pos.X, (short)_pos.Y, (short)_nextPos, _type)); _nextPos--; } } return(Delay); } }