private void screenToTile_convert(int[] ai) {
SDToolkit toolkit = ((SDToolkit) getClient().getCurrentToolkit());
SDViewport internalViewport = toolkit.getInternalViewport();
float i = ai[0] - internalViewport.getOffsetX();
float j = ai[1] - internalViewport.getOffsetY();
float k = ai[2] - internalViewport.getOffsetZ();
ai[0] = (int) ((internalViewport.getXX() * i) + (internalViewport.getYX() * j) + (internalViewport.getZX() * k));
ai[1] = (int) ((internalViewport.getXY() * i) + (internalViewport.getYY() * j) + (internalViewport.getZY() * k));
ai[2] = (int) ((internalViewport.getXZ() * i) + (internalViewport.getYZ() * j) + (internalViewport.getZZ() * k));
}
public Point screenToTile(int screenX, int screenY) {
SDToolkit toolkit = ((SDToolkit) getClient().getCurrentToolkit());
int minZ = toolkit.getMinZ();
int minX = ((screenX - 260) * minZ) / 512;
int minY = ((screenY - 171) * minZ) / 512;
int maxZ = toolkit.getMaxZ();
int maxX = ((screenX - 260) * maxZ) / 512;
int maxY = ((screenY - 171) * maxZ) / 512;
int minXYZ[] = {
minX, minY, minZ
};
screenToTile_convert(minXYZ);
int maxXYZ[] = {
maxX, maxY, maxZ
};
screenToTile_convert(maxXYZ);
float f = 0.0F;
int j8 = maxXYZ[0] - minXYZ[0];
int i9 = maxXYZ[1] - minXYZ[1];
int k9 = maxXYZ[2] - minXYZ[2];
int planeX = -1;
int planeY = -1;
for (; f < 1.0F; f = (float) ((double) f + 0.01D)) {
int pixelX = (int) ((float) minXYZ[0] + (float) j8 * f);
planeX = pixelX >> 9;
int pixelY = (int) (f * (float) k9 + (float) minXYZ[2]);
planeY = pixelY >> 9;
if (planeX <= 0 || planeY <= 0 || planeX >= 104 || planeY >= 104) {
continue;
}
int plane = getCurrentPlane();
if (plane < 3 && (getClient().getGroundData()[1][planeX][planeY] & 2) != 0) {
plane++;
}
if ((float) getTileHeight(pixelX, pixelY) >= (float) minXYZ[1] + (float) i9 * f) {
continue;
}
break;
}
return new Point(planeX, planeY);
}
Taken from the client about 4 months ago (i've just tested it just now - it should work). It's in java so if you need help converting it, just pm me/contact me on msn.