Compare commits

...

2 Commits

Author SHA1 Message Date
b8cd6a09ed bobber improvements 2024-09-14 23:52:23 -04:00
3fffad6a99 Fix fishing agent 2024-09-12 10:05:08 -04:00
10 changed files with 52 additions and 15 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -9,23 +9,31 @@ 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.fishingBobberImg = cv.imread("assets/fishing/bobbers/Bobber2.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.fail = 0
self.retry = 0
def startFishing(self):
self.player.checkConnection()
self.player.changeState(PLAYER_STATE.FISHING)
while self.player.state is PLAYER_STATE.FISHING:
if (self.fail > 5):
self.fail = 0
self.logger.log("Fishing failed too many times. Stopping fishing thread...")
self.player.changeState(PLAYER_STATE.IDLE)
return
self.castLure()
def castLure(self):
self.retry = 0
pyautogui.moveTo(2,3)
self.lureLoc = None
pyautogui.moveTo(50,50)
self.logger.log("Casting Lure.")
res = self.monitor.findMatchAndMoveToPosition(self.fishingIconImg)
if (res == -1):
@ -39,18 +47,20 @@ class FishingAgent:
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.fail += 1
self.logger.log("Took too long to find lure, retrying fishing from the beginning")
return
else:
self.logger.log("Trying again in 1 second...")
self.retry += 1
time.sleep(1)
self.findLure()
time.sleep(0.5)
self.lureLoc = res
time.sleep(0.2)
pyautogui.moveTo(res[0], res[1])
pyautogui.moveTo(self.lureLoc[0], self.lureLoc[1])
self.watchLure()
def watchLure(self):
@ -60,12 +70,16 @@ class FishingAgent:
self.retry += 1
time.sleep(0.1)
res = self.monitor.findMatch(self.fishingBobberImg)
print(self.lureLoc)
print(res)
if (res != -1 and abs(res[1] - self.lureLoc[1]) > 20):
if (res != -1 and abs(res[1] - self.lureLoc[1]) > 10):
time.sleep(0.2)
pyautogui.click()
time.sleep(0.5)
return
elif (self.retry > 200):
self.retry = 0
self.fail += 1
return
def run(self):

View File

@ -1,15 +1,16 @@
import time
import pyautogui
from threading import Thread
import pyautogui
from core.Logger import Logger
from core.Player import PLAYER_STATE
class IdlingAgent:
def __init__(self, playerAgent) -> None:
def __init__(self, monitor, playerAgent) -> None:
self.logger = Logger("Idling Agent")
self.idleTime = time.time()
self.idleThread = None
self.player = playerAgent
self.monitor = monitor
def checkIdleTime(self):
while self.player.state is PLAYER_STATE.IDLE:

View File

@ -6,14 +6,13 @@ from core.Player import Player, PLAYER_STATE
class MainAgent:
def __init__(self) -> None:
self.monitor = Monitor()
self.playerAgent = Player()
self.idlingBot = IdlingAgent(self.playerAgent)
self.playerAgent = Player(self.monitor)
self.idlingBot = IdlingAgent(self.monitor, self.playerAgent)
self.fishingBot = FishingAgent(self.monitor, self.playerAgent)
self.monitor.startScreenCaptureThread()
# Start idling agent at the construction of the mainAgent for now
self.idlingBot.run()
def startFishBot(self):
self.playerAgent.changeState(PLAYER_STATE.FISHING)
self.fishingBot.run()

View File

@ -45,6 +45,9 @@ class Monitor:
self.screenThread.start()
self.logger.log("Main Agent: Thread started")
def findBestMatchFromDir(self, dirPath):
pass
def findMatch(self, template, method = "TM_CCOEFF_NORMED"):
methodInt = getattr(cv, method)
res = cv.matchTemplate(self.screenshot, template, methodInt)
@ -53,7 +56,7 @@ class Monitor:
matchRatio = max_val * 100
self.logger.log(matchRatio)
if (matchRatio < 55):
if (matchRatio < 60):
self.logger.log("Cannot find matching result...")
return -1

View File

@ -1,5 +1,8 @@
import json
from enum import Enum
import time
import cv2 as cv
import pyautogui
from core.Logger import Logger
CONNECT_STATUS = Enum('CONNECT_STATUS', ["CONNECTED", "CONNECTING", "DISCONNECTED"])
@ -7,16 +10,33 @@ CLASSES = Enum('CLASSES', ['DRUID', 'MAGE', 'HUNTER', 'PRIEST'])
PLAYER_STATE = Enum('STATE', ['IDLE', 'FISHING', 'FARMING'])
class Player:
def __init__(self) -> None:
def __init__(self, monitor) -> None:
with open("config.json", encoding="utf-8") as jsonFile:
self.config = json.load(jsonFile)
self.isConnected = CONNECT_STATUS.DISCONNECTED
self.isConnected = None
self.idleThread = None
self.enterWorldButton = cv.imread("assets/menus/EnterWorldButton.jpg", cv.IMREAD_GRAYSCALE)
self.logger = Logger("Player Agent")
self.state = PLAYER_STATE.IDLE
self.monitor = monitor
self.playerClass = self.config["class"]
self.playerName = self.config["name"]
self.logger.log("Connected with " + self.playerName + " (" + self.playerClass + ")")
def checkConnection(self):
res = self.monitor.findMatch(self.enterWorldButton)
if (res == -1):
self.isConnected = CONNECT_STATUS.CONNECTED
else:
self.isConnected = CONNECT_STATUS.DISCONNECTED
self.logger.log("Player not connected attempting to connect...")
pyautogui.move(res[0], res[1])
time.sleep(0.4)
pyautogui.click()
time.sleep(5)
def changeState(self, newState):
self.state = newState