package net.scapeemulator.game.model.pathfinding; import net.scapeemulator.game.model.Position; import net.scapeemulator.game.model.mob.Direction; public class DumbPathFinder { public static Path find(Position position, Position dest, int size, int max, boolean inside) { Path path = new Path(); Position p = position; for (int i = 0; i < max; i++) { p = bestDummyPosition(p, dest, size); if (p != null) { if (!inside && p.equals(dest)) { Position cur; if (path.isEmpty()) { cur = position; } else { cur = path.getPoints().getLast(); } switch (Direction.between(cur, dest)) { case NONE: case EAST: case NORTH: case SOUTH: case WEST: break; case NORTH_EAST: if (Direction.isTraversable(cur, Direction.NORTH, size)) { path.addLast(new Position(cur.getX(), cur.getY() + 1, cur.getHeight())); } else if (Direction.isTraversable(cur, Direction.EAST, size)) { path.addLast(new Position(cur.getX() + 1, cur.getY(), cur.getHeight())); } break; case NORTH_WEST: if (Direction.isTraversable(cur, Direction.NORTH, size)) { path.addLast(new Position(cur.getX(), cur.getY() + 1, cur.getHeight())); } else if (Direction.isTraversable(cur, Direction.WEST, size)) { path.addLast(new Position(cur.getX() - 1, cur.getY(), cur.getHeight())); } break; case SOUTH_EAST: if (Direction.isTraversable(cur, Direction.SOUTH, size)) { path.addLast(new Position(cur.getX(), cur.getY() - 1, cur.getHeight())); } else if (Direction.isTraversable(cur, Direction.EAST, size)) { path.addLast(new Position(cur.getX() + 1, cur.getY(), cur.getHeight())); } break; case SOUTH_WEST: if (Direction.isTraversable(cur, Direction.SOUTH, size)) { path.addLast(new Position(cur.getX(), cur.getY() - 1, cur.getHeight())); } else if (Direction.isTraversable(cur, Direction.WEST, size)) { path.addLast(new Position(cur.getX() - 1, cur.getY(), cur.getHeight())); } break; } return path; } path.addLast(p); } else { return path; } } return path; } public static Position bestDummyPosition(Position cur, Position next, int size) { if (cur.equals(next)) { return null; } int deltaX = next.getX() - cur.getX(); int deltaY = next.getY() - cur.getY(); switch (Direction.between(cur, next)) { case NONE: return null; case NORTH: return new Position(cur.getX(), cur.getY() + 1, cur.getHeight()); case SOUTH: return new Position(cur.getX(), cur.getY() - 1, cur.getHeight()); case EAST: return new Position(cur.getX() + 1, cur.getY(), cur.getHeight()); case WEST: return new Position(cur.getX() - 1, cur.getY(), cur.getHeight()); case NORTH_EAST: if (Direction.isTraversable(cur, Direction.NORTH_EAST, size)) { return new Position(cur.getX() + 1, cur.getY() + 1, cur.getHeight()); } if (Math.abs(deltaX) > Math.abs(deltaY)) { if (Direction.isTraversable(cur, Direction.EAST, size)) { return new Position(cur.getX() + 1, cur.getY(), cur.getHeight()); } else { return new Position(cur.getX(), cur.getY() + 1, cur.getHeight()); } } else { if (Direction.isTraversable(cur, Direction.NORTH, size)) { return new Position(cur.getX(), cur.getY() + 1, cur.getHeight()); } else { return new Position(cur.getX() + 1, cur.getY(), cur.getHeight()); } } case NORTH_WEST: if (Direction.isTraversable(cur, Direction.NORTH_WEST, size)) { return new Position(cur.getX() - 1, cur.getY() + 1, cur.getHeight()); } if (Math.abs(deltaX) > Math.abs(deltaY)) { if (Direction.isTraversable(cur, Direction.WEST, size)) { return new Position(cur.getX() - 1, cur.getY(), cur.getHeight()); } else { return new Position(cur.getX(), cur.getY() + 1, cur.getHeight()); } } else { if (Direction.isTraversable(cur, Direction.NORTH, size)) { return new Position(cur.getX(), cur.getY() + 1, cur.getHeight()); } else { return new Position(cur.getX() - 1, cur.getY(), cur.getHeight()); } } case SOUTH_EAST: if (Direction.isTraversable(cur, Direction.SOUTH_EAST, size)) { return new Position(cur.getX() + 1, cur.getY() - 1, cur.getHeight()); } if (Math.abs(deltaX) > Math.abs(deltaY)) { if (Direction.isTraversable(cur, Direction.EAST, size)) { return new Position(cur.getX() + 1, cur.getY(), cur.getHeight()); } else { return new Position(cur.getX(), cur.getY() - 1, cur.getHeight()); } } else { if (Direction.isTraversable(cur, Direction.SOUTH, size)) { return new Position(cur.getX(), cur.getY() - 1, cur.getHeight()); } else { return new Position(cur.getX() + 1, cur.getY(), cur.getHeight()); } } case SOUTH_WEST: if (Direction.isTraversable(cur, Direction.SOUTH_WEST, size)) { return new Position(cur.getX() - 1, cur.getY() - 1, cur.getHeight()); } if (Math.abs(deltaX) > Math.abs(deltaY)) { if (Direction.isTraversable(cur, Direction.WEST, size)) { return new Position(cur.getX() - 1, cur.getY(), cur.getHeight()); } else { return new Position(cur.getX(), cur.getY() - 1, cur.getHeight()); } } else { if (Direction.isTraversable(cur, Direction.SOUTH, size)) { return new Position(cur.getX(), cur.getY() - 1, cur.getHeight()); } else { return new Position(cur.getX() - 1, cur.getY(), cur.getHeight()); } } } return null; } }