Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
15 kB
2
Indexable
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))