레이드 게시판

전체보기

모바일 상단 메뉴

본문 페이지

[쐐기돌] 쐐기용 위크오라를 만드는데... 도움요청

치아n연화
댓글: 2 개
조회: 3901
2018-01-04 02:12:31
약간의 월돚과 퇴근후 취미생활로 위크오라를 만지작하고 있습니다.

트위치에서 귀마개님의 플레이 영상을 보던중, 리틀윜이나 dbm에서 표시해주지 못하는 경보를 위크오라를 통해 표시하는걸 보고 저런건 어떻게 만드는지 궁금해서 좀 뒤적여봤습니다.

특정 몹이 자신을 타겟팅해서 스킬을 캐스팅하는걸 찾는게 좀 신기한 구조로 찾게 되어있었습니다.
COMBAT_LOG_EVENT_UNFILTERED 이벤트 명세는 컴뱃로그 소스 유닛 정보와 대상 유닛 정보를 모두 넘겨주도록 문서상에는 나와있는데, 실제 해보니 SPELL_CAST_START에서는 대상 유닛 정보가 nil이더군요...
아마 특정 버전 이후부터 막힌것이 아닐까 생각듭니다만, 대안으로 사용하는 방법이
매크로에서 target이나 focus처럼 wow api내부에서 nameplate1~nameplate40까지 사용 가능하도록 등록되어 있습니다.
아마 동시에 40마리 이상은 처리하지 않는다는 가정하에 작성되어있나 싶기도 하고
그런고로, targettarget처럼 nameplate1target을 하면 첫번째 이름표대상의 타겟을 검색 가능하도록 되어있네요.
사실 이런 코드는 api를 누가 더 많이, 명세를 정확히 알고있냐의 문제라서

다만 특정 유닛의 nameplate에 대해서 이펙트 처리하는 api는 못찾겠네요.
개인적으로도 ElvUI를 쓰고있어서 그쪽동네 api가 공개되어있나 싶어서 찾아봤는데 당연히 공개된게 있을리 만무하고
차선책으로 코드를 다 읽어봐야 하는데 그것도 고난과 역경이라
관련 api 아시는분 있으시면 팁좀 주시면 감사하겠습니다...

만들면서 커스텀 트리거로 커스텀 이벤트를 발생시키는 구조로 하려고 했는데 뭐 대단한걸 만드는것도 아니고 해서 그냥 대충 만들었습니다.
COMBAT_LOG_EVENT_UNFILTERED 이벤트의 콜백함수에 그냥 다 때려박았습니다.
그런고로 얘는 활성화되지는 않지만 동작은 되는 뭐 그런 구조입니다.


-- COMBAT_LOG_EVENT_UNFILTERED
function (eventName, ...)
  local timestamp, type, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags = ...;
  
  if (type == "SPELL_CAST_START") then
    local spellId, spellName, spellSchool = select(12, ...);
    
    for castOnMeSpell, castOnMe in pairs(ZNT["CastOnMe"]) do
      if (castOnMeSpell == spellName) then -- spell matched
        if (castOnMe[1] == "" or castOnMe[1] == sourceName) then -- source matched
          
          local isTargetOnMe = false;
          for i=1, 40 do
            local nmps = "nameplate" .. i;
            local nmpGUID = UnitGUID(nmps);
            if (nmpGUID == sourceGUID) then
              if (UnitIsUnit("nameplate" .. i .. "target", "player")) then
                isTargetOnMe = true;
              end
              break;
            end
          end
          
          if (isTargetOnMe) then -- target on me
            
            -- alert message
            if (castOnMe[2] ~= "") then
              SendChatMessage(castOnMe[2]);
            end
            
            -- alert sound
            if (castOnMe[3] ~= "") then
              PlaySoundFile(ZNSM[castOnMe[3]]);
            end
            
          end
        end
        break -- break when spell matched anyway...
      end
    end -- for castOnMeSpell, castOnMe in pairs(ZNT["CastOnMe"]) do
    
    for castAnySpell, castAny in pairs(ZNT["CastAny"]) do
      if (castAnySpell == spellName) then -- spell matched
        if (castAny[1] == "" or castAny[1] == sourceName) then -- source matched
          
          -- alert message
          if (castAny[2] ~= "") then
            SendChatMessage(castAny[2]);
          end

          -- alert sound
          if (castAny[3] ~= "") then
            PlaySoundFile(ZNSM[castAny[3]]);
          end
          
        end
        break -- break when spell matched anyway...
      end
    end -- for castAnySpell, castAny in pairs(ZNT["CastAny"]) do
    
  end -- if (type == "SPELL_CAST_START") then
