마그테리돈 큐브 클릭 못하는 틀니들을 위해 공부도 해볼겸
특임 제작해보기로 했다. 하루에 1개씩 ㅎㅎ
마그 1 - exrt 메모 인식
기본적으로 exrt를 불러오는 명령어는
본메모:
VExRT.Note.Text1
개인메모 :
_G.VExRT.Note.SelfText
메모 1,2,3,... :
VExRT.Note.Black[1]
VExRT.Note.Black[2]
VExRT.Note.Black[3]
메모1,2,3...의 이름을 변경했다면.. 메모제목 :
VExRT.Note.BlackNames[1]
VExRT.Note.BlackNames[2]
VExRT.Note.BlackNames[3]
ex1)
본메모 작성 후,
function()
return VExRT.Note.Text1
end
음 잘나오고.~
ex2) 캐릭 이름, 징표를 제대로 출력하기
이거 그대로 나와야하는데 ex1대로 하면
이렇게 나온다.
이럴땐 패턴을 검색해서 출력해야 한다.
패턴을 검색하는 함수는 (start,end는 구문 앞부터 카운팅, -는 뒤에서 카운팅)
string.sub(string, start, end) | 시작위치~ 종료위치 까지를 반환. |
string.find(string, pattern) | 패턴을 찾아서 start과 end 을 알려줌. |
string.gmatch(string, pattern) | for 구문으로 패턴에 맞는 값들을 반환 |
string.gsub(string, pattern, repl[, n]) | 패턴을 검색해서 repl로 바꿈 (n이 있으면 앞에서부터 n번 바꿈) 결과값 2번째는 몇번 바꾸었는지임. ( _,asdf ) |
string.match(string, pattern) | 패턴을 검색해서 검색한 값을 반환. |
sub 는 시작위치, 종료위치를 검색함.(-는 뒤에서 카운팅)
패턴은 클래스라 부른다.
Class | Meaning |
. | 모든 문자 |
%a | 알파벳 |
%d | 숫자 |
%l | 소문자 |
%p | . , ? ! : ; @ [ ] _ { } ~ 같은 문자 |
%s | 공백 |
%u | 대문자 |
%w | 알파벳+숫자 |
%x | 16진수 (2자리로 끊으려면 %02x) |
%z | 0 |
\0 | 0 |
[..] | 조건들 중 하나라도 맞는것들 |
[^..] | 조건들이 하나라도 아닌것들 |
%b(2개문자) | 2개문자가 앞뒤에 있는거 검색 |
+ | 1개 이상 반복 |
* | 0개 또는 반복 |
- | 0개 또는 반복 |
? | 0개 또는 1개 |
+를 자주쓰는데, %d 같은걸 쓰면 1번만 검색해주기 때무니다.
[]는 +같은 명령어를 모든 패턴에 할당해주기 위해 사용한다. (그래서 +가 [] 바깥에 있음)
[^\r\n]+ 이거는 줄바꿈이 없는 모든걸 찾아줌.
?는 1개 있든가 말든가 의 표현.
|cff |r 칼라출력이 제대로 안되니 삭제하고, 그 사이의 값을 WA_ClassColorName(이름) 해준다.
WA_ClassColorName은 유닛을 검색해 직업색깔을 입혀주는 위크오라 함수기능이다.
function()
return string.gsub(VExRT.Note.Text1,"||c%x%x%x%x%x%x%x%x([^|]+)||r", "%1")
end
마그 2 - 1조 2조 예비조 테이블 만들어서 넣기
1. 줄을 분리하여 한 테이블에 넣기
이렇게 이름만 입력하는걸로 해보자.
local click={}
for line in _G.VExRT.Note.Text1:gmatch('[^\r\n]+') do
local line2=string.gsub(line,"||c%x%x%x%x%x%x%x%x([^|]+)||r", "%1")
table.insert(click, line2)
end
--click table에 hex코드가 제거된 각 줄을 삽입
aura_env.result={{},{},{},{},{}}
if click[1] then
for w in click[1]:gmatch('%S+') do
table.insert(aura_env.result[1],w)
end
end
if click[2] then
for w in click[2]:gmatch('%S+') do
table.insert(aura_env.result[2],w)
end
end
if click[3] then
for w in click[3]:gmatch('%S+') do
table.insert(aura_env.result[3],w)
end
end
if click[4] then
for w in click[4]:gmatch('%S+') do
table.insert(aura_env.result[4],w)
end
end
if click[5] then
for w in click[5]:gmatch('%S+') do
table.insert(aura_env.result[5],w)
end
end
--aura_env.result table내부에 이름으로 분리된 5개 테이블을 요소로서 삽입함
결과 :
aura_env.result[1]={거근램지,거근램지,거근램지,거근램지,거근램지}
aura_env.result[2]={지능싸개,거근램지,지능싸개,지능싸개,지능싸개}
aura_env.result[3]={지능싸개,거근램지,거근램지,지능싸개,지능싸개}
aura_env.result[4]={지능싸개,거근램지,지능싸개,지능싸개,지능싸개}
마그 3 - 파멸의회오리 쓸때마다 조 불러오기.
너무 귀찮으니 이미 만들어져 있는 템플릿을 이용하는 것도 좋다.
와고를 탐험하다 발견한걸 이용하자.
아주 잘 만들어져 있다.
사용자 설정에 일일히 이름을 입력하는것만 바꿔주자.
이 위크오라는 디버프로 인식한다.
본섭에서는 큐브 누를때 디버프가 안생긴다.
실제 테스트 결과..
조 잘넘어가고 분배 매우 잘된다. (놀랍군)
마그 4 - 명령어 지정하고 조 경보, 대상 징표 찍기
aura_env.rot={}
aura_env.rot[1]="1조 ".."/ {별}1시: "..(aura_env.result[1][1]or"").." / {동그라미}4시: "..(aura_env.result[1][2]or"").." / {다이아몬드}6시: "..(aura_env.result[1][3]or"").." / {세모}8시: "..(aura_env.result[1][4]or"").." / {달}11시: "..(aura_env.result[1][5]or"")
aura_env.rot[2]="2조 ".."/ {별}1시: "..(aura_env.result[2][1]or"").." / {동그라미}4시: "..(aura_env.result[2][2]or"").." / {다이아몬드}6시: "..(aura_env.result[2][3]or"").." / {세모}8시: "..(aura_env.result[2][4]or"").." / {달}11시: "..(aura_env.result[2][5]or"")
aura_env.rot[3]="3조 ".."/ {별}1시: "..(aura_env.result[3][1]or"").." / {동그라미}4시: "..(aura_env.result[3][2]or"").." / {다이아몬드}6시: "..(aura_env.result[3][3]or"").." / {세모}8시: "..(aura_env.result[3][4]or"").." / {달}11시: "..(aura_env.result[3][5]or"")
aura_env.rot[4]="4조 ".."/ {별}1시: "..(aura_env.result[4][1]or"").." / {동그라미}4시: "..(aura_env.result[4][2]or"").." / {다이아몬드}6시: "..(aura_env.result[4][3]or"").." / {세모}8시: "..(aura_env.result[4][4]or"").." / {달}11시: "..(aura_env.result[4][5]or"")
if aura_env.result[5][5] then
aura_env.rot[5]="예비조: "..aura_env.result[5][1]..", "..aura_env.result[5][2]..", "..aura_env.result[5][3]..", "..aura_env.result[5][4]..", "..aura_env.result[5][5]
elseif aura_env.result[5][4] then
aura_env.rot[5]="예비조: "..aura_env.result[5][1]..", "..aura_env.result[5][2]..", "..aura_env.result[5][3]..", "..aura_env.result[5][4]
elseif aura_env.result[5][3] then
aura_env.rot[5]="예비조: "..aura_env.result[5][1]..", "..aura_env.result[5][2]..", "..aura_env.result[5][3]
elseif aura_env.result[5][2] then
aura_env.rot[5]="예비조: "..aura_env.result[5][1]..", "..aura_env.result[5][2]
elseif aura_env.result[5][1] then
aura_env.rot[5]="예비조: "..aura_env.result[5][1]
else
aura_env.rot[5]="예비조: "
end
addon:RegisterChatCommand( "r1", function ()
SendChatMessage(aura_env.rot[1],"RAID_WARNING" )
if aura_env.result[1][1] then
SetRaidTarget(aura_env.result[1][1],1) end
if aura_env.result[1][2] then
SetRaidTarget(aura_env.result[1][2],2) end
if aura_env.result[1][3] then
SetRaidTarget(aura_env.result[1][3],3) end
if aura_env.result[1][4] then
SetRaidTarget(aura_env.result[1][4],4) end
if aura_env.result[1][5] then
SetRaidTarget(aura_env.result[1][5],5) end
end )
addon:RegisterChatCommand( "r2", function ()
SendChatMessage(aura_env.rot[2],"RAID_WARNING" )
if aura_env.result[2][1] then
SetRaidTarget(aura_env.result[2][1],1) end
if aura_env.result[2][2] then
SetRaidTarget(aura_env.result[2][2],2) end
if aura_env.result[2][3] then
SetRaidTarget(aura_env.result[2][3],3) end
if aura_env.result[2][4] then
SetRaidTarget(aura_env.result[2][4],4) end
if aura_env.result[2][5] then
SetRaidTarget(aura_env.result[2][5],5) end
end )
addon:RegisterChatCommand( "r3", function ()
SendChatMessage(aura_env.rot[3],"RAID_WARNING" )
if aura_env.result[3][1] then
SetRaidTarget(aura_env.result[3][1],1) end
if aura_env.result[3][2] then
SetRaidTarget(aura_env.result[3][2],2) end
if aura_env.result[3][3] then
SetRaidTarget(aura_env.result[3][3],3) end
if aura_env.result[3][4] then
SetRaidTarget(aura_env.result[3][4],4) end
if aura_env.result[3][5] then
SetRaidTarget(aura_env.result[3][5],5) end
end )
addon:RegisterChatCommand( "r4", function ()
SendChatMessage(aura_env.rot[4],"RAID_WARNING" )
if aura_env.result[4][1] then
SetRaidTarget(aura_env.result[4][1],1) end
if aura_env.result[4][2] then
SetRaidTarget(aura_env.result[4][2],2) end
if aura_env.result[4][3] then
SetRaidTarget(aura_env.result[4][3],3) end
if aura_env.result[4][4] then
SetRaidTarget(aura_env.result[4][4],4) end
if aura_env.result[4][5] then
SetRaidTarget(aura_env.result[4][5],5) end
end )
addon:RegisterChatCommand( "r5", function ()
SendChatMessage(aura_env.rot[5],"RAID_WARNING" )
end )
/r1
/r2
/r3
/r4
/r5
매크로로 하든 직접 입력하든
조를 경보로 채팅해주고
대상자를 징표 찍어준다. (별 동글 다이아 역삼 달 순서)
마그5 - 다음 조 넘어갈때 저장된 조 경보하기
와고에 있는건 rotation이 바뀔 때 이벤트가 등록되어있었다.
하지만 위크오라 로딩될때도 이벤트가 켜지므로,
DBM,Bigwigs 타이머 로 알려주자.
SendChatMessage(aura_env.rot[aura_env.rotation],"RAID_WARNING" )
if aura_env.result[aura_env.rotation][1] then
SetRaidTarget(aura_env.result[aura_env.rotation][1],1) end
if aura_env.result[aura_env.rotation][2] then
SetRaidTarget(aura_env.result[aura_env.rotation][2],2) end
if aura_env.result[aura_env.rotation][3] then
SetRaidTarget(aura_env.result[aura_env.rotation][3],3) end
if aura_env.result[aura_env.rotation][4] then
SetRaidTarget(aura_env.result[aura_env.rotation][4],4) end
if aura_env.result[aura_env.rotation][5] then
SetRaidTarget(aura_env.result[aura_env.rotation][5],5) end
마그6. 유닛 죽었을때 백업조 호출하기
if subEvent=="UNIT_DIED" then
for unit in WA_IterateGroupMembers() do
local unitName = UnitName(unit)
if UnitExists(unit) then
if UnitIsDeadOrGhost(unit) then
for i = 1,5 do
if unitName == allstates[i].name then
for j=1,table.getn(aura_env.result[5]) do
local backup = aura_env.result[5][j]
for backupUnit in WA_IterateGroupMembers() do
if UnitName(backupUnit) == backup and UnitExists(backupUnit) and not UnitIsDeadOrGhost(backupUnit) then
aura_env.result[aura_env.rotation][i] = backup
end
end
end
end
end
end
end
end
end
문제점1. EXRT 메모 업데이트 할때 이벤트를 모르겠다.
EXRT_NOTE_UPDATE
MRT_NOTE_UPDATE
lua 뒤져서 찾음.
하지만 메모장에 입력 완료해도 업데이트가 되지 않는다.
on init에 표 저장하는것을 aura_env.ERT=function ~ end 으로 지정해 버리고,
활성조건에
if event=="MRT_NOTE_UPDATE"or event=="EXRT_NOTE_UPDATE" then
aura_env.ERT()
for i=1,5 do
local unit = aura_env.result[1][i]
local lo
if i==1 then lo="1시" elseif i==2 then lo="4시" elseif i==3 then lo="6시" elseif i==4 then lo="8시" else lo="11시" end
allstates[i] = {
show = true,
changed = true,
progressType = "timed",
name = " "..lo.." - "..(unit or ""),
icon = [[Interface\TARGETINGFRAME\UI-RaidTargetingIcon_]].. i ..[[.blp]],
}
end
return true
end
됬다! 이제 테스트만 해보면 된다.
'WOW〃Classic > 매크로,LUA〃' 카테고리의 다른 글
마흡토 위크오라 완성하다 (0) | 2021.08.07 |
---|---|
[위크오라] [던전] 경험치 평판 몹개체수 시간 (0) | 2021.08.03 |
불성 인던 설명충 위크오라 완성하다 (2) | 2021.07.30 |
[위크오라] 채팅 타이머 만들기 (6) | 2021.07.22 |
[위크오라] 트리거를 다른 위크오라에서 관리 (4) | 2021.06.27 |