인벤에서 이 글을 쓰다가 날려먹은게 워낙 많아서
본인의 블로그인 http://kanoto.blogspot.kr/ 에서 작성하고 인벤으로 가져옵니다.

프로그래밍 지식이 없지만 애드온을 만들어보고싶은 의욕이 있다! 하는 분들을 위해
무엇부터 시작해야하는지 잘 모르겠다! 하는 분들을 위해
해당 글을 올립니다.


- 서론

와우를 플레이 하면서 다들 애드온을 사용해보셨을겁니다.

하다못해 흔히 사용하는
#showtooltip
/시전 헌신의 오라
/click ExtraActionButton1
와 같은 매크로라도 말이죠.

이런 애드온 또는 매크로는 게임을 편리하게 사용할 수 있게 해주지만 원하는 애드온을 만들기에는 너무 복잡하고 이를 배우기 위해서는 전문적인 프로그래밍 지식이 필요하다고 생각하시는 분들도 간혹 있습니다. 또는 '나는 할수있어!' 라고 생각하지만 무엇부터 시작해야할지 모르는 분들도 있지요.

'무언가 만들고 싶은 기능이 있지만 어떻게 해야하는지 모르겠다.' 라고 생각하는 분들을 위해 글을 작성하기 시작합니다.


▲뭔가 만들고 싶어 애드온을 열었지만 무엇부터 시작해야할 지 모르겠다!


해당 글은 예제 위주로 코드를 분석하며 애드온을 만드는 방법을 알려드리고자 합니다. 그러므로 기본적인 프로그래밍 교육과 순서가 다를 수 있습니다. 프로그래밍과 관련하여 원하는 정보가 없다고 생각되시면 댓글 또는 메일로 문의바랍니다. [kanoto.kr@gmail.com]


------------------------------------------------------------------------------------------


- 애드온의 작동 원리

먼저 우리가 흔히 알고있는 애드온이 어떻게 작동하는지를 보도록 하겠습니다.
원하는 기능을 사용하기 위해서. 즉, 애드온이 작동되기 위해서는 먼저 3가지 조건을 필요로 합니다.

1. 애드온이 작동 될 장소
2. 어떠한 조건에서 애드온이 작동될 것인가
3. 위 조건을 만족하면 어떤 기능을 수행할 것인가

입니다.

그리고 위와 같은 애드온을 만들기 위해서 우리는 월드오브워크래프트에서 제공하는 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)를 사용합니다. 쉽게말해 미리 만들어진 기능이라고 생각하면 됩니다.

예를들어 아래의 매크로를 와우 내에서 입력을 하면 1번 가방이 열리는 것을 알 수 있습니다.

/run ContainerFrame1:Show()

* 가방과 관련한 애드온을 사용하는 분들은 해당 매크로가 작동하지 않을 수 있습니다.
여기서 'ContainerFrame1'는 1번 가방의 UI를, 뒤의 ':Show()'는 해당 UI를 보여주겠다. 라는 뜻이죠.


▲마우스와 단축키를 사용하지 않고 매크로만을 이용해서 가방을 열어보았다.

이와 같이 미리 만들어진 여러 기능인 API를 이용하게 됩니다. 바꿔 말하면 API가 지원하지 않는 기능은 사용하지 못한다는 뜻이지만 일정 수준(자동 사냥 프로그램 급)을 넘어가지 않는 기능들은 대부분 API를 지원하므로 걱정하지 않으셔도 됩니다.
여기서 사용되는 언어는 'LUA'이며, 해당 언어에 맞는 문법을 사용해 우리는 애드온을 제작할 것입니다.
LUA어와 관련해서는 http://www.lua.org/ 를 참조하시길 바랍니다.

아직도 뭐가 뭔지 잘 모르겠다구요? 그냥 따라하면 되는겁니다. 이해는 나중에 해도 늦지 않아요.

- 전투 시작 시 초시계가 작동하는 기능

위에서 이야기 했던 애드온이 작동하는 조건을 쉽게 볼 수 있는 예제를 보겠습니다.
아래 코드는 전투 시작 시 초시계가 작동하는 매크로입니다.
* 여기서 초시계란 와우에서 기본적으로 제공해주는 초시계로 '/시계' 또는 '/초시계', '/stopwatch'를 입력했을 때 열리는 초시계를 의미합니다.

▲초시계는 이녀석입니다.

