the value can most definitely be more than just 0 and 1. if you look in the client, you'll see checks for player and projectile traversal. different bits set mean different characteristics/attributes. this has been known about for a long time and is how modern bots 'walk'.
Code:
public static boolean canReach(int startX, int startY, int destX,
int destY, boolean isObject) {
// Documentation part:
// The blocks info
// When you can walk freely it's 0, also used to create a noclip
int[][] via = new int[104][104];
int[][] cost = new int[104][104];
int[] tileQueueX = new int[4000];
int[] tileQueueY = new int[4000];
for (int xx = 0; xx < 104; xx++) {
for (int yy = 0; yy < 104; yy++) {
via[xx][yy] = 0;
cost[xx][yy] = 99999999;
}
}
int curX = startX;
int curY = startY;
via[startX][startY] = 99;
cost[startX][startY] = 0;
int head = 0;
int tail = 0;
tileQueueX[head] = startX;
tileQueueY[head] = startY;
head++;
int pathLength = tileQueueX.length;
int blocks[][] = Bot.getClient().getGroundDataArray()
[Bot.getClient().getPlane()].getBlocks();
while (tail != head) {
curX = tileQueueX[tail];
curY = tileQueueY[tail];
if (!isObject && curX == destX && curY == destY) {
return true;
} else if (isObject) {
if ((curX == destX && curY == destY + 1)
|| (curX == destX && curY == destY - 1)
|| (curX == destX + 1 && curY == destY)
|| (curX == destX - 1 && curY == destY)) {
return true;
}
}
tail = (tail + 1) % pathLength;
// Big and ugly block of code
int thisCost = cost[curX][curY] + 1;
// Can go south (by determining, whether the north side of the
// south tile is blocked :P)
if (curY > 0 && via[curX][curY - 1] == 0
&& (blocks[curX][curY - 1] & 0x1280102) == 0) {
tileQueueX[head] = curX;
tileQueueY[head] = curY - 1;
head = (head + 1) % pathLength;
via[curX][curY - 1] = 1;
cost[curX][curY - 1] = thisCost;
}
// Can go west
if (curX > 0 && via[curX - 1][curY] == 0
&& (blocks[curX - 1][curY] & 0x1280108) == 0) {
tileQueueX[head] = curX - 1;
tileQueueY[head] = curY;
head = (head + 1) % pathLength;
via[curX - 1][curY] = 2;
cost[curX - 1][curY] = thisCost;
}
// Can go north
if (curY < 104 - 1 && via[curX][curY + 1] == 0
&& (blocks[curX][curY + 1] & 0x1280120) == 0) {
tileQueueX[head] = curX;
tileQueueY[head] = curY + 1;
head = (head + 1) % pathLength;
via[curX][curY + 1] = 4;
cost[curX][curY + 1] = thisCost;
}
// Can go east
if (curX < 104 - 1 && via[curX + 1][curY] == 0
&& (blocks[curX + 1][curY] & 0x1280180) == 0) {
tileQueueX[head] = curX + 1;
tileQueueY[head] = curY;
head = (head + 1) % pathLength;
via[curX + 1][curY] = 8;
cost[curX + 1][curY] = thisCost;
}
// Can go southwest
if (curX > 0 && curY > 0 && via[curX - 1][curY - 1] == 0
&& (blocks[curX - 1][curY - 1] & 0x128010e) == 0
&& (blocks[curX - 1][curY] & 0x1280108) == 0
&& (blocks[curX][curY - 1] & 0x1280102) == 0) {
tileQueueX[head] = curX - 1;
tileQueueY[head] = curY - 1;
head = (head + 1) % pathLength;
via[curX - 1][curY - 1] = 3;
cost[curX - 1][curY - 1] = thisCost;
}
// Can go northwest
if (curX > 0 && curY < 104 - 1 && via[curX - 1][curY + 1] == 0
&& (blocks[curX - 1][curY + 1] & 0x1280138) == 0
&& (blocks[curX - 1][curY] & 0x1280108) == 0
&& (blocks[curX][curY + 1] & 0x1280120) == 0) {
tileQueueX[head] = curX - 1;
tileQueueY[head] = curY + 1;
head = (head + 1) % pathLength;
via[curX - 1][curY + 1] = 6;
cost[curX - 1][curY + 1] = thisCost;
}
// Can go southeast
if (curX < 104 - 1 && curY > 0 && via[curX + 1][curY - 1] == 0
&& (blocks[curX + 1][curY - 1] & 0x1280183) == 0
&& (blocks[curX + 1][curY] & 0x1280180) == 0
&& (blocks[curX][curY - 1] & 0x1280102) == 0) {
tileQueueX[head] = curX + 1;
tileQueueY[head] = curY - 1;
head = (head + 1) % pathLength;
via[curX + 1][curY - 1] = 9;
cost[curX + 1][curY - 1] = thisCost;
}
// can go northeast
if (curX < 104 - 1 && curY < 104 - 1
&& via[curX + 1][curY + 1] == 0
&& (blocks[curX + 1][curY + 1] & 0x12801e0) == 0
&& (blocks[curX + 1][curY] & 0x1280180) == 0
&& (blocks[curX][curY + 1] & 0x1280120) == 0) {
tileQueueX[head] = curX + 1;
tileQueueY[head] = curY + 1;
head = (head + 1) % pathLength;
via[curX + 1][curY + 1] = 12;
cost[curX + 1][curY + 1] = thisCost;
}
}
return false