헤더 바이트의 값의 범위로 한 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)
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
~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 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
~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) 를 하고 ~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 출력 : 초성퀴즈가 이미 실행중입니다
newFrame:setScript("OnLoad",funcname)
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어렵다.
<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 자신을 일컫는다.
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 이것 두가지만 출력하는것을 알 수 있다.
~lua seconds = GetTime(); print("Current system uptime is: "..seconds.." seconds!");
~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이 먼저나오는것 맞다.
{{{ 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을 채크하는걸 볼수 있다. 이제.. 모든 준비가 맞춰졌다!!! 다음에 할일 : 프로그램 시나리오 및 구성 == 남기고 싶은 말 ==