public static Point2D lookUpNextStep(Point2D start, Point2D end, Class<?>... ignoredObstacles) {
        if (Field.arePointsNear(start, end)) { return end; }
        
        int[][] map = getMap(ignoredObstacles);
        map[start.x+1][start.y+1] = 0; 
        map[end.x+1][end.y+1] = 0;
        
        Queue<Integer> points_to_go = new LinkedList<>();
        points_to_go.add(end.x+1);
        points_to_go.add(end.y+1);
        
        CommonBfsNeighborHandler bfsH = new CommonBfsNeighborHandler(points_to_go, map);
        DestinationNeighborHandler destH = new DestinationNeighborHandler(map, start);
        
        while (!points_to_go.isEmpty()) {
            int curr_x = points_to_go.poll();
            int curr_y = points_to_go.poll();
            
            if (curr_x == start.x+1 && curr_y == start.y+1) {
                processNeighbors(destH);
                break;
            }
            
            bfsH.setCurrentCoord(curr_x, curr_y);
            processNeighbors(bfsH);
        }
        
        return destH.next_step == null ? start : destH.next_step;
    }