메이플스토리 매크로 만들기




안녕하세요

오늘은 메이플스토리 매크로에 대한

제작 포스트를 쓰도록 하겠습니다.


먼저 진행하기 앞서 찾아와주신

모든분들 정말 감사합니다.   :)


포스팅은 제작기에 대한 간략한 설명

어떠한 방식으로 만드는지, 제작후 영상,

마지막으로 테스트 스크립트 공개순으로 

포스팅 하였습니다.


시작하기전 당부의 말씀을 드리면 본 포스팅은 프로그램 배포는 하지 않습니다.

제작방법을 알려드리는 포스팅이며 제작방법에 대한 강의나 스크립트 의뢰는 가능합니다 :D



메이플 매크로


메이플스토리 매크로 제작이야기 - 1



사실 작년 초여름 이미 메이플 스토리 매크로를 제작했었고 제작내용에 관하여 포스트 한 적이

있었습니다. 하지만 한시적으로 소수인원을 대상으로 테스트정도만 진행하였고 포스트 글또한

금방 내려두었습니다.  그동안 메일이나 쪽지등으로 매크로를 공유받고 싶다는 요청의 연락을

매우 많이 받았었습니다만 개인적으로 답장을 보내드리지 못해서 죄송했습니다.


오늘은 단순히 메이플스토리 매크로를 만들고 그에관한 자료 공유 포스트가 아니라 직접만들고

제작당시 작성했던 소스를 공개할 예정입니다.   여기서 소스란 하나의 프로그램이 되기전,

즉 컴파일하기이전의 것으로 매크로가 어떻게 작동하는지 그 방법을 모두 살펴 볼 수 있습니다.


대부분의 매크로 만드시는분들은 개인적으로 쓰시거나 / 비싸게 팔거나 / 비공개 커뮤니티를 통해

공유하는 방식으로 사용합니다. 이유는 매크로 배포는 약관위반과 더불어  법률 위반이기 때문입니다.

또한 사용하는것 자체만으로도 약관상 위배 이기때문에 매크로의 제작및 사용여부는 본인의 판단하에

이루어져야 할것입니다. 




서론이 길었지만,

어쨋든 오늘 이포스트가 다 끝날때 쯤에는 들러주신 모든분들이

원하는 정보를 얻으시고 그 지식을 함께 공유해 나갈 수 있었으면 좋겠습니다.




메이플스토리 매크로 제작과정 - 2



첫째로 매크로는 AutoHotkey 를 이용해서 제작하려고 합니다.

가볍고 꽤 강력한 프리웨어로서 C를 기반으로두었기때문에 매크로 이외에도 그 쓰임새가 넓습니다.


둘째로 이번 제작을 해볼 게임은 " 메이플스토리 " 입니다.

워낙 유명한 게임이니 대부분 아시리라 생각합니다. 예전에 만들어둔 백업자료가 거의다 날라가고

남은게 이미지자료 정도 뿐이 안되서 빨리작업한데다가  많은분들이 쉽게 따라하실 수 있도록 하기

위하여 쉬운명령어들로만 구성하였습니다.


자동사냥 매크로가 단순하다 뛰어나다의 그 기준은

얼마나 예외옵션을 많이두는지 / 가독성이 얼마나 뛰어나는지, 에서 차이가 나게 됩니다.


예외옵션이란 매크로는 사용자가 입력한 명령에서 절대 벗어나지 않습니다.

하지만 모든상황에는 예외가 발생합니다. 이러한 예외처리를 해두지 않으면 그 상황에서

아무 입력이 안되어 정지하거나, 반대로 꼬여버리는 현상이 발생하게 됩니다.

혹은 예외옵션을 활용하여 인공지능인척(?) 도 가능합니다. 이런 활용적인부분은

나중에 따로 포스트 하도록 하겠습니다.


게임매크로는 뭐라해도 반응속도가 생명인만큼 가독성이 뛰어나야 우리가 원하는 속도의

매크로를 만들 수 가 있겠습니다 :) 소스를 보기좋게 정리하는것부터가 그 시작입니다.

그이후에야 알고리즘의 개선이나 서브루틴및 함수의 활용이 더해지는거라고 생각합니다.







아래는 이번주 제작했던 메이플스토리 매크로 영상 입니다.





메이플 스토리 매크로 제작은? - 3



