Вложений: 7
Интерфейс ИМБА-ПАЛ (WeakAura, PlateBuff, макросы)
Дорогие друзья, предлагаю вашему внимание настройки интерфейса для Прег/Ретри паладина.
Интерфейс затачивался под ПвП, но вполне хорошо показал себя и в ПвЕ.
WeakAuras
Начнем с самого интересного - c настроек аддона WeakAuras. Этот аддон реализует концепцию HUD - когда все самое важное отображается рядом с персонажем и не надо смотреть на откаты кнопок или полоски бафов.
1. Он показывает недостающие бафы (вы их не кинули / они слетели от времени / с вас их сдеспелили)
Вложение 1143598
Вложение 1143599
2. Он показывает проки, откат своих способностей, откат нажимных тринек, полоску замаха оружием (специально для фанатов PvE)
Вложение 1143600
Вложение 1143601
2. Он показывает особые таймеры дебафов, вызванных нажатием "Гнева карателя" или "Божественного щита"
Вложение 1143602
Вложение 1143603
Строка для импорта аур:
Код:
!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
Аддон показывает бафы / дебафы над головами противников.
Вложение 1143605
В первую очередь аддон нужен для показа контролей, бурстов и сейвов. В оригинальном аддоне прописаны большая часть контроллей и небольшое количество сейвов и бурстов. Оставшиеся бафы / дебафы можно добавить руками, но это очень нудно особенно если у вас несколько персов. Поэтому вашему вниманию предлагается файл (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