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

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