사실은 매크로는 자신이 어떻게 만드냐에 따라 그 기능과 효율차이가 많이 납니다.

또한 스크립트에 많은 기능을 담을수록 힘들고 어려워 집니다. 


위 사진처럼 1000줄을 쓸수도.. 15000줄을 쓸수도 300줄을 쓸수도

그 기능에 따라 소스의 길이나 내용은 완전 달라집니다.


스크립트를 전부 공개하는것은 악용될 소지가 많아 영상처럼 테스트용으로 

작성했던 스크립트만 공개 하도록 하겠습니다. 해당 스크립트를 기반으로 다양한 기능을

추가해보시거나 소스를 응용하여 직접 만들어 보시는건 어떨까요? :)


오토핫키 스크립트 작성법이나 다른 스크립트 제작의뢰도 같이 받고있습니다.

이메일 : cai6452@naver.com







스크립트




Gui,3: +LastFound +AlwaysOnTop -Caption +ToolWindow 

Gui,3: Add, Button, x20 y10 w82 h16 gBop,Option

Gui,3: Add, Button, x20 y30 w82 h16 gBst,Start

Gui,3: Add, Picture, x0 y0 BackgroundTrans, C:\KHAN\Mps\bn.png

Gui,3: Show, x400 y100 w500 h357, Mps


Gui,1: Color, FFFAFA

Gui,1: Add, GroupBox, x11 y14 w250 h190 cgreen, Option

Gui,1: Add, GroupBox, x271 y14 w180 h85 cgreen, Sub Skill

Gui,1: Add, GroupBox, x271 y100 w180 h82 cgreen, Buff

Gui,1: Add, Text, x23 y47 w70 h20 , 사냥터

Gui,1: Add, Text, x23 y87 w100 h20 , 물약  f11/f12

Gui,1: Add, Text, x23 y117 w100 h20 , 탐지기 알림

Gui,1: Add, Text, x23 y167 w50 h20 , 주스킬

Gui,1: Add, Text, x153 y167 w50 h20 , 점프

Gui,1: Add, Text, x425 y39 w15 h20, /s

Gui,1: Add, Text, x425 y69 w15 h20, /s

Gui,1: Add, Text, x425 y122 w15 h20, /s

Gui,1: Add, Text, x425 y152 w15 h20, /s


Gui,1: Add, ComboBox, x101 y44 w150 h100 vBa, 또 다른 망각의길4|남겨진 용의 둥지1|준비중

Gui,1: Add, Radio, x121 y84 w50 h20 vR1, On

Gui,1: Add, Radio, x171 y84 w70 h20 , Off

Gui,1: Add, Radio, x121 y114 w50 h20 Group vR2, On

Gui,1: Add, Radio, x171 y114 w70 h20, Off

Gui,1: Add, ComboBox, x74 y164 w60 h80 vB1, Ctrl||Shift|Alt|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|f11

Gui,1: Add, ComboBox, x191 y164 w60 h80 vB2, Alt||Shift|Ctrl|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z


Gui,1: Add, CheckBox, x281 y36 w20 h20 vC1,

Gui,1: Add, CheckBox, x281 y66 w20 h20 vC2,

Gui,1: Add, ComboBox, x305 y36 w65 h60 vB3, a||b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

Gui,1: Add, ComboBox, x305 y66 w65 h60 vB4, a||b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

Gui,1: Add, Edit, x381 y36 w40 h24 vE1,10

Gui,1: Add, Edit, x381 y66 w40 h24 vE2,10


Gui,1: Add, CheckBox, x281 y119 w20 h20 vC3,

Gui,1: Add, CheckBox, x281 y149 w20 h20 vC4, 

Gui,1: Add, ComboBox, x305 y119 w65 h60 vB5, PgDn||PgUp|Home|End|Ins|Del|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

Gui,1: Add, ComboBox, x305 y149 w65 h60 vB6, PgUp||PgDn|Home|End|Ins|Del|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

Gui,1: Add, Edit, x381 y119 w40 h24 vE3, 60

Gui,1: Add, Edit, x381 y149 w40 h24 vE4, 60


Gui,1: Add, Button, x271 y185 w85 h20 gBld, Load

Gui,1: Add, Button, x366 y185 w85 h20 gBok, Ok


OnMessage(0x201, "WM_LBUTTONDOWN")

WM_LBUTTONDOWN() 

PostMessage, 0xA1, 2,,, A 

}

