POE(패스오브엑자일) 물약 자동 먹기 매크로
* 경고 *
해당 포스팅은 교육적인 목적입니다. 절대 악용, 남용 하면 아니되옵니다.
2019-06-14
해당 Post는 Arduino Pro Micro를 사용하여 매크로를 제작 했습니다. 그러나 Only Python 만으로도 가능 하더군요 … Only Python을 원하시는 분은 본 글을 가볍게 읽으신 뒤 아래 링크로 가보시기 바랍니다.
POE(패스오브엑자일) 물약 자동 먹기 매크로 (소프트웨어)
할로 ~! 라이프온룸 입니다.
저번 포스팅에서 아두이노 프로 마이크로를 이용해서 하드웨어 매크로를 만들어 봤죠 ?? ㅎㅎ
오늘은 그 매크로를 요즘 유행하는 겜인 패스오브엑자일에 적용해 보겠습니다.
먼저 어떤식으로 동작하는지 설명 드릴게요 ㅎㅎ
1. 어떻게 동작하는가 ?
- config.cfg 라는 파일을 만든 뒤 아래와 같이 입력합니다.
[portion_drink_delay] delay = 0.1 [portion_key] k_f2 = 1,2,3,4,5 m_right = 5 m_middle = 4
portion_drink_delay 섹션은 하드웨어 매크로가 Key를 여렇개 누를 때 두는 시간차 입니다. 즉 위 경우에 1, 2를 누른다고 치면 1을 누르고 0.1초 기다린 뒤 2를 누르겠다는 의미입니다.
portion_key 섹션에서는 특정 입력에 따라 누를 숫자키를 정의하고 있습니다.
k_f2 = 1, 2, 3, 4, 5 를 예로 들면 키보드 f2 를 누르면 하드웨어 메크로로 1, 2, 3, 4, 5 키를 누르라는 의미 입니다. 즉 f2를 누르면 1, 2, 3, 4, 5 가 0.1 초 시간 텀으로 입력됩니다.
k_f2 의 k는 Keyboard 라는 의미이며 m_right의 m은 Mouse 라는 의미입니다.
키보드의 경우 대부분의 키가 지원 되며 마우스는 left, right, middle 만 동작합니다.
- 코드를 관리자 권한으로 실행시킨 뒤 패스오브엑자일을 Play 합니다.
동작 방법을 알았으니 코드를 보겠습니다.
2. 코드
저번 Post 에서 serialFunc.py 를 만들었죠 ?? 그 폴더에 drinkPortion.py 라는 파일을 만들고 아래 코드를 입력해 줍니다. 아 그리고 config.cfg 파일도 만들어 주세요 ㅎ
import mouse as mo import keyboard as keys import time import serialFunc as sf import configparser import os try: ser = sf.ExternalHID('COM16') except Exception as e: print(e) print("Hardware Macro Disabled") def generateKeyEvent(val, key_s, delay): if val == True: for outVal in key_s: # hardware macro ser.keyboardInput(outVal) # software macro # keys.press(outVal) time.sleep(delay) def drinkPortionWithInput(listDevKeyOutVal, delay=0.001): listKeyState = [0] * len(listDevKeyOutVal) while True: for idx, dictDevVal in enumerate(listDevKeyOutVal): keyormo = list(dictDevVal.keys())[0] generateKeys = dictDevVal[keyormo].split(',') # [0] = k is keyboard [1] = pushed key if keyormo.split('_')[0].strip() == 'k': value = keys.is_pressed(keyormo.split('_')[1].strip()) if listKeyState[idx] != value: generateKeyEvent(value, generateKeys, delay) listKeyState[idx] = value # [0] = m is mouse [1] = pushed mouse btn elif keyormo.split('_')[0].strip() == 'm': possList = [mo.LEFT, mo.RIGHT, mo.MIDDLE] try: possList.index(keyormo.split('_')[1].strip()) except Exception as e: continue value = mo.is_pressed(keyormo.split('_')[1].strip()) if listKeyState[idx] != value: generateKeyEvent(value, generateKeys, delay) listKeyState[idx] = value if __name__=="__main__": configFile = os.path.dirname(os.path.realpath(__file__)) + '\\' + 'config.cfg' config = configparser.ConfigParser() config.read(configFile) itemList = [] for option in config.options('portion_key'): itemList.append({option:config['portion_key'][option]}) drinkDelay = float(config['portion_drink_delay']['delay']) print("macro start drink delay %s " % str(drinkDelay)) while True: time.sleep(0.001) drinkPortionWithInput(itemList, drinkDelay)
저의 경우 Pycharm에서 폴더의 구성은 다음과 같은데요
이런식으로 되어 구성이 되어 있는 상태에서 Pycharm에서 코드를 실행해 줍니다.
아 참 Pycharm을 관리자 권한으로 실행해줘야 합니다. ~~~~
또 코드를 보면 ExternalHID(‘COM16’) 문구가 있죠 ? 여기서 COM16은 시리얼 포트 번호를 의미합니다. 즉 아두이노 프로 마이크로의 COM port를 사용하면 됩니다.
그리고 라이브러리도 설치해 줘야해요 ! CMD 에서 아래 명령어로 설치해 주면 됩니다. Pycharm에서도 설치가 가능한거 다 아시죠 ~~~ ㅎㅎ
pip install keyboard pip install mouse pip install configparser
실행을 시키면 아래 문구가 나올거에요
macro start drink delay 0.1
그럼 이 상태에서 POE를 켜고 사냥 중에 마우스 오른쪽 버튼과 F2 번을 눌러보세요 ~~ 그러면 자동으로 물약이 먹어질 겁니다. !!
블로그 구독하기 !!
config.cfg파일은 어디다 어떻게 만드나요?
config.cfg 파일은 drinkPortion.py 파일이 있는 폴더 안에 만들어주심 됩니다. ㅋㅋ 그리고 빈 메모장을 열어서 본문 내용을 복사 한뒤 저장하고 파일이름을 변경하면 됩니다. ㅎ
오토핫키로 픽셀서치 이용해서 만들면 간단한데.. 이건 상당히 복잡하네요
사실 파이썬은 매크로를 위한 언어는 아니라서 코드가 좀 길어지는 경향이 있는것 같습니다 ㅎㅎ 물론 제가 잘 못짜서 그런 걸수도 있어요 ㅠ
안녕하세요.
글 여러번 읽어봤는데 잘 이해가 안되서요 이거 하려면 아두이노 프로 마이크로 있어야 하나요?