U E D R , A S I H C RSS

WOW Add On/2011년프로�트/초성퀴즈



1. 목�


2. 과정


2.1. Lua 설치 � 셋팅

WOW� 애드온� Lua나 Ruby와 같� 스�립트 언어를 사용하는것으로 알고있다.

그래서 Programming in Lua�는 책� �서관�서 빌려왔다. 아마 빌려온지 1주�� �겠지.

Lua 개발환경� 셋팅하는� 좀 걸렸다.

Lua-Eclipse를 받아서 깔고. (LunarEclipse�는 것� 있단다)


Eclipse�서 Java외� 다른것� �리려면 당연 �터프리터나 컴파�러를 설치해주어야 한다. 그래서 Lua를 설치하려했다. LuaProfiler나 LuaInterpreter를 설치해야한다는� �통 �어를 못�겠다 나� 무�함� 들어났다.

여튼 어찌어찌해서

http://luaforge.net
�서 루아 Windows �스톨러를 받아서 설치하게�다.

5.1.4-35 2010-04-07 13:09
LuaForWindows_v5.1.4-35.exe

�호. 설치.

설치ë�œê²½ë¡œë¥¼ ë”°ë�¼ Eclipseì�˜ Profilerë§�ê³  Interpreter로 lua.exe로 path를 설정해주면 Eclipseì—�서 Project를 만든뒤 ìœë ¥ë�˜ëŠ” Lua파ì�¼ì�„ 볼수 있다.

2.2. �바�서 초성빼오기


WOW애드온 초성퀴즈를 만들기위함�기 때문�.

당연히 한글� 초성� 빼올수 있어야한다.

그래서 찾아봤�니 UTF-8방�으로 빼올수 있다고 한다.

근� ��한� UNICODE�서 계산해서 빼오�구만.
추가 : 알고보니 UNICODE를 �함하는 방�중 하나�고한다. 근� � 모르겠는�... U-00000800 - U-0000FFFF 범위� 들어간다고 하는�??
아악 모르겠어!! 그래서 추가로 ��를 걸어본다.

http://blog.naver.com/declspec?Redirect=Log&logNo=10092640244
http://divestudy.tistory.com/8
��가 안없어지길.

우선 �바 코드는 다�과 같다.
/////////////////////////////////////////////
package utfencoding;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UtfEncoding {

final static char[] first = {
'ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','�','ㅂ','ㅃ','ㅅ','ㅆ','o','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','�','ㅎ'
};
final static char[] middle = {
'�','�','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅠ','ㅘ','ㅛ','ㅙ','ㅚ','ㅜ','�','ㅞ','ㅟ','ㅡ','ㅢ','ㅣ'
};
final static char[] last = {
'\0','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄽ','ㄾ','ㄿ','ㅀ','�','ㅂ','ㅄ','ㅅ','ㅆ','o','ㅈ','ㅊ','ㅋ','ㅌ','�','ㅎ'
};

/**
  • @param args
  • /
public static void main(String[] args) {
String temp = "ë°”";

char a = temp.charAt(0);
a = (char) (a - 0xAC00);
int cho = a/21/28;
int joong = ( (a %(21*28))/28);
int jong = (a%28);
System.out.println(""+ (char)firstcho + (char)middlejoong + (char)lastjong);
}

}
////////////////////////////////////////

보면 알겠지만 �바�서 작성�는건 UNICoDE�다(아마�?)

현재 Eclipse개발환경중 문� Encoding� UTF-8방��다.
거기서 한글� 빼온후 UTF-8� 따� 0xACC00 (<- UTF-8시작) � 빼고 초성 중성 종성� 다�으로 빼온다

초성 = (�문� /21 /28)
중성 = ( (�문�%(21*28))/28)
종성 = ( a%28)

�렇게 하고 문� 규칙� 따� 빼온다.
규칙� 위� 코드를 보면 알수 있다.

2.3. 첫 와우 Addon 만들기


첫 와우 Addon� 제작하게 �었다.
�름하야 Hello WoW!!

천리길� Hello World!부터�는 지론� 따�
어떻게 연��는지를 살펴보겠다.

기본 프로그램 정보를 담고있는 *.toc파�.
그리고 UI와 LUA를 Mapping 시켜주는 *.xml
그리고 연산� 해주는 *.lua

작성� 해보�

기본�으로 "/World of Warcraft/interface/addons/애드온명" 으로 ��가 만들어져있어야한다.

그리고 HelloWoW.toc으로 기본설정� 잡아야하고
toc� 정보를 넣어주어야한다.
HelloWoW.toc

HelloWoW.xml
HelloWoW.lua

Interface�는 현재 버전 정보가 들어가있다.
http://www.wowwiki.com/Getting_the_current_interface_number
로 현재 �터페�스 정보를 알아볼수 있다.
내가 작성하는건 4.2니까 40200�겠지 �터페�스 정보를 갱신안해놓으면 와우 애드온 로드시 '구버전'으로 제대로 로드가 안� 수 있다.

Title� �작대로고
노트는 그냥 설명�고
Author� 있�.

HelloWoW.xml

<UI xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui">
<script file="HelloWoW.lua"/>
<Frame name="HelloWoWFrame">
<Scripts>
<OnLoad>
HelloWoW_ShowMessage();
</OnLoad>
</Scripts>
</Frame>
</UI>


HelloWoW.lua

function HelloWoW_ShowMessage()
message("Hello WOW!");
end

WoW API function� lua� 넣어준�� 없지만 ��으로 �나보다.
신기한�?

�렇게 작성하면 Hello WOW!가 뜬다.

2.4. WOW API를 �용해서 아�템 �름� 불러오�!


WOW는 WOW API를 소개해주는 wiki를 가지고 있고 API를 가보면 다양한것들� 있다.
http://www.wowwiki.com/World_of_Warcraft_API
�한 Widget과 LuaFunction� 사용정보를 볼수 있다.

여기서 아�템 초성 퀴즈� 기본� 아�템 �름 DB를 검색할수 있어야한다. 근� WOW아�템� 현재 아�템 넘버만 7만� 넘는다. 중간중간 비어있는 index� 있다. �게 뭥미. 아마 suffix때문�것으로 예��다. suffix란 아�템� 부가�으로 붙� 옵션� item index�수치화 한것� 부르는 ��� 그것� 따� 아�템� index가 결정�는것 같��. (아� 정확히는 모른다)

그리고 아�템 리스트를 한꺼번� 뽑는것� 지�해주는 것� 아니�서 누구드�, 블루아�템 같� 애드온� 심지어 아�템 ID와 �시 정보까지 구해놓고 있�만.. 까보고 놀�네.

와우 게임정보 공� 사�트� 가면 아�템� 50760개�고 나와있다.
4.2 전율하는 불�땅� 아�템� 공개 후� 업��트 �것�다.


저 번호� 아�템 넘버를 넣으면 해당 아�템 정보가 들어가있는 페�지로 ��하게 �다. DB를 WOW안�서와 웹페�지 똑같� 관리 하는것 같�� �렇게 똑같� �있으니까 좋다. 사실 Addon�서 페�지�서 하나 빼오는걸로 ��했지만 가장 좋다고 ��하는것� 블루아�템과 누구드�처럼 아�템 �름� 보관해놓고 Addon� �려보는것� 정신건강� �로울것��고 ��했다.

아� WOW addon� 대해서 모르는것� 있고. WOW�서 사용하는 몇몇 �료구조가 특�한건 알겠다. 젠장. Item� 뭔 부가정보가 그렇게 많� 붙어!! 여튼 그것� 대해서는 한번 다시 다루어보아야겠다.

HelloWoW를 수정해서 만든것� 한번 다시 보�

function HelloWoW_ShowMessage()

local baseName
local count = 1
local base = {}
baseName = GetItemInfo(25)
for i=25, 70000 do
baseName = GetItemInfo(i)
if count > 10000 then
break
end

if baseName ~= nil then
basecount = baseName
count = count+1
end
end
for i = 1, #base do
print(basei)
end
end

ìš°ì„  ì�¼ë‹¨ ì•„ì§� ì•„ì�´í…œ 번호는 7ë§Œì�„ 넘지 않는다 wowì•„ì�´í…œì •ë³´ì—� 관한건 나중ì—� 조사하기로 하고 그래서 i 는 와우 ì�¼ë°˜ itemì�˜ 최소 시작값ì�¸ 'ë‚¡ì�€ì‡¼íŠ¸ë‹¨ê²€' 25부터 시작해서 1만개ì�˜ ì•„ì�´í…œì�„ 검색해서 baseí…Œì�´ë¸”ì—� 한개씩 저장해서 ìœë ¥í•œë‹¤.

결과는 잘�다. 조금 �리겠지만 �걸 DB화해서 저장해놓았다가 해� 좋�듯 한다. 최�화따윈 우선 버리고 해보�.


수정 했다

아�템 정보 25번 부터 7만 사�� 랜�변수를 불러와서
ì•„ì�´í…œ ì •ë³´ê°€ 나온다면 ìœë ¥!
아�템들� 모� 가져오는것 보단 빠르다. 안전하진 않지만..

function HelloWoW_ShowMessage()

local baseName = nil

repeat
i = random(25,70000)
baseName = GetItemInfo(i)
until baseName ~= nil

print(baseName)
end


� 그럼 파싱� 해보�

2.5. Lua�서 초성빼오기


결국 초성� 빼오게 �었다
황현� 준 UTF-8로 첫 바�트로 뒤� 몇바�트를 차지하는 문��지 보여주는 �표를 가지고 Lua로 바꾸어보았다.

헤� 바�트� 값� 범위로 한 UTF-8 글�� 바�트 수 알아내기

00000000 ~ 01111111 : 1 byte (0 ~ 127)
11000000 ~ 11011111 : 2 bytes (192 ~ 223)
11100000 ~ 11101111 : 3 bytes (224 ~ 239)
11110000 ~ 11110111 : 4 bytes (240 ~ 247)
11111000 ~ 11111011 : 5 bytes (248 ~ 251)
11111100 ~ 11111101 : 6 bytes (252 ~ 253)

아래 함수는 문�열� 들어오면 몇 byte를 차지해주는지 알려주는 함수�다
function charLen(str)
	calc = string.byte(str:sub(1,1))
	--lua�서 byte로 char형� 변환하면 0��� 나온다.
	if(calc >= 0 and calc <= 127) then return 1
	elseif(calc >= 192 and calc <= 223) then return 2
	elseif(calc >= 224 and calc <= 239) then return 3
	elseif(calc >= 240 and calc <= 247) then return 4
	elseif(calc >= 248 and calc <= 251) then return 5
	elseif(calc >= 252 and calc <= 253) then return 6
	else return 0
	end			
end

다시한번 �하�면 한글� 3byte�다.
�제 3byte를 찾�수 있으니 �문과 특수문�가 섞여있어� 초성만 뽑아내는�는 아무 문제 없�것�다.
� �제 한글� 받아와서 초성만 뽑아 보�.
~lua
Chosung = {"ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","�","ㅂ","ㅃ","ㅅ","ㅆ","o","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","�","ㅎ"};
Middle = {"�","�","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅠ","ㅘ","ㅛ","ㅙ","ㅚ","ㅜ","�","ㅞ","ㅟ","ㅡ","ㅢ","ㅣ"};
Last = { "\0","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄽ","ㄾ","ㄿ","ㅀ","�","ㅂ","ㅄ","ㅅ","ㅆ","o","ㅈ","ㅊ","ㅋ","ㅌ","�","ㅎ"};	

function samplingFirst(str)
	-- 1110xxxx 10yyyyzz 10zzwwww
	local first = string.byte(str:sub(1,1)) - 224  -- 1110xxxx
	local second = math.floor((string.byte(str:sub(2,2)) - 128)/4) 
	local third = math.floor((string.byte(str:sub(2,2))%4)*4 + (string.byte(str:sub(3,3)) - 128)/16)
	local fourth = math.floor(string.byte(str:sub(3,3))%16)
		
	local unicode = first * 16* 16* 16 + second * 16 * 16 + third * 16 + fourth
	unicode = unicode - 0xAC00
	local cho = math.floor(unicode / 21/ 28)
	local goong = math.floor((unicode % (21*28))/28)
	local jong = math.floor((unicode % 28))

	return Chosung[cho+1];	
end

�제 한글 문�열� 집어넣는다면 초성만 빼와주는것� 발견할수 있다. Lua�서 초성 ㄱ� 3byte로 ���기 때문� �릭터형 'ㄱ'으로 �싸면 환경� 따� �러가 날수 있다. 따�서 문�열 " "로 �싸주었다.

ì�´ì œ ì�´ê²ƒì�„ ì�´ìš©í•˜ì—¬ "카르가스\:ì–¼ë�¼ì�´ì–¸ìФ\:Aldiana"를 한글ì�€ 초성만 뽑고 ê·¸ 외는 그냥 보존해서 ìœë ¥í•´ 보는것ì�„ 연습해보ìž�

~lua
function cstc(len, str)
	return {type = len, body = str}; 
end

function makingTable(str)
	
	stringtable = {}
	for i = 1, #str do
		len = charLen(str:sub(i,i))
		if len ~= 0 then -- �거 안좋��..
			stringtable[#stringtable+1] = cstc(len, str:sub(i,i+len-1))
		end		
	end
		
	chosungtable = {}
	for i, v in ipairs(stringtable) do		
		if v.type == 3 then
			chosungtable[#chosungtable+1] = cstc(v.type, samplingFirst(v.body)) 
		else 
			chosungtable[#chosungtable+1] = cstc(v.type, v.body)
		end
	end
	
	return stringtable, chosungtable
end


local a = "카르가스\:얼��언스\:Aldiana"
t,x = makingTable(a)
for i, v in ipairs(t) do
	print(v.type .. " " .. v.body)
end
for i, v in ipairs(x) do
	print(v.type .. " " .. v.body)
end

ìœë ¥ê²°ê³¼ :
카르가스:얼��언스:Aldiana
ㅋㄹㄱㅅ:ㅇㄹㅇㅇㅅ:Aldiana

� 아�템 목�� 불러왔고 초성� 빼왔으니 합치는걸로 가보�

2.6. WOW Slash Command


와우�는 SlashCommand가 있다. 그게 ��면..

/명령어 란 것�다.

Addon� 만들고 초성퀴즈는 SlashCommand로 시작하게 할려고한다.

/초성퀴즈 시작 30
하면 30개� 문제가 진행�다.

�외�� 기본셋팅� 필요하기� 하고 진행 시나리오� 짜야하지만 우선 SlashCommand로 작�시켜보�.

SlashCommand� 등�시키는것� 알아보�.
~lua
function HelloWoW_OnLoad(self)
	SLASH_HelloWoW1 = '/hiw';
	SLASH_HelloWoW2 = '/hellow';
	SLASH_HelloWoW3 = '/HelloWOW';
	SlashCmdList["HelloWoW"] = function (msg)
         	   HelloWoWF(msg)
	end
end

function HelloWoWF(msg, editbox) -- 4.
	print("Hello WOW")
end

와우 입력 :/hiw
와우 시스템 ìœë ¥ : Hello WOW
SlashCmdList["애드온명"] = function(msg) 를 하고
SLASH_애드온명# = '/명칭'으로 변수를 설정해주면
WOW�서 '/명칭' 명령어는 msg를 들고 function으로 들어가게 �다.

위� 예제�서는 3개� 명칭� 있는것�다

SLASH_HelloWoW1 = '/hiw';
SLASH_HelloWoW2 = '/hellow';
SLASH_HelloWoW3 = '/HelloWOW';

�� 실행하면 같� 결과가 나오는것� 알수 있다.

다�� 할�� String 파싱으로 시나리오를 꾸며보�.

2.7. CommandMessageParsing


ìž� 슬래시 커맨드를 통해 받아온 msg를 ìœë ¥í•´ë³´ê³ 
parsing해서 �하는 문�만 뽑아보�.

실행 ��때를 위해서 실행�고 있는지 않는지� 대한 flag를 넣어봤는�
Addon� �재�면 해당 프로그램 전체가 올�간것�기 때문� WOW 메모리� 할당� �있다. 따�서 Addon�서 flag는 따로 메모리를 할당 받았다는 얘기. 따�서 전역 변수는 addon� 함수 어디서든 접근� 가능하단 소리가 �다.

~lua
SLASH_HelloWoW1 = '/hiw';
SLASH_HelloWoW2 = '/hellow';
SLASH_HelloWoW3 = '/HelloWOW';
flag = false;

function HelloWoW_ShowMessage()
	
	SlashCmdList["HelloWoW"] = function (msg)
		HelloWoWF(msg)
	end;
	
end
	
function HelloWoWF(msg, editbox)
	print(msg)

	local x;

	if string.find(msg,"시작") then		
		if flag == false then
			x = msg:match("시작%s(%d+)$");
			print(x)
			flag = true;			
			if x then
				print("초성퀴즈 시작 " .. x .. " 문제!");
			else print("초성퀴즈 기본 시작 10 문제!");
			end
		else 
			print("초성퀴즈가 �미 실행중입니다");
		end
	elseif msg:find("종료") then
		if flag == true then
			print("초성퀴즈를 종료합니다");
			flag = false;
		else 
			print("초성퀴즈가 실행중�지 않습니다");
		end
	end	
end
WOW 입력 : /hiw 종료
WOW ìœë ¥ : 초성퀴즈가 실행중ì�´ì§€ 않습니다
WOW 입력 : /hiw 시작 50
WOW ìœë ¥ : 초성퀴즈 시작 50 문제!
WOW 입력 : /hiw 종료
WOW ìœë ¥ : 초성퀴즈를 종료합니다
WOW 입력 : /hiw 종료
WOW ìœë ¥ : 초성퀴즈가 실행중ì�´ì§€ 않습니다
WOW 입력 : /hiw 시작
WOW ìœë ¥ : 초성퀴즈 기본 시작 10 문제
WOW 입력 : /hiw 시작 50
WOW ìœë ¥ : 초성퀴즈가 ì�´ë¯¸ 실행중입니다

string.find(msg,"시작")� msg�서 "시작"�란 단어가 시작�는곳과 �� 다중 ��로 2개 넘겨주며 값� 없�때는 nil� 리턴한다. 따�서, if문�서 쓰면 lua�서는 nil� 제외한 모든 값� (심지어 0과 공백스트�""�) true로 ��한다.

처�� 문제가 �겼었는� Eclipse�서 테스트하� string.find(msg,"시작")� WOW�서 글씨가 깨지며 정� 작�하지 않았다. 그 �유는 무엇�� 하면 WOW Addon���서 lua파�� 작업할때 메모장� 열고 작업했었는� 메모장� 기본 글� Encoding타입� 윈�우�서 ANSI�다. 그렇기 때문� WOW�서 쓰는 UTF-8과는 매칭� 안�는것! 따�서 메모장�서 새로 저장 -> 저장 버튼 밑� Encoding타입� UTF-8로 해주면 정�작� 한다. �래저래 힘들게 한다.

x = string.match(msg,pattern) 는 pattern� 따� msg를 매칭해주고 서브 패턴� 맞는 ��를 assign 연산�(=)를 통해 넘겨주게 �다.
위� 코드�서는
x = msg:match("시작%s(%d+)$");
으로 해�하�면 시작 다�� 공백� 하나있고 숫�집합 다�� 문�열� �나는 문�열�서 숫� 집합� x로 가져오란 소리다.


패턴 매칭� 여기 있다. Lua�서 Sub pattern� �해 변수를 가져오는건 � 찾아�야한다.

�단 �런 저런 것� 참조하면 하나 하나 완성하고 있다.

짜� : 테스트 케�스를 와우� 가서 ��� 입력하는것� 지겹다!!!
쉬운방법없나? �러운 코드!! 청소해줘!!

다� : 채팅창과 lua파�� 연�해서 모든 메시지를 처리하는걸 보�.

2.8. FrameEventHandling


가장 빡센 공부가 �걸로 ���다.

항� UI를 만지는� 어려운건

�기화, Event Handling, UI꾸미기니�

WOW API를 뒤지고 뒤져서 우선 Frame� 주고 Frame� DefaultChatWindow�서 메시지를 받아야 할것 같다.

우선 Lua�서 Frame� 불러오려면 CreateFrame� 해�야겠지

CreateFrame()
newFrame = CreateFrame("frameType"[, "frameName"[, parentFrame[, "inheritsFrame"]]]);

frameType
Frame 타입� 따� �성�는게 달�진다 "EditBox","Button"등 UIObject를 String 타입으로 넣어 설정해주면 타입� 결정�다


frameName
�름� 주면 �다 String타입.

parentFrame
부모님� 지정해준다.

inheritsFrame
��할 Frame� 지정하는것 같�� 없으면 �� 안�단다. �런..

newFrame:setScript("OnLoad",funcname)
�렇게 하면 OnLoad�는 �벤트때 funcname� 실행�다.

http://www.wowwiki.com/WoW_constants
와우�서 �수값으로 가지고 있는 값들� 여기 나와있다.

여기서 MainFrame� 찾아보�.

채팅� 관련해서..
http://www.wowwiki.com/Chat
Event중� CHAT_MSG_CHANNEL � 있는�

예제로 들�게 ��하면 �시�서만 2. 거래 채�� 사용할수 있는� 밖� 나갔�때 � 채�� 활성화�있지만. CHAT_MSG_CHANNEL �벤트를 ��� 서버�서 보내지 않는다는것�다.

여튼 메시지를 받으면 발��는 �벤트란 소리겠지.

다ì�Œì�˜ ì—�제는 기본 프레임ì—� RegisterEvent를 입력시키고 ì±—ì�´ 들어올때마다 ìœë ¥í•˜ëŠ”ê²ƒì�´ë‹¤.
function HelloWoW_ShowMessage()
	DEFAULT_CHAT_FRAME:RegisterEvent("CHAT_MSG_CHANNEL");
		local function eventHandler(self, event, ...)
			if (event == "CHAT_MSG_CHANNEL") then
			local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 = ...;
				print(arg1);
			end
		end
	DEFAULT_CHAT_FRAME:SetScript("OnEvent", eventHandler);
end

어렵다.

� �제 채팅 메시지를 다 뽑아버려보�.


�곳� 가면 커뮤니케�션 �벤트를 볼수 있는� 내가 �번� 대�으로 하는 �벤트는 채팅 관련으로 "파티","길드","�반","공격대"로 해당 Chat� 발�할때마다 날아오는 Event를 캣치해서 가져온다.

frame� 만들어 놓으면 Event가 발�해서 받는 대�� �관없� 모든 �벤트가 날아오게 �다.

�.. 다시 xml로 �아가 보�.

HelloWoW.xml
<UI xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui">
<script file="HelloWoW.lua"/>
<Frame name="HelloWoW">
<Scripts>
	<OnLoad>
		HelloWoW_ShowMessage(self)
	</OnLoad>
	</Scripts>
</Frame>
</UI>
self로 바꼈다!! self는 Frame �신� �컫는다.

On_load가 �면 �기 �신� 넘겨서 HelloWoW를 실행시킨다.

HelloWoW.lua
function HelloWoW_ShowMessage(self)

	local frame = self;
		
	frame:RegisterEvent("CHAT_MSG_CHANNEL");
	frame:RegisterEvent("CHAT_MSG_SAY");
	frame:RegisterEvent("CHAT_MSG_PARTY");
	frame:RegisterEvent("CHAT_MSG_YELL");
	frame:RegisterEvent("CHAT_MSG_GUILD");
	
	print("Load OK")
	local function eventHandler(self, event, ...)
		if (event == "CHAT_MSG_CHANNEL" or event == "CHAT_MSG_SAY") then
		local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 = ...;
			print(arg1);
			print(arg2);
		end
	end
	
	frame:SetScript("OnEvent", eventHandler);
end

�렇게 하면 �벤트 등�한것�
frame:RegisterEvent("CHAT_MSG_CHANNEL");
frame:RegisterEvent("CHAT_MSG_SAY");
frame:RegisterEvent("CHAT_MSG_PARTY");
frame:RegisterEvent("CHAT_MSG_YELL");
frame:RegisterEvent("CHAT_MSG_GUILD");
다섯가지지만 CHAT_MSG_CHANNEL CHAT_MSG_SAY ì�´ê²ƒ ë‘�가지만 ìœë ¥í•˜ëŠ”ê²ƒì�„ 알 수 있다.

� �제 �것� 실행하면 로드가 �면 Load_OK�고 하면서 진행�다.

�제 채팅창� 올�오는 모든 문�를 print해준다.

eventHandler(self, event, ...)

self는 �벤트를 받� frame�나 �체를 �하고 event는 해당 �벤트. 그리고 가변 �� ... �서 뽑아온 arg1~arg9는

참조사�트 :
http://www.wowwiki.com/Events/Communication

Communication Event가 발��때 건네주는 ��를 받아와주는것으로 대체�으로 arg1�는 msg arg2�는 author가 들어가 있다.

�제 다��는 타�머를 쓰는것� 배워보�.

Timer + CommandMessageParsing + FrameEventHandling로 초성퀴즈를 만들수 있다.


2.9. �� Update함수 찾고 timer찾기


여행갔다와서 다 까먹�다�� 하는 Addon만들기.

Timer는 어떻게 만들까?

우선 WOW API�서 지�해주는것� getTime()..
ìœë ¥ì�€ 잘ë�œë‹¤.
~lua
	seconds = GetTime();
	
	print("Current system uptime is: "..seconds.." seconds!");


우선 와우�서는 API설명�. Addon� Sleep� 걸어놓으면 전체 시스템� 멈추는것으로 �어있다. 그렇다면 쓰레드를 만들어서 Sleep� 했다가. 복귀하면 하는건 어떨까? 우선 Sleep� Lua� System함수 패키지� OS�서는 지�해주지 않는다.

그래서 Lua 홈페�지�서 찾아보겠다.


�곳�서는 Lua로 작성� 다양한 환경� sleep� 볼수 있다.

Coroutine� �용해서 만드는듯 한� 뭔가 ��하다.

Coroutine� 다른 쓰레드를 하는건가? ��하다. Busy Wait로 만든 Sleep� 해서 하는건� Thread해서 다른 타��� 나오는것 같지가 않다???

�여 �거.
~lua
local clock = os.clock
function sleep(n)  -- seconds
	local t0 = clock()
	while clock() - t0 <= n do end
end

co = coroutine.create(function()
	print("what")
	sleep(5)
	end
	
)

print("what")
print("main",coroutine.resume(co));
�걸 실행하면 what� 먼저나오는것 맞다.

그리고 sleep(5)를 하면 5초뒤� 실행�다. 주�. Millisecond가 아니다.


시뮬� �려본 결과 Coroutine� 다른 Thread 단위로 �아가는것� 아니� main�서 같� �아가는것으로 나왔다. �거 진짜 어떤경우� 쓰는건지.. 여튼.

2주를 찾아서 ��으로 0.1초나 0.2초사�� ��으로 Check를 해주는 함수를 찾아해매었다.

그러다가 OnUpdate�는 Event를 발견하게 �는� 설명� 보�
{{{
How Often Is It Called

The game engine will call your OnUpdate function once each frame. This is (in most cases) extremely excessive.
Ctrl + R to see the FPS on screen.
}}
FPS... Frame Per Second마다 불린단다. 그러니까 대략 1/60초 마다 한번 불린단다.

그래서 OnUpdate를 Frame� 등�하고 사용해보았다.

{{{
<UI xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui">
  <script file="HelloWoW.lua"/>
  <Frame name="HelloWoW">
    <Scripts>
      <OnLoad>self.TimeSinceLastUpdate = 0 </OnLoad>
      <OnUpdate function="HelloWoW_OnUpdate"></OnUpdate>
    </Scripts>
  </Frame>
</UI>
}}}
� Frame� OnUpdate�는게 있고 OnUpdate가 실행�때마다 HelloWoW_OnUpdate�는 함수를 실행해준다. 

근� 실행해보면..?

{{{
function HelloWoW_OnUpdate(self, elapsed)
  self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed; 	

  if (self.TimeSinceLastUpdate > MyAddon_UpdateInterval) then
    --
    -- Insert your OnUpdate code here
    --
	TimeSet();
    self.TimeSinceLastUpdate = 0;
  end
end
	
function TimeSet(){
	seconds = GetTime();
	
	print("Current system uptime is: "..seconds.." seconds!");

}	
}}}

근�...

실행� 안�다?
�유를 보니�.
{{{
When Is It Called Edit

OnUpdate is not called on any hidden frames, only while they are shown on-screen. OnUpdate will also never be called on a virtual frame, but will be called on any frames that inherit from one.
}}}

가� Frame�선 안�아간다는것�다. 아우.. �접 Frame� 나오게 하고 만들어야 �다.

그래서 나는 예제로 배우는 프로그래� 루아 �는 책� �서관�서 빌려서 WOW Addon Studio를 깔게 �었다.

WOW Addon Studio는 WOW Addon� UI디��과 �벤트 헨들�� �와주는 유용한 툴�다. 

Addon Studio는 �게 V1.0.1과 V2.0으로 나눌수 있는�
1.0.1� Visual Studio 2008� 지�하고 V2.0� Visual Studio 2010� 지�한다 당연히 V2.0� 지�하는 기능� � 많다고 �있다.

사�트는 http://www.codeplex.com/WarcraftAddOnStudio �서 다운 받� 수 있다.

Basic Addon UI나 ACE UI를 지�해준다.

Project를 Visual Studio� 기본과 같� 만들으면 Frame� 하나 뜨고 Frame� 누르게 �면 우측 하단� Properties�서 EventHandling� 하게 �다. 

넣고 ì‹ì�€ ì�´ë²¤íŠ¸ë¥¼ 누르고 Create버튼ì�„ 누르면 Functionì�„ 제작할 수 있게ë�˜ê³  Lua파ì�¼ì—� ìž�ë�™ìœ¼ë¡œ Scriptê°€ 등ë¡�ë�˜ê²Œ ë�œë‹¤.

� 그래서.. 

OnUpdate� �용할 함수를 만들고 가� 프레임� 아닌 실제 프레임� 툴로 만들어 �성하게 하면
{{{
Frame.xml
<Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.blizzard.com/wow/ui/">
	<Script file="Frame.lua" />
	<Frame name="Frame1" parent="UIParent" toplevel="true" movable="true" enableMouse="true">
		<Size>
			<AbsDimension x="359" y="303" />
		</Size>
		<Anchors>
			<Anchor point="TOPLEFT">
				<Offset>
					<AbsDimension x="100" y="-47" />
				</Offset>
			</Anchor>
		</Anchors>
		<Scripts>
			<OnUpdate>Frame1_OnUpdate();</OnUpdate>
			<OnMouseDown>self:StartMoving();</OnMouseDown>
			<OnMouseUp>self:StopMovingOrSizing();</OnMouseUp>
		</Scripts>
		<Backdrop bgFile="Interface\DialogFrame\UI-DialogBox-Background" edgeFile="Interface\DialogFrame\UI-DialogBox-Border" tile="true">
			<BackgroundInsets>
				<AbsInset left="11" right="12" top="12" bottom="11" />
			</BackgroundInsets>
			<TileSize>
				<AbsValue val="32" />
			</TileSize>
			<EdgeSize>
				<AbsValue val="32" />
			</EdgeSize>
		</Backdrop>
	</Frame>
</Ui>
}}}

�렇게 만들어주게 �다.

{{{

Frame.lua
-- Author      : June
-- Create Date : 2011-08-12 오전 2:23:05


function Frame1_OnUpdate()
	--put your event handler logic here
	seconds = GetTime();
	
	print("Current system uptime is: "..seconds.." seconds!");
end
}}}
{{{
## X-AutoGenerated: true
## X-GeneratorComment: Basic project properties and project files will be automatically added during deployment. Properties added by the user will be copied without changes.
## Interface: 40200
## Title: WowAddon1
## Notes: Basic WoW Addon
## Author: June
## Version: 0.1Beta
Frame.xml
Frame.lua
}}}

�렇게 ���성�다.

해당 해드온� �리면 초당 60회씩 Time� 채�하는걸 볼수 있다.

�제..

모든 준비가 맞춰졌다!!!


다�� 할� : 프로그램 시나리오 � 구성


== 남기고 ì‹ì�€ ë§� ==

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:23
Processing time 0.0167 sec