from inspect import walktree
from pickle import TRUE
from queue import Empty
from pyautogui import *
import pyautogui
import time
import keyboard
import random
import decimal
import os
import win32api, win32con #, win32gui
import cv2
from ahk import AHK
import pydirectinput
from time import sleep, perf_counter
from threading import Thread
ahk = AHK()
win = ahk.find_window(title=b'MapleMS')
win.move(x=300, y=300, width=1286, height=749)
win.activate()
sleep(0.2)
def scan_bot_map():
try:
return list(pyautogui.locateCenterOnScreen('bot_map.png', region=(308, 354, 600, 528), grayscale=False, confidence=0.9))
except Exception:
pass
def scan(img):
try: #list(pyautogui.locateAllOnScreen('stop.png')) becareful this is putting [0][0]
return list(pyautogui.locateAllOnScreen(img, region=(500, 645, 1282, 817), grayscale=True, confidence=0.7))
except Exception:
pass
def scanmyself(currentlocation):
currentlocation = cancel_exception(pyautogui.locateCenterOnScreen(currentlocation, region=(300, 616, 1583, 900), grayscale=True, confidence=0.7))
if currentlocation == 0:
currentlocation = cancel_exception(pyautogui.locateCenterOnScreen('look_left.png', region=(300, 616, 1583, 900), grayscale=True, confidence=0.7))
return currentlocation
else:
return currentlocation
def recovery(hp, mp):
if hp is True:
hpfound = pyautogui.pixelMatchesColor(570, 1033, (190, 190, 190))
while hpfound == True:
print("HP is less than 50%, using HP pot\n")
ahk.key_down('Del')
ahk.key_up('Del')
sleep(.5)
hpfound = pyautogui.pixelMatchesColor(570, 1033, (190, 190, 190))
if mp is True:
mpfound = pyautogui.pixelMatchesColor(680, 1033, (190, 190, 190))
while mpfound == True:
print("MP is less than 50%, using MP pot\n")
ahk.key_down('PgDn')
ahk.key_up('PgDn')
sleep(1)
mpfound = pyautogui.pixelMatchesColor(680, 1033, (190, 190, 190))
# commands isn't working yet...
def feed_pet(img): # pet region 550, 500, 1570, 900
try:
pet_stats = pyautogui.locateCenterOnScreen(img, region=(500, 645, 1280, 817), grayscale=True, confidence=0.8)
# a = cancel_exception(pet_stats)
# print(pet_stats)
if pet_stats[0] > 0:
ahk.key_press('F8')
sleep(5)
if pet_stats[0] == None:
print("Pet is not hungry - Trying to command...\n")
# Pet command:
pet_commands = ["sit", "poop", "no", "bad", "badboy", "cutie", "adorable", "cute", "pretty", "iloveyou", "loveyou"]
ahk.key_down('Enter')
sleep(0.15)
ahk.key_up('Enter')
sleep(0.5)
ahk.type(random.choice(pet_commands))
sleep(1)
ahk.key_down('Enter')
sleep(0.15)
ahk.key_up('Enter')
sleep(0.15)
ahk.key_down('Enter')
sleep(0.15)
ahk.key_up('Enter')
sleep(0.1)
except Exception:
pass
# not using it, not working properly...
# def att_mob(direction):
# # es = pyautogui.locateCenterOnScreen(img, region=(578, 617, 1341, 869), grayscale=True, confidence=0.7)
# # mob = scan(mob)
# # mob = cancel_exception(mob)
# # mycur = scanmyself('look_right.png')
# try:
# if direction == 'right':
# pydirectinput.keyDown('right')
# pydirectinput.keyUp('right')
# pydirectinput.keyDown('c')
# pydirectinput.keyUp('c')
# pydirectinput.keyDown('c')
# pydirectinput.keyUp('c')
# sleep(0.01)
# elif direction == 'left':
# pydirectinput.keyDown('left')
# pydirectinput.keyUp('left')
# pydirectinput.keyDown('c')
# pydirectinput.keyUp('c')
# pydirectinput.keyDown('c')
# pydirectinput.keyUp('c')
# sleep(0.01)
# else:
# tele()
# except Exception:
# pass
# not really using this for image detection, only works when mobs are detected and not in body...
# def definemylocation(mob, mob1):
# # mob = cancel_exception(scan(mob))
# try:
# gathered = scan(mob)
# gathered1 = scan(mob1)
# gathered.sort()
# gathered1.sort()
# # print(gathered, gathered1)
# myList = [gathered[0][0], gathered1[0][0]]
# m1 = cancel_exception(gathered[0][0])
# m2 = cancel_exception(gathered1[0][0])
# print(myList, mycur)
# s = min(myList, key=lambda x:abs(x-mycur))
# # ahk.mouse_move(x=x, y=gathered[0][1], speed=2, blocking=True)
# if m1 != 0 or m2 != 0:
# # if mycur == 0:
# # print("I unable to find myself")
# # randomwalk()
# # else:
# # randomwalk()
# if mycur < s:
# close = s - mycur
# if close <= 300:
# direction = 'Mob close within x300 facing right'
# print(direction, mycur, s)
# att_mob('right')
# else:
# close = mycur - s
# if close <= 300:
# direction = 'Mob close within x300 facing left'
# print(direction, mycur, s)
# directionSend = 'left'
# att_mob('left')
# else:
# randomwalkv2()
# except Exception:
# pass
# maybe for mage class only
# def tele():
# direction = ["left", "right"]
# choosen = random.choice(direction)
# sleep(0.05)
# pydirectinput.keyDown(direction)
# sleep(0.25)
# pydirectinput.keyDown('x')
# sleep(0.15)
# pydirectinput.keyUp('x')
# sleep(0.015)
# pydirectinput.keyUp(direction)
# sleep(0.05)
# print(f"I am going {direction}")
# removing since v2 is better?
# def randomwalk():
# if mycur < 900:
# direction = "right"
# elif mycur > 1100:
# direction = "left"
# else:
# direction = ["left", "right"]
# direction = random.choice(direction)
# # direction = ["left", "right"]
# holding = random.randint(80, 200)/100
# sleep(0.05)
# print(f'Mob not found, walking {direction}')
# pydirectinput.keyDown(direction)
# sleep(holding)
# pydirectinput.keyUp(direction)
# sleep(0.5)
def cancel_exception(x):
try:
if x == None:
return 0
if x[0] > 0:
return (int(x[0]))
# else:
# print(x)
except Exception:
pass
# future project, can set arrays for buttons
def refresh_buffs(btn):
for j in btn:
print(f"Pressing {j}")
pydirectinput.keyDown(j)
sleep(1.5)
pydirectinput.keyUp(j)
# sleep(0.5)
# pydirectinput.keyDown("shift")
# sleep(0.1)
# pydirectinput.keyUp("shift")
# sleep(0.5)
# pydirectinput.keyDown("ctrl")
# sleep(0.1)
# pydirectinput.keyUp("ctrl")
def walk(direction):
if previous == 0:
direction = direction
else:
randomwalkv2(1)
holding = random.randint(200, 350)/100
print(f"I am going {direction} for {holding} seconds")
pydirectinput.keyDown(direction)
sleep(holding)
if jump_att == True:
pydirectinput.keyDown('space')
pydirectinput.keyUp('space')
if jump_att == True:
for x in range(att_times):
print(f"I am attacking for {x}times")
pydirectinput.keyDown('c')
pydirectinput.keyUp('c')
sleep(0.05)
pydirectinput.keyUp(direction)
def randomwalkv2(n):
if n == 1:
previous = 0
direction = ["left", "right"]
direction = random.choice(direction)
holding = random.randint(80, 180)/100
print(f'Walking to {direction}')
pydirectinput.keyDown(direction)
sleep(holding)
if jump_att == True:
pydirectinput.keyDown('space')
pydirectinput.keyUp('space')
if jump_att == True:
for x in range(att_times):
print(f"I am attacking for {x+1} times")
pydirectinput.keyDown('c')
# # pydirectinput.keyDown('space')
# # sleep(0.1)
# # pydirectinput.keyUp('space')
#
pydirectinput.keyUp('c')
sleep(0.05)
pydirectinput.keyUp(direction)
def get_window_coordinates():
maple_window = pyautogui.getWindowsWithTitle("MapleMS")[0]
return maple_window.box
def logout(maple_window_box):
while True:
if not pyautogui.locateOnScreen("escape_menu.PNG", region=maple_window_box):
pyautogui.press("esc")
time.sleep(1)
ahk.click(1511, 984)
sleep(3)
os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0")
# define some settings for your bot
maple_window_box = get_window_coordinates()
hours = 3600
loops = 0
previous = 0 # testing this loops
stopped = False
start_time = time.time()
run_time = 3*hours # seconds, default 3 hours
buffs = True # if you want buffs before starting
buffs_btn = ["end", "ctrl", "shift"] # put correctly with "" and button inside e.g "end"
jump_att = True # if you want jump and att
att_times = 3 # how many times you want to attack, especially for Aran
hp_pot = True # use hp pot? default is 50%
mp_pot = True # use mp pot? default is 50%
has_pet = True # do you want to feed pet? put pet food on F8
pet_sad = 'pet_sad.png' # find pet's sad emotion, put .png
pause = False
# initial steps
refresh_buffs(buffs_btn)
feed_pet(pet_sad)
class myClassPots(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.start()
def run(self):
if stopped:
print("Stopped detecting HP/MP")
self.stop()
while hp_pot or mp_pot == True:
sleep(3)
recovery(hp_pot, mp_pot) # regen potions, first is HP and second is MP
print("Detecting HP/MP...")
class myClassPet(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.start()
def run(self):
if stopped:
print("Stopped detecting pet stats")
self.stop()
while has_pet == True:
sleep(120)
feed_pet(pet_sad)
print("Detecting pet stats...")
myClassPots() # starts detecting HP/MP different CPUs
myClassPet() # start detecting pet stats from different CPUs
while True:
if keyboard.is_pressed('1'): # if key '1' is pressed, good only when you need to take over
if pause != True:
print('You pressed 1, pausing 60s')
sleep(60)
pause = True
break
if keyboard.is_pressed('`'): # if key '`' is pressed
print('You pressed `, finish loops')
stopped = True
quit()
break
if time.time() > start_time + run_time:
logout(maple_window_box)
print(f" Bot Successfully Ran for {loops} loops. ")
break
if loops > 0:
if loops % 100 == 0:
refresh_buffs(buffs_btn)
#mycur = scanmyself('my_tag_aran.png') # not using, but this is your char medal screenshot
try:
bot_map = scan_bot_map() # bottom of the mini map
flag = 0
xt = 306 # top left corner of the mini map
yt = 352
xb = bot_map[0] # x of the bottom of the mini map
yb = bot_map[1]
percentleft = 2
percentright = 8
# print(f"I am inside try, ref {previous}")
pic = pyautogui.screenshot(region=(xt, yt, xb, yb) ) # search
width, height = pic.size # screenshot size
for x in range(0, width, 2): # scan every 2 pixels - width
for y in range(0, height, 2): # scan every 2 pixels - height
r, g, b = pic.getpixel((x, y)) # define rgb
if r == 255 and g == 255 and b == 136: # yellow dot, myself on mini map
flag = 1
# click(x+xt, y+yt)
mypos = x+xt # my x
# 384 468 e.g location
# print(xt, xb)
cal1 = xb - xt
# print(cal1)
cal2 = cal1 / 10
# # print(cal2)
# print(sorted([cal2*2, cal2*4]))
# print(cal2*2)
firsthalf =(xt + cal2*percentleft) # this is within 20%
secondhalf = (xt + cal2*percentright) # this is within 80%
if mypos < firsthalf:
print(f"I am at left side of the map at x{firsthalf}")
previous = +1
print(f"i am inside decision, ref: right, now showing: {previous}")
walk("right")
elif mypos > secondhalf:
print(f"I am at right side of the map at x{secondhalf}")
previous = +1
print(f"i am inside decision, ref: left, now showing: {previous}")
walk("left")
break
if flag == 1:
break
except Exception:
pass
randomwalkv2(0)
loops += 1
print(f"Loops completed: {loops}")
# get windows size
# def callback(hwnd, extra):
# rect = win32gui.GetWindowRect(hwnd)
# x = rect[0]
# y = rect[1]
# w = rect[2] - x
# h = rect[3] - y
# print("Window %s:" % win32gui.GetWindowText(hwnd))
# print("\tLocation: (%d, %d)" % (x, y))
# print("\t Size: (%d, %d)" % (w, h))