본문 바로가기
개발 연습/메이플랜드 매크로_파이썬

(파이썬연습) 메이플랜드 매크로 만들기2_미니맵 유저 인식 및 채널 이동하기

by 멍뭉부 2024. 2. 7.
728x90

안녕하세요.

지난번에 이어서 오늘은 파이썬 연습용 프로젝트의 일환으로,

메이플랜드 게임 내에서 다른 유저가 같은 맵에 등장했을 때 자동으로 채널을 변경하는 매크로를 만들어 보았습니다.

이 매크로의 작동 방식은 굉장히 간단합니다:

 

 

  1. 미니맵 상에서 다른 유저 (빨간 점)을 10초에 한 번씩 주기적으로 스캔합니다. 이 과정은 게임 내 미니맵에서 다른 플레이어의 존재 여부를 확인하는 "유저 감시 함수"에 의해 수행됩니다.
  2. 만약 다른 유저가 발견되면, 채널 변경을 위한 이동 수행합니다. 이 때 "채널 변경 함수"를 호출하여 자동으로 채널을 변경합니다.

 

소스코드

채널 변경 함수는 다음과 같이 구현되어 있습니다:

def change_channel():
    print("채널 변경 작업 수행중..")
    time.sleep(3.0)
    # 월드 언어 바꾸는 형식으로 채널 변경
    pyautogui.click(1681, 98)  
    time.sleep(1.5)
    pyautogui.click(1681, 175)
    time.sleep(1.5)

    # 'ch.png' 이미지를 화면에서 찾아 클릭한 이후 언어 변경 클릭
    ch_image_location = pyautogui.locateOnScreen("C:\\dump\\ch.png", confidence=0.7)
    if ch_image_location:
        ch_x, ch_y = pyautogui.center(ch_image_location)
        pyautogui.click(ch_x, ch_y)
        time.sleep(1.5)
    else:
        print("C:\\dump\\ch.png 이미지를 찾지 못했습니다.")

    # 최종 채널 변경을 위한 클릭들
    pyautogui.click(1081, 714)
    time.sleep(1.5)
    pyautogui.click(1072, 635)
    time.sleep(1.5)

    # 변경된 채널 확인을 위해 대기
    time.sleep(180)

 

 

[로직 설명]

ch.png

 

위 사진과 같이 월드 언어 변경하는 방식으로 채널을 변경하며, 위 ch.png 이미지를 통해 월드 언어에 한국어 혹은 영어로 비어있는 동그라미 버튼을 알아서 클릭하도록 해두었습니다.

 

 

유저 감지 및 채널 변경 호출 함수는 아래와 같습니다:

def check_for_channel_change():
    while True:
        # 미니맵의 특정 영역을 스크린샷
        screenshot_pillow = pyautogui.screenshot(region=(12, 67, 282 - 12, 374 - 67))
        screenshot = np.array(screenshot_pillow)
        screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)

        # 빨간 점(다른 유저)을 나타내는 이미지와 매칭 시도
        reduser_image = cv2.imread("C:\\dump\\reduser.png", cv2.IMREAD_COLOR)
        result = cv2.matchTemplate(screenshot, reduser_image, cv2.TM_CCOEFF_NORMED)
        threshold = 0.6

        # 매칭 결과가 임계값 이상이면 채널 변경
        if cv2.minMaxLoc(result)[1] >= threshold:
            print("C://dump//reduser.png 이미지가 발견되었습니다. 채널을 변경합니다.")
            change_channel()
        else:
            print("유저감지 되지 않음")

        time.sleep(10)  # 다음 스캔까지 10초 대기

 

위 코드에서는 미니맵에서 reduser 사진 (빨간 점)을 10초에 한번씩 감지합니다.

그리고 만약 빨간 점이 발견된다면 change_channel() 명령어를 통해 아까 먼저 설명드렸던 채널 변경 함수를 호출합니다. 

이거는 추후 메인 함수와 별개로 10초마다 한번씩 감지하도록 할꺼기 때문에 하기와 같이 쓰레드로 돌릴 예정입니다.

 

    # 메인 스레드와 별도의 스레드로 채널 변경 여부를 확인
    channel_check_thread = threading.Thread(target=check_for_channel_change, daemon=True)
    channel_check_thread.start()

 

이렇게 한번 해봤는데, 

다음번에는 사냥, 로프 이동 등으로 마무리 지을 예정입니다.

한번 더 말씀드리지만, 이거는 단순 연습용이라 실제 사용하진 못하며, 만약 사용하더라도 계정이 정지됩니다.

주의해주시기 바랍니다. 이 귀찮은 매크로 제작은 다음번에 마무리 짓도록 하겠습니다.

728x90