"""Module providing a fishing agent.""" from threading import Thread import time import cv2 as cv import pyautogui from core.Logger import Logger from core.Player import PLAYER_STATE class FishingAgent: def __init__(self, monitor, player) -> 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 self.logger = Logger("Fishing Agent") self.monitor = monitor self.lureLoc = None self.player = player self.retry = 0 def startFishing(self): self.player.changeState(PLAYER_STATE.FISHING) while self.player.state is PLAYER_STATE.FISHING: self.castLure() def castLure(self): 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): 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") return else: self.logger.log("Trying again in 1 second...") self.retry += 1 time.sleep(1) self.findLure() self.lureLoc = res time.sleep(0.2) pyautogui.moveTo(res[0], res[1]) self.watchLure() def watchLure(self): self.retry = 0 self.logger.log("Waiting for fish...") while True: self.retry += 1 time.sleep(0.1) res = self.monitor.findMatch(self.fishingBobberImg) print(res) if (res != -1 and abs(res[1] - self.lureLoc[1]) > 20): pyautogui.click() time.sleep(0.5) return elif (self.retry > 200): return def run(self): self.logger.log("Starting fishing thread in 3 seconds...") 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.startFishing, args=(), name="fishing thread", daemon=True) self.fishingThread.start()