rendered paste bodyimport java.awt.Color;import java.awt.Graphics;import impsoft.nexus.bots.color.constants.Areas;import impsoft.nexus.bots.color.methods.ColorScript;import impsoft.nexus.bots.color.scriptobjects.MiniMap;import impsoft.nexus.components.paint.PaintJob;public class canReach extends ColorScript { @Override public boolean doStart(String cmd, String[] args) throws InterruptedException { // TODO Auto-generated method stub return true; } @Override public void script() throws InterruptedException { while (true) { final int sleepTime=defaultmaxAgeInMillisecs * 1; try { final int width = MiniMap.width; final int height = MiniMap.height; final int xOffSet = MiniMap.minX; final int yOffSet = MiniMap.minY; final byte[][] places = canReachRec(currentMouseX(), currentMouseY()); if (places != null) { addPaintJob(new PaintJob() { long start = System.currentTimeMillis(); @Override public void paint(Graphics g) { g.setColor(Color.green); for (int xB = 0; xB < width; xB++) { for (int yB = 0; yB < height; yB++) { if (places[xB][yB] == 2) { g.fillRect(xB + xOffSet, yB + yOffSet, 1, 1); } } } } @Override public boolean timeUp() { return start + sleepTime < System .currentTimeMillis(); } }); } } catch (RuntimeException e) { log("e.getCause()=" + e.getCause() + "\n" + e.toString()); e.printStackTrace(); } sleep(sleepTime-4); } } short ignore[][] = { { 120, 140, 180, 20 }, { 100, 120, 160, 20 }, { 245, 239, 230, 20 } }; public byte[][] canReachRec(int x, int y) { if (!MiniMap.inMiniMap(x, y)) { return null; } int width = MiniMap.width; int height = MiniMap.height; int xOffSet = MiniMap.minX; int yOffSet = MiniMap.minY; short[][][] colorMap = getColorArray2d(); boolean blocksp[][] = new boolean[width][height]; for (int xB = 0; xB < width; xB++) { for (int yB = 0; yB < height; yB++) { for (short[] color : ignore) { short r = colorMap[xB + xOffSet][yB + yOffSet][0]; short g = colorMap[xB + xOffSet][yB + yOffSet][1]; short b = colorMap[xB + xOffSet][yB + yOffSet][2]; int redChange = r - color[0]; int greenChange = g - color[1]; int blueChange = b - color[2]; int tolerance = color[3]; if ((greenChange >= 0 ? greenChange : -greenChange) < tolerance && (redChange >= 0 ? redChange : -redChange) < tolerance && (blueChange >= 0 ? blueChange : -blueChange) < tolerance) { blocksp[xB][yB] = true; if (xB > 0) { blocksp[xB - 1][yB] = true; } if (xB < width - 1) { blocksp[xB + 1][yB] = true; } if (yB > 0) { blocksp[xB][yB - 1] = true; } if (yB < height - 1) { blocksp[xB][yB + 1] = true; } } } } } byte places[][] = new byte[width][height]; canReachCornerFan(colorMap, places, blocksp, 647, 81, xOffSet, yOffSet, 0, 0); canReachCornerFan(colorMap, places, blocksp, 650, 82, xOffSet, yOffSet, 0, 1); canReachCornerFan(colorMap, places, blocksp, 649, 85, xOffSet, yOffSet, 0, 2); canReachCornerFan(colorMap, places, blocksp, 646, 84, xOffSet, yOffSet, 0, 3); boolean good = true; while (good) { good = false; for (int xB = 1; xB < width - 1; xB++) { for (int yB = 1; yB < height - 1; yB++) { if (places[xB][yB] == 2) { if (places[xB][yB - 1] == 0) { if (canReachRec(colorMap, places, blocksp, xB + xOffSet, yB + yOffSet - 1, xOffSet, yOffSet, 0)) good = true; } if (places[xB][yB + 1] == 0) { if (canReachRec(colorMap, places, blocksp, xB + xOffSet, yB + yOffSet + 1, xOffSet, yOffSet, 0)) good = true; } if (places[xB + 1][yB] == 0) { if (canReachRec(colorMap, places, blocksp, xB + xOffSet + 1, yB + yOffSet, xOffSet, yOffSet, 0)) good = true; } if (places[xB - 1][yB] == 0) { if (canReachRec(colorMap, places, blocksp, xB + xOffSet - 1, yB + yOffSet, xOffSet, yOffSet, 0)) good = true; } } } } } return places; } public void canReachCornerFan(short[][][] colorMap, byte places[][], boolean blocksp[][], int x, int y, int xOffSet, int yOffSet, int i, int mode) { i++; if (i > 1500) { log("canReachTriangle x=" + x + " y=" + y + " i=" + i); return; } if (!MiniMap.inMiniMap(x, y)) { return; } if (places[x - xOffSet][y - yOffSet] == 2 || places[x - xOffSet][y - yOffSet] == 1) { return; } if (blocksp[x - xOffSet][y - yOffSet]) { places[x - xOffSet][y - yOffSet] = 1; return; } places[x - xOffSet][y - yOffSet] = 2; switch (mode) { case 0: canReachCornerFan(colorMap, places, blocksp, x + 1, y, xOffSet, yOffSet, i, mode); canReachCornerFan(colorMap, places, blocksp, x, y - 1, xOffSet, yOffSet, i, mode); break; case 1: canReachCornerFan(colorMap, places, blocksp, x + 1, y, xOffSet, yOffSet, i, mode); canReachCornerFan(colorMap, places, blocksp, x, y + 1, xOffSet, yOffSet, i, mode); break; case 2: canReachCornerFan(colorMap, places, blocksp, x - 1, y, xOffSet, yOffSet, i, mode); canReachCornerFan(colorMap, places, blocksp, x, y + 1, xOffSet, yOffSet, i, mode); break; case 3: canReachCornerFan(colorMap, places, blocksp, x - 1, y, xOffSet, yOffSet, i, mode); canReachCornerFan(colorMap, places, blocksp, x, y - 1, xOffSet, yOffSet, i, mode); break; } } public boolean canReachRec(short[][][] colorMap, byte places[][], boolean blocksp[][], int x, int y, int xOffSet, int yOffSet, int i) { if (i > 1500) { log("canReachRec x=" + x + " y=" + y + " i=" + i); return true; } i++; if (!MiniMap.inMiniMap(x, y)) { return false; } if (places[x - xOffSet][y - yOffSet] == 2 || places[x - xOffSet][y - yOffSet] == 1) { return false; } if (blocksp[x - xOffSet][y - yOffSet]) { places[x - xOffSet][y - yOffSet] = 1; return false; } places[x - xOffSet][y - yOffSet] = 2; return canReachRec(colorMap, places, blocksp, x + 1, y, xOffSet, yOffSet, i) || canReachRec(colorMap, places, blocksp, x - 1, y, xOffSet, yOffSet, i) || canReachRec(colorMap, places, blocksp, x, y + 1, xOffSet, yOffSet, i) || canReachRec(colorMap, places, blocksp, x, y - 1, xOffSet, yOffSet, i); }}