CreateFrame("Frame","cswf")
cswf:RegisterEvent("PLAYER_REGEN_DISABLED")
cswf:SetScript("OnEvent",function(self,event,...)Stopwatch_Clear();StopwatchFrame:Show();Stopwatch_Play() end)


먼저 첫째 줄 부터 보도록 하겠습니다.
CreateFrame("Frame","cswf") 는 첫 조건인 애드온이 작동 될 장소를 생성하는 것입니다.
여기서 "Frame"은 프레임의 종류를 의미합니다. Frame 외에 ScrollFrame, SimpleHTML, Slider, GameTooltip, Button 등 여러 종류가 있습니다. 자세한 내용은 'http://wowprogramming.com/docs/api/CreateFrame' 을 참조하도록 하고, 프레임의 종류에 관해서는 'http://wowprogramming.com/docs/widgets_hierarchy' 를 참조하면 됩니다.
다음의 "cswf"는 해당 프레임의 이름을 뜻합니다. 이 이름은 자유롭게 만들어도 되지만 되도록 와우 기본UI 또는 다른 애드온에서 사용될 프레임의 이름과 중복이 되지 않도록. 그리고 해당 프레임이 무엇을 의미하는지 명확하게 알 수 있는 이름을 사용하도록 합니다.

두번째 줄은 애드온이 작동할 조건을 뜻합니다.
':RegisterEvent(~)'는 앞의 cswf가 작동할 조건(이벤트)을 추가하는 것입니다.
뒤의 "PLAYER_REGEN_DISABLED"는 플레이어가 (전투 시작 등의 이유로) 자동회복을 하지 않을 경우 를 의미합니다. 이벤트의 종류는 'http://wowprogramming.com/docs/events'를 참조하면 됩니다.

세번째 줄은 애드온의 기능에 해당하는 부분입니다.
':SetScript(~)'는 cswf 프레임에 이러한 기능을 사용할 것이라고 선언을 하는 부분입니다. 관련 내용은 'http://wowprogramming.com/docs/widgets/Frame/SetScript'를 참조하면 됩니다.
앞의 "OnEvent"는 위의 RegisterEvent 에 등록한 조건에 의해 해당 프레임이 시작될 때 뒤의 기능을 사용한다는 뜻입니다.
마지막으로 'function ~ end'의 내용은 작동될 기능들입니다. 콜백 함수라고도 부르지만 프로그래밍 지식이 없는 분들은 그냥 '이런 모양이구나.'라고 생각하시면 됩니다.
Stopwatch_Clear() :: 초시계 초기화
StopwatchFrame:Show() :: 초시계 열기
Stopwatch_Play() :: 초시계 시작
위 내용들을 한번에 수행한다는 내용입니다.

자, 그럼 위 잘 작동되는지 확인해보겠습니다. 위 코드를 어떻게 사용해야 할 지 모르겠다는 분들은 2번 글을 참조해주시길 바랍니다.
* 위 코드를 실험하기 위해서 각 줄 앞에 다음과 같이 '/run'을 추가한 뒤 게임 내 매크로로 사용해도 작동합니다.

/run CreateFrame("Frame","cswf")
/run cswf:RegisterEvent("PLAYER_REGEN_DISABLED")
/run cswf:SetScript("OnEvent",function(self,event,...)Stopwatch_Clear();StopwatchFrame:Show();Stopwatch_Play() end)




새로운 전투가 시작될 때 마다 초시계가 초기화 되면서 잘 작동하는 걸 볼 수 있습니다. 초시계가 닫혀있으면 새로 열어주기까지 하지요.
만약 '전투가 끝나면 초시계를 멈추게 하고 싶다'면 이론상으론 위 내용에서 2번의 조건에 '(전투가 끝나는 등의 이유로)자동 회복이 시작될 때' 라는 조건과 3번의 기능에 '초시계가 멈춘다' 라는 기능을 추가해주시면 되겠지요.
해당 코드는 '조건문'을 소개한 뒤 말씀드리겠습니다.


이렇게 위 3가지 조건만 잘 숙지한다면 기존의 애드온을 상황에 맞춰 조금씩 바꾸어 자신이 원하는 애드온으로 바꾸거나 새로운 애드온을 만들 수 있을 것입니다.

------------------------------------------------------------------------------------------

여기까지 애드온이 어떻게 작동되는지를 확인하였습니다.
애드온을 만드는게 어렵다고 생각하시는 분들에게 많은 도움이 되길 바라며, 꾸준히 작성하도록 하겠습니다.

- 2015.03.20 게시글 첫 작성