거상 매크로 제작기

macro_gif

본의 아니게 어그로를 끌게 되었는데 매크로 공부용으로 직접 거상에서 실험을 해보았다.

잘 작동하는 것을 확인하였다. 로직은 이전포스트 와 크게 다르지 않다. 당연히 코드는 공개하지 않을것이고 실험만 잠깐 해봤을 뿐 매크로를 사용하지 않고 있다.

먼저 매크로와 거상에 대해 잠깐 얘기해보고자 한다. 일단 본질적으로 거상은 게임서비스가 오래돼서 생기는 고질적인 문제점이 있는데 과도한 파워 인플레이션으로 RTS 장르의 게임임에도 불구 몹들의 방어력과 체력이 어마무시해졌고 이를 잡기 위해서 몇몇 플레이어 유닛들의 스킬 데미지가 같이 인플레이션 해서 어마무시해지면서 몬스터들을 사냥하는 것이 단 몇 초내로 스킬을 난사하여 끝나는 것을 무한반복하는게 컨텐츠가 되어버린 것이다.

Gersang_img

따라서 RTS 게임의 핵심가치인 실시간전략성 등의 재미는 낮아져 가치가 낮아지고 RPG의 강점만이 대두되게 된다.

결과적으로 매크로 마우스나 키보드를 통한 플레이로 몇초내의 사냥을 더 빠르고 손목에 무리가 덜 가게 하면서 끝낼 수 있게 되면서 매크로 하드웨어 유저나 매크로 유저들이 넘쳐나게 된다.

매크로는 왜 규제되지 않는가?

간단하게 말하면 가능은 한데 하드웨어를 통한 매크로 에를 들어 마우스나 키보드 사용은 잡아내기가 매우매우 힘들다.

이것들은 하드웨어 신호를 내는데 게임가드나 게임백신이 해당 플레이어의 모든 면을 감시하거나 컴퓨터 내 모든 리소스를 감시하는 과도한 권한을 마구잡이로 사용하지 않는한 불가능하다고 본다.

결과적으론 게임에서 매크로 마우스를 사용한 유저인지 일반 유저든 서버에는 똑같은 로그기록만 남는다.

그래서 이를 이용해 잡아내는 몇몇 게임들이 존재한다. 메이플스토리는 이 로그 데이터가 어느정도 규칙성을 뜬다 싶으면 냅다 유저인지 로봇인지 검증하는 메시지를 띄우고 틀리면 바로 계정정지를 먹을 수 있다.

문제는 오래된 게임들이 입력은 매크로 유저가 아니더라도 규칙성을 띄기 쉽고 서버에 로그 데이터를 뒤지는 것이 쉽지 않다는 것이다.

로그 데이터란

예전에 PUBG의 배틀그라운드 서버 로그 파일을 분석하는 친구가 있었는데 분석이 말그대로 매우 힘들었었다.

A라는 선수의 명중률을 알기 위해서 A라는 선수가 한 경기에서의 로그 데이터만 살펴보더라도 이런식이였다. 2022년 10월 11일 몇시 몇분 몇초 어느 총을 쏨 B플레이어가 맞음 xx의 데미지 이러한 단편적인 정보들만이 수없이 많은 로그파일로 이루어져있다.

심지어 총이 안 맞으면 총을 쏨 기록만 남는다. 전후 로그를 다 뒤져야 왜 총을 왜 쐈는지 알게 된다. 즉 명중률을 계산하려면 어그로를 위해 총을 쏜 것인지 동시에 몇사람을 상대한것인지 알수가 없다.

오직 A가 몇시몇분 총을 쏘고 누가 맞음 아니면 총을 쐈다는 기록을 시간에 따라 연속적으로 몇십개를 뒤져야 상황이 전반적으로 그려지게 되는 것이다. 정말 어떤 경우에는 누군가와 교전 의지 없이 총소리를 내기 위해 허공에 총을 쐈는지를 알 수 있는식이다.

말했듯이 서버는 모든 데이터를 서버에 교신하면 서버는 과부화로 터지기 때문에 꼭 필요한 데미지 교환 총을 쏨 총을 맞음을 실시간으로 처리하고 이에 대한 로그 데이터가 쌓이는 것이다.

마지막으로

이상현상이지만 앞서의 내용으로 하드웨어 매크로는 막기 쉽지 않기 때문에 오히려 매크로 마우스와 키보드의 매출이 증가한다.

그런데 굳이 꼭 이러한 하드웨어를 사야만 하드웨어 매크로를 할 수 있는 것은 아니다.

C언어는 이미 혼자서 하드웨어 신호를 만들 수 있고 매크로 하드웨어들도

lua_script

이러한 스크립트를 기타 언어로 컴파일해서 돌리는 것이기 때문이다.

따라서 python에도 ctypes모듈과 ‘DDDD94687.64.dll’를 이용하면 하드웨어 신호를 구현할 수 있다.

from ctypes import *
try:
    win = gw.getWindowsWithTitle('Gersang')[0]
except IndexError:
    print('거상 아직 안켜짐')
dd_dll = windll.LoadLibrary('./DD94687.64.dll')
def negong():
    # 1번 부대
    dd_dll.DD_key(201, 1)
    time.sleep(0.03)
    dd_dll.DD_key(201, 2)
    # R 스킬 사용
    dd_dll.DD_key(304, 1)
    time.sleep(0.03)
    dd_dll.DD_key(304, 2)

파이썬을 관리자 권한으로 실행해주면 다음과 같이 1번을 누르고 r키를 사용하는 것을 매크로화 할 수 있다.

이전포스트 와 합치면 대부분의 매크로가 가능해지는 것이다.

마지막으로 이런식으로 keyboard에 어느 키를 누르면 미리 만들어둔 하드웨어 매크로가 실해되게 하면

import keyboard
playing = True
while playing:
    if keyboard.is_pressed('f4'):
        pause=True
    while pause:
        time.sleep(0.002)
        if keyboard.is_pressed('q'):
            first()
        if keyboard.is_pressed('e'):
            skill(1)
        if keyboard.is_pressed('w'):
            fallback()
        if keyboard.is_pressed('f4'):
            pause = False
            break

이런식으로 하면 나만의 매크로 마우스 매크로 키보드 완성이다. first() 함수 예: 1번 r 2번 r 입력