end



몇몇 샘플들을 뒤적여보니 동작탭에서 초기 실행에 글로벌 변수를 때려박는 테크닉이 있더군요 -_-
사용할 설정들을 대강 모아놨습니다.


-- Soundfile Mapping
ZNSM = {
    ["AirHorn"] = "interfaceaddonsweakaurasmediasoundsairhorn.ogg",
    ["BikeHorn"] = "interfaceaddonsweakaurasmediasoundsbikehorn.ogg",
    ["Sonar"] = "interfaceaddonsweakauraspoweraurasmediasoundssonar.ogg"
};

-- ZNT Table
ZNT = {
    ["CastOnMe"] = {
        ["사격"] = {"", "사격", "Sonar"} -- specific target, chat, sound
    },
    ["CastAny"] = {
        ["칼춤"] = {"", "칼춤", "Sonar"}, -- specific target, chat, sound
        ["산사태"] = {"막돌 파괴자", "산사태", "AirHorn"}
    }
};


실제 위크오라 문자열은 다음과 같습니다.

dW1evaqEvvTEvkQEpiI5RQOCFGq7NwquKwKs1mIIOHeIuZzvbzuqHtbknPvfuZAvrAwQunSOuLBPOmTvfQ2fimUfvuM3QcPHPQi6yqPSmfv6zQkQMMkfX1uviEhiQzhf19uGvheyzRkcFhjPTJKYdccYbbjluvjEiq0evvQUisQ2OQs6JQkLFSOIQtIOQvQq7zrfXmvuv3eiTtOKFIOmufv4uRuuwkuQ8uO6trPQ6QiQSvvksFfkvLtSOI05wvaRvLcVfKAUQe3fuSxv5VQuAWYHvYIvuLhRuMSICziBwvLpRGgTkPtJWQbcQxJKy2i1TrKDRIFJIHJeBBvbA5O0ZbmDuDDG61RkuUDisMkOAKqr4h2EWF4KE4tp8Ph8h(ebaim4ZgNGAOh(IM(HV24eudbNLy4qelOmtOhwZW2N8HV24emhGh8hoaFXYFWF4amGptpCYF4i2FRn0fOMMyoaxW(qlQafy2fWL5GHQiwOaZUaafnrSUGZa(mbCbG5SyHGz4Wh(eZTamGptV594pCIdb)b)HpXC7gyaodP3xE4BGb4mKE4ZMz4mGpt)iOrgOlkuiodD8gyHdQnWGehnZmO3HIGftWWE2HXgy7ehoI93AdD5YAAI5aC5cvrlQSaZUaUCHeAIyD5cad4ZeWLllc2RmShiygoC)UJMzg07FHGkimbd7zhgBGTtC4i2FRn0LlRPjMdWLlufTOYcm7c4YfsOjI1LlamGptaxUmpcQGUYWEGGz4W97oAMzqVJZCwS7WydSDIdhX(BTHUCznnXCaUCHQOfvwGzxaxUqHHQi2fy2faj0eX6YfagWNjGlxayolwiygoC3rqeYo64Sz2nWcUbFnpAKJ3al42adsC0mZGEhKlaozhqr7WydmiXrZmZmZGEhZy6Ncc(e3SDySbgKSVF32XmM(PGGpXnB)UTJZCwS7GOnBMbqbTr8JyZ4l2Hi(DB76IF3ayaFMC0mZaX7oAMzqVdYfahQZ)DySbgK4OzMzMzqVJ5pWhfZFWp8om2ads23VB7y(d8rX8h8dVF32Xzol2Dq8UnBMbqbTr8JyZ4l2Hi(DB76IF3ayaFMC0mZmZmO3XmMI9WmM(PqkqOp0om2ads2)yy)ZPFS5CmPbPWKysqWh)JJ55ei9(DBhZyk2dZy6NcPaH(q73TDOiyXemSNDq0rZmdeDeeH8J)4pColXWHi2h8ho)pf0dFdmaNH0dFdmaNH0TxjMqpCobj00dFdmaNH0T8)uqpCe1qh(dFcm7ItWCE4ydIpYdhrn0H)Wb51f3afbaSgIE4iQHoCGhoijd0Vaf8BNpzF7wQFtPowWVLCy9vYpF4uh7O(3F4BGb4mKE4ZMzGKmq)cuWVD(K9TBP(nL6yb)wYH1xj)8HtDSJ6F3XFGpBCcMJHbIAOdhRfj0DdciGawhnZmAMTfTXjiHa4lsuUB8)uq3TRetiqUa4i27gady2n03ih5)(DdGbm7gcRfj0DdGbm7g6R0RHa3nagWSBiSBrm9v61qG72ecG)nYr(VF3MqaCSwKq3Tjea)R0RHa3Tjeah7wetFLEneWgyqabeq2rZmZrZmJ4NHb)pfKnyGTJphuF(Z)wqcfo8BXHdf2bFhwJFfDC0mZmZmAMTfTbqbrtt(P7gafennwlsO7gafenn(2vggABGbGOrBCmW2CVBqabeWczhnZmZmZrZmZmZ(XWABlaozhqr4uq003TTfaNSdOiJ4yuweSayCdSGd9oixaCYoGI2HbwBIXrZmZmZmZmIFggBlaozhqr4uq002Gbgafennwlsiyn(v0XMnZaOGOPnsl(2v0KJMzMzMzMzMzgXpdJTfaNSdOiOXgm2Gb2(UXWABlaozhqrqJnySbdmagWSBiSwKqWA8ROJnBMbWaMDdzKw8TROjhnZmZmZmZmZmZmZrZmZmZmZmZmZmZOz2w0gba8f7qeNSdOiBG9BrdGGSJMzMzMzMzMzMzM9JH1igGT72n5tAtmoAMzMzMzMzMzMzMzMrZSTOTdjka2aB)SiHOqV4ODdcimci7OzMzMzMzMzMzMzMzgnZ2I2oKO8nYr(VBdmYDi4FJCK)7yCirbawi7OzMzMzMzMzMzMzMzgXpdJdjkFJCK)72Gbgady2n03ih5)oSg)k64OzMzMzMzMzMzMzMzMzMr8ZWGChco5bi3HGJX(zrcrHEXr7geqyegeqy78f7qeF)UTtHE9hXUdlSg)k64OzMzMzMzMzMzMzMzMzMzMzeaWxSdrCYoGISbgNfmcYoAMzMzMzMzMzMzMzMzMzOZKJMzMzMzMzMzMzMzMzMz28yrlQazhnZmZmZmZmZmZmZmZqNjhnZmZmZmZmZmZmdDMC0mZmZmZmZmZmZmhnZmZmZmZmZmZmJ4NHbba8f7qeNSdOiyn(v0XMnZ4l2HiUXCmsihnZmZmZmZmZmZmZmZC0mZmZmZmZmZmZmZmB2mBrJy5gjeaWAiYrZmZmZmZmZmZmZmZmIFggBlaozhqrqpxym)Sb2(oSg)k64OzMzMzMzMzMzMzMzMzMHJotG86IdkcayneHX2cGt2bue0ZfgyHSJMzMzMzMzMzMzMzMzOZKJMzMzMzMzMzMzMzMzoAMzMzMzMzMzMzMzMnBMTOrSCdGb8zYrZmZmZmZmZmZmZmZmIFggBlaozhqrq)5Wy(zdS9Dyn(v0XrZmZmZmZmZmZmZmZmZmBoOx)XzaFM(kbncJBGfoOqVTa4KDafb9NddmWczhnZmZmZmZmZmZmZmZqNjhnZmZmZmZmZmZmZmZC0mZmZmZmZmZmZm0zYrZmZmZmZmZmdDMC0mZmZmZmZmZMhlArfB2mBESOfvmQEfDmakiAAJ0IVDfnzRZFQU(dbeq4OzMzMzMzg6m5OzMzMzOZKnBM9JH12waCYoGIWPGOPVBBlaozhqrgXXOSiybW4gybh6DqUa4KDafTddS2eJJMzMzM5OzMzMz)yyTTfahQZFCkiA6722cGd15VrCmklcwamUbwWHEhKlaouN)7WaRnX4OzMzMzMzgXpdJTfahQZFCkiAABWadGcIMgRfjeSg)k6yZMzauq00gPfF7kAYrZmZmZmZmZmJ4NHX2cGd15p0ydgBWaBF3yyTTfahQZFOXgm2Gbgady2newlsiyn(v0XMnZayaZUHmsl(2v0KJMzMzMzMzMzMzM5OzMzMzMzMzMzMzZMzlAel3iHaawdroAMzMzMzMzMzMzgXpdJTfahQZFONlmMF2aBFhwJFfDC0mZmZmZmZmZmZmZmdhDMa51fhueaWAicJTfahQZFONlmWczhnZmZmZmZmZmZmdDMC0mZmZmZmZmZmZmhnZmZmZmZmZmZmB2mBrJy5gad4ZKJMzMzMzMzMzMzMr8ZWyBbWH68h6phgZpBGTVdRXVIooAMzMzMzMzMzMzMzMnh0R)4mGptFLGgHXnWchuO3waCOo)H(ZHbgyHSJMzMzMzMzMzMzMHotoAMzMzMzMzMzMzMJMzMzMzMzMzg6m5OzMzMzMzMzMnpw0Ik2Sz28yrlQyu9k6yauq00gPfF7kAYwN)uD9hciGWrZmZmZmZm0zYrZmZmZqNjB2m7hdRTTa4qD(JtbrtF32waCOo)nIJrzrWcGXnWco07GCbWH68FhgyTjghnZmZmZrZmdDMSzZmIFgg8)uq2Gb2o(Cq95p)Bbju4WVfhouyh8Dyn(v0Xr0z6Hd(GOg6WF4lWCMhoWvgQs25HdCLHQKDGAJtqn0J)WPzwtp4pCWaOBbiU5O3xE48fn6WFWF4KatZjEWF8h)HZU2qp4pCsGP5ep4p(J)WNi(9Jydmn))d(dhG4mKg9W3UUOPrNHOhojW0CIh8h(21fnn6me9(YJ)4pCwgA0d(dNeyAoXd(J)4pC(IgD4Z9b)HtcmnN4b)XF8hofQrHVOrh(d(dNeyAoXd(J)4p8FRnobZ5b)HtcmnN4b)XF8hoya0Tte)(rSbMM))9LhoXzildykp4pCsGP5ep4p(J)WbiU5Oh8hoaXzin6HtzXY))WjbMMt8G)WPSy5)FF5XF8h)HZIgsWCG)Nc6HtSXCE4etpCmdPH0GG5mS38jM3dFnnrWjyol6B5SedhIybEWF8h(bmj4SedhIybEyHTh)Hd8WNleFeiM7dNApSW2nzUy7XFp


Lv50 치아n연화

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 와우
  • 게임
  • IT
  • 유머
  • 연예