Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Интерфейс ИМБА-ПАЛ (WeakAura, PlateBuff, макросы)

Упомянутые в теме пользователи:

Показано с 1 по 2 из 2
  1. #1
    Новичок
    Регистрация
    20.04.2025
    Сообщений
    2
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).
    Репутация: 0

    Post Интерфейс ИМБА-ПАЛ (WeakAura, PlateBuff, макросы)

    Дорогие друзья, предлагаю вашему внимание настройки интерфейса для Прег/Ретри паладина.
    Интерфейс затачивался под ПвП, но вполне хорошо показал себя и в ПвЕ.

    WeakAuras
    Начнем с самого интересного - c настроек аддона WeakAuras. Этот аддон реализует концепцию HUD - когда все самое важное отображается рядом с персонажем и не надо смотреть на откаты кнопок или полоски бафов.

    1. Он показывает недостающие бафы (вы их не кинули / они слетели от времени / с вас их сдеспелили)
    p1.jpg
    p2.jpg

    2. Он показывает проки, откат своих способностей, откат нажимных тринек, полоску замаха оружием (специально для фанатов PvE)
    p3.jpg
    p5.jpg

    2. Он показывает особые таймеры дебафов, вызванных нажатием "Гнева карателя" или "Божественного щита"
    p4.jpg
    p6.jpg

    Строка для импорта аур:
    Код:
    !WA:2!T33c8TXX5D6vWowb21vIYwosY2cMXwf0MIce8LOSzKbibfPeFjaskjl7aSaybwiccSC3f8vSRTzCDyA8f3WK04K4KyZKMMRnTrM2Y21VARA6J7U02rkp(TPPnTrX9rst)1E661ljT3L77BM9jWc(u21TXqcea7m7SZoF))EoZ8TCJwJs0MBiqdbQz8Asxt65VPZNKp1yPLlk1zX8fLpShpEgYtGgArQMuflOkxmFEH0DkMlFAzHchiypJ01crfukwsoLGsTD21fswuoTGCy9MqAlHZNB2z5Lt7B4IfZRMtAb(c5gNxnxXcTgvrLxwT7ZkWRietfAUSQIxzy1zKecxOybHZNUKmTIXXdjRiax)0kZH1Ey4aKRo8485k0nX7vsUkYvt(zixd5NLC1jZKRqofXYp855lPkwuEqjSbv8MK1nfLNzWmzueu5wIVqkO8HkMRGAYoJmWWrIUiRoXYnRWvKKDhMm34sfLvxIvcB8HJJZJ806nJ(5ejDwbPTgBIs8Yc(6Uu(8(oMyovbz(u0lFRK3UxYw9gg6PQENtvox2SW93o3JS(xFKftlKSuMm4TPCpr6BOUhPpYvfLhgpcoNIKq(89MwX7fukLuysHcQXGQMB6LI3zOydhp2WHIoSzrdjlaffn2qr6RVOf4hxqXBuAbj7rGpVQy4sqxiPuE(zeKxOub9RV3fLfYcDu86hnRCXssNLDFXUlF7rvsXNxWZckc5ZqhXiBV2CPNR3(dhAVdfQVlchrqUaF(rH7kOzYTugz4sdKyEvEpxKns3nEi8cKmwNrJezGLYvitrzgYWBsGuNjxwV6d09waUQEcwkx6LAF2MMC8HhmwtI8lI4HCm6z48f5t3DsvOBvqD7rhVea18gggQsTDsyVrtLNxrb)wyfGAIFzr1IPMK1928K3tnPEYMM3hXZHJgMpzEHf7P04JlipkGipBiz1IzogVCKPlkpNXpiVnYvMuciUWTElKRLJCDKTt2jfkqUjk1D3ibM4BN7HCZpcPwY7eWI3c5w9s2d5NJCBEj(j1rUDs9K9sAGSpVKwZrAMS9fbQwu6aVIxYD1njc2rjDs)Bx0)gI(3nzYtsEhKDqAYdzBIKBGCJKaKgjx)vqc(2jDd3uajHC5K28q2pPDsnEj3PhYD4L0XsXM5yPkntWMARLdt2fh5GEjhWlzZqVUBkddW3OZZq2sfhzRLFK5Bmzjfb54ZWX(CAoSnV2V4LDrGAkGyNcPnLJ4r6AtlOWRI81cOicw5IlPGybHPHcesyVoDB2gIeFxdmw(5XXXfqgbky(as7M8HiVk55iN5Cp05MJSe5mKxH8kN7dq(T8DU3p5fo3Cs3QBvGC6Z9y(ipp8bTsKtlD9Kpc5LiNgo3h1wbqdHujKAb0oGyjd3Kdax5eirePLiPDFEL2kYzpPWWm(N(lMw4lEzZjuiDOczZl8WBhjWR3r45KlQs5k4cNbealTLULZnRVJwIpnYo5B4Hj9TZTtUQZdGNKMdPjffYLvu9l)ZsrcjtbIIbsK0wGUFO0NQKIQqAH09ZpTO0wTojDkGuR9I8Vz4tjCpHsNgqJ3ZXe4hlemORCpdvCkbz6x7xiDo(7HDu8VnjTvlsUrt126QPc28Yb)TXGLC8CYYfLfl)glxbrsGlkjxmRSGcCmANHnkmn3cahEH0inkA4(Imqxx0AeGHuPSwL9hK)CbL88fuXtmzVdeR3UImhsqq9d7a4SwKQnJsW5qwUO85Le59mxQIJlH9crKF8qujfT5j6u5sRk(WBJCeGfTJL6P5wfgfg6gC0KY5kGYLeebw2LkkNdeXqP(ZnAKOd3BNH6JXWkTfREntQ8vm)ntBTRTN7kAn)Wt(Ec93rVwoehHSq)nGMeQoee)Ua9BiIEZV6NxARWOy8ScfeKZLkMyXPgSqIZ74NxqH(rNGQ80fNQazVGex5ScQNxg0MeZOPKUoYta8CVe5vp3C(ipdWUDgGX70NhBDZRxcKJczSagPB)8HOkg9nIck(Lwrzbu7EUczf15XiN4lEzBe(OfTeRaO(05usjlOcxhdUlgBe5DtI)Tsspi0fVRrxa7lfavMYI6WVUSblzquuiCgaWjRd0iNImgzEPioW(d6a7Zq80rm8wFsAxyq4QaAIvUNKYWTE8mYccZkq2vph8hmXJ9d)UpXLHyqtj79Gs2NGjCVJLAlFxhzO2pA2PBSouiFnGkptHUeLBzl6s5pjNji53P7ro4p(x7l9tSbs2kfN47MOYzpEcQ8nu8hqH0PvdVtPBK84N7HiV45EVG8uMe1x1h(hYVfvUlQqdv1XOzql9VaTeoigtfWRkIytud53G8IGq2x9Cp45EeYlaF7LNdQXWWGEErY7jb5(i3pTHEaYhK8qjiZU5x9PqTlrfgx8IWNrMgK2gJzgKi0dNdUIZugkbhQEyrYjpJfz9zVgYJGKuY7BfiLjafPZVHjIPfghm9jv8uGqrYU(li)cCM0UEDq7gSP8QTF0dhUUrogs7(ah2tph8F4(PV65GFJFz6lpOcCLM3SdT1oTWf5bk7iBT8Jyr9Jub13MichuFDLFaiy4DsE0YiWLnC)lWTogUfTgUjlG3NRxoCZX3d7y8nBHPMS9UKtpsQOMJV)Jpa9vph81AM(QNdEHoKo9LDzxgzxp6vABG(KNHAwyYWJeD4ydlv7jJka2iNSesPVxFXMcKp5B4CGTI(83jO8P441fTNHchkQC)Hgie8jAOiElDPYersFxQSm8kmSmCDpAZSN8iGbWDSuWXoU0W7VTqhRhD9tGvGZhmmOFAQf7zWO9E3doWWGQlpN6IKhN8SG(GttEPt2sJbUxPMiFm4hViEaBgVrEPZ9Oq9EvYlZeUGgPDg8GNS59dN0UjpfzPZ9yGrAMMZbh5fql4ozWaqf2d5lDUheeWasOqd6EgQTDpluJtdnei3HwVMV3Zggv1kp2jBgpPBM8jH27zH2IzGiCbmBJt2yWwcCVMKZ78kTrpb1PG8HRWPu0vhzDjqmDPXledBapGy)05kP8WxnsPbZhYLTaz7YGzfOnLC6K(qvq6zGHJauulYpkpTVCJNtvKceojhGfUOc46ApZawyKEyunB3KNuK8eIKNsK8PfnbkNn9mGP15srD7dWmHXZIC1rZJT2vHuCajENEUa48f0ZkO2nilUOCYOH6Q3rIHyQGV95YIxcW1UAJ2LjE7Jc2Xof7(CbS8JHgaDvicuMfraWINow6eXowOSnwsmAr)lWlNQpAmba7N3f3Iza3O7mNCQ8GE5nSuq0hfotHFTkNUy88flkjgvbnOsQPvwQpwpL7bmlsnBPcnumB25G2qH5QIoeafL(CuYVDzPiKGjpfHadVZfT4iqXU)sIUOfZMyvH1Mu1GH6Qlqn2ETUHgA0HO(EFp9IKq8N7nmFbWiV9gzCavm(E3Fqam9rTRV6jqHPTzipvO5zehOqX0dRoHP80)Y44R3nip9APVy6ReUKtOiNre8L75jVGOD9vohKHrwyqegIHrtWAJgwBcyOufd60g3QZni5d63RnIxtbrchqRmODFkKsORlK6()qbcnv)hou0rb26Qq7qYVjXdWGaDWsh2Yshyd57QsXZ(aJgPYNDsImSMahWTCN(sh8No(T(CcTPwOJdByJr(0uJr65GFNp(h)jrdmGbwwyyIKQP(93wZnFSbquoZSVBK(QNd(TVj81nYiBm6WVa3YsgCiZXPX76sCacZnVIQfPucKIGuMlXYI2aeJgBEDleX(yVbn5ZuTHBGub0NowQ0mDn4DN7ihoI0Si1cOpiwyzjgJIeJxqevLKnFXPOeMLWVfNf13WOVZUWTCbYhICgWtOhc)lmeTg4p(3tHsRt6y7O4jxOipjDa2y4VZszBmyxsbgUZESCjQcI1U4SrryIPO18p5ttF1Zb)Ron(6P9yNmvMJo4GlvIv1n9ZMpWi5ajdi5aiEx6Og2DC6Pw7(nTEPgbqyGnLfpfLkaKhTJ(3)Gi5XuRrZ11vMjASZKHoKFCC3U2DCKV1fbBGLhJAuNNfZbkNIrNWepjNIpBXE7AHjhy8blmA4uhHSRE(DULj(Y)4V7h83d9dvAVl(s)ZFSOi5580MiQr8yK2QJFJHDlCOrgEWGLKZlTlrvvjLdSV9HnFd5kUpZ2FFbdJxErIVpiqGNFllLI6xwCXCPfIQcUQLgOCxKDWr5LZHwcRiT33JxFWlr(cP91HVAvaN8kKT26PhursqW(r9E)gTjoVulPGHkQKuA4Vg24RBFpBkyuKEXo7lYihi2X6DGdfVRq9h6qr0)r)9glwKUoaD2z0)HVrgO3HJhA4Hd15rIdfahzO(cDIirJh5OJ07q9hzGHJ3zpHg4qgvLEYwZ8t5hSxCMSIoYqd7s9hPZoH2hkOZrIgfBywhHwO(1aa9jz3StFlV3mLkqLK5NpFE6DTs9(O3I17Jnds17tPuYiSJOiN6qJ0Bx17lE9XRpTGIk9x4p81qdnuhDKnFXu859LQKmorkOB0WO8HeOFZV9AWJfGb9pUqHjPhpxg2v2xhaDXTXHA9HKsw3Iwj2xzh2OxIfWl0GsE(X9PkkuG204R9UxFs8Glu(uOE4JWgzZcHRnCsq7b2DLMgcG(5ZvW37YXnIJMdFbNskEfvS56WNQCjHYlfd3jEQ9jKr1xhUEj2R9lHZZ3GICYAX2P27fAH3JJAqrYGgi9RE9vuyka8NLc0DVCKRI1VWVPq7VvwlJyUJU)X4zaU3u16sfXX3QF1MKpFjb2LZ(atLvufJAOvfJHmRvwltEyDAqzDO73XVqcS14zXmzGHte2ugjzWmzwjIUoPfAIQtzXMP6e2YiUSoJB02vK(UAOXUrNHlP7vCvtQxfK7Yi52gWCVU2O6qDRcrFvq4RK4luiTJFllOwsUGtowJ6iKxrWHKOQliTwdeukrHuJD0scLesRpPhoqnmHlgskWIm6b27ySAzXh67N3IGDYMBR5wcWqS9Q0jdxrdsTFAj15QSjBTvLnf(A5f3CYAXtGcnD0yR0zPdiPNyfcfDDONnKVC39TeSA39qjRT7EAt9FKU7BP193ylUE3tlzTC3R3u)hO7E6ba7ELkNPA5UpTDs25VTUNz9e353RMPz1686dxRScQSlIsVfYuu36ghJTUPWVdhQxUDhk58UC6(rRAeuPneD6j8ZkQENQjD7AwxzczmeVId0bycKSEv(iC561CP)B0EExbnCvEhGLuVdj(UCjRZbAzLUifYL3RBc(lh9vbHV6wzxvdpxbX8v3yXm8vCNS6HkgQrxrRfVuGywbJNSBgKjAYn7LwDWixV1E9cnTHnnOAoFvjWWfStLJuRaaAvaIUuaKE9gmDjbqDPbu96jWYnWv1ay2axL5gROQVIYLFWPuyYSbpAbB1fuzE0Uracvk9(ncuauP8ayMnJ7DSSUlTgh1uCzulvEb(jfCPazLQYRTQTUW4fl2g2gimv12HVrkKtnKkUKzOhXVHKGkhySDsMFf63bCLpY1Ww4cVbYFvPI)vpNLlxOnkd1gNBAnaHCNDWKubmdRs)1xzEH1kJGB9vNTHneHlGRvp7ITHWkTnYR9dxLqYzpkMLPMJH9limv)w9q4xdUw4aCwF7)Yb(FLn1QQdFvT)5IzaUowTbJziCw27c6(6ybdlZACxHh6szWfeVu(CODfoBZ95SjRY5RAf(k)RyKjRZ3Tz7cUU01OEjXAdN0VvK9QAi(Q5ruhOGruuPDSN7slxf2Fun41AqgPTMyL9n6sxuozWu7Ja2hLwDdqvhQAEI7RQUpUQWPveN11gm1nsM6LapqwjAwzS0vdJ6KAQZAqLpaTjB2PyMHWKMAwxwy8DWPu3Y0WS7Mvt7IHn2(nNZwDJj1Tc3ZltpKFJ5Bczrrfj43T0GqHK(9RiKxiLQ)gztiflEoHIg9e1sT7JvyZvuyD1vNBQYuxpZCd2vnpX3Lp)bAOvatAFSPU6wrzj9BAXPlx1an0CzT4BybcyzIGxz30bVKFth8nv30vX4j2yHlWtqcP(SN66ea4DJ58WY6WGbhKD3EQ1(mxxB5ofvR9PY2vR8sNltgtlOvfBGpPIF7Yr37YpSA1imrWRU2WH6oeY5gu52bOsJT47oDQvGkDWfP)UvBFUdvxn(zS(9X41n)l2iUsaJXo9ySCFiDA2AvMM0ycQUnBaRs9XaJV33qCXCvfjqDzD(9BYaCNDyGJ1rzwLqXwGGpG7YVXkDOs8XDATmiQOdYoxhgN(wGZvG(CjyOHHdn7lvFGXY5baJV6J8TRwX6kq3gduLr7TCe7RlSfxYjrgbth4vaDtWh46LuFpBa(heLpRqu6eQtUDYvr(o2w32lLoNYPORxPjfcYxygPAylJj9DOBFfZMlLudMROjJ9GFDmnGMDg2rpzJ3l9IFc2sBlU1ERBr6(wJMydeRYcaC(AssRFuo8ySVhYd7Zd5HwDmTfq)D4Eo4V3hgF9vts3I9Z4Hmb3Cg5bHWngiWTwZmClqRlUSloVIQmpUrFPBCv4YwZ06L2nCNjDgZ7pJ1Qr9(Kb7DZcVtcV5H3YbHFdVtcV5dwN9BF5gb4S5PcMu5xoia(KBSU6W2O8cZIfMLwyYkkmjwysAH8vuipwipuiok7L8iC0DDj9(ibBGyApUSXOtYRNcg65G)D)q41p6w75GFx6W3m9CWV1NeFDwpKhw8S0fsiBxYEcosFhMUql13Z0w7z5jpplBdeVilxoy8tw(kiiC1ix1c4USMEy9mIGowa3gq6P(I4tMtjxY8cj0tEbXfsNvGCJg)ctabEMF7s1GBw04kI8Plo1X1ZEelqpg(NAVvjPTyRgwPAIlWoQzMx4RlTn6r4lbOBCb4qxdMHdb)8I0cYKBAb2UT5Hop7w5e6xUZslh3005YmdbgpKH7o8ylslWcLZ6x4MDEXitt3mZtXpZ5npinnvm4id3xVdeXX9LXfs)6ACBYoZPGXJJjZln3X0)cR7Op6jQF7BlTCC2EhyGirJZsohs3K5yvCwEJiUuC0Tc9FXjDZvRcWnqQCyIFWJ1TaUjU3TuDv7u03tuXvfHBEXI5tZjTdxQl7lK)ms8DqxU831JWaYy2NiXfm3(ZJvO4ufe1xkVH2tsLC4Mg)RtcV93xc6EFEsbXCPYlmsorsx7rJZN8qH6lux9oaudnUAtWwkWOON4SeErIlqr4Hn2x7KxKWlsA99rxNW4IEEpKVJ0VoZq6CPTTwkBixAV6lcZ8fli0RJY0pKxVMlL4gOleYdede5MUuEbMwcRsJLIVa1Vaqmdyot9((5owO4XgoAKH7SN49hjESidmuOE)5Q3N1PCibvwgVWFoqXG(vSU6wiDX4m51ji7g68t)2Uw3wjOEzZFdDrJY2pW4ARqFvoPVoo7rqUyUu(IbYYhtWR1C7uXjrxCqWj0jTCVSj7PSAPViA0B6OLkiyRHfvRO6T1wlTuEpzyr5It5Ln1CLv)GbAP52nR)X4LHwV44sEnwJQLv9gBU1MnRDmOcEnM2jZviOXk4QdJaA0u9Unyvx9g1MUINwMAJJsg1wFfcv1AZgTGAF)ukvLR8n2CTrt1lvwk9Ugt3azY0dBzzBvzBh3BzMTfWR72UwXXzMxrpCz2n51LzoVYfORXz64qEn04w118ZYzJ0Y74UZ6A)xMUV72kHIcA6vvyCClJ5h)EbKhTO8m0dAf4H691yRuNicuN31YCAAFLIUMUATzC1eyKXkgVCmA6W2uF(XLQF9(mmnQEFctlLJ9DQx8gbYGTI(7Wh1wwwSOlQ6RmOL9OSuixER1)L(XSwTTUUcBR2QQT8filD3hyBbOA05HYmVpSS91X9dufNhOEBRvDu1Fp5sly0bSIyS((zGow5TklW3tILEVwfBSIzz72Hgy608x7T2qq0zaJoQUmG7Ns7CqNQmOWuhnQN1Wmcd9inS8xPkQUZHz8cRXTNe4E55iKRWUnEhNJTBuSY7qKSy65a1BGwX1XsQDYpANDkfowXGjvegFsb5On2aOYAbQ59kWyz4(I09W0T)Ye4gQE)lrBXEOzvNDqMxAB9liNbylOsx0Z2n61jx60cfchEWH7j8Sflooxu6HtyUjB(Lz9vJuKZbwX9ASEnvUhwcfloMqXO5tm6(L6HVAsE0YWEo4R9v(k)P)KFIg5o2J0wRqCAILSH4tqkLGuZDdwuVuAbLuY5OPfTWO1msx7qaXaODzTNEdifJMhZ0lefpJsoUi5QskkWdMZQXDhBsUqryWiRGiuygOe1IzbZzaJDZWxkVAIGJjmJg3(XmNuxW1smmM5MK(N6e7G(aAUVjO9sFSDjNp)33WwdiSD5kFYC5ZPotCGDQKqC(Xtwsr8anUF8)bG)1AZ4)H)eG(N7t1x1BIP4LLZveSANQKFn2iuJ3INwGxvCSciqiEAGocfnzoAFF5AU6ikxbBKtJ7DHJAAChuFatJ7U04cLqJlSgx7ACDkQX1L02WeUd6PmJhMUQDGMGmj5tso4b2d516MCZEQTOuTD0XCtQVnMIszzIsxh9Y6kWKzCnk7eSJSxX5arsGT6QG7WGP(n0Cd2n52rJQXDOW4vgolYw04oc98pmaY(20xFnpE046J8dBTSZrJBaOEbH(DY85kmMq6eMNBph8lt3EXbaG6)m(6R2Zbp3rXx3hRTihWRSEkz7kMpe5p96iKB4YOBa8x(NHU99(QCKVrL78RKtWFQwpIuMO7RrIM4cO18DNNpRIg3wjFpg3pAl(pe6aZ)oWxxVNEo4NZyRo)WIKFeh5U(xO2DljOMKxvf8(WAZ3XSsNAgoy7TUf4Ym7UdILHYUWCLa(DnUBkryzaXGvpApLgNVaj8EI2fa7YaJehhmDhlXdj81K4ktGyle3GN5cstkPN96W0uNCX8S0uhgHWCPa(OzOxRzPgiRSPlOmEXIQIdPRHjbvaNg3TrMFPi5NCKE9fgS0zmnUwL8BHI7KbjcZlFpJ07ET(1EJHYJ04ArKkJImbqpQJoYPX5NJCUfmhIrjTlQhifuwXxWmadMkCnDFGLcbDBcbGrfEDRDO7nrB2eePqPXBGEquPzd9d10ketL10uWBthaSCd7l(h3SUOkjQAjRxKVg5Rt8naUJaVwQpzs41q8SuFYer)RvutGHpAbAb4g7J78M1d)zc9C5XEP(DjsZEIjUi7Z4itfpyKtTVRoO7ruCda(nb)aVVZYsyw00dKaMuoIJjCXejzNxnbmsmi)t10i528kxQaDj0eg1OJ7S0)6G85ZZ2FPJTU3FPx0iFE2BHULbUdXlae(uJntx6QYb5nh1JrurMe(Z)pY)g5)Rg3MgYtWgcs(j0WoOXDzaaMtUrFdLBAH8K)1RaR(pE(RxJBNqHxET3QKg3vOx13g5RRXDLACBwJ7T)qACE504Ukm(cACxTg3oGF9ZOJUUgY9QXDdG6HAUHltJBlHhaG3ACxRg31PXTD46D9lX85pAVhQNH14UrYFMl(DxWWVBOX31o042gCbaM(4qh4wyEcJUb3XsdpEHqhDcXahrEksnEpVrQLKoMKyUI65TPDsZHkxEGgARfnUgIsVYK3MgNQXUhgDhL73F5q6muUSDFPzvXGhbnbvMbFDDUKPf0bufWALd0PSantiwqng1oj)GfQ17R2bhns0(cDcBRhkJwSdwdu(XrgLdZI1tp(RLffLkpBB1Au)12FVD1vFrCVw0yYy2q1Z6TqhR6TmWk4VohtyVTMlgnIrmd4W5KFVnwx5vbhd8Z(9boK(pRRIAHcdOw(zRQwhtpgJSxG9JyItqJlaO7QzUlAGb0n4ANACjiBshtxp1cXaOjHACbJoqey8hTM7JrA7kjkxEnGry9CWxHUf1)Gv(fObkcgDjY2JZDXYeDGAgQ6CVKdSDP3rUSfkklONGAPHrjcMBdbz73H35dPXnJnKjvZiM(b(kxJPMrnUO2YarakvJ79G3GACXQqviASOk(AspwQa14gHQRZq1Ng37EtLR4dvWPXDm2bpoOBtJ7eufBAC3l7CUh2h3n7JtY2662u6PXnm0Lg1s3QgxCBQVGHCqRLghVBQJy8HNtJljQisJlLgxA7s2PIrVpnoqxwEOzYcccenLBRXLdowbGqq3I2rPAzqHVACNcKBRXja9RXzIKbfbACzsqLLJYXrrXACsoLeV2tffACtaxdzNcCnf0ccDbXQoL3QXPGcKzYA3ft45YiR1LOIQ6iQOMcJDroQQz8lr5NOCzDj2tI9ChISVrSoGmBxcYQA5bz1H8CnUsGCEGk6sSwvRsSwNXsS(oTeRZ4lPI2PjOdnUPta2mcYS14MLA3YkXqgOdq3Gg39TtkMlOg3ppWLRXD)i3mYz)4OmbK7g9cutuNdwJ7bSX2QX9Gjavl92F4EgRU9pBJDRmFtKpbuQNNS256SR9omiXUrJVeu66cb81zrVQogO7v0xx0088IXcnAeF0u(S0ohjweFuLorgCKy(6EKONWxVD7B4qdCKfXIIjMtiF6LOPPy805ZCb8WNyWrI6l0irdfZ6NXIeQVys1y(BWL2yX6DGdfZO)Kkj8Ly8sYWhhcS8a)8WLsFkPDdFH8FLMtK(m0KcdM2CFwYRWYigKxGvHplCOtdfVal5pcv7PWkIPt3LWwSyA6nj2Qrlnwo8yOVNX4tjFw9VhAsW5eA3HVub1fHVegdHCU8wvEsHf1)ExczOhUy(zW2aBx0(q8t0Bz8MjuXiyT7wg8dQ44lW6fW5jtVrbP74vOuY8Zr)uwrLwGAPcMj2TJ)2AST93W(B0E66BX3(Qi1UzKktTYyFFwpgPnNFf49jPjWTVKNLlhUTUtXn2Y7F)QmZD(Cp8vJP)VN2kXUbe0R)ki)AqTb(LF9RI85Pz(JVi53G8SjWed4DAMgqQTZUipZdVDYPPPNn0dSowkBxNi34toCQo7oa53eZRBFH5VrnUpiWo84W7pe8(9bV)eW7pg8(xcE)PH3Fy49NhE)fG3pb8(JaV)uW7pl8(ZbVFk49haE)XH3)QW7pd8(jH3)kW7pj8Eb498W7hdE)OW7f1Z0VSjfsqgDHqupnKCeslZ3avXivbrnGILutVPTQp9gyyJswsvfCBiv67WlyeMz03q)Rn)X7Y(ItnvA0GcJSDRFAe4eu8TxBHD0mEy3HxF2oNy0yQ4V2blmcnCyG9rMUkHZDx9(eYZlPyeGllB)OjryAa(ShEq8uq7ym6kyfu8BEnnwJt(npBF3UvpZ3(81yGa4KByLCn8DN(AQYfHa03nNqgO5DAnfytwa4)oUOl7nmyNkw5kNlF9JAoCrTl8o8AUGmwfT4k1tX)BNKGHhLEnkKwpzaD(u6JLXMkh4DN0wSCRLD9sQNtxOgwPLq3gJRBUCQcJJjWyoJmv7T5LESy5lQUlMuHW4VjZUz)7r3GdJ8g0TlvRbj0NHV7(8hzIs5KghxpDyBuh1PuJRscYdiTL)(N5z)hE8x4h8PECF)GN7J(3)mNbtkU3QxZ6HNvc0Kh0(hQ3TQYGlFu)zj7B7K7Br0l0q5NcmTL8xt(B0nJ5IJjiifcZr(QrrKscuwvymEGl2ZG9DIy90B3dhZUPkZVtDN9c67wLK8vTjlD8IPJJzz5eLBCYTuTZiVqw(uZept(IfLtqnpzrwgygPgHhyWbIOBYXn4r3KedRFmTk58F)ZCMFWN6b999FHh87)YplyCcN(mr7ykVF0lJzaKnlsiBNAqYwbBEGc2viMHg7GldA3fyBMUbz9CWVD(3Xb)j)K)aBgM9V65BCEmbFbQBMOKqHuZGgNhSf28OJfGuOdLxF27fNdpeDvBWeePNPGxepmlrxED08fMXSMVqwJtLEtsl742llg9PWaTlmSi4rFban5jmn5JrlVVCWr2kT9dZECxqI)qK76pGAHpAs(2aR63wIlKxysH82JHbA5pZs)DNWMhaEPylAT1Nd6O0FuBtnVO1eBdOEBzPQ1TknDBRcq0ih822d51ALCZaD(qlw0m7JRX1RhJOlMaJG4dBfbZAUt4G10iCcxW58My)ewKfduC8btCyOdg21Z3XsZu4WnpuDnD4uTMbSfe1VgKQrSnpmlfLUwdHiiqTRC0SxogYZIMr7h0lkvdmSz0P7Vy6O0uloDAfAJO8qO(vqJCPeKJGkEFyrCPlHbedd68MMZ4kK4SgFdF4IiwHQonUFDDjBACFrOl8BOX9BA3Pq9SEgtiMg3xYq8fZvPtFJmjxACpn1jkRKvRg3ZW8d6b04EwMGhnUZy4j1TRXTKg3ZLGkSJkRrJ75TjJrJ7fsSrsmALl(H6)Jg3lPX9YjQiotVct2Hg3RQX9BZ4N3gx1eyOX97WKMvdNHaGYKkGck(DrjgOqHBWdveugQeH)vpvxOai1ag1pRHOanUFpnU)7qj)(ACq1(dHlWFe8R)B6DJVmCh()a(8pg(8RaF(NaDJ)uD2unUZLWoFQDordxNz8OACemYJaBDNSdFEGLuJ7RsvaboXJmIAqT(wu(jnU)SnzG3rRtVdVMGBfyu8BsXVAC4jqDhYejpVbOvpvWsnmCMu9uk2yz6QDHMnWWAC)wACVOd2wnUV2kXUc15RRZ0AvjnUVHUKanU)CX5VncbJhnF2csNkO04XSspSiO3TzhWSQ7RXkt)FZVDC9e60NmlT6uocW7)fzp7FqBnXSX4cPkoEsE18fZYuRF(4wBO)yXi)t12uam3aE7l2jTE(6Ry2Lmx6pycR)b4ySrSfeKzBZux)xGSui)K0oiFy2tobFyYRfDdtpf1(yM5CqK9s8sl7LlXfqXw8vzXEWnEpXY490572w5r71vwo4KVEPTYI1B4bhE4b7xpIVipObR7UIWIvmWgUH5WMFh2JBn12I1Zn0zdjNdmAFaEz5ItXKoTSItCCRWHdKK4TTkY1JOwWAqVCaExPBP85LmukXCGEy0cY4dn6qX7jEG2rlw15X7yPJ2v(PLBF0zoC2Jc81ISyy2mx583VFQITVzcIYrXmgmQusuNH(ph9YceGisZ2Jm2qnUVTt(pA1C4P872GjtJ7VYGXcr5Zsgb5UOiDGxba9eGJ)7ImDWO8fqEGxdzsEaOp(xlsv583KGXAb8CACFhZ4Yz)cql34zhbw8SKrz1L2O6Sxy)a5pHlbTXnyhPxc8P6d0rODm9S7PdLzI6Pbx30l93zXGSkauaPNbOqiTdoep6OidWcdhXWuxVg33JbLqEgegXclwfmeiS3DgcKvbzi(k6mfUXqSYm4WDOr)NZHw1V)kCdyWkG8fg9)DWT6zdy4XVf1R)1FCybMG7GMwSvoQBCc)Iu2aRhDwDS00cdgy6dXFe)Phe5k0zTGH9)sKL0F5SK0fbxCmuvX1vViW0UCaVaN5871Y4TpG(qxQA961HUmNXZ3RE(mTgW0Tn)oMrFbsxQGk(evjAWwAB)b0NeXfXzymY05uuvyyyJKb9I4kWYxN4jzZT0B175bz7PefuypIFopBgl7pNcUSuXiCrTaKAjiy2VodXF7MSBGxZYdp4q0fmZdNWbNXUyGHlpAumqMM8fB3Lzh0ayzaA0d3lIXC4jNHhq2aDsxxOuPah8lG5eWHaFQXVNAggi8392zCNU6YhIZ31nZWWVsIYC5dJbpa65i3i6PNRmyrPtg6kWJLWYSoaK)i6gTzUed2EC4NVtrhw3voWVgMSxQZq70YQkYFKUrvhGUclyx7(iFaBMyz3vNGmxDw3UKrT3B8dFSGNQUjKQB8Wgmit4HzXi1iYMkNx6dGCBgQv0suMAfQXOml8Ol(k6J6po7miuVBCYCqv0GHKXolHg3)i9Pl0oCM85T9SGtJ7)Lg3)mZHN)NjmdGlL5qJ7IgpDoqvbpdvhbYqr13q5wCf6FPY4RDPl(nzSE6nsFDzF(DwoUf0Lhe8AAEY)hNsJ)HmmEvnkzh6CiitaYXvHlo2ycwgpB(rlJDxjC6zZqxEW2AWv(aWP4YxSnEnCO5DYIQTUyxRydqHpGRo)V19IwxI(3u33fg0ZU34pQbm1a8sLZ2XsZMAM(Jn(DFIdf6egWth(lS(y704(XiJRg3)Mdind8Vga1Oa(2A0cpIOxnUMmfTdOxgiLkJgbWasFm7cVrW9YaGxhsdmaW3gdaFdmr9vAe0AuyVBq4FxDdkSKJBZycel)YjSSP(vsS8GSvuylIi2GIBb6odvsTDOVW9hDYPo2a5o6PmYz9OH2gIlriQtrM)xOywtSSUit7gdyy1GPWZnke7xmAJTV)2BmyZT2c8T2AUv83Tr)7(3F42c2EZrBkyWGnfnyGGnUFMKulSOPvgiCtxCP(ZnmeZIsz1LWwDJi2WaXYKKggNo01IC0TT8YrxtgtSwLJQBU(pA1BkHbeFYYH4MtSy5rl6sJLei0UsKi6KzJ8cTEIMut2wgkO1EGsTa72Lf)bP2HtH5mUfgoFxC6SGBeW92SdU)erd2yG93mGDBeG34FBL(xat34(Bpi(3anMSPM3FBbWk1uBTqpHG6WCQTVonyWgohN0xeBtFGdjxCQcdwi)m2SD4nm8ooF))NF8(JujE3f7f(QBU)B4ngu)HAE6Upu)hosH(wLO(hB9I6RMHWv6KOdW)Vg17WGuP6bO)niCK9dc0BS92BRTWngOP9tLQ3g9W43BVXgPFV91odG2MUUvb2NEFxfCCu66u5TaYUcKX150ggiRPpvtDS0KDNz8zKBzOUlMBvIE)LSHEx3sWyiERyOubQVwZL(Vouxx0og0(Vb9P9kA2RTak(as7K8jiNM8CKNL94D75jNgFKJDgYtFUhJfFpk6LU4SL2HltcpnInuZKNDZFpBp3RSf0psFhGbv1x0Z2S1DvTYNDeLpg0Rgog81XsK77XWQu7Nnc6ThU1ymVnI39)dNZQ0QkgBR)jT1lDkKAMdriMyMpKdruTz7zrNyt9nyB110XorQWMEDPdl0d3CnEDfm4qMxfOIBxBt3QoSylKpd5vPtGc(OD6fiNPmWG(u9m7Mhizz08v7GWOKRkPen36s)nECVxP2M8hodFAHYqnL5H0Ah1S9eLJzShx4kqnR5adVrqnitIfaqNmAccwazGnFM82xO0srIeTUIDhZwaHq3L0P7T5rNUR3oRKGakjhiKpG02SM3m8JNgFY)Rt0NDZV6tBs1R4z8yv403W0mJz8cjillF(20JsZ6Gt3qrZ6JtFLdFfaYbiTbah(Q2MQdH5iPsF2KS9CetJ7dt5q7M8hGps8wmDX4Jdcz5X9i4Fyy8jXfz3BNT47BfQYfPpL8YGpxlPpsToF3rd1FKyr6lsNdpyuYFi5pIQW5HyYmgS7bfhVWGbo8X7Ye3achylcqtXf14D1bzORSbPDBUoxXv467L(ir8mO(d91ZQj(zW9rXn2MGy3eASUhp)PjOxZiTbGpUOW4J4i0BMp4zprXwlfyItX3wBDAz0mL(Zi(mrfRraatnXnYwUZ(i)2UTENRMoJ)XV76xNHnYptFbIaEtNngV(PTWiuUEzXcJdPLMaGpkJSAJRVvWVLs1LlC627hj8OyA2Z(rkgYM5aREBhTX)FtglMD9hgW4Qz3N1Yz3K9)xSZ3iz)3W0FJjI1I9VQwlSn6uY(gi7VnoC7IbqcRjm4xMbdmfau3(7wQt)39y3D0tPlaOgVw2lIyPjw3MnCZKpeq5Fo0AbGKVKTNCXGleV3Z9GoCJWaeGONz3m59)6VreRrw53qn8ZUX4anWWEa7s0)yByrJTzjliNyOWN6eJ02yJkOJbO6)PWieWSoGamTa7IUxwEEYlXqcmhg8b0(3l4bHPjKFeeWyq9)pnYaUJ)DqgG5A5qxfaqjnrmposuzka6yPPpANz6D6wKAxr2XKHWmqW5db41M6FkV)7K8rOpjSFf8HI9ZrFAmBjcOsBaCY9VRB41)GfSgD77nuf5ur02y7T7gWhFdZ2BZeGCXIPeQUwgBIWr1T9ZzOcQ0iG1QnG2qblrfe8Yag45rVbmL(p7MV4xC55))Pmpin5HNOsZ4(eguO205JpuJTptZ7VTyzdBWhVrLwAX7BtIW6nKruHb7US98i1eGNh(GUgsmngSsbb33E)PBZakxqGD9)FsK7ZMk8Jh4WTFIKnhiu(tzluWwH)zdk2yzaa2w(3vtqW1tECGG)m0T0kZeaQnbwUb4F01QiG)tTP8LRgV8q)9eiH1qvEOa(tD8wow(z7lJUiaTe24I3GYdwxc(3Lnb)N7Hi)2aV(dXS(ZsS)RDxVLu)vPu)pv5s9934D3fFl7VqGsh7nRs9jhRQI1X910Bjw3DX6F6YeR3zDrugO0ihTpv)V5tS(UDUWqzk2TS23s8(p(p(TeVVgeV)zSlEV3PIDOJmH)bMCGt96N49k9SFvacyr6Zy1bphJ8)I4(PQmY)x7jERG8Djc6q30HUgI)NKYfzFUGJ2A4U9hjqKsYr0JQJTq7Vlox1SVATPFBKNavQJBGomgVNgdOx1TJV)F62H(nQl7wZbS9qb8u2M)xk9oP)WtMQ7tPo7Pk5Q78RZi5rP31q(04K3zkS3AE)NDZV6ZSMNc4xh4rFZJPCvjq82zwxCdlZZme(9oI)2A8U7TTg79WwHW3ngD6XkJIFt4IBBlSCnaDFmTjk5hjHaeWkb73jBJrPV(Gme87WiFm(opn8gxUqmKHb6bafsBZQzSYlcD0bz2UcX2ZHpN16GJUc5W0(J(cE(40DriErhENABAO3cGvoaZTaf(z3WimddqoCRsnLkz(j4l0BvMJOQOlXcGPTPbyaRzVLDtPXBAqNGjYO2XmSDxH2MokIqyu7vpcbAQQzHXBnnYRcWfO2W0lqQDavaT(CguFBHs(uc9pzBJ1Q6GJfXCnKyB6KTMgHQlfYcK8A3v5GeQ)gABQZYKSGlj21hkbBR3qKJ8Mzs9Rp2L8R4Wis7gOe4qPgi9qhjtlsnPBGILJSowQjUbsUgNGeDvuvkjzKk1(OJrM9w8)VhXy6npopCPCTPz3AMpF5RUiQEJOhIVRu9m0eTK7WoxFYvU2Ywncf2899OUlvG7V9sNubOTElPcxYKkyhJ8Rw1LSClkLknz02NUWrs6QBl1S(M8XDdEO(Q4cpW(IqZCXiwXAy3CjO5VRx)fs8M5fD8LaYVHmIYJR1xOCmavorsXWjpv7JKsi7PSVYLTwbkt4PMjV87))p
    Сам аддон можно скачать тут.

    Plate buffs
    Аддон показывает бафы / дебафы над головами противников.
    p7.jpg

    В первую очередь аддон нужен для показа контролей, бурстов и сейвов. В оригинальном аддоне прописаны большая часть контроллей и небольшое количество сейвов и бурстов. Оставшиеся бафы / дебафы можно добавить руками, но это очень нудно особенно если у вас несколько персов. Поэтому вашему вниманию предлагается файл (core.lua), добавляющий в аддон отслеживание всех контролей, бурстов и сейвов за все классы WoLTK.
    Код:
    --[[
    Author:		Cyprias, Kader
    License:	All Rights Reserved
    ]]
    local folder, core = ...
    LibStub("AceAddon-3.0"):NewAddon(core, folder, "AceConsole-3.0", "AceEvent-3.0")
    
    -- global lookup
    local Debug = core.Debug
    
    local LibNameplates = LibStub("LibNameplates-1.0", true)
    if not LibNameplates then
    	error(folder .. " requires LibNameplates-1.0.")
    	return
    end
    
    local LSM = LibStub("LibSharedMedia-3.0")
    if not LSM then
    	error(folder .. " requires LibSharedMedia-3.0.")
    	return
    end
    
    -- local
    core.title = "Plate Buffs"
    core.version = GetAddOnMetadata(folder, "X-Curse-Packaged-Version") or ""
    core.titleFull = core.title .. " " .. core.version
    core.addonDir = "Interface\\AddOns\\" .. folder .. "\\"
    
    core.LibNameplates = LibNameplates
    core.LSM = LSM
    
    local LDS = LibStub("LibDualSpec-1.0", true)
    
    local L = LibStub("AceLocale-3.0"):GetLocale(folder, true)
    core.L = L
    
    -- Nameplates with these names are totems. By default we ignore totem nameplates.
    local totemList = {
    	2484, --Earthbind Totem
    	8143, --Tremor Totem
    	8177, --Grounding Totem
    	8512, --Windfury Totem
    	6495, --Sentry Totem
    	8170, --Cleansing Totem
    	3738, --Wrath of Air Totem
    	2062, --Earth Elemental Totem
    	2894, --Fire Elemental Totem
    	58734, --Magma Totem
    	58582, --Stoneclaw Totem
    	58753, --Stoneskin Totem
    	58739, --Fire Resistance Totem
    	58656, --Flametongue Totem
    	58745, --Frost Resistance Totem
    	58757, --Healing Stream Totem
    	58774, --Mana Spring Totem
    	58749, --Nature Resistance Totem
    	58704, --Searing Totem
    	58643, --Strength of Earth Totem
    	57722 --Totem of Wrath
    }
    
    -- Important spells, add them with huge icons.
    local defaultSpells1 = {
    	19386, --Wyvern Sting (hunter)
    	19503, --Scatter Shot (hunter)
    	34490, --Silencing Shot (hunter)
    	1499, --Freezing Trap (hunter)
    	47476, --Strangulate (DK)
    	51514, --Hex (shama)
    	118, --Polymorph (mage)
    	44572, --Deep Freeze (mage)
    	42917, --Frost Nova (mage)
    	2139, --Counterspell (mage)
    	6770, --Sap (rogue)
    	2094, --Blind (rogue)
    	605, --Mind Control (priest)
    	8122, --Psychic Scream (priest)
    	64044, --Psychic Horror (priest)
    	15487, --Silence (priest)
    	33786, --Cyclone (druid)
    	339, --Entangling Roots (druid)
    	5782, --Fear (warlock)
    	710, --Banish (warlock)
    	6358, --Seduction (warlock)
    	5484, --Howl of Terror (warlock)
    	6789, --Death Coil (warlock)
    	32700, --Avenger's Shield (pally)
    	10326, --Turn Evil (pally)
    	20066, --Repentance (pally)
    	10308, --Hammer of Justice (pally)
    	23335, -- Silverwing Flag (alliance WSG flag)
    	23333, -- Warsong Flag (horde WSG flag)
    	34976 -- Netherstorm Flag (EotS flag)
    }
    
    -- semi-important spells, add them with mid size icons.
    local defaultSpells2 = {
    	59672, --Metamorphosis (warlock)
    	30823, --Shamanistic Rage (shama)
    	2825, --Bloodlust (shama)
    	3045, --Rapid Fire (hunter)
    	19263, --Deterrence (hunter)
    	37587, --Bestial Wrath (hunter)
    	48707, --Anti-Magic Shell (DK)
    	49039, --Lichborne (DK)
    	48792, --Icebound Fortitude (DK)
    	47585, --Dispersion (priest)
    	33206, --Pain Suppression (priest)
    	10060, --Power Infusion (priest)
    	51713, --Shadow Dance (rogue)
    	31224, --Cloak of Shadows (rogue)
    	5277, --Evasion (rogue)
    	2983, --Sprint (rogue)
    	642, --Divine Shield (pally)
    	498, --Divine Protection (pally)
    	6940, --Hand of Sacrifice (pally)
    	10278, --Hand of Protection (pally)
    	31884, --Avenging Wrath (pally)
    	53563, --Beacon of Light (pally)
    	31821, --Aura Mastery (pally)
    	64205, --Divine Sacrifice (pally)
    	22812, --Barkskin (druid)
    	2637, --Hibernate (druid)
    	16689, --Nature's Grasp (druid)
    	1850, --Dash (druid)
    	29166, --Innervate (druid)
    	45438, --Ice Block (mage)
    	12472, --Icy Veins (mage)
    	66, --Invisibility (mage)
    	5246, --Intimidating Shout (warrior)
    	23920, --Spell Reflection (warrior)
    	46968, --Shockwave (warrior)
    	46924, --Bladestorm (warrior)
    	18499, --Berserker Rage (warrior)
    	55694, --Enraged Regeneration (warrior)
    	20230, --Retaliation (warrior)
    	871, --Shield Wall (warrior)
    	67867, --Trampled (ToC arena spell when you run over someone)
    	2335, --Swiftness Potion
    	6624, --Free Action Potion
    	3448, --Lesser Invisibility Potion
    	11464, --Invisibility Potion
    	17634, --Potion of Petrification
    	53905, --Indestructible Potion
    	54221 --Potion of Speed
    }
    
    -- used to add spell only by name ( no need spellid )
    local defaultSpells3 = {
    	5782 -- Fear
    }
    
    local regEvents = {
    	"PLAYER_TARGET_CHANGED",
    	"UPDATE_MOUSEOVER_UNIT",
    	"UNIT_AURA",
    	"UNIT_TARGET"
    }
    
    core.db = {}
    local db
    local P  --db.profile
    
    core.defaultSettings = {
    	profile = {
    		spellOpts = {},
    		ignoreDefaultSpell = {} -- default spells that user has removed. Seems odd but this'll save space in the DB file allowing PB to load faster.
    	}
    }
    
    core.buffFrames = {}
    core.guidBuffs = {}
    core.nametoGUIDs = {}
    -- w/o servername
    core.buffBars = {}
    
    local buffBars = core.buffBars
    local guidBuffs = core.guidBuffs
    local nametoGUIDs = core.nametoGUIDs
    local buffFrames = core.buffFrames
    local defaultSettings = core.defaultSettings
    
    local _
    local pairs = pairs
    local UnitExists = UnitExists
    local GetSpellInfo = GetSpellInfo
    
    local nameToPlate = {}
    
    core.iconTestMode = false
    
    local table_getn = table.getn
    
    local totems = {}
    do
    	local name, texture, _
    	for i = 1, table_getn(totemList) do
    		name, _, texture = GetSpellInfo(totemList[i])
    		totems[name] = texture
    	end
    end
    
    --Add default spells to defaultSettings table.
    for i = 1, table_getn(defaultSpells1) do
    	local spellName = GetSpellInfo(defaultSpells1[i])
    	if spellName then
    		core.defaultSettings.profile.spellOpts[spellName] = {
    			spellID = defaultSpells1[i],
    			increase = 2,
    			cooldownSize = 18,
    			show = 1,
    			stackSize = 18
    		}
    	end
    end
    
    for i = 1, table_getn(defaultSpells2) do
    	local spellName = GetSpellInfo(defaultSpells2[i])
    	if spellName then
    		core.defaultSettings.profile.spellOpts[spellName] = {
    			spellID = defaultSpells2[i],
    			increase = 1.5,
    			cooldownSize = 14,
    			show = 1,
    			stackSize = 14
    		}
    	end
    end
    
    for i = 1, table_getn(defaultSpells3) do
    	local spellName = GetSpellInfo(defaultSpells3[i])
    	if spellName then
    		core.defaultSettings.profile.spellOpts[spellName] = {
    			spellID = "No SpellID",
    			increase = 1.5,
    			cooldownSize = 14,
    			show = 1,
    			stackSize = 14
    		}
    	end
    end
    
    core.Dummy = function() end
    
    function core:OnInitialize()
    	self.db = LibStub("AceDB-3.0"):New("PB_DB", core.defaultSettings, true)
    	self.db.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged")
    	self.db.RegisterCallback(self, "OnProfileCopied", "OnProfileChanged")
    	self.db.RegisterCallback(self, "OnProfileReset", "OnProfileChanged")
    	self.db.RegisterCallback(self, "OnProfileDeleted", "OnProfileChanged")
    	self:RegisterChatCommand("pb", "MySlashProcessorFunc")
    
    	if LDS then LDS:EnhanceDatabase(self.db, self.title) end
    
    	self:BuildAboutMenu()
    
    	local config = LibStub("AceConfig-3.0")
    	local dialog = LibStub("AceConfigDialog-3.0")
    	config:RegisterOptionsTable(self.title, self.CoreOptionsTable)
    	dialog:AddToBlizOptions(self.title, self.titleFull)
    
    	config:RegisterOptionsTable(self.title .. "Who", self.WhoOptionsTable)
    	dialog:AddToBlizOptions(self.title .. "Who", L["Who"], self.titleFull)
    
    	config:RegisterOptionsTable(self.title .. "Spells", self.SpellOptionsTable)
    	dialog:AddToBlizOptions(self.title .. "Spells", L["Specific Spells"], self.titleFull)
    
    	config:RegisterOptionsTable(self.title .. "dSpells", self.DefaultSpellOptionsTable)
    	dialog:AddToBlizOptions(self.title .. "dSpells", L["Default Spells"], self.titleFull)
    
    	config:RegisterOptionsTable(self.title .. "Rows", self.BarOptionsTable)
    	dialog:AddToBlizOptions(self.title .. "Rows", L["Rows"], self.titleFull)
    
    	config:RegisterOptionsTable(self.title .. "About", self.AboutOptionsTable)
    	dialog:AddToBlizOptions(self.title .. "About", L.about, self.titleFull)
    
    	--last UI
    	local optionsTable = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
    	config:RegisterOptionsTable(self.title .. "Profile", optionsTable)
    	dialog:AddToBlizOptions(self.title .. "Profile", L["Profiles"], self.titleFull)
    
    	if LDS then LDS:EnhanceOptions(optionsTable, self.db) end
    
    	LSM:Register("font", "Friz Quadrata TT CYR", [[Interface\AddOns\AleaUI\media\FrizQuadrataTT_New.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
    end
    
    local function GetPlateName(plate)
    	return LibNameplates:GetName(plate)
    end
    core.GetPlateName = GetPlateName
    
    local function GetPlateType(plate)
    	return LibNameplates:GetType(plate)
    end
    core.GetPlateType = GetPlateType
    
    local function IsPlateInCombat(plate)
    	return LibNameplates:IsInCombat(plate)
    end
    core.IsPlateInCombat = IsPlateInCombat
    
    local function GetPlateThreat(plate)
    	return LibNameplates:GetThreatSituation(plate)
    end
    core.GetPlateThreat = GetPlateThreat
    
    local function GetPlateReaction(plate)
    	return LibNameplates:GetReaction(plate)
    end
    core.GetPlateReaction = GetPlateReaction
    
    local function GetPlateGUID(plate)
    	return LibNameplates:GetGUID(plate)
    end
    core.GetPlateGUID = GetPlateGUID
    
    local function PlateIsBoss(plate)
    	return LibNameplates:IsBoss(plate)
    end
    core.PlateIsBoss = PlateIsBoss
    
    local function PlateIsElite(plate)
    	return LibNameplates:IsElite(plate)
    end
    core.PlateIsElite = PlateIsElite
    
    local function GetPlateByGUID(guid)
    	return LibNameplates:GetNameplateByGUID(guid)
    end
    core.GetPlateByGUID = GetPlateByGUID
    
    local function GetPlateByName(name, maxhp)
    	return LibNameplates:GetNameplateByName(name, maxhp)
    end
    core.GetPlateByName = GetPlateByName
    
    local function GetTargetPlate()
    	return LibNameplates:GetTargetNameplate()
    end
    core.GetTargetPlate = GetTargetPlate
    
    do
    	local OnEnable = core.OnEnable
    	function core:OnEnable(...)
    		if OnEnable then
    			OnEnable(self, ...)
    		end
    
    		db = self.db
    		P = db.profile
    
    		for i, event in pairs(regEvents) do
    			self:RegisterEvent(event)
    		end
    
    		LibNameplates.RegisterCallback(self, "LibNameplates_NewNameplate")
    		LibNameplates.RegisterCallback(self, "LibNameplates_FoundGUID")
    		LibNameplates.RegisterCallback(self, "LibNameplates_RecycleNameplate")
    
    		if P.playerCombatWithOnly == true or P.npcCombatWithOnly == true then
    			LibNameplates.RegisterCallback(self, "LibNameplates_CombatChange")
    			LibNameplates.RegisterCallback(self, "LibNameplates_ThreatChange")
    		end
    
    		-- Update old options.
    		if P.cooldownSize < 6 then
    			P.cooldownSize = core.defaultSettings.profile.cooldownSize
    		end
    		if P.stackSize < 6 then
    			P.stackSize = core.defaultSettings.profile.stackSize
    		end
    
    		for plate in pairs(core.buffBars) do
    			for i = 1, table_getn(core.buffBars[plate]) do
    				core.buffBars[plate][i]:Show() --reshow incase user disabled addon.
    			end
    		end
    	end
    end
    
    do
    	local prev_OnDisable = core.OnDisable
    	function core:OnDisable(...)
    		if prev_OnDisable then
    			prev_OnDisable(self, ...)
    		end
    
    		LibNameplates.UnregisterAllCallbacks(self)
    
    		for plate in pairs(core.buffBars) do
    			for i = 1, table_getn(core.buffBars[plate]) do
    				core.buffBars[plate][i]:Hide() --makesure all frames stop OnUpdating.
    			end
    		end
    	end
    end
    
    -- User has reset proflie, so we reset our spell exists options.
    function core:OnProfileChanged(...)
    	self:Disable()
    	self:Enable()
    end
    
    -- /da function brings up the UI options
    function core:MySlashProcessorFunc(input)
    	InterfaceOptionsFrame_OpenToCategory(self.titleFull)
    	InterfaceOptionsFrame_OpenToCategory(self.titleFull)
    end
    
    -- note to self, not buffBars
    function core:HidePlateSpells(plate)
    	if buffFrames[plate] then
    		for i = 1, table_getn(buffFrames[plate]) do
    			buffFrames[plate][i]:Hide()
    		end
    	end
    end
    
    local function isTotem(name)
    	return totems[name]
    end
    
    function core:ShouldAddBuffs(plate)
    	local plateName = GetPlateName(plate) or "UNKNOWN"
    
    	if P.showTotems == false and isTotem(plateName) then
    		return false
    	end
    
    	local plateType = GetPlateType(plate)
    	if (P.abovePlayers == true and plateType == "PLAYER") or (P.aboveNPC == true and plateType == "NPC") then
    		if plateType == "PLAYER" and P.playerCombatWithOnly == true and (not IsPlateInCombat(plate)) then
    			return false
    		end
    
    		if plateType == "NPC" and P.npcCombatWithOnly == true and (not IsPlateInCombat(plate) and GetPlateThreat(plate) == "LOW") then
    			return false
    		end
    
    		local plateReaction = GetPlateReaction(plate)
    		if P.aboveFriendly == true and plateReaction == "FRIENDLY" then
    			return true
    		elseif P.aboveNeutral == true and plateReaction == "NEUTRAL" then
    			return true
    		elseif P.aboveHostile == true and plateReaction == "HOSTILE" then
    			return true
    		elseif P.aboveTapped == true and plateReaction == "TAPPED" then
    			return true
    		end
    	end
    
    	return false
    end
    
    function core:AddOurStuffToPlate(plate)
    	local GUID = GetPlateGUID(plate)
    	if GUID then
    		self:RemoveOldSpells(GUID)
    		self:AddBuffsToPlate(plate, GUID)
    		return
    	end
    
    	local plateName = GetPlateName(plate) or "UNKNOWN"
    	if P.saveNameToGUID == true and nametoGUIDs[plateName] and (GetPlateType(plate) == "PLAYER" or PlateIsBoss(plate)) then
    		self:RemoveOldSpells(nametoGUIDs[plateName])
    		self:AddBuffsToPlate(plate, nametoGUIDs[plateName])
    	elseif P.unknownSpellDataIcon == true then
    		self:AddUnknownIcon(plate)
    	end
    end
    
    function core:LibNameplates_RecycleNameplate(event, plate)
    	self:HidePlateSpells(plate)
    end
    
    function core:LibNameplates_NewNameplate(event, plate)
    	if self:ShouldAddBuffs(plate) == true then
    		core:AddOurStuffToPlate(plate)
    	end
    end
    
    function core:LibNameplates_FoundGUID(event, plate, GUID, unitID)
    	if self:ShouldAddBuffs(plate) == true then
    		if not guidBuffs[GUID] then
    			self:CollectUnitInfo(unitID)
    		end
    
    		self:RemoveOldSpells(GUID)
    		self:AddBuffsToPlate(plate, GUID)
    	end
    end
    
    function core:HaveSpellOpts(spellName, spellID)
    	if not P.ignoreDefaultSpell[spellName] and P.spellOpts[spellName] then
    		if P.spellOpts[spellName].grabid then
    			if P.spellOpts[spellName].spellID == spellID then
    				return P.spellOpts[spellName]
    			else
    				return false
    			end
    		else
    			return P.spellOpts[spellName]
    		end
    	end
    	return false
    end
    
    do
    	local UnitGUID = UnitGUID
    	local UnitName = UnitName
    	local UnitIsPlayer = UnitIsPlayer
    	local UnitClassification = UnitClassification
    	local table_remove = table.remove
    	local table_insert = table.insert
    	local UnitBuff = UnitBuff
    	local UnitDebuff = UnitDebuff
    
    	function core:CollectUnitInfo(unitID)
    		if not unitID or UnitIsUnit(unitID, "player") then return end
    
    		local GUID = UnitGUID(unitID)
    		if not GUID then return end
    
    		local unitName = UnitName(unitID)
    		if unitName and P.saveNameToGUID == true and UnitIsPlayer(unitID) or UnitClassification(unitID) == "worldboss" then
    			nametoGUIDs[unitName] = GUID
    		end
    
    		if P.watchUnitIDAuras == true then
    			guidBuffs[GUID] = guidBuffs[GUID] or {}
    
    			--Remove all the entries.
    			for i = table_getn(guidBuffs[GUID]), 1, -1 do
    				table_remove(guidBuffs[GUID], i)
    			end
    
    			local i = 1
    			local name, icon, count, duration, expirationTime, unitCaster, spellId, debuffType
    
    			while UnitBuff(unitID, i) do
    				name, _, icon, count, _, duration, expirationTime, unitCaster, _, _, spellId = UnitBuff(unitID, i)
    				icon = icon:upper():gsub("(.+)\\(.+)\\", "")
    
    				local spellOpts = self:HaveSpellOpts(name, spellId)
    				if spellOpts and spellOpts.show and P.defaultBuffShow ~= 4 then
    					if
    						spellOpts.show == 1 or
    						(spellOpts.show == 2 and unitCaster == "player") or
    						(spellOpts.show == 4 and not UnitCanAttack("player", unitID)) or
    						(spellOpts.show == 5 and UnitCanAttack("player", unitID))
    					then
    						table_insert(guidBuffs[GUID], {
    							name = name,
    							icon = icon,
    							expirationTime = expirationTime,
    							startTime = expirationTime - duration,
    							duration = duration,
    							playerCast = (unitCaster == "player") and 1,
    							stackCount = count,
    							sID = spellId,
    							caster = unitCaster and core:GetFullName(unitCaster)
    						})
    					end
    				elseif duration > 0 then
    					if
    						P.defaultBuffShow == 1 or
    						(P.defaultBuffShow == 2 and unitCaster == "player") or
    						(P.defaultBuffShow == 4 and unitCaster == "player")
    					then
    						table_insert(guidBuffs[GUID], {
    							name = name,
    							icon = icon,
    							expirationTime = expirationTime,
    							startTime = expirationTime - duration,
    							duration = duration,
    							playerCast = (unitCaster == "player") and 1,
    							stackCount = count,
    							sID = spellId,
    							caster = unitCaster and core:GetFullName(unitCaster)
    						})
    					end
    				end
    
    				i = i + 1
    			end
    
    			i = 1
    			while UnitDebuff(unitID, i) do
    				name, _, icon, count, debuffType, duration, expirationTime, unitCaster, _, _, spellId = UnitDebuff(unitID, i)
    				icon = icon:upper():gsub("INTERFACE\\ICONS\\", "")
    
    				local spellOpts = self:HaveSpellOpts(name, spellId)
    				if spellOpts and spellOpts.show and P.defaultDebuffShow ~= 4 then
    					if
    						spellOpts.show == 1 or
    						(spellOpts.show == 2 and unitCaster == "player") or
    						(spellOpts.show == 4 and not UnitCanAttack("player", unitID)) or
    						(spellOpts.show == 5 and UnitCanAttack("player", unitID))
    					then
    						table_insert(guidBuffs[GUID], {
    							name = name,
    							icon = icon,
    							expirationTime = expirationTime,
    							startTime = expirationTime - duration,
    							duration = duration,
    							playerCast = (unitCaster == "player") and 1,
    							stackCount = count,
    							debuffType = debuffType,
    							isDebuff = true,
    							sID = spellId,
    							caster = unitCaster and core:GetFullName(unitCaster)
    						})
    					end
    				elseif duration > 0 then
    					if
    						P.defaultDebuffShow == 1 or
    						(P.defaultDebuffShow == 2 and unitCaster == "player") or
    						(P.defaultDebuffShow == 4 and unitCaster == "player")
    					then
    						table_insert(guidBuffs[GUID], {
    							name = name,
    							icon = icon,
    							expirationTime = expirationTime,
    							startTime = expirationTime - duration,
    							duration = duration,
    							playerCast = (unitCaster == "player") and 1,
    							stackCount = count,
    							debuffType = debuffType,
    							isDebuff = true,
    							sID = spellId,
    							caster = unitCaster and core:GetFullName(unitCaster)
    						})
    					end
    				end
    				i = i + 1
    			end
    
    			if core.iconTestMode == true then
    				for j = table_getn(guidBuffs[GUID]), 1, -1 do
    					for t = 1, P.iconsPerBar - 1 do
    						table_insert(guidBuffs[GUID], j, guidBuffs[GUID][j]) --reinsert the entry abunch of times.
    					end
    				end
    			end
    		end
    
    		if unitName and not self:UpdatePlateByGUID(GUID) and (UnitIsPlayer(unitID) or UnitClassification(unitID) == "worldboss") then
    			-- LibNameplates can't find a nameplate that matches that GUID. Since the unitID's a player/worldboss which have unique names, add buffs to the frame that matches that name.
    			-- Note, this /can/ add buffs to the wrong frame if a hunter pet has the same name as a player. This is so rare that I'll risk it.
    			self:UpdatePlateByName(unitName, UnitHealthMax(unitID))
    		end
    	end
    end
    
    function core:PLAYER_TARGET_CHANGED(event, ...)
    	if UnitExists("target") then
    		self:CollectUnitInfo("target")
    	end
    end
    
    function core:UNIT_TARGET(event, unitID)
    	if not UnitIsUnit(unitID, "player") and UnitExists(unitID .. "target") then
    		self:CollectUnitInfo(unitID .. "target")
    	end
    end
    
    function core:LibNameplates_CombatChange(event, plate, inCombat)
    	if core:ShouldAddBuffs(plate) == true then
    		core:AddOurStuffToPlate(plate)
    	else
    		core:HidePlateSpells(plate)
    	end
    end
    
    function core:LibNameplates_ThreatChange(event, plate, threatSit)
    	if core:ShouldAddBuffs(plate) == true then
    		core:AddOurStuffToPlate(plate)
    	else
    		core:HidePlateSpells(plate)
    	end
    end
    
    function core:UPDATE_MOUSEOVER_UNIT(event, ...)
    	if UnitExists("mouseover") then
    		self:CollectUnitInfo("mouseover")
    	end
    end
    
    function core:UNIT_AURA(event, unitID)
    	if UnitExists(unitID) then
    		self:CollectUnitInfo(unitID)
    	end
    end
    
    function core:AddNewSpell(spellName, spellID)
    	Debug("AddNewSpell", spellName, spellID)
    	P.ignoreDefaultSpell[spellName] = nil
    	P.spellOpts[spellName] = {show = 1, spellID = spellID}
    	self:BuildSpellUI()
    end
    
    function core:RemoveSpell(spellName)
    	if self.defaultSettings.profile.spellOpts[spellName] then
    		P.ignoreDefaultSpell[spellName] = true
    	end
    	P.spellOpts[spellName] = nil
    	core:BuildSpellUI()
    end
    
    function core:UpdatePlateByGUID(GUID)
    	local plate = GetPlateByGUID(GUID)
    	if plate and self:ShouldAddBuffs(plate) == true then
    		self:AddBuffsToPlate(plate, GUID)
    		return true
    	end
    	return false
    end
    
    -- This will add buff frames to a frame matching a given name.
    -- This should only be used for player names because mobs/npcs can share the same name.
    function core:UpdatePlateByName(name, maxhp)
    	local GUID = nametoGUIDs[name]
    	if GUID then
    		local plate = GetPlateByName(name, maxhp)
    		if plate and self:ShouldAddBuffs(plate) == true then
    			core:AddBuffsToPlate(plate, GUID)
    			return true
    		end
    	end
    	return false
    end
    
    -- This should speed up the look up and the display when it comes
    -- to targeted units and their nameplates, hopefully.
    function core:UpdateTargetPlate(GUID)
    	if UnitExists("target") and UnitGUID("target") == GUID then
    		local plate = GetTargetPlate()
    		if plate and self:ShouldAddBuffs(plate) == true then
    			self:AddBuffsToPlate(plate, GUID)
    			return true
    		end
    	end
    	return false
    end
    
    function core:GetAllSpellIDs()
    	local spells, name = {}, nil
    
    	for i, spellID in pairs(defaultSpells1) do
    		name = GetSpellInfo(spellID)
    		spells[name] = spellID
    	end
    	for i, spellID in pairs(defaultSpells2) do
    		name = GetSpellInfo(spellID)
    		spells[name] = spellID
    	end
    
    	for i = 76567, 1, -1 do --76567
    		name = GetSpellInfo(i)
    		if name and not spells[name] then
    			spells[name] = i
    		end
    	end
    	return spells
    end
    
    function core:SkinCallback(skin, glossAlpha, gloss, _, _, colors)
    	self.db.profile.skin_SkinID = skin
    	self.db.profile.skin_Gloss = glossAlpha
    	self.db.profile.skin_Backdrop = gloss
    	self.db.profile.skin_Colors = colors
    end
    Changelog: в этом файле, по сравнению с оригинальным, изменены секции defaultSpells1 и defaultSpells2.

    Для того, чтобы применить файл необходимо скопировать его в корневую папку аддона ..\Interface\AddOns\PlateBuffs и заменить оригинальный файл core.lua.
    После копирования необходимо будет сбросить / удалить имеющиеся настройки аддона.
    Заранее извиняюсь за такой геморройный способ, но форум не дает добавить модифицированный аддон.

    Макросы
    Куда же мы без макросов :) Приведу только наиболее интересные сложные макросы:

    1. Бан ДКщной гаргулии без смены цели:
    /target Вороная
    /cast Изгнание зла
    /targetlasttarget

    2. Автобаннер петов на арене. Особо актуально, для бана Суккубы, которая хочет вас поцеловать из инвиза. Просто тупо спамите кнопку, и когда эта тварь
    вылезет из стелса, то она сразу побежит погулять. Ну, а если нажать "ctrl", то можно забанить текущий таргет, например, ДК в форме труппа, или Лока в форме демона
    /cast [mod: ctrl] Изгнание зла
    /cast [@arenapet1,harm] Изгнание зла
    /cast [@arenapet2,harm] Изгнание зла

    3. Спамер правосудием. Все правосудия на одной кнопке, при этом отключены сообщения об ошибках, что скил не откатился и т.д.
    /console Sound_EnableSFX 0
    /cast [mod:alt] Правосудие мудрости
    /cast [mod:ctrl] Правосудие справедливости; Правосудие света
    /startattack
    /script UIErrorsFrame:Clear()
    /console Sound_EnableSFX 1

  2. #2
    Наш человек Аватар для Серо-буро-малиновый
    Регистрация
    25.11.2017
    Адрес
    Новосибирск
    Сообщений
    707
    Поблагодарил(а)
    148
    Получено благодарностей: 125 (сообщений: 88).
    Репутация: 616
    и шо тут имбового?

Похожие темы

  1. Weakaura на мага
    от ilyha10 в разделе WoW Circle 3.3.5a x1
    Ответов: 1
    Последнее сообщение: 01.08.2024, 20:47
  2. WeakAura абсорб
    от ilyha10 в разделе WoW Circle 3.3.5a x5
    Ответов: 1
    Последнее сообщение: 30.07.2024, 18:36
  3. Не теряем курсор во время боя [WEAKAURA]
    от mxcatarsis в разделе Аддоны
    Ответов: 2
    Последнее сообщение: 14.09.2023, 03:50
  4. Абсорб в weakaura мб есть у кого такое
    от ilyha10 в разделе WoW Circle 3.3.5a x100
    Ответов: 3
    Последнее сообщение: 12.09.2023, 11:05
  5. WeakAura вопрос по отслеживанию энергии.
    от AntiGM в разделе Аддоны
    Ответов: 1
    Последнее сообщение: 05.01.2022, 23:15

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •