[lua] 와몽어스 위크오라 살펴보기
이번에 피스 에서 공유된 와몽어스 위크오라는 사기적이다.
공격대 프레임에 바로 범인이 표시가 된다.
이건 어떻게 만들어졌는지 살펴보자.
C_ChatInfo.RegisterAddonMessagePrefix('PiecesPublic')
ChatInfo 의 커스텀 애드온프리픽스를 'PiecesPublic'으로 지정해준다.
이건 나중에 쓸 C_ChatInfo.SendAddonMessage 를 사용하는 전제조건이다.
-- Who doesn't love a good troll?
aura_env.alreadyHappy = false
local tooSerious = {
Method = true,
Korruptio = true,
Noni = true,
Slack = true,
Afterburst = true,
Bloom = true
}
local gn = GetGuildFactionInfo()
local ts = gn and tooSerious[gn]
aura_env.requiresMoreFun = function()
if ts and not aura_env.alreadyHappy then
aura_env.alreadyHappy = true
return true
end
end
기본 aura_env.alreadyHappy를 false로 지정. (이미 행복하지 않다)
GetGuildFactionInfo()로 조회하는걸 보니
tooSerious 테이블은 아마 길드 이름인듯.
Method,Korruptio, Noni, Slack, Afterburst, Bloom 길드 소속인 경우 ts 변수를 true로 지정.
aura_env.requresMoreFun
만약 저 길드 소속이면, aura_env.alreadyHappy를 true로 지정하는 함수.
즉 이 함수들은. Method,Korruptio, Noni, Slack, Afterburst, Bloom 길드가 몰래 받아간경우 쓰지못하게 만드는 안전장치? 느낌.
찾아보니 실제 월퍼 레이스 길드들임.ㄷㄷ 메소드 길드밖에 몰?루
CLEU:SPELL_CAST_SUCCESS:SPELL_AURA_REMOVED, IRONI_CUSTOM, CHAT_MSG_ADDON
이벤트로서 cleu는 COMBAT_LOG_EVENT_UNFILTERED 의 약자로서, 전투기록의 모든 이벤트를 포함한다.
여기서 사용된건 '스킬 시전성공', '버프 제거'.
IRONI_CUSTOM은 커스텀 이벤트 등록이다.CHAT_MSG_ADDON은 보낸이가 있는 모든 채팅 이벤트다.
function(s, waEvent,timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellID, spellName,spellSchool,auraType,...)
이건 cleu인데, 각 이벤트에서 사용할 각 Parameters를 적으면 된다.
if waEvent == "COMBAT_LOG_EVENT_UNFILTERED" then
if event == "SPELL_CAST_SUCCESS" and spellID == 360717 then
local id = aura_env.id
C_Timer.After(2, function()
WeakAuras.ScanEvents("IRONI_CUSTOM", id)
end)
스킬 성공했을때, 스킬id가 360717일때
찾아보니 와몽어스 진입스킬.
그때 IRONI_CUSTOM 이라는 사용자 이벤트를 2초 후에 작동시킨다.
그리고 aura_env.id라는 디스플레이 정보를 id변수에 지정한다.
elseif event == "SPELL_AURA_REMOVED" and spellID == 360516 then
for k,v in pairs(s) do
v.show = false
v.changed = true
end
return true
end
아니면 버프가 제거된 이벤트가 생기고, 그 버프가 360516 일때 - 찾아보니 '잠입 임무'. 시전자를 25초간 스턴하고, 이동불가로 만듬.
그때 모든 프레임의 아이콘을 지우고, 변경가능하게 만든다.
아마 넴드 적용스킬일 듯 하고, 와몽어스 종료시 프레임 표시 위크오라를 초기화 시키는듯.
elseif waEvent == "IRONI_CUSTOM" and timestamp == aura_env.id then
aura_env.alreadyHappy = false
if GetPlayerAuraBySpellID(360759) then
C_ChatInfo.SendAddonMessage("PiecesPublic", "LORDSSUS;"..UnitGUID('player'), IsInGroup(LE_PARTY_CATEGORY_INSTANCE) and "instance_chat" or IsInRaid() and "raid" or "party")
end
아니면 이벤트가 IRONI_CUSTOM 이고(와몽어스 시작 2초후), 시간대가 aura_env.id 이면 (이건 잘 모르겠음)
aura_env.alreadyHappy 라는 변수를 false로 지정한다. (이미 행복하지 않다)
만약 플레이어의 버프가 360759의 버프가 존재한다면, (아마 범인 버프인듯?? 아님말구)
PiecesPublic 이라는 히든 애드온 채널에 "LORDSSUS;내GUID"라고 공찾이면 인스턴스 채팅을, 공격대 상태면 공격대나 파티챗으로 알린다.
이게 위크오라의 핵심인데, 360759의 버프는 숨겨져 있으며,
GetPlayerAuraBySpellID의 api로 감지할 수 있는듯 하다.
elseif waEvent == "CHAT_MSG_ADDON" and timestamp == "PiecesPublic" then -- fast edit to make it work without any extra addon
local targetwa,data = strsplit(";", event)
아니면 위크오라 이벤트가 CHAT_MSG_ADDON 이거나(채팅메시지) timestamp=="PiecesPublic" 이면
event 메시지를 ;로 구분하여 각각 targetwa, data로 지정해준다.
targetwa는 LORDSSUS고정이겠고, data는 UnitGUID인듯.
if targetwa ~= "LORDSSUS" then return end
if aura_env.requiresMoreFun() then
PlaySound(144021, 'master')
for i = 1, GetNumGroupMembers() do
local unitID = "raid"..i
s[UnitGUID(unitID)] = {
show = true,
changed = true,
progressType = "timed",
duration = 30,
expirationTime = GetTime()+30,
autoHide = true,
unit = unitID,
icon = 458256,
}
end
return true
만약 targetwa가 LORDSSUS가 아니면 가만히 있어라.
만약 경쟁길드가 쓴다면?ㅋㅋ
144021 소리를 재생
ㅋㅋ찾아보니 https://ko.wowhead.com/sound=144021/vo-pcvulperafemale-laugh
불페라 여캐 웃음소리임.
30초간 unitguid에 위크오라를 표시한다.
다만 icon은 458256.
못쓰게 하는 견제인줄? 알고보니 미국식 조크 ? 그런거인듯.
else
if s[data] then return end -- so private wa will work nicely with public version
for i = 1, GetNumGroupMembers() do
local unitID = "raid"..i
if UnitGUID(unitID) == data then
s[data] = {
show = true,
changed = true,
progressType = "timed",
duration = 30,
expirationTime = GetTime()+30,
autoHide = true,
unit = unitID,
}
local n = UnitName(unitID)
print("SUS: ",n)
return true
end
end
end
end
end
그게 아니라면 정직하게 이 위크오라의 디스플레이를 unitguid에 30초간 표시한다.
그리고 범인을 채팅창에 print한다. "SUS: 범인이름"
후기
1. C_ChatInfo.RegisterAddonMessagePrefix
C_ChatInfo.SendAddonMessage
를 배울수 있었다.
이것을 감지하려면 CHAT_MSG_ADDON으로.
function(event, prefix, message, channel, sender)
prefix 일치확인 후 message이용하면 될듯.
2. GetPlayerAuraBySpellID 의 api를 제한할듯?
트리거나 버프 를 바꿀수는 없는 노릇이니,
플레이어 숨겨진 버프 찾는 api를 삭제하는 방향으로 가는게 좋을듯.
3. 레이드 프레임 표시면 바로 칠수 있어서 좋은듯.
아니면 간단하게 내가 이 버프 있으면 외침으로 알리는 것도 좋지 않았을까 생각해봤음.
하지만 아무튼 가벼워서 이렇게 꼬아서 만들어도 무난할듯.
4. 어떻게 만들던 공대원 전원이 받아야 한다.
자기가 범인일 때 알리는 기능이기 때문.
만약 범인이 1명만 보인다면, 힘들게 찾은 범인이 위크오라도 받지 않은 범인이다.
5. 난 컴퓨터 전공자도 아닌데 왜 이런걸 아는거지?
전공자가 보기엔 귀여운 글일수 있다