diff --git a/combined_bot_main.py b/combined_bot_main.py index 50ae5a2..067c725 100644 --- a/combined_bot_main.py +++ b/combined_bot_main.py @@ -1,11 +1,11 @@ import sys -from time import time import cv2 as cv -import keyboard from combined_user_interface import PrimaryOverlay from equipment import Equipment from crops import Crops from farm import Farm +from magic import Magic +from craft import Craft def run(): @@ -43,6 +43,12 @@ def run(): elif overlay.rb_int.get() == 3: farm = Farm(overlay) farm.execute_main_loop() + elif overlay.rb_int.get() == 4: + magic = Magic(overlay) + magic.execute_main_loop() + elif overlay.rb_int.get() == 5: + craft = Craft(overlay) + craft.execute_main_loop() if __name__ == "__main__": run() diff --git a/craft.py b/craft.py new file mode 100644 index 0000000..6a867cd --- /dev/null +++ b/craft.py @@ -0,0 +1,316 @@ +import cv2 as cv +from utils import get_click_point, dig_point, check_for_craft_ok_button, check_for_craft_button +import pydirectinput +from config_file import UserConfigs +from window_capture import WindowCapture +from vision import Vision + +MODE25X1 = "m25x1" +MODE10X2 = "m10x2" +MODE5X3 = "m5x3" +MODE_SIMPLE_STACK = "simple" +MODE1X5_T = "m1x5_T" +MODE1X5_X = "m1x5_X" +MODE_HOUSE = "house" + + +class Craft: + + def __init__(self, overlay): + self.overlay = overlay + self.config = UserConfigs() + + self.mode = str(overlay.mode_use.get()) + self.run_target = int(overlay.crafts_use.get()) + + self.run_counter = 0 + self.dimension = 172 + + def execute_main_loop(self): + + while True: + if self.overlay.run_mode == 'paused': + cv.waitKey(1) + continue + elif self.overlay.run_mode == 'stopped': + break + + if self.run_counter >= self.run_target: + self.run_counter = 0 + self.overlay.run_mode = 'finished' + break + + ab1 = [420, 1180, 142, 142] + ab2 = [562, 1180, 142, 142] + ab3 = [704, 1180, 142, 142] + ab4 = [846, 1180, 142, 142] + ab5 = [986, 1180, 142, 142] + ab6 = [1128, 1180, 142, 142] + ab10 = [1698, 1180, 142, 142] + + if self.mode == MODE25X1: + self.click_square_center(ab1) + + # grid 770 1630 160 1020 172 o + self.dimension = 172 + for i in range(0, 5, 1): + for e in range(0, 5, 1): + self.click_square_center( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension]) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + + for i in range(0, 5, 1): + for e in range(0, 5, 1): + self.collect_grid_reverse_click( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension]) + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(ab10) + elif self.mode == MODE10X2: + for r in range(0, 2, 1): + # grid 770 1630 160 1020 172 + + if r == 0: + self.click_square_center(ab1) + start = 0 + target = 3 + else: + self.click_square_center(ab2) + start = 1 + target = 4 + + for i in range(start, target, 2): + for e in range(0, 5, 1): + self.click_square_center( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, + self.dimension]) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + + for i in range(0, 4, 2): + for e in range(0, 5, 1): + self.collect_grid_reverse_click( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension]) + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(ab10) + elif self.mode == MODE5X3: + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + for r in range(0, 3, 1): + # grid 770 1630 160 1020 172oo + self.dimension = 172 + if r == 0: + self.click_square_center(ab1) + start = 0 + target = 1 + elif r == 1: + self.click_square_center(ab2) + start = 1 + target = 2 + else: + self.click_square_center(ab3) + start = 2 + target = 3 + + for i in range(start, target, 1): + for e in range(0, 5, 1): + self.click_square_center( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, + self.dimension]) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + + for i in range(0, 1, 1): + if self.overlay.run_mode == 'stopped': + break + for e in range(0, 5, 1): + self.collect_grid_reverse_click( + [770 + (i * self.dimension), 160 + (e * self.dimension), self.dimension, self.dimension]) + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(ab10) + elif self.mode == MODE1X5_T: + tps = [ab1, + [770 + (0 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + ab2, + [770 + (2 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension]] + + result_tp = [770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension] + + for tp in tps: + self.click_square_center(tp) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(result_tp) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(ab10) + + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + elif self.mode == MODE1X5_X: + tps = [ab1, + [770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]] + + result_tp = [770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension] + + for tp in tps: + self.click_square_center(tp) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(result_tp) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + self.click_square_center(ab10) + + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + elif self.mode == MODE_HOUSE: + cements = [[770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension], + [770 + (3 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension], + [770 + (4 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension]] + + bricks = [[770 + (0 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (3 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (4 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (0 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + [770 + (4 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]] + + boards = [[770 + (2 * self.dimension), 160 + (3 * self.dimension), self.dimension, self.dimension], + [770 + (0 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (1 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (3 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (4 * self.dimension), 160 + (1 * self.dimension), self.dimension, self.dimension], + [770 + (2 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension]] + + glasses = [[770 + (1 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension], + [770 + (3 * self.dimension), 160 + (2 * self.dimension), self.dimension, self.dimension]] + + tp_hammer = [770 + (1 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension] + tp_nails = [770 + (3 * self.dimension), 160 + (0 * self.dimension), self.dimension, self.dimension] + tp_result = [770 + (0 * self.dimension), 160 + (4 * self.dimension), self.dimension, self.dimension] + + self.click_square_center(ab1) + + for cement in cements: + self.click_square_center(cement) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(ab2) + + for brick in bricks: + self.click_square_center(brick) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(ab3) + + for board in boards: + self.click_square_center(board) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(ab4) + + for glass in glasses: + self.click_square_center(glass) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(ab5) + self.click_square_center(tp_hammer) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(ab6) + self.click_square_center(tp_nails) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_craft_button() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.click_square_center(tp_result) + self.click_square_center(ab10) + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + elif self.mode == MODE_SIMPLE_STACK: + # initialize the StunWindowCapture class + capture_config = UserConfigs() + # capture_window = WindowCapture(None, "screen_conf", capture_config) + + capture_window2 = WindowCapture(None, "bla", capture_config) + + # initialize the StunVision class + vision_stun = Vision() + # odig_overlay = DiggingOverlay(config) + check_for_craft_button(capture_window2, vision_stun, capture_config) + check_for_craft_ok_button(capture_window2, vision_stun) + self.run_counter = self.run_counter + 1 + self.overlay.update_status_label(self.mode + ": " + str(self.run_target - self.run_counter)) + # check_for_ok_button(capture_window, vision_stun, capture_config) + + def collect_grid_reverse_click(self, square): + pydirectinput.moveTo(get_click_point(square)[0], get_click_point(square)[1]) + cv.waitKey(50) + pydirectinput.mouseUp() + cv.waitKey(50) + pydirectinput.mouseDown() + cv.waitKey(100) + + def click_craft_button(self): + dig_point(1910, 330, 100) + cv.waitKey(1500) + + def click_square_center(self, square): + cp = get_click_point(square) + dig_point(cp[0], cp[1], 100) + cv.waitKey(100) diff --git a/magic.py b/magic.py new file mode 100644 index 0000000..6754207 --- /dev/null +++ b/magic.py @@ -0,0 +1,155 @@ +import random +from window_capture import WindowCapture +from vision import Vision +import cv2 as cv +from hsvfilter import HsvFilter +from config_file import UserConfigs +import pydirectinput + + +class Magic: + + def __init__(self, overlay): + self.overlay = overlay + self.config = UserConfigs() + + self.SPAWN_COUNT = int(overlay.spawn_use.get()) + + self.capture_window = WindowCapture(None, "magic", self.config) + + # initialize the StunVision class + self.vision_stun = Vision() + # initialize the StunOverlay class + hsv_filter_orange = HsvFilter(10, 156, 0, 17, 255, 255, 0, 0, 0, 0) + hsv_filter_p = HsvFilter(130, 156, 0, 179, 255, 255, 0, 0, 0, 0) + hsv_filter_b = HsvFilter(88, 156, 0, 128, 255, 255, 0, 0, 0, 0) + hsv_filter_g = HsvFilter(34, 156, 0, 74, 255, 255, 0, 0, 0, 0) + hsv_filter_y = HsvFilter(24, 156, 0, 33, 255, 255, 0, 0, 0, 0) + hsv_filter_0 = HsvFilter(0, 0, 0, 179, 255, 255, 255, 0, 0, 0) + self.hsv_filter_w = HsvFilter(69, 25, 0, 94, 255, 255, 0, 0, 0, 0) + + self.magic_list = {"1": "body", "2": "finding", "3": "mind", "4": "perceiving", "5": "physical", "6": "seeing", + "7": "spiritual"} + self.tier_list = {"1": "0", "2": "orange", "3": "y", "4": "g", "5": "b", "6": "p"} # , "w"} + self.hsv_filter_list = {"1": hsv_filter_0, "2": hsv_filter_orange, "3": hsv_filter_y, "4": hsv_filter_g, + "5": hsv_filter_b, "6": hsv_filter_p} + + self.needle_list = [] + self.hsv_list = [] + for key1 in self.tier_list: + for key2 in self.magic_list: + self.needle_list.append( + cv.imread("magic/" + self.magic_list[key2] + "_" + self.tier_list[key1] + ".jpg", + cv.IMREAD_UNCHANGED)) + self.hsv_list.append(self.hsv_filter_list[key1]) + + def execute_main_loop(self): + + while True: + if self.overlay.run_mode == 'paused': + cv.waitKey(1) + continue + elif self.overlay.run_mode == 'stopped': + break + + screenshot = self.capture_window.get_screenshot() + # screenshot = cv.imread("buffbar.jpg") + + # cv.imshow("screenshot", screenshot) + # cv.waitKey(150) + # continue + + spawn_1 = self.vision_stun.find(screenshot, cv.imread("magic/spawn_1.jpg", cv.IMREAD_UNCHANGED), 0.4, 1) + if len(spawn_1) == 1: + points = self.vision_stun.get_click_points(spawn_1) + for i in range(0, self.SPAWN_COUNT, 1): + pydirectinput.moveTo(points[0][0], points[0][1]) + pydirectinput.mouseDown() + w = random.randint(1, 50) + cv.waitKey(30 + w) + pydirectinput.mouseUp() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + else: + spawn_0 = self.vision_stun.find(screenshot, cv.imread("magic/spawn_0.jpg", cv.IMREAD_UNCHANGED), 0.7, 1) + points = self.vision_stun.get_click_points(spawn_0) + for point in points: + pydirectinput.moveTo(point[0], point[1]) + pydirectinput.mouseDown() + cv.waitKey(500) + pydirectinput.mouseUp() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + continue + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + # for needles in needle_list: + for rer in range(0, len(self.needle_list), 1): + while True: + screenshot = self.capture_window.get_screenshot() + processed_screenshot = self.vision_stun.apply_hsv_filter(screenshot, self.hsv_list[rer]) + processed_needle = self.vision_stun.apply_hsv_filter(self.needle_list[rer], self.hsv_list[rer]) + + rectangles = self.vision_stun.find(processed_screenshot, processed_needle, 0.7, 2) + # draw the detection results onto the original image + + # only trigger ocr reading if a stun is detected + points = self.vision_stun.get_click_points(rectangles) + if len(points) == 2: + pydirectinput.moveTo(points[0][0], points[0][1]) + pydirectinput.mouseDown() + w = random.randint(1, 100) + cv.waitKey(250 + w) + pydirectinput.moveTo(points[1][0], points[1][1]) + pydirectinput.mouseUp() + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + else: + break + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + + needles_white = [cv.imread("magic/body_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/finding_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/mind_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/perceiving_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/physical_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/seeing_w.jpg", cv.IMREAD_UNCHANGED), + cv.imread("magic/spiritual_w.jpg", cv.IMREAD_UNCHANGED)] + + for needle_w in needles_white: + # do object detection + screenshot = self.capture_window.get_screenshot() + processed_screenshot = self.vision_stun.apply_hsv_filter(screenshot, self.hsv_filter_w) + processed_needle = self.vision_stun.apply_hsv_filter(needle_w, self.hsv_filter_w) + rectangles = self.vision_stun.find(processed_screenshot, processed_needle, 0.7, 1) + # draw the detection results onto the original image + # output_image = vision_stun.draw_rectangles(screenshot, rectangles) + # cv.imshow("output_image", output_image) + # cv.waitKey(150) + + points = self.vision_stun.get_click_points(rectangles) + if len(points) >= 1: + pydirectinput.moveTo(points[0][0], points[0][1]) + pydirectinput.mouseDown() + w = random.randint(1, 100) + cv.waitKey(100 + w) + pydirectinput.mouseUp() + screenshot = self.capture_window.get_screenshot() + rectangles = self.vision_stun.find(screenshot, cv.imread("magic/collect.jpg", cv.IMREAD_UNCHANGED), + 0.8, + 1) + points = self.vision_stun.get_click_points(rectangles) + if len(points) >= 1: + pydirectinput.moveTo(points[0][0], points[0][1]) + pydirectinput.mouseDown() + w = random.randint(1, 100) + cv.waitKey(100 + w) + pydirectinput.mouseUp() + + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break + if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused': + break