diff --git a/assets/fishing/Bobber.jpg b/assets/fishing/Bobber.jpg new file mode 100644 index 0000000..418db0e Binary files /dev/null and b/assets/fishing/Bobber.jpg differ diff --git a/assets/fishing/Bobber.png b/assets/fishing/Bobber.png deleted file mode 100644 index 9bbe4b4..0000000 Binary files a/assets/fishing/Bobber.png and /dev/null differ diff --git a/assets/fishing/FishIcon.jpg b/assets/fishing/FishIcon.jpg new file mode 100644 index 0000000..56bc1c5 Binary files /dev/null and b/assets/fishing/FishIcon.jpg differ diff --git a/assets/screenshot.jpg b/assets/screenshot.jpg index 755ca0a..ab64f1a 100644 Binary files a/assets/screenshot.jpg and b/assets/screenshot.jpg differ diff --git a/bots/fishing/FishingAgent.py b/bots/fishing/FishingAgent.py index 50b6b00..bf47def 100644 --- a/bots/fishing/FishingAgent.py +++ b/bots/fishing/FishingAgent.py @@ -1,73 +1,67 @@ """Module providing a fishing agent.""" -import os from threading import Thread import time import cv2 as cv -import numpy as np import pyautogui from core.Logger import Logger class FishingAgent: def __init__(self, monitor) -> None: self.logger = Logger("Fishing Agent") + self.retry = 0 self.monitor = monitor - assetPath = os.path.join( - os.path.dirname(os.path.realpath(__file__)), - "..\\..\\assets" - ) - self.fishingBobberImg = cv.imread(os.path.join(assetPath,"fishing","Bobber.png"), cv.IMREAD_GRAYSCALE) + self.lureLoc = None + self.fishingBobberImg = cv.imread("assets/fishing/Bobber.jpg", cv.IMREAD_GRAYSCALE) + self.fishingIconImg = cv.imread("assets/fishing/FishIcon.jpg", cv.IMREAD_GRAYSCALE) self.fishingThread = None def castLure(self): - self.agentLog("Casting Lure.") - # pyautogui.press('1') - time.sleep(1) + self.retry = 0 + pyautogui.moveTo(2,3) + self.logger.log("Casting Lure.") + res = self.monitor.findMatchAndMoveToPosition(self.fishingIconImg) + if (res == -1): + self.logger.log("Trying again in 1 second...") + time.sleep(1) + self.castLure() + pyautogui.click() self.findLure() def findLure(self): - if self.mainAgent.currImg is not None: - self.agentLog("Searching for Bobber.") - cv.imshow("Bobber", self.fishingBobber) - - lureLoc = cv.matchTemplate(self.mainAgent.currImg, self.fishingBobber, cv.TM_CCORR_NORMED) - lureLocArray = np.array(lureLoc) - - minVal, maxVal, minLoc, maxLoc = cv.minMaxLoc(lureLocArray) - self.moveToLure(maxLoc) - else: - print("No curr img") - - def moveToLure(self, maxLoc): - if maxLoc: - self.agentLog("Moving to Bobber.") - pyautogui.moveTo(maxLoc) + self.logger.log("Moving cursor to Lure.") + time.sleep(2) + res = self.monitor.findMatch(self.fishingBobberImg) + if (res == -1): + if (self.retry > 4): + self.logger.log("Took too to find lure long, retrying fishing from the beginning") + self.castLure() + else: + self.logger.log("Trying again in 1 second...") + self.retry += 1 + time.sleep(1) + self.findLure() + self.lureLoc = res + self.watchLure() def watchLure(self): - self.agentLog("Waiting for fish...") + self.logger.log("Waiting for fish...") + while True: + time.sleep(0.1) + res = self.monitor.findMatch(self.fishingBobberImg) + print(res) + def pullLine(self): - self.agentLog("Pulling line!") - - def test(self): - while True: - time.sleep(1) - self.logger.log("###") - point = self.monitor.findMatch(self.fishingBobberImg) - pyautogui.moveTo(point[0], point[1]) + self.logger.log("Pulling line!") def run(self): - if self.monitor.screenshot is None: - self.logger.log("Screenshot capture not found...") - return self.logger.log("Starting fishing thread in 3 seconds...") - time.sleep(3) - - # print("Switching to fishing hotbar (hotbar 4)") - # pyautogui.keyDown('shift') - # pyautogui.press('4') - # pyautogui.keyUp('shift') - # time.sleep(1) + time.sleep(1) + self.logger.log("Starting fishing thread in 2 seconds...") + time.sleep(1) + self.logger.log("Starting fishing thread in 1 seconds...") + time.sleep(1) self.fishingThread = Thread( target=self.castLure, diff --git a/core/Monitor.py b/core/Monitor.py index 43a8560..31ca1a0 100644 --- a/core/Monitor.py +++ b/core/Monitor.py @@ -30,8 +30,9 @@ class Monitor: fpsPrintTime = time.time() while True: newScreenshot = pyautogui.screenshot() - newScreenshot = cv.cvtColor(np.array(newScreenshot), cv.IMREAD_GRAYSCALE) - self.screenshot = newScreenshot + newScreenshot = cv.cvtColor(np.array(newScreenshot), cv.COLOR_RGB2BGR) + grayScreenshot = cv.cvtColor(newScreenshot, cv.COLOR_BGR2GRAY) + self.screenshot = grayScreenshot cv.imwrite("assets/screenshot.jpg", self.screenshot) currTime = time.time() if currTime - fpsPrintTime >= FPS_REPORT_DELAY: @@ -46,12 +47,16 @@ class Monitor: def findMatch(self, template, method = "TM_CCOEFF_NORMED"): methodInt = getattr(cv, method) - screen = cv.imread("assets/screenshot.jpg", cv.IMREAD_GRAYSCALE) - assert template is not None, "file could not be read, check with os.path.exists()" - res = cv.matchTemplate(screen, template, methodInt) + res = cv.matchTemplate(self.screenshot, template, methodInt) w, h = template.shape[::-1] min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) + matchRatio = max_val * 100 + self.logger.log(matchRatio) + if (matchRatio < 40): + self.logger.log("Cannot find matching result...") + return -1 + # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]: top_left = min_loc @@ -61,6 +66,14 @@ class Monitor: return (top_left[0] + bottom_right[0]) / 2, (top_left[1] + bottom_right[1]) / 2 + def findMatchAndMoveToPosition(self, template, method = "TM_CCOEFF_NORMED"): + point = self.findMatch(template, method) + if (point == -1): + return -1 + time.sleep(0.2) + pyautogui.moveTo(point[0], point[1]) + time.sleep(0.15) + def stopScreenCaptureThread(self): if (self.screenThread): self.screenThread.terminate()