WinSet, Transparent, 205 , Mps

WinSet, Region, R35-35 W500 H357 0-0

Pause

return


Bop:

Gui,1: +LastFound +AlwaysOnTop -Caption +ToolWindow 

Gui,1: Show, x700 y400 h272 w576, option

WinSet, Transparent, 230 , option

WinSet, Region, R10-10 W576 H272 0-0

Gui,Submit,nohide

return


Bld:

IniRead, L_C1, C:/KHAN/Mps/save.ini, ini, C1, 0 

GuiControl,,C1, %L_C1% 

IniRead, L_C2, C:/KHAN/Mps/save.ini, ini, C2, 0 

GuiControl,,C2, %L_C2% 

IniRead, L_C3, C:/KHAN/Mps/save.ini, ini, C3, 0 

GuiControl,,C3, %L_C3% 

IniRead, L_C4, C:/KHAN/Mps/save.ini, ini, C4, 0 

GuiControl,,C4, %L_C4% 

IniRead, L_E1, C:/KHAN/Mps/save.ini, ini, E1, 0 

GuiControl,,E1, %L_E1% 

IniRead, L_E2, C:/KHAN/Mps/save.ini, ini, E2, 0 

GuiControl,,E2, %L_E2% 

IniRead, L_E3, C:/KHAN/Mps/save.ini, ini, E3, 0 

GuiControl,,E3, %L_E3% 

IniRead, L_E4, C:/KHAN/Mps/save.ini, ini, E4, 0 

GuiControl,,E4, %L_E4% 

IniRead, L_R1, C:/KHAN/Mps/save.ini, ini, R1, 0 

GuiControl,,R1, %L_R1% 

IniRead, L_R2, C:/KHAN/Mps/save.ini, ini, R2, 0 

GuiControl,,R2, %L_R2% 

IniRead, L_B1, C:/KHAN/Mps/save.ini, ini, B1, 0 

GuiControl,,B1, %L_B1% 

IniRead, L_B2, C:/KHAN/Mps/save.ini, ini, B2, 0 

GuiControl,,B2, %L_B2% 

IniRead, L_B3, C:/KHAN/Mps/save.ini, ini, B3, 0 

GuiControl,,B3, %L_B3% 

IniRead, L_B4, C:/KHAN/Mps/save.ini, ini, B4, 0 

GuiControl,,B4, %L_B4% 

IniRead, L_B5, C:/KHAN/Mps/save.ini, ini, B5, 0 

GuiControl,,B5, %L_B5% 

IniRead, L_B6, C:/KHAN/Mps/save.ini, ini, B6, 0 

GuiControl,,B6, %L_B6% 

return


Bok:

Gui, Submit, Hide

GuiControlget,E1

IniWrite,%E1%, C:\KHAN/Mps/save.ini, ini, E1

GuiControlget,E2

IniWrite,%E2%, C:\KHAN/Mps/save.ini, ini, E2

GuiControlget,E3

IniWrite,%E3%, C:\KHAN/Mps/save.ini, ini, E3

GuiControlget,E4

IniWrite,%E4%, C:\KHAN/Mps/save.ini, ini, E4

GuiControlget,B1

IniWrite,%B1%, C:\KHAN/Mps/save.ini, ini, B1

GuiControlget,B2

IniWrite,%B2%, C:\KHAN/Mps/save.ini, ini, B2

GuiControlget,B3

IniWrite,%B3%, C:\KHAN/Mps/save.ini, ini, B3

GuiControlget,B4

IniWrite,%B4%, C:\KHAN/Mps/save.ini, ini, B4

GuiControlget,B5

IniWrite,%B5%, C:\KHAN/Mps/save.ini, ini, B5

GuiControlget,B6

IniWrite,%B6%, C:\KHAN/Mps/save.ini, ini, B6

GuiControlget,R1

if R1 = 1

{

Settimer, Ma, 300

}

IniWrite,%R1%, C:\KHAN/Mps/save.ini, ini, R1

GuiControlget,R2

if R2 = 1

{

Settimer, Mb, 1000

}

IniWrite,%R2%, C:\KHAN/Mps/save.ini, ini, R2

GuiControlget,C1

if C1 = 1

{

Settimer, S1,%E1%000

}

IniWrite,%C1%, C:\KHAN/Mps/save.ini, ini, C1

GuiControlget,C2

