[[TableOfContents]] == 목ì == == ì§„í–‰ == === Lua 설치 ë° ì…‹íŒ… === 알아야 í• ê²ƒ : Eclipse Plugin깔기 다ìŒì— í• ê²ƒ : 초성 뽑기 연습, 와우 ì• ë“œì˜¨ 문법, 와우 ì• ë“œì˜¨ 설치, 루아 문법, 와우 루아 ì—°ë™ WOWì˜ ì• ë“œì˜¨ì€ Lua나 Ruby와 ê°™ì€ ìŠ¤í¬ë¦½íЏ 언어를 사용하는것으로 ì•Œê³ ìžˆë‹¤. 그래서 Programming in Luaë¼ëŠ” ì±…ì„ ë„서관ì—서 ë¹Œë ¤ì™”ë‹¤. 아마 ë¹Œë ¤ì˜¨ì§€ 1주ì¼ì€ ë¬ê² ì§€. Lua ê°œë°œí™˜ê²½ì„ ì…‹íŒ…í•˜ëŠ”ë° ì¢€ ê±¸ë ¸ë‹¤. Lua-Eclipse를 받아서 ê¹”ê³ . (LunarEclipseë¼ëŠ” ê²ƒë„ ìžˆë‹¨ë‹¤) http://luaeclipse.luaforge.net/ 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파ì¼ì„ 볼수 있다. === 초성 뽑기 연습 in ìžë°” === 알아야 í• ê²ƒ : Java Project 만들기, 기본 ìžë°” 코딩 다ìŒì— í• ê²ƒ : 와우 ì• ë“œì˜¨ 문법 배우기, 와우 ì• ë“œì˜¨ 설치, 루아 문법, 와우 루아 ì—°ë™ WOWì• ë“œì˜¨ 초성퀴즈를 만들기위함ì´ê¸° 때문ì—. 당연히 í•œê¸€ì˜ ì´ˆì„±ì„ ë¹¼ì˜¬ìˆ˜ 있어야한다. 그래서 찾아봤ë”니 UTF-8ë°©ì‹ìœ¼ë¡œ 빼올수 ìžˆë‹¤ê³ í•œë‹¤. ê·¼ë° ì´ìƒí•œë° UNICODEì—서 계산해서 빼오ë”구만. 추가 : ì•Œê³ ë³´ë‹ˆ UNICODE를 í¬í•¨í•˜ëŠ” ë°©ì‹ì¤‘ 하나ë¼ê³ 한다. ê·¼ë° ë” ëª¨ë¥´ê² ëŠ”ë°... U-00000800 - U-0000FFFF ë²”ìœ„ì— ë“¤ì–´ê°„ë‹¤ê³ í•˜ëŠ”ë°?? ì•„ì•… ëª¨ë¥´ê² ì–´!! 그래서 추가로 ë§í¬ë¥¼ 걸어본다. http://blog.naver.com/declspec?Redirect=Log&logNo=10092640244 http://divestudy.tistory.com/8 ë§í¬ê°€ 안없어지길. ìš°ì„ ìžë°” 코드는 다ìŒê³¼ 같다. {{{ ~java 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)first[cho] + (char)middle[joong] + (char)last[jong]); } } }}} ë³´ë©´ ì•Œê² ì§€ë§Œ ìžë°”ì—서 작성ë˜ëŠ”ê±´ UNICoDEì´ë‹¤(아마ë„?) 현재 Eclipse개발환경중 ë¬¸ìž Encodingì€ UTF-8ë°©ì‹ì´ë‹¤. 거기서 í•œê¸€ì„ ë¹¼ì˜¨í›„ UTF-8ì— ë”°ë¼ 0xACC00 (<- UTF-8시작) ì„ ë¹¼ê³ ì´ˆì„± 중성 ì¢…ì„±ì„ ë‹¤ìŒìœ¼ë¡œ 빼온다 초성 = (ì›ë¬¸ìž /21 /28) 중성 = ( (ì›ë¬¸ìž%(21*28))/28) 종성 = ( a%28) ì´ë ‡ê²Œ í•˜ê³ ë¬¸ìž ê·œì¹™ì— ë”°ë¼ ë¹¼ì˜¨ë‹¤. ê·œì¹™ì€ ìœ„ì˜ ì½”ë“œë¥¼ ë³´ë©´ 알수 있다. === 첫 와우 AddOn Hello WOW! === 알아야 í• ê²ƒ : 와우 ì• ë“œì˜¨ í´ë” 위치, ì• ë“œì˜¨ 설치법, ì• ë“œì˜¨ 만들때 기본 ì„¤ì •, 와우 API 문법, Lua 기본 문법 다ìŒì— í• ê²ƒ : 샘플 lua 파ì¼ë¡œ ì•„ì´í…œ ì´ë¦„ 불러오기, ì• ë“œì˜¨ ëª…ë ¹ì–´ 실행, 초성 퀴즈 시나리오, 초성 분리 첫 와우 Addonì„ ì œìž‘í•˜ê²Œ ë˜ì—ˆë‹¤. ì´ë¦„하야 Hello WoW!! ì²œë¦¬ê¸¸ë„ Hello World!부터ë¼ëŠ” ì§€ë¡ ì— ë”°ë¼ ì–´ë–»ê²Œ ì—°ë™ë˜ëŠ”ì§€ë¥¼ ì‚´íŽ´ë³´ê² ë‹¤. 기본 프로그램 ì •ë³´ë¥¼ ë‹´ê³ ìžˆëŠ” *.toc파ì¼. ê·¸ë¦¬ê³ UI와 LUA를 Mapping 시켜주는 *.xml ê·¸ë¦¬ê³ ì—°ì‚°ì„ í•´ì£¼ëŠ” *.lua ìž‘ì„±ì„ í•´ë³´ìž ê¸°ë³¸ì 으로 "/World of Warcraft/interface/addons/ì• ë“œì˜¨ëª…" 으로 í´ë”ê°€ ë§Œë“¤ì–´ì ¸ìžˆì–´ì•¼í•œë‹¤. ê·¸ë¦¬ê³ HelloWoW.toc으로 ê¸°ë³¸ì„¤ì •ì„ ìž¡ì•„ì•¼í•˜ê³ tocì— ì •ë³´ë¥¼ 넣어주어야한다. {{{ HelloWoW.toc ---------------------------- ##Interface:40200 ##Title:HelloWOW ##Notes:Example 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 --------------------------------- }}} Lua 기본문법ì´ë‹¤. 위는 함수만들기 ì˜ˆì œ. message("")는 와우ì—서 ì œê³µí•˜ëŠ” API WoW API functionì„ luaì— ë„£ì–´ì¤€ì ì€ ì—†ì§€ë§Œ ìžë™ìœ¼ë¡œ ë˜ë‚˜ë³´ë‹¤. ì‹ ê¸°í•œë°? ì´ë ‡ê²Œ ìž‘ì„±í•˜ê³ ì™€ìš° ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 실행시키면 Hello WOW!ê°€ 뜬다. ì°¸ì¡°í• ì‚¬ì´íЏ : http://www.wowwiki.com/Getting_started_with_writing_addons === WOWì—서 API를 ì´ìš©í•œ Item 불러오기 연습 === 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 ì „ìœ¨í•˜ëŠ” 불ì˜ë•…ì˜ ì•„ì´í…œì´ 공개 í›„ì— ì—…ë°ì´íЏ ëœê²ƒì´ë‹¤. http://kr.battle.net/wow/ko/item/번호 ì € ë²ˆí˜¸ì— ì•„ì´í…œ 넘버를 넣으면 해당 ì•„ì´í…œ ì •ë³´ê°€ 들어가있는 페ì´ì§€ë¡œ ì´ë™í•˜ê²Œ ëœë‹¤. 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 base[count] = baseName count = count+1 end end for i = 1, #base do print(base[i]) 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 ---------------------------------- }}} === Luaì—서 초성 빼오기 === 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 문ìžì¸ì§€ ì•Œë ¤ì£¼ëŠ” 함수ì´ë‹¤ {{{ ~lua 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 }}} ìž ì•„ì´í…œ 목ë¡ë„ ë¶ˆëŸ¬ì™”ê³ ì´ˆì„±ë„ ë¹¼ì™”ìœ¼ë‹ˆ 합치는걸로 ê°€ë³´ìž === WOW SlashCommand 작성 === 와우 ì• ë“œì˜¨ì„ lua와 합치는 ìž‘ì—…ì¤‘ì— í•˜ë‚˜. Addonì—게 ëª…ë ¹ë‚´ë¦¬ê¸°ë¥¼ í•´ë³´ìž. http://www.wowwiki.com/HOWTO:_Create_a_Slash_Command 와우ì—는 SlashCommand란 ê²ƒì´ ìžˆë‹¤. 그게 ëëƒë©´.. /ëª…ë ¹ì–´ ì´ë ‡ê²Œ ìƒê²¼ë‹¤. 해당 ëª…ë ¹ì–´ë¥¼ 실행하면 Commandì°½ì—서 해당 ëª…ë ¹ì–´ë¥¼ 실행하게 ëœë‹¤. Addonì„ ë§Œë“¤ê³ ì´ˆì„±í€´ì¦ˆëŠ” SlashCommand로 시작하게 í• ë ¤ê³ í•œë‹¤. /초성퀴즈 시작 30 하면 30ê°œì˜ ë¬¸ì œê°€ ì§„í–‰ëœë‹¤. ì´ì™¸ì—ë„ ê¸°ë³¸ì…‹íŒ…ì´ í•„ìš”í•˜ê¸°ë„ í•˜ê³ ì§„í–‰ ì‹œë‚˜ë¦¬ì˜¤ë„ ì§œì•¼í•˜ì§€ë§Œ ìš°ì„ SlashCommand로 ìž‘ë™ì‹œì¼œë³´ìž. SlashCommandì— ë“±ë¡ì‹œí‚¤ëŠ”ê²ƒì„ ì•Œì•„ë³´ìž. {{{ ~lua function HelloWoW_ShowMessage(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 파싱으로 시나리오를 꾸며보ìž. === CommandMessageParsing === ìž ìŠ¬ëž˜ì‹œ 커맨드를 통해 받아온 msg를 ì¶œë ¥í•´ë³´ê³ parsing해서 ì›í•˜ëŠ” 문ìžë§Œ 뽑아보ìž. 실행ë˜ê³ 있는지 ì•ŠëŠ”ì§€ì— ëŒ€í•œflag를 ë„£ì–´ë´¤ëŠ”ë° Addonì´ ì 재ë˜ë©´ 해당 프로그램 ì „ì²´ê°€ 올ë¼ê°„것ì´ê¸° ë•Œë¬¸ì— WOW ë©”ëª¨ë¦¬ì— í• ë‹¹ì´ ë˜ìžˆë‹¤. ë”°ë¼ì„œ Addonì—서 flag는 따로 메모리를 í• ë‹¹ 받았다는 얘기. ë”°ë¼ì„œ ì „ì— ë³€ìˆ˜ëŠ” addonì´ ë©”ëª¨ë¦¬ì— ì˜¬ë¼ê°€ìžˆëŠ”ë™ì•ˆ ê°™ì€ 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로 ê°€ì ¸ì˜¤ëž€ 소리다. http://www.castaglia.org/proftpd/doc/contrib/regexp.html 패턴 매ì¹ì€ 여기 있다. Luaì—서 Sub patternì— ì˜í•´ 변수를 ê°€ì ¸ì˜¤ëŠ”ê±´ ë” ì°¾ì•„ë´ì•¼í•œë‹¤. ì¼ë‹¨ ì´ëŸ° ì €ëŸ° ê²ƒì„ ì°¸ì¡°í•˜ë©´ 하나 하나 ì™„ì„±í•˜ê³ ìžˆë‹¤. ì§œì¦ : 테스트 ì¼€ì´ìŠ¤ë¥¼ ì™€ìš°ì— ê°€ì„œ ì¼ì¼ì´ ìž…ë ¥í•˜ëŠ”ê²ƒë„ ì§€ê²¹ë‹¤!!! 쉬운방법없나? ë”러운 코드!! ì²ì†Œí•´ì¤˜!! ë‹¤ìŒ : 채팅창과 lua파ì¼ì„ ì—°ë™í•´ì„œ ëª¨ë“ ë©”ì‹œì§€ë¥¼ 처리하는걸 ë³´ìž. == 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 타입으로 넣어 ì„¤ì •í•´ì£¼ë©´ íƒ€ìž…ì´ ê²°ì •ëœë‹¤ http://www.wowwiki.com/UIOBJECT_Frame 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 }}} ì–´ë µë‹¤. ìž ì´ì œ 채팅 메시지를 다 ë½‘ì•„ë²„ë ¤ë³´ìž. http://www.wowwiki.com/Events/Communication ì´ê³³ì— 가면 커뮤니케ì´ì…˜ ì´ë²¤íŠ¸ë¥¼ 볼수 ìžˆëŠ”ë° ë‚´ê°€ ì´ë²ˆì— 대ìƒìœ¼ë¡œ 하는 ì´ë²¤íŠ¸ëŠ” 채팅 ê´€ë ¨ìœ¼ë¡œ "파티","길드","ì¼ë°˜","공격대"로 해당 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로 초성퀴즈를 만들수 있다.