Professional Documents
Culture Documents
import numpy as np
import pyautogui as au
import time as t
import tkinter as tk
import gtts as gt
from pygame import mixer
import os
from PyQt5 import QtWidgets, QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import threading
import concurrent.futures
#create GUI
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(427, 446)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.Start = QtWidgets.QPushButton(self.centralwidget)
self.Start.setGeometry(QtCore.QRect(20, 30, 91, 81))
self.Start.setObjectName("Start")
self.Start.clicked.connect(self.start)
self.Stop = QtWidgets.QPushButton(self.centralwidget)
self.Stop.setGeometry(QtCore.QRect(130, 30, 91, 81))
self.Stop.setObjectName("Exit")
self.Stop.clicked.connect(self.stop)
self.Pause = QtWidgets.QPushButton(self.centralwidget)
self.Pause.setGeometry(QtCore.QRect(20, 120, 91, 81))
self.Pause.setObjectName("Pause")
self.Pause.clicked.connect(self.pause)
self.continue_2 = QtWidgets.QPushButton(self.centralwidget)
self.continue_2.setGeometry(QtCore.QRect(130, 120, 91, 81))
self.continue_2.setObjectName("continue_2")
self.continue_2.clicked.connect(self.con)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(240, 30, 151, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(240, 10, 171, 16))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 427, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def start(self):
self._running = True
self.Start.setText("Restart")
self.Start.update()
size = get_screen_size()
#print(size)
tmp = find_map()
cords = (tmp.left,tmp.top)
index = self.comboBox.currentIndex()
tmp = self.comboBox.itemText(index)
print(tmp)
create_overlay(cords,0.1,size)
left_map,screen,map_size,char_name,limit,visible,champ_movement,now,start =
search_for_char_init(tuple(cords), size, str(tmp))
resize_var_x,resize_var_y =
get_minimap_overlay_size_difference(tuple(cords),size,map_size)
global i
i = 0
while self._running:
i += 1
left_map,screen,map_size,char_name,limit,visible,champ_movement,now,start =
search_for_char_loop(left_map,screen,map_size,char_name,limit,visible,champ_movemen
t,now,start,resize_var_x,resize_var_y)
if i == 20:
Window.lift()
Window.attributes('-topmost', True)
i = 0
def stop(self):
exit()
def pause(self):
self._running = False
def con(self):
self.start()
def window():
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
def overlay_to_background(event):
i = 0
print("I m called")
Window.attributes('-topmost', False)
Window.lower()
def
get_minimap_overlay_size_difference(overlay_top_left,overlay_bottom_right,map_size)
:
overlay_x_size = overlay_bottom_right[0]-overlay_top_left[0]
overlay_y_size = overlay_bottom_right[1]-overlay_top_left[1]
x_const = overlay_x_size/map_size
y_const = overlay_y_size/map_size
return x_const, y_const
def overlay_dot(top_left,resize_var_x,resize_var_y):
overlay.create_oval(top_left[0]*resize_var_x-2,top_left[1]*resize_var_y-2,
top_left[0]*resize_var_x+2,top_left[1]*resize_var_y+2,
fill = "red",outline = "red",tags = "dots")
#finds users minimap by scaling the top left corner image untill found
def find_map():
left_map = None
scale_and_map_finder = cv.imread('find_map.png')
cv.imwrite('find_map_tmp.png', scale_and_map_finder)
index = 0
width = 50
height = 50
# print(width,height)
while left_map is None:
width += 5
height += 5 # have to make sure I make a square finder
left_map = au.locateOnScreen('find_map_tmp.png', confidence=0.55)
tmp = cv.resize(scale_and_map_finder, (width, height))
cv.imwrite('find_map_tmp.png', tmp)
# print(left_map)
index += 1
print(index)
if index > 55: # reset and go for smaller
width = 25
height = 25
index = 0
cv.imwrite('find_map_tmp.png', scale_and_map_finder)
# scale = width / (int(scale_and_map_finder.shape[1]))
return left_map
# cv2 stuff getting necesary images to use also matching the template
def get_processed_minimap(map_size,char_name,img):
img_rgb = np.array(img)
img_rgb = cv.cvtColor(img_rgb,cv.COLOR_RGB2BGR)
img_rgb = cv.resize(img_rgb, (map_size, map_size))
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('champs 40x40/' + str(char_name) + '_OriginalCircle.png',
0)
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED, None, template)
return img_rgb,img_gray,template,res
def update_stopwatch(seconds):
time_counter = np.zeros((200, 200, 3), np.uint8)
cv.putText(time_counter, "Last seen :" + str(seconds),
(20, 100),
cv.FONT_HERSHEY_SIMPLEX,
0.7,
(255, 255, 255),
2)
cv.imshow("stopwatch", time_counter)
cv.waitKey(1)
def take_screenshot_of_map(left_map,screen):
try:
im = au.screenshot(region=(left_map[0], left_map[1], screen[0] -
left_map[0], screen[1] - left_map[1]))
except:
im = False
print("SC failed")
pass
return im
def create_overlay(top_left,transparency,bottom_right):
global overlay
global Window
Window = tk.Tk()
size1 = bottom_right[0] - top_left[0]
size2 = bottom_right[1] - top_left[1]
text = "{}x{}+{}+{}".format(size1,size2,top_left[0],top_left[1])
Window.overrideredirect(True)
Window.title('Transparent window')
Window.geometry(str(text))
#Window.attributes('-alpha', transparency)
Window.wm_attributes('-transparentcolor', Window['bg'])
Window.attributes('-topmost', True)
overlay = tk.Canvas(Window,width = size1,height = size2)
#overlay.bind("<Enter>", overlay_to_background)
overlay.pack()
overlay.update()
def
search_for_char_loop(left_map,screen,map_size,char_name,limit,visible,champ_movemen
t,now,start,resize_x,resize_y):
# overide:
limit = 0.75
overlay.update()
im = take_screenshot_of_map(left_map, screen)
img_rgb, img_gray, template, res = get_processed_minimap(map_size, char_name,
im)
w = template.shape[1]
h = template.shape[0]
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
#print("max_val :", max_val)
#print("limit :", limit)
# print("size = ",map_size)
last = visible
visible = champ_found(max_val, limit)
if visible:
champ_movement.append(top_left)
img_rgb = dot(img_rgb, champ_movement)
draw_rectangle(img_rgb, top_left, bottom_right)
overlay.delete("always_delete")
overlay_draw_rectangle( top_left, bottom_right, resize_x,resize_y)
overlay_dot(top_left,resize_x,resize_y)
if last is False:
overlay.delete("dots")
before = now
now = t.perf_counter()
speak(now, before, 10)
update_stopwatch(0)
if not visible:
present = t.perf_counter()
last_seen_seconds = int(present - start)
update_stopwatch(last_seen_seconds)
if last:
start = t.perf_counter()
if last_seen_seconds >= 5:
champ_movement = []
return
left_map,screen,map_size,char_name,limit,visible,champ_movement,now,start
# https://docs.opencv.org/4.5.2/d4/dc6/tutorial_py_template_matching.html
#config:
times_found = 0
# endx
print(sys.argv)
ping = gt.gTTS(text="care", lang="en", slow=False)
ping.save("ping.mp3")
mixer.init()
mixer.music.load("ping.mp3")
window()
input("press enter to exit")