if C2 = 1

{

Settimer, S2,%E2%000

}

IniWrite,%C2%, C:\KHAN/Mps/save.ini, ini, C2

GuiControlget,C3

if C3 = 1

{

Settimer, S3,%E3%000

}

IniWrite,%C3%, C:\KHAN/Mps/save.ini, ini, C3

GuiControlget,C4

if C4 = 1

{

Settimer, S4,%E4%000

}

IniWrite,%C4%, C:\KHAN/Mps/save.ini, ini, C4

GuiControlget,Ba

if Ba = 또 다른 망각의길4

{

Settimer, Aak, 300

Settimer, Mve1, 2500

Settimer, Upr1, 500

}

if Ba = 남겨진 용의 둥지1

{

Settimer, Bak, 230

Settimer, Mve2, 1000

Settimer, Upr2, 500

}

return


]::

pause

Sendinput, {%B1% Up}

return


Bst:

WinWait, MapleStory, 

IfWinNotActive, MapleStory, , WinActivate, MapleStory, 

WinWaitActive, MapleStory, 

WinMove, 0, 0

Settimer, cfm, 1800000

Settimer, Err, 600000

return




Aak:

Thread, Notimers

Gui, Submit, nohide

Imagesearch, vr, vt, 1, 1, 1024, 768, *63 C:\KHAN\Mps\nw.bmp

Imagesearch, vx, vy, vr-320, vt-250, vr, vt, *11 C:\KHAN\Mps\mv.bmp

If Errorlevel = 0

{

Sendinput, {Right Up}

Sendinput, {Left Down}

Sleep, 50

Sendinput, {%B1% Down}

Sleep, 1000

}

If Errorlevel = 0

{

Sendinput, {%B1% up}

}

Imagesearch, vr, vt, 1, 1, 1024, 768, *63 C:\KHAN\Mps\nw.bmp

Imagesearch, vx, vy, vr, vt-250, vr+320, vt, *11 C:\KHAN\Mps\mv.bmp

If Errorlevel = 0

{

Sendinput, {Left Up}

Sendinput, {Right Down}

Sleep, 50

Sendinput, {%B1% Down}

Sleep, 1000

}

If Errorlevel = 0

{

Sendinput, {%B1% up}

}

return



Mve1:

Thread, NoTimers

Imagesearch, va, vb, 117, 170, 157, 186, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, va, vb, 62, 147, 157, 167, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, va, vb, 92, 107, 157, 124, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, va, vb, 32, 127, 151, 144, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

Imagesearch, va, vb, 32, 170, 117, 186, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

return


Upr1:

Thread, NoTimers

Imagesearch, va, vb, 112, 170, 120, 186, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left Up}

Sendinput, {Right Up}

Sleep, 50

Sendinput, {Up Down}

Sleep, 50

Sendinput, {Up up}

Sendinput, {Right Down}

}

Imagesearch, va, vb, 146, 127, 157, 144, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Down Down}

Sleep, 50

Sendinput, {%B2% Down}

Sleep, 50

Sendinput, {%B2% Up}

Sleep, 50

Sendinput, {Down Up}

}

return



Bak:

Thread, Notimers

Gui, Submit, nohide

Imagesearch, vr, vt, 1, 1, 1024, 768, *60 C:\KHAN\Mps\nw2.bmp

Imagesearch, vx, vy, vr-320, vt-250, vr, vt, *14 C:\KHAN\Mps\mv2.bmp

If Errorlevel = 0

{

Sendinput, {Right Up}

Sendinput, {Left Down}

Sleep, 50

Sendinput, {%B1% Down}

Sleep, 1000

}

If Errorlevel = 0

{

Sendinput, {%B1% up}

}

Imagesearch, vr, vt, 1, 1, 1024, 768, *60 C:\KHAN\Mps\nw2.bmp

Imagesearch, vx, vy, vr, vt-250, vr+320, vt, *14 C:\KHAN\Mps\mv2.bmp

If Errorlevel = 0

{

Sendinput, {Left Up}

Sendinput, {Right Down}

Sleep, 50

Sendinput, {%B1% Down}

Sleep, 1000

}

If Errorlevel = 0

{

Sendinput, {%B1% up}

}

return


Mve2:

Thread, Notimers

Imagesearch, PX, PY, 39, 169, 72, 187, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

