WOW〃retail/매크로,LUA〃

[lua] 와몽어스 위크오라 살펴보기

토실스 2022. 3. 28. 06:29
반응형

이번에 피스 에서 공유된 와몽어스 위크오라는 사기적이다.

공격대 프레임에 바로 범인이 표시가 된다.

이건 어떻게 만들어졌는지 살펴보자.

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. 난 컴퓨터 전공자도 아닌데 왜 이런걸 아는거지?

전공자가 보기엔 귀여운 글일수 있다

반응형