lastwartrucksearch/trucknim.py
2025-05-11 16:43:09 +02:00

323 lines
8.7 KiB
Python

import pygetwindow
import cv2
import mouse
from pynput.keyboard import Key, Listener
import time
import keyboard
import numpy as np
import pyautogui
import pytesseract
from threading import Thread
import win32gui
orgX = -10
orgY = 0
orgWidth = 1920
orgHeight = 1111
mouse_timeout_normal = 0.2
mouse_timeout_fast = 0.1
refresh_Y = 81
refresh_X = 1220
shareTruck_X = 1030
shareTruck_Y = 967
shareBox_Y = 355
shareBox_X = 696
confirmShare_Y = 647
confirmShare_X = 1040
truckItemBox_Y = 876
truckItemBox_X = 700
truckItemWidth = 60
truckItemHeight = 60
truckItemGap = 4
truckItemBoxWidth = 450
truckItemBoxHeight = 60
shareBoxItemHeight = 93
shareBoxItemWidth = 510
shareBoxItemGap = 14
scrollGap = 44
shareOffset= 40
truckOffSet = 15
truckScreen__min_X = 683
truckScreen_max_X = 1200
truckScreen_min_Y = 100
truckScreen_max_Y = 722
min_count_share = 3
threshold_urShard = .825
threshold_truck = 0.8
rangeOffset = 20
pictureFolder = './pictures/'
urShard = cv2.imread(pictureFolder+'ur_shard.png', cv2.COLOR_RGB2BGR)
urTruck1 = cv2.imread(pictureFolder+'urtruck1.png', cv2.COLOR_RGB2BGR)
urTruck2 = cv2.imread(pictureFolder+'urtruck2.png', cv2.COLOR_RGB2BGR)
srTruck1 = cv2.imread(pictureFolder+'srtruck1.png', cv2.COLOR_RGB2BGR)
srTruck2 = cv2.imread(pictureFolder+'srtruck2.png', cv2.COLOR_RGB2BGR)
nameBox_Y = 770
nameBox_X = 796
nameBox_Width = 280
nameBox_Height = 30
powerBox_X = 832
powerBox_Y = 831
powerBox_Width = 65
powerBox_Heigth = 22
min_shards = 3
min_shards_for_kor_chat = 3
checkServer = False
serverString = '#1004'
foundTrucks = []
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
class CustomThread(Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, verbose=None):
# Initializing the Thread class
super().__init__(group, target, name, args, kwargs)
self._return = None
# Overriding the Thread.run function
def run(self):
if self._target is not None:
self._return = self._target(*self._args, **self._kwargs)
def join(self):
super().join()
return self._return
def click(x,y,normal):
if normal:
mouse_timeout = mouse_timeout_normal
else:
mouse_timeout = mouse_timeout_fast
mouse.move(x,y)
time.sleep(mouse_timeout)
mouse.click()
time.sleep(mouse_timeout)
def pointIsOutside(pt):
return pt[0] < truckScreen__min_X or pt[0] > truckScreen_max_X or pt[1] < truckScreen_min_Y or pt[1] > truckScreen_max_Y
def pointInRange(pt, arr):
for [x,y] in arr:
if x-rangeOffset <= pt[0] and pt[0] <= x+rangeOffset and y-rangeOffset <= pt[1] and pt[1] <= y+rangeOffset:
return True
return False
def clickShare(x,y):
click(x,y,True)
click(confirmShare_X,confirmShare_Y,True)
click(shareTruck_X,shareTruck_Y,True)
def share_Truck(count,isServer):
click(shareTruck_X,shareTruck_Y,True)
shareShot = cv2.cvtColor(np.array(pyautogui.screenshot()),cv2.COLOR_RGB2BGR)
# cv2.imshow('ShareShot',shareShot)
# cv2.waitKey(0)
for j in range(0,1):
for i in range(0,4):
shareItem_X = shareBox_X
shareItem_Y = shareBox_Y + i*(shareBoxItemHeight+shareBoxItemGap)
#shareImage = shareShot[shareItem_Y:shareItem_Y+shareBoxItemHeight,shareItem_X:shareItem_X+shareBoxItemWidth]
# cv2.imshow('Shareitem', shareImage)
# cv2.waitKey(0)
if j == 0 and i == 0 and isServer and count < 4 :
clickShare(shareItem_X+shareOffset,shareItem_Y+shareOffset)
continue
if j == 0 and i == 1:
clickShare(shareItem_X+shareOffset,shareItem_Y+shareOffset)
continue
if j == 0 and i == 2 and count >= min_shards_for_kor_chat:
clickShare(shareItem_X+shareOffset,shareItem_Y+shareOffset)
continue
continue
content = pytesseract.image_to_string(shareShot[shareItem_Y:shareItem_Y+shareBoxItemHeight,shareItem_X:shareItem_X+shareBoxItemWidth])
def addResToLoc(res,loc):
resFlatten = res.flatten()
indSort = np.argsort(resFlatten)
indSort = indSort[::-1]
indSort = indSort[0:10]
# for index in indSort:
# print(resFlatten[indSort])
idx2d = np.unravel_index(indSort, res.shape)
# idx2d = idx2d[::-1]
# idx2d = idx2d[0:10]
for n_pt in zip(*idx2d[::-1]):
if pointInRange(n_pt,loc):
continue
if pointIsOutside(n_pt):
continue
#print(res[n_pt[1]][n_pt[0]])
if res[n_pt[1]][n_pt[0]] < threshold_truck:
continue
loc.append(n_pt)
if(len(loc) == 2):
break
def addLocations(locX,loc):
for pt in locX:
loc.append(pt)
def analyse_static_Truck(foundTrucks):
screenshot = cv2.cvtColor(np.array(pyautogui.screenshot()),cv2.COLOR_RGB2BGR)
truckLocations = []
loc1 = []
loc2 = []
loc3 = []
loc4 = []
res1 = cv2.matchTemplate(screenshot,urTruck1,cv2.TM_CCOEFF_NORMED)
res2 = cv2.matchTemplate(screenshot,urTruck2,cv2.TM_CCOEFF_NORMED)
res3 = cv2.matchTemplate(screenshot,srTruck1,cv2.TM_CCOEFF_NORMED)
res4 = cv2.matchTemplate(screenshot,srTruck2,cv2.TM_CCOEFF_NORMED)
t1 = CustomThread(target=addResToLoc,args=(res1,loc1))
t2 = CustomThread(target=addResToLoc,args=(res2,loc2))
t3 = CustomThread(target=addResToLoc,args=(res3,loc3))
t4 = CustomThread(target=addResToLoc,args=(res4,loc4))
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
addLocations(loc1,truckLocations)
addLocations(loc2,truckLocations)
addLocations(loc3,truckLocations)
addLocations(loc4,truckLocations)
checkedLocations = []
for location in truckLocations:
isServer = False
if pointInRange(location,checkedLocations):
continue
checkedLocations.append(location)
truckLocation_X = location[0] + truckOffSet
truckLocation_Y = location[1] + truckOffSet
count = 0
click(truckLocation_X,truckLocation_Y,False)
screenshot = cv2.cvtColor(np.array(pyautogui.screenshot()),cv2.COLOR_RGB2BGR)
itembox = screenshot[truckItemBox_Y:truckItemBox_Y+truckItemHeight,truckItemBox_X:truckItemBox_X+truckItemBoxWidth]
namebox = screenshot[nameBox_Y:nameBox_Y+nameBox_Height, nameBox_X:nameBox_X+nameBox_Width]
powerBox = screenshot[powerBox_Y:powerBox_Y+powerBox_Heigth, powerBox_X:powerBox_X+powerBox_Width]
# cv2.imshow('Powerbox', powerBox)
# cv2.waitKey(0)
# cv2.imshow('Namebox', namebox)
# cv2.waitKey(0)
name = pytesseract.image_to_string(namebox,config="--psm 7").strip()
power = pytesseract.image_to_string(powerBox,config="--psm 7").strip()
truckstring = name + ';' + power
print(truckstring)
# cv2.imshow('Itembox', itembox)
# cv2.waitKey(0)
if truckstring in foundTrucks:
continue
foundTrucks.append(truckstring)
for i in range(0,7):
truckItem_X = i*(truckItemWidth+truckItemGap)
truckItem_Y = 0
item = itembox[truckItem_Y:truckItem_Y+truckItemHeight, truckItem_X:truckItem_X+truckItemWidth]
# cv2.imshow('Item', item)
# cv2.waitKey(0)
res = cv2.matchTemplate(item,urShard,cv2.TM_CCOEFF_NORMED)
loc = np.where( res >= threshold_urShard)
for pt in zip(*loc[::-1]):
count += 1
print(count)
global checkServer
if checkServer:
isServer = serverString in truckstring
if count >= min_shards:
#click(shareTruck_X,shareTruck_Y,True)
share_Truck(count,isServer)
time.sleep(1)
keyboard.send('esc')
time.sleep(1)
click(refresh_X,refresh_Y,True)
time.sleep(2)
def on_press(key):
global break_program
if key == Key.f1:
print ('end pressed')
break_program = True
return False
# hwndMain = win32gui.FindWindow(None, "Last War-Survival Game")
# rect = win32gui.GetWindowRect(hwndMain)
# x = rect[0]
# y = rect[1]
# w = rect[2] - x
# h = rect[3] - y
# print("Window %s:" % win32gui.GetWindowText(hwndMain))
# print("\tLocation: (%d, %d)" % (x, y))
# print("\t Size: (%d, %d)" % (w, h))
foundTrucks = []
win = pygetwindow.getWindowsWithTitle('Last War-Survival Game')[0]
win.activate()
win.moveTo(orgX,orgY)
win.size = (orgWidth, orgHeight)
time.sleep(2)
break_program = False
# with Listener(on_press=on_press) as listener:
# while(not break_program):
while True:
analyse_static_Truck(foundTrucks)
# listener.join()