Imagesearch, PX, PY, 39, 145, 72, 166, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

Imagesearch, PX, PY, 39, 125, 56, 143, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

Imagesearch, PX, PY, 39, 108, 96, 125, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Left up}

Sleep, 50

Sendinput, {Right Down}

}

Imagesearch, PX1, PY1, 85, 169, 137, 187, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, PX1, PY1, 80, 145, 112, 166, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, PX1, PY1, 62, 125, 96, 143, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Right up}

Sleep, 50

Sendinput, {Left Down}

}

Imagesearch, PX3, PY3, 101, 128, 140, 166, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Up up}

Sendinput, {Right down}

Sleep, 50

Sendinput, {Down down}

Sendinput, {%B2% Down}

Sleep,50

Sendinput, {%B2% up}

Sleep,100

Sendinput, {Down Up}


}

return


Upr2:

Thread, NoTimers

Gui, Submit, Nohide

Imagesearch, PX2, PY2, 75, 174, 86, 187, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Up up}

Sleep, 50

Sendinput, {Left down}

Sleep, 50

Sendinput, {%B2% down}

Sleep, 50

Sendinput, {%B2% up}

Sleep, 200

Sendinput, {Up down}

Sendinput, {Left Up}

}

Imagesearch, PX2, PY2, 75, 157, 86, 164, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Up up}

Sleep, 50m

Sendinput, {Left down}

Sendinput, {%B2% down}

Sleep, 50

Sendinput, {%B2% up}

Sleep, 200

Sendinput, {Up down}

Sendinput, {Left up}

}

Imagesearch, PX2, PY2, 60, 134, 68, 144, *12 C:\KHAN\Mps\bs.bmp

If Errorlevel = 0

{

Sendinput, {Up up}

Sleep, 50

Sendinput, {%B2% down}

Sleep, 50

Sendinput, {%B2% up}

Sleep, 200

Sendinput, {Up down}

}

return




S1:

Thread, NoTimers

Gui, Submit, Nohide

Sleep, 100

Sendinput, {%B3% down}

Sleep, 50

Sendinput, {%B3% up}

return


S2:

Thread, NoTimers

Gui, Submit, Nohide

Sleep, 100

Sendinput, {%B4% down}

Sleep, 50

Sendinput, {%B4% up}

return


S3:

Thread, NoTimers

Gui, Submit, Nohide

Sleep, 50

Sendinput, {%B5% down}

Sleep, 50

Sendinput, {%B5% up}

Sleep, 4000

return


S4:

Thread, NoTimers

Gui, Submit, Nohide

Sleep, 50

Sendinput, {%B6% down}

Sleep, 50

Sendinput, {%B6% up}

Sleep, 4000

return



Ma:

Thread, NoTimers

Imagesearch, p1, p2, 340, 730, 365, 790, *10 C:\KHAN\Mps\h1.bmp

If Errorlevel = 1

{

Sendinput, {F11 down}

Sleep,50

Sendinput, {F11 up}

}

Imagesearch, p3, p4, 500, 750, 515, 790, *10 C:\KHAN\Mps\h2.bmp

If Errorlevel = 1

{

Sendinput, {F12 down}

Sleep,50

Sendinput, {F12 up}

}

return


Mb:

Thread, NoTimers

ImageSearch, VX, VY, 1, 1, A_ScreenWidth, A_ScreenHeight, *10 C:\KHAN\Mps\gt.bmp

If Errorlevel = 0

{

Soundplay, C:\KHAN\Mps\Collide.mp3

pause

}

return



cfm:

Thread, NoTimers

Urldownloadtofile, http://mynewblogcai2.blogspot.kr/2016/05/blog-post.html, C:\KHAN\Temp2.txt

Fileread, Int, C:\KHAN\Temp2.txt

Ifinstring, Int, 0x01

{

filedelete,C:\KHAN\Temp2.txt

}

else

{

filedelete,C:\KHAN\Temp2.txt

ExitApp

}

return


Err:

Sleep, 10000

return


GuiClose:

ExitApp

return


3GuiContextMenu:

ExitApp

return









로, 매크로만들기,매크로제작, 메이플,메이플스토리, 메이플 스토리, 메이플 매크로 메이플매크로, 매크로제작, 메이플매크로 만들기, 매크로 만들기,메이플스토리매크로메이플스토리매크로 메이플 스토리 매크로















Posted by Khan64
,