From 84fb8b86943b35e569d6c17ac87d5e410a4c600a Mon Sep 17 00:00:00 2001 From: MilleXIV Date: Tue, 19 Jul 2016 19:18:15 -0400 Subject: [PATCH] Initial commit --- SX_Databar.toc | 20 ++ media/datatexts/anchor.png | Bin 0 -> 390 bytes media/datatexts/exp.tga | Bin 0 -> 1042 bytes media/datatexts/fps.tga | Bin 0 -> 1042 bytes media/datatexts/garr.tga | Bin 0 -> 1042 bytes media/datatexts/garres.tga | Bin 0 -> 1042 bytes media/datatexts/gold.tga | Bin 0 -> 1042 bytes media/datatexts/hearth.tga | Bin 0 -> 1042 bytes media/datatexts/honor.tga | Bin 0 -> 1042 bytes media/datatexts/ping.tga | Bin 0 -> 1042 bytes media/datatexts/repair.tga | Bin 0 -> 1042 bytes media/datatexts/reroll.tga | Bin 0 -> 1042 bytes media/datatexts/seal.tga | Bin 0 -> 1042 bytes media/datatexts/shipcomp.tga | Bin 0 -> 1042 bytes media/homizio_bold.ttf | Bin 0 -> 83872 bytes media/microbar/ach.tga | Bin 0 -> 4114 bytes media/microbar/char.tga | Bin 0 -> 4114 bytes media/microbar/chat.tga | Bin 0 -> 4114 bytes media/microbar/guild.tga | Bin 0 -> 4114 bytes media/microbar/help.tga | Bin 0 -> 4114 bytes media/microbar/journal.tga | Bin 0 -> 4114 bytes media/microbar/lfg.tga | Bin 0 -> 4114 bytes media/microbar/menu.tga | Bin 0 -> 4114 bytes media/microbar/pet.tga | Bin 0 -> 4114 bytes media/microbar/pvp.tga | Bin 0 -> 4114 bytes media/microbar/quest.tga | Bin 0 -> 4114 bytes media/microbar/shop.tga | Bin 0 -> 4114 bytes media/microbar/social.tga | Bin 0 -> 4114 bytes media/microbar/spell.tga | Bin 0 -> 4114 bytes media/microbar/talent.tga | Bin 0 -> 4114 bytes media/profession/alchemy.tga | Bin 0 -> 615 bytes media/profession/blacksmithing.tga | Bin 0 -> 1042 bytes media/profession/enchanting.tga | Bin 0 -> 690 bytes media/profession/engineering.tga | Bin 0 -> 652 bytes media/profession/herbalism.tga | Bin 0 -> 694 bytes media/profession/inscription.tga | Bin 0 -> 602 bytes media/profession/jewelcrafting.tga | Bin 0 -> 648 bytes media/profession/leatherworking.tga | Bin 0 -> 744 bytes media/profession/major.tga | Bin 0 -> 11282 bytes media/profession/mining.tga | Bin 0 -> 1042 bytes media/profession/minor.tga | Bin 0 -> 4114 bytes media/profession/skinning.tga | Bin 0 -> 501 bytes media/profession/tailoring.tga | Bin 0 -> 528 bytes media/spec/DEATHKNIGHT.tga | Bin 0 -> 4114 bytes media/spec/DRUID.tga | Bin 0 -> 4114 bytes media/spec/HUNTER.tga | Bin 0 -> 4114 bytes media/spec/MAGE.tga | Bin 0 -> 4114 bytes media/spec/MONK.tga | Bin 0 -> 4114 bytes media/spec/PALADIN.tga | Bin 0 -> 4114 bytes media/spec/PRIEST.tga | Bin 0 -> 4114 bytes media/spec/ROGUE.tga | Bin 0 -> 4114 bytes media/spec/SHAMAN.tga | Bin 0 -> 4114 bytes media/spec/WARLOCK.tga | Bin 0 -> 4114 bytes media/spec/WARRIOR.tga | Bin 0 -> 4114 bytes modules/armor.lua | 72 +++++++ modules/clock.lua | 110 +++++++++++ modules/config.lua | 268 +++++++++++++++++++++++++ modules/currency.lua | 324 ++++++++++++++++++++++++++++++ modules/gold.lua | 225 +++++++++++++++++++++ modules/heartstone.lua | 251 ++++++++++++++++++++++++ modules/micromenu.lua | 371 +++++++++++++++++++++++++++++++++++ modules/social.lua | 272 +++++++++++++++++++++++++ modules/system.lua | 223 +++++++++++++++++++++ modules/talent.lua | 228 +++++++++++++++++++++ modules/tradeskill.lua | 274 ++++++++++++++++++++++++++ settings.lua | 314 +++++++++++++++++++++++++++++ 66 files changed, 2952 insertions(+) create mode 100644 SX_Databar.toc create mode 100644 media/datatexts/anchor.png create mode 100644 media/datatexts/exp.tga create mode 100644 media/datatexts/fps.tga create mode 100644 media/datatexts/garr.tga create mode 100644 media/datatexts/garres.tga create mode 100644 media/datatexts/gold.tga create mode 100644 media/datatexts/hearth.tga create mode 100644 media/datatexts/honor.tga create mode 100644 media/datatexts/ping.tga create mode 100644 media/datatexts/repair.tga create mode 100644 media/datatexts/reroll.tga create mode 100644 media/datatexts/seal.tga create mode 100644 media/datatexts/shipcomp.tga create mode 100644 media/homizio_bold.ttf create mode 100644 media/microbar/ach.tga create mode 100644 media/microbar/char.tga create mode 100644 media/microbar/chat.tga create mode 100644 media/microbar/guild.tga create mode 100644 media/microbar/help.tga create mode 100644 media/microbar/journal.tga create mode 100644 media/microbar/lfg.tga create mode 100644 media/microbar/menu.tga create mode 100644 media/microbar/pet.tga create mode 100644 media/microbar/pvp.tga create mode 100644 media/microbar/quest.tga create mode 100644 media/microbar/shop.tga create mode 100644 media/microbar/social.tga create mode 100644 media/microbar/spell.tga create mode 100644 media/microbar/talent.tga create mode 100644 media/profession/alchemy.tga create mode 100644 media/profession/blacksmithing.tga create mode 100644 media/profession/enchanting.tga create mode 100644 media/profession/engineering.tga create mode 100644 media/profession/herbalism.tga create mode 100644 media/profession/inscription.tga create mode 100644 media/profession/jewelcrafting.tga create mode 100644 media/profession/leatherworking.tga create mode 100644 media/profession/major.tga create mode 100644 media/profession/mining.tga create mode 100644 media/profession/minor.tga create mode 100644 media/profession/skinning.tga create mode 100644 media/profession/tailoring.tga create mode 100644 media/spec/DEATHKNIGHT.tga create mode 100644 media/spec/DRUID.tga create mode 100644 media/spec/HUNTER.tga create mode 100644 media/spec/MAGE.tga create mode 100644 media/spec/MONK.tga create mode 100644 media/spec/PALADIN.tga create mode 100644 media/spec/PRIEST.tga create mode 100644 media/spec/ROGUE.tga create mode 100644 media/spec/SHAMAN.tga create mode 100644 media/spec/WARLOCK.tga create mode 100644 media/spec/WARRIOR.tga create mode 100644 modules/armor.lua create mode 100644 modules/clock.lua create mode 100644 modules/config.lua create mode 100644 modules/currency.lua create mode 100644 modules/gold.lua create mode 100644 modules/heartstone.lua create mode 100644 modules/micromenu.lua create mode 100644 modules/social.lua create mode 100644 modules/system.lua create mode 100644 modules/talent.lua create mode 100644 modules/tradeskill.lua create mode 100644 settings.lua diff --git a/SX_Databar.toc b/SX_Databar.toc new file mode 100644 index 0000000..4394b85 --- /dev/null +++ b/SX_Databar.toc @@ -0,0 +1,20 @@ +## Interface: 60200 +## Title: SX_Databar +## Author: |cff00FF99Saxitoxin +## Notes: Adds a bottombar by the request of |cffffffffu/sammojo|r on Reddit, Icons made by |cffffffffu/sammojo|r +## SavedVariables: TEST_CONFIG + +settings.lua + +modules\config.lua +modules\social.lua +modules\micromenu.lua +modules\armor.lua +modules\talent.lua +modules\clock.lua +modules\tradeskill.lua +modules\currency.lua +modules\performance.lua +modules\system.lua +modules\gold.lua +modules\heartstone.lua \ No newline at end of file diff --git a/media/datatexts/anchor.png b/media/datatexts/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..521fcc331ce7342f1058fbaeee267a8bddca7baf GIT binary patch literal 390 zcmV;10eSw3P)<0C<)ZIpx?sm-O7e10zY36+k510Q*%!rcWfzY~KN4b}Z?;0%pipYJf%Y zK+=otG^Qx}N5Bj?1;U^-H!Sim_4jLlPC+OaW_^a%VRK-*1yE^U)~$p|k<%HF>5IZ{ zC86pYR|!S4?KEzI#8}`d{`4_O^RlCN1H^WGn)U+pEx%=wpaHMd#EV`N{{e}?k?>ja z&{-ob{Vq^a3LMq%TRA8xtOapCRFlLwo|Pt4ZNxVLnv}($6ei9|XL~|BKpB?jDH2xK kxh>qQS9^UY{dNc$>C|OR=wxy?|eSS8L_+y_t%UK`(^VZv@ OCG|hzKX2O|x7{!5flzJ$ literal 0 HcmV?d00001 diff --git a/media/datatexts/fps.tga b/media/datatexts/fps.tga new file mode 100644 index 0000000000000000000000000000000000000000..8a3204fa1f4fac2bfa023d4659f5e08078c63aa9 GIT binary patch literal 1042 zcmchT-3`J(41*({cczr>wu-1;VeBP8&^GaL``=(a3yok<3wR^@B+0$1>c}_cXMU0L4kl&XRvEt zVFsnU7x278D#q}{XIRE=$6e{}Y5{lqD&DrgCp$*Y_LP1;Yx~J}-d}l}|C6Yk&6U69 z>iuSRZ?M2o?&hA`6BTdUchCCRHRs20cV(8}aL@bBsfD3H_HN8#e%A5+i^B?L?NrQM ux0kY8ph4!HxsLpSPhgHYw7-r#|Hs`Xb$wdfHfU%eOq zSFcN&89bZtp7O(U!<*;&SGA~~Z7EYef#!*y3areghE&dfe;9VPzZ%k2!&7xflvrxkbBd0B>zNLOKWTA=7zw-ObY{Hj8H%`ka z|FJo|=(?dQApZrM&5^#?tldER@aek^q-kI5o#_?ilkVAh`&xNK*g(Dud=(zj2aQ>o z8!pp#y6OYznZEzY##|vdB69(i?kvyr{W)p!R%oDI0-x7z)XETHXu2zJ1C{y;KCkzv zn;{yRE}!2w-izt}#(_4fGGs{L^;uSTBK%h;26<=P>~_$1e62hVs4&ZVJ(*W`vdc*K GzVHVCVpXyL literal 0 HcmV?d00001 diff --git a/media/datatexts/ping.tga b/media/datatexts/ping.tga new file mode 100644 index 0000000000000000000000000000000000000000..58921fa563e25c05075299d11e3f79d794d1322f GIT binary patch literal 1042 zcmd6ky-EW?6otnGG37S)2^N7A@f89V);5t;=1ENFbEL6ODjPu-)27G+*oY}?trY*( z@4!7F3zLS`MW`2YgxF^>`&IXZNqVB(8e*t-Z G=k*`BelwK- literal 0 HcmV?d00001 diff --git a/media/datatexts/repair.tga b/media/datatexts/repair.tga new file mode 100644 index 0000000000000000000000000000000000000000..768200ca17922fc7c8d8c3667beaf49bd06eb387 GIT binary patch literal 1042 zcmZQzU}As)0R{mE1&;s!|1%6SJOSt)VgN`THn$4^#Xk@*-~tZ4F!KWN=>H6qGa#TJ zWKIDNGaeA37i4}n7X2@PVi$lo0*GO5#YW%3q8DAr0gD*|K(Pbp3UTl!py>|)@;~5E zi%s|fl75g`mx7>5soOnOZ+d3TF{Kw10?Cgmi9Y)VO%mogYFECw=IB!e85P7pOs=M&0IqQ^to<#z zCWgH3C`u6e{NxS2%f0zN=M-I_KdcYE^80?|OlRaB;2G2_96<}@dxU*28SjHpQ2H8S z*aCIJRhoU@$9t&@*oImd1a%8T;GAlM5%7$y;Q2j^x`r{>g>VP&TmvOg1F(~3NzzW# zA7}L0q&t2mZ4m0 z3~a(1)I&e01JJ(;zEcsV;V&IB8SZ~Vu3tUD3iy5hqu>vo2NLl-{tLcm9r#`ShTb7B z{Y@~N8}!W|!S|YnN$^eIGYH8N=+iI$i|*r_-hgtwJ(T-;t~qD`J(XDu{?N-9!#b!f L=z;va`=#|K2#A!I literal 0 HcmV?d00001 diff --git a/media/datatexts/seal.tga b/media/datatexts/seal.tga new file mode 100644 index 0000000000000000000000000000000000000000..3239d9f9f830637e9e32a12e60e8c5a68dc43c3a GIT binary patch literal 1042 zcmcJIL5;*P5Cli}x~Cx+f*~w~Krn#KyT{|0 z{a7ejviy6Vr~Ly9Zys=0=TP9U|4qyjG1W^#oA+J91` z6d6``!^H##6wsX~sTVJ(j^Sc}-q5~sb2_efCFL1(mM1VrxxfM$W@zr}S2#ek9YV2R zDby!-<+yi{HSgYKyuk|QVAsDZ9=%+FY8ZJDvH72GzIs8+peIiUNB>w~7N5+DjO7 z%HKZ&dE8&rFKDN^MBb3mF-M`XNuX}NpsarPeEEDN^%1rx^c5MpztIq(nL@LK6Xx_* z&`}Yw;eg_X`U~0<&6E?e*P1o&RR`}$e}8P$A-272{>%HFRxM?yr&y}qE3*GDa56wnsr=YpRA2bipUG%IvV??3QPQ{Jx^+|rg c-q21%T;2-381(1mS^X?7{dmjFW%U2@4^2&Cd;kCd literal 0 HcmV?d00001 diff --git a/media/homizio_bold.ttf b/media/homizio_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e9618b83896212294a1f71a43b4245e60abf324a GIT binary patch literal 83872 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 pxFppgkZach~g?^QJ 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 literal 0 HcmV?d00001 diff --git a/media/microbar/ach.tga b/media/microbar/ach.tga new file mode 100644 index 0000000000000000000000000000000000000000..7f27dceb008316f2013b95ec5cd2b611199818ff GIT binary patch literal 4114 zcmeHG!3~2j42=5flMxt!5g36HIszkfgpR-{jKBztzy|a#iX{};2uOd&saJnXTai*=Do?zVChJS#UIJnBC<1EI#OcsNAj(R j?93xL4N^i4cM+^jjTC?WN32f)HC#bCgK`J{>kfPY2q~1W literal 0 HcmV?d00001 diff --git a/media/microbar/char.tga b/media/microbar/char.tga new file mode 100644 index 0000000000000000000000000000000000000000..846c2599143cdc8362e0e235df8a64e303e754b8 GIT binary patch literal 4114 zcmeHGv26n}3=~qO{1G&QNAO48fbV^t=P)p4Fy27Z8;F?Kb(z@_YXPPu-ur)|-UFafi!qJ41F)xl zqL4DJFX;cW0bzuBtVh?R{ z+zsz5;TMWL^!c`aUJ*1kzlil4?LA8}ye(lyaj&lQeYXgj+J}R_P~PBtN>Ev;cLuI% zU+&Snl8U?$AjbhnKvB5BKLNUiJv8=g0XfLs%8}RzYwff385~mw4|^^heOA9mTR67# P3ddNtzo9Y1e>%fI%v`P) literal 0 HcmV?d00001 diff --git a/media/microbar/chat.tga b/media/microbar/chat.tga new file mode 100644 index 0000000000000000000000000000000000000000..4296bbbee65797a9f9529f86ec06c121dc9a4257 GIT binary patch literal 4114 zcmeHHK@Gz&47B#zvk(Gd5CWkP0-+EFp%4mT5CWkP24M`cyN9KGrYd!|Xp&u>VyUt3 ze6=ca5se^tuB8-lxCg!iO*=5buQb>*(3d9=2k9Wc#*E}w{}J_Gxp}^T46Hx^zNKYB zZ*m>Qh6@wWQwMvt#E#3oG_-Q7&Ib~!2T_}yJXvqiz!@yDq1eK2;bv_f%ufyfJiqn( zug3W!4KzeRt;K)Va)vXJP-NxS`c@4+xmClAdGdh~e1GdWw{q7f`!B$~LP8#Z`kv?R Mhwp&zz{eeU1F;*tYybcN literal 0 HcmV?d00001 diff --git a/media/microbar/guild.tga b/media/microbar/guild.tga new file mode 100644 index 0000000000000000000000000000000000000000..75a258318a1439efca90a3998dfccade458c0272 GIT binary patch literal 4114 zcmeHG!3~2j42=5flMxu9BQOFZFajfF1V&&4M#u<^kP+B`-hnOU0TKjP>Lac$jxWv~ zp~1PA)2JPO?{!^WL3sz|4*c~UXz~9nz?Fz-ssYRI+FvnFdKzPY%d_NY@jQ2;MstqO z*`EH6IePiLXIeS@aMRx#`-hwUld=ERZ%-d{Hug_-qZS8wOgM+R1$xosnJOSi&D14x zU1w%+?WzB;DeVL2)bqjxshJrg;DC;WgmUC_5LE~{h(;$Ivjep5r4F*Li9NYU&+kQt znehRrTd_dsdb^j~IAUba6ExVbUj3%J4^edIgd2ooKleTHJ=!}aUYxRLNw`V4qrDa! d&lSbbi&rN#pM&cbK1HLv$8rbC9r*bj_ySC%k(K}e literal 0 HcmV?d00001 diff --git a/media/microbar/help.tga b/media/microbar/help.tga new file mode 100644 index 0000000000000000000000000000000000000000..56a091e1dad63d2a43a3bcbda6ba9e1abf363a63 GIT binary patch literal 4114 zcmeH`-ED(F5QI;8%A-r51WLFPTmmJy1WKR;N}vQvpae>A2hM!*E?S*XY%qC<#6*+* zpS?rpl)jRqO8WbLJRa%f`3=rD@YWls^_@C#5+jJoSK?p%o-WcI#CO0s=s)rtXl_BT z<|FoV545n8=$Pe@Z_VDlAWI+pH?v80FWCXGXbvK}=n-f0iOG8(7GSCEVTC|ID?jRR z7U1XcTK7yZ|IzW<7F+7%LT9uM<^E>b{B+RSve$d(pfjy#WaXNbJoB$+>3K!9ELgk4 zXw^ox)Ebt_r&HG7iK9fjvLlCvrl`{&krZrYoL{>?dQE7m!;T~FKL_n8XtVb!UMzQ) z1zDs9XVFp4de1A{yMWnRmKpZ46HcNd%c0(Q!fa=GYFn5Koz~_n*|?Xs-fBsfeG#<+ z@_RU%P;c{SH|A$q==wMLgVpE<9w+&GSZS^kFXAXVW;wmsnk9CSPvT8v4*ydQ(%6Dl p&7ba!^X2`2I}2w$>fZ4T_*v}5S&WzzbYdl@ljk=$-@yNP13!0BtY!cJ literal 0 HcmV?d00001 diff --git a/media/microbar/journal.tga b/media/microbar/journal.tga new file mode 100644 index 0000000000000000000000000000000000000000..8ace558d1f6a733c6dfa8c3b915b7e118aeb9344 GIT binary patch literal 4114 zcmeH`!3_c-5Jib6%b*lWumnr61WVfzEX59RCRq|Pnc;tyiw7{o@aOSn7cr$%IkKSMF*-8gKi|Ssc z2V$%@;#n@*ALZ7Yo%ecJ$YCNs%B}h%LFxSZJet{oylmZi+gf`bZQ*>ge#ALyDneei zPBn8N){i(xO-0Cy>QoZ~LVcn-p{9_?k8(;*K&VetC)5-Y`BC1>U$Q8DaIS6kmRx5) fk}R%F&#{utKEp~cZ|`jX&0o7W``q@qQFq`6{(s*6 literal 0 HcmV?d00001 diff --git a/media/microbar/lfg.tga b/media/microbar/lfg.tga new file mode 100644 index 0000000000000000000000000000000000000000..6c80738b6d0a835ef0718574542675e596103911 GIT binary patch literal 4114 zcmeHFK@r0s5M=u5vl5UH2}p>9NT>uPL_#D)0umx265@dFw%kmHNz)ccKIJ-_I~`|`1uVqnAr_5C(q77uLEe~%XtgWyav?40KK32S((Hwa!2Zu zf6p9>{7*{u(C-Kis7-I`3-T?H+shmJXWHPq*Pkn(&wGejEOfvCFSR??3TOcbi1k=7 zp934nVy;`rQ!nP9Lrrhg;=P|@6S!=|)rI^5&tBF%6XH3_t?R$6JMhq`V*qO1Lk#yc z>aj*%*2Ea+Vi2+fZwlzU1YJ2||6HGML1m(sVJ7${Q=7e$BgJMM%Duas9}*fc1@+m- tw>>P_+ZEQPK4E|n*fQ$&fCgm$k-mWr`yup6nn&KJa-Z{V>YP_|egKbozdZl| literal 0 HcmV?d00001 diff --git a/media/microbar/menu.tga b/media/microbar/menu.tga new file mode 100644 index 0000000000000000000000000000000000000000..466f0d2504e1e44b03a4e795a72e9558d0f986b4 GIT binary patch literal 4114 zcmeH{(FuSs3`B!pj^U_|&=DNL5gf@4VuH2!brkf_kGoPTq~zrKh}mG5CW|$?yJ;(f z%D@&UOM5gfu@P@9?|a`r`_J*CnG-`j`J-%9!|W=b=lQG*@N3T={)zUjHR7aQB7PwM n%s+EtX^Fl_&k=O!_dsvvB-nq+4apkZ0g{4919?2BBx5H@=!$`>EzRCLjW| zsjVzEesH+XR=yLid9T06}br{*#oF{ z1Yc8q-r*j!FX@?&DfKJrBo#zoa0kb=6!QkAbM>}9I=4yZi(q@|ooo~P0e;`&N^M8I z0Up7mwR%*L?BV3k-BC$@^%y`_`7M}q-!HbnYK{sN*Fit|TCc%sT8)-^$MU@`ZcFQD z_+*$H*s`Cm-O)?5U>a~D__!^6^))@Q?d(65!-rwIp GeShD#F>dSt literal 0 HcmV?d00001 diff --git a/media/microbar/quest.tga b/media/microbar/quest.tga new file mode 100644 index 0000000000000000000000000000000000000000..d2c932d5a1a75b92fc74bf13f40d5c50e1f1b989 GIT binary patch literal 4114 zcmeHG+YN&-47B>yPe#ZHjKByTfe{#?BXk5tU<5{B1V&&3dM5?RvO*djMXeN9C!F|l zXG|(`lO>$scc153GV%=a9r&9&P~clNKo1N6gLwzk0PElSPd}kO0kIfSd;n+n&>B@mi z`4AD-=htW*3YxbyuUCY7qdTtfcwP=7Gz06;wGGSJ+eZoE$%tER>py~D0DC>{Irc!! rlo&ud(|hTKnonS@5AN51Tma6a0vi8x7kFOrUfJWC`;+JV19N@@7{a|v literal 0 HcmV?d00001 diff --git a/media/microbar/shop.tga b/media/microbar/shop.tga new file mode 100644 index 0000000000000000000000000000000000000000..a1b0c574476d9b09a51e0330e37f75745a04792d GIT binary patch literal 4114 zcmeHG(G7zj6eRuXrz1FmBXoq0&=ER;4d)Hz@$YEO4_`_>Xpahi(GzIaBcL(dz*?K$Qha%@#bAF}M-9g;7bkZcA>wmN{O92#&fvvzL8z@SQ|nOfj3f zWzF7W1Me{ojNZw&z}}guANOFRT)r}!e5yTiJ}?-?y&Rdd=G~o`y|%B~JMT`^v;Xnz E-xi|UMgRZ+ literal 0 HcmV?d00001 diff --git a/media/microbar/social.tga b/media/microbar/social.tga new file mode 100644 index 0000000000000000000000000000000000000000..5ab130bff34265fb4061615dd27ac489d6cdf359 GIT binary patch literal 4114 zcmeH`U2Vfa5QI;C>Z2Ld5DeiU7=j@L!a*nmLoftG2!uc|gLFR0Tdh`3;%gJN51wdr zyR$!Yah#OilA%rdykD=^bntiv$2;(^-vRwR)p+Lry4L)x0sOOLyK0Z_HK?yRGRM9e zjB0Me06WtT&S5SqXSN2tnwj%pN7}*YHEM?MvWR;ys|lYeG;=5PN9@8J=^&ynBzJID ztr6+>K!4=x>v106UhG76ZDEr5A(l{Flr!h|?}=N@u+uOqu(@KQ&Wo7W8a}gV_^Ef& z0@&Lkoz1GD6C3ce{#ctr&G+qzFJ_|i>~@V#C;Yrq>s@V+r}bnO2T<#RW~t3xOjyrR zr`2lC9QKehUp90k`l&A@4wGW^S~hM6A$!?TNH&nAQJ+KYwCdDqS=_E+o%fn6e}Df@ zB6kI|*of&DWMAv%v*HN+ya%52dF`3;94=5^=ymJfCwb!A|AF_dJ01G#-nrx19?$ma G@4y%NImxI1 literal 0 HcmV?d00001 diff --git a/media/microbar/spell.tga b/media/microbar/spell.tga new file mode 100644 index 0000000000000000000000000000000000000000..76cdfa9a2f7ba6cfb49ef9adecb1dde279213875 GIT binary patch literal 4114 zcmeH`!3~2j3`L`!ddvunzz7|I5jp~+FhWP@2pNG9IszNe_oY}0igIZLm)hvbjuZUB zazeNTvmx-@_k9nJ_rPc1=NX9fZh{5UMSUF6nX?}5U}xOth{6+IupQLuh3V^@#l1e& zGR=%>>43$(-u0X9t~RXK-hZDzn}uHQ_piEU&4l&(%KP_5Y=#I|=&$H3@F?_5SAGCl znd^xYwLUOG`Hy8y?dh9V*x(K2eos8+x~ds-UFBv-Ad}Zx`5vv-yOFvJY?(E$Cw%Lj SGx7s^;*8o})BE~YGw=mLg{FQ0 literal 0 HcmV?d00001 diff --git a/media/microbar/talent.tga b/media/microbar/talent.tga new file mode 100644 index 0000000000000000000000000000000000000000..db094a8a18b6738ca0aef467740dbe09ac447bcc GIT binary patch literal 4114 zcmeHIu}#E45VVL0uLPIi5?la*Lqf+yUxG6T-2l>+;1V2AfFn{qAm^yynK8F${`B(e zYyyP5XuP{~yEFIJzbJ~E!lEqjcY8XWiXHnq_~YM!Ci8v{^JV7F((k}Si&&bmvkG$o zU^Z@RK0u4%0o6)98k`3XB6MzRU4Ki?&sRK;(zB%Ji*O_At)A(=$X_k{U-tJ`9nS~e z&^jRf3~T!KTzY=jheW?YKP7WL`Za#KFgouFj31zOeB(cK%d@i0GDd!^z;kjLtk>#Xn`)G6b|K2+@s>`7SKb3cc=l? zEYW)%Lj3`J0*^okRDkZ})TuV4=Kp~sGVhZHIR`w;!7*|OTo|F0;kRYFf-#j zbY5w0Z)e|k&P`nqbLM7~1I>rFZ8KmG ztjAF5EAR$X-Zr&RGmdSZhU&(+KbIAt8qPA~WZgQjLPoAgzIk98+!tc?Mo*C|i|z`8 zeO0KQdK|gAD??s@9Ox?QxA=AjgbLh=(pA!Lb0^IUUDF4t)#$=4xDE@Os2@^6J~p4p QHhoXmtLNQox=iNo2B-dId;kCd literal 0 HcmV?d00001 diff --git a/media/profession/blacksmithing.tga b/media/profession/blacksmithing.tga new file mode 100644 index 0000000000000000000000000000000000000000..8c7f024b48849e59ab7a8b913b4bba9fe231729e GIT binary patch literal 1042 zcmbu8ze_?<6vwYRXu3R?a17cKmxlZ^0&%e^LkLOy5iNyV&Ef9i?BZ5KV?&Tb|A~_j zExtZqxEBtg@^~HiaL&Ewd(OG{U7mAU7c6p-J1WF+Jc2B^l&q1?v)oefg$Oyx@y}a#nZkbwBuy(PfDHKDWT{>(TQ%-RBC_ z{|q8H2iY7-U}xKSC=u2Iz3(e5ArB4Mzziy2>ug*lcL-Am_C=r`by&eI*cuz>$UTF# zPZn*^_fT)Ex3S*o4XnMhsDah(if>Gz?)m{^xQBh;KJ=TQvv$HlcTO_@0G-aRe?sqc V388Nie~eyd)hxYTlA3>MegV!)HBqlJNLKaS18G9mE}w4oC;419Q*# z5rd^O-nn~ccI-7fw*CngEIL{=O=Cv*^o=2X?b9%o7GsG9t*w}2+0jNON^DQNtU4vk z`WA-VCn?5)vS*Q#tqHy=aHd%Gwta$F3e22S;cY1Y7GIv>TZ>%aDMWjw7C~%g3f`)w zAfsvR8t2s_5_Ur94yP;?`RKjT`sbg9C;S@Fh>7Tbj`alVsGa@4{zvPTP7mUTxWE){JFcipFAYD$@SIg<3(~gIkR7o5~TV7 literal 0 HcmV?d00001 diff --git a/media/profession/engineering.tga b/media/profession/engineering.tga new file mode 100644 index 0000000000000000000000000000000000000000..6c270901798273638164b1de06217cbce86a7a14 GIT binary patch literal 652 zcmZ{g$qm9V5JiU_Ar3Af4S*;i7my+$Ky2bj36ubY^#mnQ0-Zn!bO0Tg|0l5}f@0}8 z@%YVnG$IXg%ZQPnezDd{nH%7Gf)%)(Rm7iExPdp|^2*68RfMU8;7>bxt(I!HJoVt! zW~v%|b9LM;!5WN!+4yvQi6@3Zw!|w&(3ZdlEK^f;(JDoRec}-ZTL2+Qq%BhzqIB14 zoYMnvrfvu?{3i)96WGpri%q8$=u2#(16)d0-#GoQCD@qLbJf+3kFhUZ1n1?IMzM*si- literal 0 HcmV?d00001 diff --git a/media/profession/herbalism.tga b/media/profession/herbalism.tga new file mode 100644 index 0000000000000000000000000000000000000000..870328e45006df869b50ae25bd2774d115c28b1a GIT binary patch literal 694 zcmZ`%%WcCj3}t>r(33{c0xdj(E-7H3XpR2RV@B`@O49aJpdKM3cm$7-5j=u6P~W3y z13i?$qsXU6nkFQ2Et5HM;nj!uy9fqkp~)pH&tOx>%fdacOj(=WTsY9{{*siQ(VK;mI%`N!Om@{Gy#Luy&0b0P7^_VIh zLFw?pn0O*1!0?YUnlk8*QyF#cX_j7luE4jZfUEY*09qgW3L;pY9WzTe%- EFPLwGRR910 literal 0 HcmV?d00001 diff --git a/media/profession/inscription.tga b/media/profession/inscription.tga new file mode 100644 index 0000000000000000000000000000000000000000..48429b02efe9ba0c9983b5ede2381d885213710d GIT binary patch literal 602 zcmZvZ+fBnj5JiWVK>6Ad+yE#Yke?t~LJ;v1pYDKk;3PtXKU{)4fD+t6T!KrWgXNwH zyA~27oypGbojdD|*~C%=3s#(c#2D?AMCi8>#HY9vLG*7*kyAS$5o@-N#FB;LOLVWS z4#iHmw>PK=xuH^3i$W}EsA<54S>uF_Dj(V->KH%W_-yv+NkzX^;nKw@;BHAU)4I+d z(T*ZaZJlII_L=5Af0R+OatYpp2y|lMDccS%;)d=2g6dsok*D!bKG6aPibix|CBFU2 z`0$i}r0wqp@=_kWPvK@h2Xyge$>GctuGExPcLK6C#hxK4CjZV*M zQ>XP;Ajs1}^9t`V1v(TRKaf#c0c-LeQLv7CrTfxz0k4fVS!T5|GUw=xkUr1fU9 zZmmzAG~c&&+0nle>_;dTSQPd?3f2mvWrzHQ%%QjJ;w+)8VC-4XqihHDGtB69`)t&_ zYUenFC=ji%7ZSPu1|8d~P+@NZ&2MbD01DHM`2Z=OLh?b}V=u(vDoo_?%}h_IJS!h= V_WbxVe{G(c`@8G6+h#Gpu|FQ9qEP?< literal 0 HcmV?d00001 diff --git a/media/profession/leatherworking.tga b/media/profession/leatherworking.tga new file mode 100644 index 0000000000000000000000000000000000000000..b986a8e1bc051c04f63355b4f93d0d4ded257165 GIT binary patch literal 744 zcmZ{h+fBnj5JiWV1bn#!Hvmcr{t1#L1Q9Rshf7EaNkIIX4%iMz2X+T>3GTpjVD4Fa z7i5Kz&U$v|&g|^i?A(GSmRNdP_I+zE4ZQYB@g8-#!^GthMggJ*V5xvv5$%5BT9<@B+DpC_eq#b zCTJb|6klTJyNkX2xtENUz)<3+VtCKKjANn#`xdBIekLYwHfbwvhq3WPYT;sniwa|= zVO$KpdDY@aR(p@>X5%=G4HqKZ`sY!5C%Ra>^yesPbS4ZDX}|xASrKwkT#a{RoOEQg u!gx5TwZJNo`0lx(5HInBr%;r{OjyYh?BVWl{*>S6w>KBhSNZk)(tZHa+|q9V literal 0 HcmV?d00001 diff --git a/media/profession/major.tga b/media/profession/major.tga new file mode 100644 index 0000000000000000000000000000000000000000..bd0ed38cc5db5e55c5981a3b22ea8dea7ad1f930 GIT binary patch literal 11282 zcmd^_YwVj<9e^v!)nF=SG9{53FeErbB?b&3QZ>xY)>I)M>RQ<4ocabarI!)LFX6ugPl=s7cis%w=H+u@En)-cLnS94)<_g=f^U5ftm$StuF)QVVr>o5{84}L;>9Oy z+O+Aq{rmU-Vej6(Kij-{b7NdRxe7RL5bYMUp$Q!bVy+6M9M%(i8a5YT&YHB>xs)2D zxeBp5Sd%yJJBU93%Dph{9zKcMc&-Ni0F(}dTsg8sEY)3`3Zzeb+!)^?@B2@=71FUU zB=${kPo}xlpF_!Eei=evFH3gNLuh9@uBl}; z=B<||l=9fKXU}(^d+xdKy!hga|2%l`;9s79{`vcN@7{fTUTqX>VNWB4^V00!_QcDO&?iS54i9QQu*OL!*J=8T)a z11^U%As(xVAEb*>fsofWrVJo{7Gvi6nI0NII$*!G=9JzMHL9;*n?DBb3zr@`bZBPB zjve!?J$(4^0qpt4wr$&Xep(;-&J*Uw%oW#h%zQci2Z{L_+?Zg@Tv30I+yJUkO&hyN z(zU#n!rx`Z-X&fQMRWNY?kvcMIbDm=f-)41W!${$iN$e@hjGm77mf2-a>{mRyRB_~)LR}Uby~lmV zSXwy4ED(Ad_@z8nuU>sR`*b^J?ur*)c;V>Uhr{7Q;!hBNa>xXAI7E2eW49*#2>`$QNov+qj0K4Gp5cdY#F@_MN zg%NV&w0-^1l<7gH9j^=K%TP4V0&$or6ec-@> z@H);A|HZCdyBuqVyM^NwjnT4ZjFib0^%{Q-_<6Sw{Je@WX3m}*=Jf#oun0dA} zN}Oxq4@S{r|I^Fd2D$>JBG|LHaaZuZF!SuQ&)$IEm-WtY58knT`*uISM|o;LSujpL z^c3jA`LppnTfHOP0H01UW^U5?>l~d7?J_i=1vM}>i8oLa_V9h!zV`Mk2Bi&tE~n!d zZ$Jfx5K9v$twO@r9LB+>z&Rq29#bx3SHkA+c%{5BXU89{(Q1vJ%HL z!S|heJFeG$FRTHdPw||N@b{Xuw;dI_&NLtVN>ryA;;D9wVOHBi4>DV2ybE|XZX_5@}dD_3b zcid}XZi2D*gEeVyI&UqjX`xf;5lH)s{0g;i1J7XPZ{X)p-Wt*|8r0RH4MAL|W2Uuv zewn&HI8LzbuR;&?QabcLEW^r1*f{I+{Nzm@s#6gQ%8;dkG2(bw>uZJsf~o{#G5u5~*dgA z|0iJ?c!%u4L$DCu4MqKBa;{P7LIpytIb%VZ7$G-K+cyYJiFUjazlkm2{9VPJV3ps^ z)~#E24zUjrdz9Ep~f74iIoY*7m=MOsuG?K9=x$UekUAt$8=kJwp zMS|Z)-UB{U+UK*x(!{aG+F_i?>;XC*BlSIFe~{Jx813i5Z=g1qxBz* z5uU*@I-vBRR6yH;NY2Oh&O7P+4deNm-UIIf&)-Yohwvtt4WTa8u5$pf^l^GoV2Evv zYfSr#{A$!6n~pR3pGnw@zcIo0wyW5;JNUPX`{4di%x`JmU~ey?ZnbB$aqbw4P+?9( zL0oezuDJo7EU4dw&>QRZ#GeN5*?DXvZcW^yT?b`wL>=?qZxD0NRP0H|3I5sSMt_s6 z>1y<4a4(z

A4Tp(hsCGi|SR_N%*~sPp?>u-E%HSS8 z6UOzKYeN${kjjvNW67j((tJA|48IY^;XW{jJ^Fq2=xERS8wB6iKEr!`iVaqKG>^qxcfF7T{9rJ!co^`Axm0`U8uJwZ>~ zPs`DJZU;N>b(wZ7pLdusK-b}z-la>I&f@!-=jsT~-)GjYU3>BR_3JNTU+)QV_UgWwWR;-2(?{xK)Qzu_<$3znyj@z%@df;367x&1<2}K h$E(06NH0(Z-M`KwKdV=Ho$(vq;S}^=&#M2I_X{(vEaCtF literal 0 HcmV?d00001 diff --git a/media/profession/minor.tga b/media/profession/minor.tga new file mode 100644 index 0000000000000000000000000000000000000000..d0be18359e40df498973a47249818997e4f86f13 GIT binary patch literal 4114 zcmdUv!I9fA3`IFP<;W6Lf=W;cE`cSe1eTx@RDw!S2`YglsDsV>7U6*zX*YJVhhXOU z10X&~?O{Xs5iEufL-+IJ<0E`Ck^SkL?>PI0kvlDB620SW&U&{xET8rMg>LLCkYI%j zuig=>7rBS_s248i>2IJpp^#q95A|Gg#m%X&T~|Ke*Iafa@(C3CA&*>h-uqR)R{x9& zg?izHNUwn2GlK3`y}%4-9@>x4ynOOl3?yeh>qXAx^D+6N$+f!!^M9td>eW7*8*9&M z)1LkY14P)tLj471(3yFp8FaqG1Z@-=t;hSvYS5f^D9-liYyj{5Dz}}n`ue&9dD=5l zYgXJ~gEp)u%@7)f*5GP+`exqzD}9k*1cmB0CK}-da$TUE=F{E+QuPMdV1@`8cK9rA z9LgiVXZg&;nf9i}Bflaa^3b)`UUaYK&xrH~=&LU14h8(YYK3Oi*No-T6}GC#Z=o}J zg!~@L%h28o1tPS*g`Pq)iuI7E-+{{eEKl?cWY8YVx0(mkAbt8jwo-Rs_v?Ju&mV;C zG`+Hn93;?OscIgnVmjpU{khg&w8#4_FZ5$Q8_?P1qz{kIbWd>X$1dz5Sc)-0N- zg+liz4-J&}@0Rzbg2;zF{U)l`t9o_)t~wS}`-(f$YzwWIW5=O)w!5s(Zev$xUF-fg z=$&6@BWUlUf|w3@`W>k34zC;iTOTFE+2U z$sH7OdD_q}^LUN)HD4fI%=q~>pYiz6dxT;;ECjv0A3P<}Oc)=$j)m?`uw=>#2wzof^n&_2H_-Mh!%V6Ay8x$$^^nm5scgsTZM|67} z;o8)Jo+!hF@{jTXHzX9W(5=whca(@wsM}47ZU~ESDGCoGK(EMJ2it`CrH~7;Q19jJ zrtL3F7}F_L96}+r?W_>~X02M;j$mMH-A}YY{c77jy8`M|NQAcw?8DAM8Mn&X3ii_j mDcH6WuoU(c$30$n3JHlDF4)({X7-(ZW~=4oXPzx)Q}++t4+hu( literal 0 HcmV?d00001 diff --git a/media/profession/tailoring.tga b/media/profession/tailoring.tga new file mode 100644 index 0000000000000000000000000000000000000000..6a13e9ea0600b0384b5cee70fe451f99b7d6d0c4 GIT binary patch literal 528 zcmZ{hJqp4=5QW#DLadS-cmX|vg&|5n6f}m25U_}#twK^8#L^3jjp8-d_r?`nqk%VM z-hMli$tcxSug6i2YBf$w_u^@-FGmEe_$Ho&3eq!lJs{kfUFp1mDpD8fL2-c)(TR=Y z3RtiO?+&0fp%t?=9XS(<_i7L;C4?4q664hDmUY-6loQ+$%#BmGK~`kjl;DzJYMdVx zr#Q+8ZV6@(ogWo@uh9L!-%iu zi5edFpUsT^yE$_|q1WTpEbd{>QW-SaTX}OEyuI?P9e5n{Uit67bKfVddOVv&ZzmED zk-K)$L5>C%u@^@%iJKTPtH{Pq5jIxy7C~=%h*KO~$&U|vN_&RuqLoOc5Ni4y zF?Y=)GoIk&15e`iVNb8Ocq85tYY_0#!`-9E?nWHMU0lTyXuJ&~-pTT$_yoD<6J|Z0 z?cpE31wFNSt@OPzY?GExdTMiiqSf~LDcy(N+`Nc*hz|1E3q|T|TC12$TNOKT5F-v1 zdlZ!8!MlpHm>y)WSv9;QvWK0(Yv0{Tn?>R(I?xs`6sfbtPBDoQ?%gCF;%X#E1Iyp= z@5_uQ$<7FNH)0z_<#Fd&yq%TIa?rz!mkWxE<>*b&$@ZrW`+7 zi6o&B7h_)n9^fKdV4z`!O{HE3R?26^yQCcf5;$b;{2RZNHC3fN@rh@2Kz*F`; zT{m__uQ*!1+um%kwv#^IXR*X0p%wAedeL~h!ddUr`lLhrrbD^cclPif*?weKY^}c2 mJ6m5Zyd>V4@wA7V_@{5@uIgF7>|+oAd58{jv~Txc`u_mC7Fp^5 literal 0 HcmV?d00001 diff --git a/media/spec/DRUID.tga b/media/spec/DRUID.tga new file mode 100644 index 0000000000000000000000000000000000000000..652565d95a6f766dd0ebe7bf88ca6d21c14e7f44 GIT binary patch literal 4114 zcmd6k&28N<5QK@Ga#RT{K@9|82`WLSoK-*&u!L8F3dlhvumqK$64Zh7&C9Mq5c+w6 zV;}>J_h)8Sv>n2i;7Fkh@$1{$TlfI`4`e^`-Txsw^1BP|TVk_I%w4lP%1n5QaiMCy z%e8k#GPB*Fyknz_F#IEqc6mRzw>CR{duVp;JM?=h*J5Xpq5PB8HtX{P{R+Ahq3Q_3 z1ru64(UorAJ=p+kSKvs(#mHhr+Zr!LSj z(zJQkJJWPW(7yE^&E@I7{xKfhO4pI6I`cDDzMVca)E%d+lYRib-=SO&+ib_Km}#X( zINAKes*1D>+q~ux-eJSgX475B^hlNWVRL<_W7pe$vwBo!mbxJ-6Rc*c-(BeooS}N( z)4rppQ?{mduOMNnbLuBpF2Xxngr3V)@4JPae0NwejIe{sPO!ip3i(fY-Wsae*3W%p zP`2gBZg=BJO-)W2eOtHmy(37UOxUR3p!_w9>1Sm}NKHn0=L1kMe zcG9nq5eMj5d3V^`PIG;u*nX5?n5mwR^cilZos|i}Gj;WEJSL&v#+; zp~||w*iQdj-HuSZ1qS0p-Qia4q{(vyWfJr|b@lAes{;pGIk~6X`M~e1waINJ=pD)q zHqSO|=Wi_ZJ=`m;&aghjYFp(7sEjkxOJA%~UP8g;H;!tLuAB00P#9tBl}~y$ZK66> znhr{LB$@$+irSq)S>34pZT~?31sC`#3dZ)%*_`ZX`)>E^ecA4*-_5V0%v{YAz303} zc6G+>nMT?SI~YzVPl0~}`OogPdwpA&VXGa@@-GU23^lJBfaar2&whXfCfNFP<0x0} sVwGL!uTT){>|LMn>y3B5TA%QbmeKp?YOZ~s)$4m_CP>q&??U-7CF* zG=MA_r9Lds5MRVU6UG`w&}kA`1ol42kncUgTC6Khx)d?4V2OOWbp;v@U&3h z%zK^~Pv*7%RqgEod}oHUx7>9$p3Lo~dJ??@EU>~AyeS)~8%+1?{YSsvYvApqCr=$D z);arXY}wg@mAHeqM#vij`3;nF{W&wvpcb&cSX4TwduYL2O^@*Ob$*2(p$BiiVq})u zNm?kqT~*gJ-;&fqa?RpRT$$x9b2Wm!-6E7TOW$chpPC-w(|4o#31-l*uFwQsk!MeD zY9Yz~K<yh*f}Nu1l;qB%!zkN!klgN67roN1uh zfc_o2sO`0o_et;nR!8Dtf%NOqTjQRrP->>Ql#MFapSN;%peJgFrl7YOYKd1U=L_{3 z^RqCAe~Mwf-_bv+#l5I+GKKo2A6Oa6==;Ys=4 z6qAM6RBXkT{ua{jsDpZ^tS_4WgK~F{or&n1sb5J}=%4}T%4l6{q_Nb^qVCAAMeU6w z`zyU8JQJ}k>X|(KXR(jHjd%s)JLQcrO#01_V(CJjzB&3+^a|Vk_uZ9-H=LUFZ&G16r6sS?hnrpeb}CcCcpSB<7u0zq4E!L0=EPud?^39^YRG3*^nA z7@D`RLD^4l&T?f8|4f`BKVovrx_T+dpN?+~iut<7#^7*lL|NEYb z*%-5x=$!#l4N20Hm+#Ef_WJNxD`W1QMg3>mX-?1;L-&1SD|)7Xga3C~Eh>4#J!8&i z@&jtwmr?`89*u@r;?J_i%%E=oJr_{^tk$m>HNB8C_fo#MWKqO_$a~Q1&JAX`fV~zD zSV8^v2%o+?)gPZakK#(mJ#U?%$NQ-pNekICKilhLVJ9vy!6o8BRQ8<@5eawMSARXi z{jHI_sc5OU@VIk@uIR<+h6PUZN+?ns$^Jk)!zJ~nY=<&?endu9A@9uW7zYxnmL%DOS f-mJ?pZj?Lb?p@%3TK3#q!MxsmSGTb{M{K?UH!cfT literal 0 HcmV?d00001 diff --git a/media/spec/MAGE.tga b/media/spec/MAGE.tga new file mode 100644 index 0000000000000000000000000000000000000000..2b632cb51ab71c0edb81ba6ae319606d7befabc3 GIT binary patch literal 4114 zcmdUwy{pq;6o;dND2T>I98@|gDAdJ49Wn@ti`^7m;>YGva1j@?xQIh1Q3MHYZv6uk zf{3df6dgngZcatS(d+YT&w+DeZc}?J;(^EC`FhWr(;H%vY)#y6+;i}cRx$(T_4iLp0@7bG%-JoY$giX0(bR z*4z9`^nb7c!#_MbZ+6#aN+!?&?=O@zE78pGdf$s^3Z8G$*sFVFO?{`xAFI_$H3vI~ z-*k4_+#t+$x55$8a)Nlr*ox8$hP8U^?O3m*0R0}ZF8>Vtg!`d(5kJ}+f^ASgyKJ0? z;r@3Csoz}fn1b$WGR@O&9Z-+xg3e7qCiR-@? z3p9lcR1@+`kSXp?z1jEN+;yU!4kS>mtIPuBooluFJ*&M4`P-r2&uvzRHouShK2`0W z!g?~xd#wFNmdmZDE|t~mdBsUU-*dP3II7*W#1Hg><>HxD_`b7t$?d+(NM+J| z>dp4<;ir%omDTD}gv1D6$o$++{P>O^CO)VJ>@yq%@BJH^>mqDClj*xXG(YAm%jx-3 zs6R_)^$F^|N-1_5;`Cq)e*U-@(Yu!ag1&;?7OQtV?1DWZ=QB2|1740vUi~PAv`x<@fFbb@GE?W)8J=Up#}4X&}J14U6^-g7V6qD+L)l} z>|<-vdw&vcS>F-#B}98f&@^M&Tt5!qz}FsadpF(RtIf-ZoBBSHe_*u(sJ;jOo8V60 zi>K&ySmpnHdX@>a*@%V#6p(}VlHUc**ocgpo6a}&>0N#eTa6Rw6Hxzo*bhzTR+USc t--8lHu!vPO<)?u2BC zCw{<`)benkknTyfTQ08T>7G0B-g@nNX3ao8!vJ=x%QTiAeaDo{Yfo=Oc|I|w zH6s|H1-qed4X`FP>piJ0uz{H;7@&s^+yUw@aMq4?o#`FjnP`rY2fhK@*%QkwFL`M^ zY!YHKs8-VEHQlp0!Y>OJBtD`6(2{UMJfCj9;=cNlETi@>6 m-@UoB_3hiX_pOfFnfd;tuCzez{ literal 0 HcmV?d00001 diff --git a/media/spec/PALADIN.tga b/media/spec/PALADIN.tga new file mode 100644 index 0000000000000000000000000000000000000000..3599b9c08494aac4223de935d26a6fbc8ae9016b GIT binary patch literal 4114 zcmeH@U5(^05QMFJx<^9@gg`Kafe;7>!4L*QAPj^+7zlx226OeD+)}G$&#q=?_vuP1 zbyxMDlaziXLrFO;zaNiB`UYOKa~E%&6oUihr$1V|ftnylKBBEo@MIN(xP>a2< z=%T$N+-0_2SQTfx>GNQQ{)Sz1D(PO}L0h&5)EtZt||;DmHNh zeCl!bE1J7A6ctAGLw@SaZkYb+w552|49uj!qZfBYzOi*}0gWH$-l3};HxHuG`jo%+fV2kz}oTY4z*cg-gif4SM73yEHe8_(vS!BGccp9{O{r`95m&7<|p=s~TEwx+?nGPv_kCI3?m6 bcxxT_vClNU%$Od@DuMVv%@xQS;J3HGU-=v-9~ zja3ah$uu`os}9UMy|-0gU-EI%qv2Cm(HPyNx~cC(@@7fC+bQ|%U2Le<)aRCrcivIi z&0F5ZcWj8l9Hd9XBS$rupB|z*=bhAY%1oN=li$MMRp;nksvFf+^u0SOt4rFsAPD&# zdVuFQ=R^7X_u#t?XL22Fs;=VM+rr1|qA#lGlZbB2YFe?mf$Z#K&%hw;V%|@W2FUR4 z$RJE2b72T{s%V*mP1PxRz51Fw`sRXb%FvdJ%+bu%i_X`t#l^e?H}wSa8WXTLsou4!tts3jpC5$!nn&xPa|8;b-zVk>u z`X+*>NaijUmI~BQJFha6@_g4A_jXl)<~`k^ypCt++^b^$l8>|KY(hhCVH=iBsgCDZsww2M#H_{gC@<$Jyh3w2W0lCpt@ymVsw&R?nQ7 ze;4=sPRkJBUN7!3Z>sotk9&0T23dRGRPX7uZ}sx1MHOa{>4NAFu}K`&PcgTuL-M${ ziW$9zEeX4N-{&qY;yE))Yi^)cyx(IV@8!4f0U92eR$N5DYg@TWZCDRp%sjB0K48kRGiQA0ofaKsOhQsoJAn!TwX`D%Pt|XuRwEE%gr+ CY-`U|xP(j4u0w8y%ern?m!?Y1SO)6KaUTy1MdO}~c(?SWQ*18F+YOz{FLcJ#0| z-O)Yui#r(5$TVa6NSs`5b?<2}Ht}17?`_2aO$wwMOsI`}AGf)q`rD zL@ukLTcYdVza;*X^S^kT8FOvMR}gc4!JFo+&#T^Ddva%!H|QM|^blYG)jWw@RztN! z*Pov`9`WkgOi8So>^sa$^qT)cdDXj{h;&ys6`Sd%-q3)(%X~#meVJluB3vLrv7#rR zTx}$l{e}|OdY^X^VhMcxY`iR6{n#7ir&UjB1b=VHHTf1U;H@U{`amv?)s&l61XeGJ zh0jwKwytjdGd{2T;DXz&`_qT+H5qaCwwic$nnXM}q%9m>?)ln8O(tK0dNE@<<+21; zd)6-tS3hC3U+=N^d8ul4za~z;>EeO71!+r|L0aWTAU0D^GiD=!Flz~l7hyZS4?DY~ z7vUH`74Enb z^Wf2aeM^EF^mgSFXg1`0YrdtoHr2MY&(=EjUSP~bducJ&||pn|9bn_zFg Ork66|K({x4SN%WK051~& literal 0 HcmV?d00001 diff --git a/media/spec/SHAMAN.tga b/media/spec/SHAMAN.tga new file mode 100644 index 0000000000000000000000000000000000000000..aa1b363efc9c9636a0b40280510e76a676dee6e4 GIT binary patch literal 4114 zcmchVTan{P5JfBYYd!@*5Cowh7=j=)go0oQf?x;*!4L$&40_M$&77@KsC%NHH{v*7 zH?#ENQvNBaTBb7pdVYScFhltQ7H%Y+yuk)LtWZv<^roSIIn?fWGxu-gqt0%=r`O`x zMtslSnb+@Be&YmJus6dUIvn@(?NDPj6ZP6pud^-cg*YlbAC2R^3x_{?$Gr`%al>2c z0Sipf!T#}$D?Qb~nZ6CysB82})Xq}b`%LtkcDO@@@m4$3<7~_qe0z8&;sa9VGgP?3 zxM!|^2em>4>ps+^zxVWeQlLj4gY_V&1C@U0p0t(Ck(d4q+Sa<9H*=Re-?u4-UCa&vG{r_P<7 zJpJj-`ZICjZr;o1?<6bqn7ws>!J}W#2Cu0y(DQ&>b9H@HSkcvZQRUUz%Ab7s%`kLVwRem&p8%H0i?ll#t85B$aw_^mB+!mCP;H#R6> zu6C%fLV+hZ)19XCpTh5GaD&uJGQR(yuF*@+S@e#39nx<;s!^0+8wZj5)+OfY`>r?* zZ+3Fo!2bB=mAXdnMts1T8cp}~_sET-D#Z*F6xiTQo#q01z5~DU0jWk}@9bTD7Z|@o zzq-Q=&ZdaYYUG`G)J`M4g?u|2hT8de;&)u&KD=peKi@T1H&`KO<_qXEcitkJ+wXAH zOv9P6g7@xlCVfA_@f+IkuK5)znD4Mcfdy`0uSL8>&v}QV?75@#>RT*MC#8TU#5; zfiiNkNiO|!&FRb_JKz+|gIxO+B5w%er639MVC*8=HIPaC*o{aS4837~l)L~v6^g;< zX0o@C^AjXrU@cf)9D6IwbUusatCQ3Wr3#1qRy!3YL~V;Vp*kw>)t1uAknK5fWLtAJMsuPOVR{5IqjVO2~@>!jHbUC$BpgE~d9R4O1Bq&e$gWxi( zf$eYt4#HtL09uQ^pf%8Q_XPD5rSJ|OM(u{^x8Ox*qz71^BT?{*^I0q(ou*zqs#%2= zndCgq1lU-Mu{S{_XutQvb(jOHxe)e%o>yz(_g^*I!6UFeEyA7**TCdChX23X76t4X z3ZebH^xV^J@C;gU8}mE%TquX*FdMX=!$Etexm<+PptZOS*4JyT-|8T?k+#VN44>aW zX#3c|*jjJpr=ScHkOs}?Poh5J2b=}XS7);;jD$`w1A2q%%>lc|t#7DxmWG1&>p$-s zNVM-hRtP&m%^IkNe-RryMW;KUJFGdF-)pUf;`iXD%b9}xB=XsNq4&Y}l|2AnfkbN> z#`A4g*HzB_NBK5pV{AJ^=F6u0lB@3ki`!j>t4>P!wV2M!eb^cKTA_8%N_v6i6+%z1 ztD61Ji^BD)BE$Hj@U4ZCAl8xg3eaAM&l<<~6im)xSdQ*dlT{er|C+YmEAtgXC#fg& zF2o@X*(5>& z6m`#ooe9i((b~xG$I*QB{2yRq5VO2)_-}z^7?|JdS@=IH0nweOnC^n*AW4JIZyB_G zEFU|m!I0|Ts{Xees|do{dM|aa+x->Bt*!e{--2Vne4*|@tP*tJk8pXa{Q~wv1LqI> j7owe@z9bDv(0Af8F!k^W5(}ozA*W z*r3zx^p0CuS!tki1TtbzGgyZ1D*L0gvb0M7aKD>ftaWO&-bV7bs@huX`pmDuhj7|q z%ns1DkZnR@ecorPn?W!2jjd_UHqeE6^SQPO%^&borG18cKm6Z)oR9WBcnI!-7PdnE ztabYpU&%DQeG>UhSLxr<&_dQf{~e zF|YU8?@6^ci1&i$HgxwAZ%KL7!#_vQGyXQz_6-F;^JUloF{7V?whZRoLe>~hAgt~U zqk&g9O?iZE1o#=m8lFw2ujoL34y`R&<5Nb{2eR}V}HE;{;0_|4t_xyGf>`kz?72bt&AlA@( zHeQ3vz&qfEikrxTMugq`ViV9*$-pW_}Njk@BB{v I4%XcJf3CJ${{R30 literal 0 HcmV?d00001 diff --git a/modules/armor.lua b/modules/armor.lua new file mode 100644 index 0000000..a72f54b --- /dev/null +++ b/modules/armor.lua @@ -0,0 +1,72 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.armor.show then return end + +local armorFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +armorFrame:SetPoint("LEFT",590,0) +armorFrame:EnableMouse(true) +armorFrame:RegisterForClicks("AnyUp") + +local armorIcon = armorFrame:CreateTexture(nil,"OVERLAY",nil,7) +armorIcon:SetPoint("LEFT") +armorIcon:SetTexture(cfg.mediaFolder.."datatexts\\repair") +armorIcon:SetVertexColor(unpack(cfg.color.inactive)) + +local armorText = armorFrame:CreateFontString(nil, "OVERLAY") +armorText:SetFont(cfg.text.font, cfg.text.normalFontSize) +armorText:SetPoint("RIGHT", armorFrame,2,0) +armorText:SetTextColor(unpack(cfg.color.normal)) + +armorFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + armorIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +armorFrame:SetScript("OnLeave", function() + local durMin = 100 + for i = 1, 18 do + local durCur, durMax = GetInventoryItemDurability(i) + if ( durCur ~= durMax ) then durMin = min(durMin, durCur*(100/durMax)) end + end + if durMin >= cfg.armor.minArmor then + armorIcon:SetVertexColor(unpack(cfg.color.inactive)) + else + armorIcon:SetVertexColor(unpack(cfg.color.normal)) + end +end) + +armorFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + + end +end) + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("UPDATE_INVENTORY_DURABILITY") + +eventframe:SetScript("OnEvent", function(self,event, ...) + local durMin, durCol + durMin, durCol = 100, "ffffff" + for i = 1, 18 do + local durCur, durMax = GetInventoryItemDurability(i) + if ( durCur ~= durMax ) then durMin = min(durMin, durCur*(100/durMax)) end + end + + if durMin >= cfg.armor.maxArmor then + local overallilvl, equippedilvl = GetAverageItemLevel() + armorText:SetText(floor(equippedilvl).." ilvl") + else + armorText:SetText(floor(durMin).."%") + end + + if durMin >= cfg.armor.minArmor then + armorIcon:SetVertexColor(unpack(cfg.color.inactive)) + else + armorIcon:SetVertexColor(unpack(cfg.color.normal)) + end + armorFrame:SetSize(armorText:GetStringWidth()+18, 16) +end) \ No newline at end of file diff --git a/modules/clock.lua b/modules/clock.lua new file mode 100644 index 0000000..80c17a3 --- /dev/null +++ b/modules/clock.lua @@ -0,0 +1,110 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.clock.show then return end + +local hour, minu = 0,0 +local AmPmTimeText = "" + +local clockFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +clockFrame:SetSize(32, 32) +clockFrame:SetPoint("CENTER") +clockFrame:EnableMouse(true) +clockFrame:RegisterForClicks("AnyUp") + +local clockText = clockFrame:CreateFontString(nil, "OVERLAY") +clockText:SetFont(cfg.text.font, cfg.SXframe:GetHeight()-4) +clockText:SetPoint("LEFT") +clockText:SetTextColor(unpack(cfg.color.normal)) + +local amText = clockFrame:CreateFontString(nil, "OVERLAY") +amText:SetFont(cfg.text.font, cfg.text.normalFontSize) +amText:SetPoint("RIGHT") +amText:SetTextColor(unpack(cfg.color.inactive)) + +local calendarText = clockFrame:CreateFontString(nil, "OVERLAY") +calendarText:SetFont(cfg.text.font, cfg.text.smallFontSize) +calendarText:SetPoint("CENTER", clockFrame, "TOP") +if cfg.core.position ~= "BOTTOM" then + calendarText:SetPoint("CENTER", clockFrame, "BOTTOM") +end +calendarText:SetTextColor(unpack(cfg.color.normal)) + +local elapsed = 0 +clockFrame:SetScript('OnUpdate', function(self, e) + elapsed = elapsed + e + if elapsed >= 1 then + hour, minu = GetGameTime() + if minu < 10 then minu = ("0"..minu) end + if ( GetCVarBool("timeMgrUseLocalTime") ) then + if ( GetCVarBool("timeMgrUseMilitaryTime") ) then + clockText:SetText(date("%H:%M")) + amText:SetText("") + else + clockText:SetText(date("%I:%M")) + amText:SetText(date("%p")) + end + else + if ( GetCVarBool("timeMgrUseMilitaryTime") ) then + clockText:SetText(hour..":"..minu) + amText:SetText("") + else + if hour > 12 then + hour = hour - 12 + hour = ("0"..hour) + AmPmTimeText = "PM" + else + AmPmTimeText = "AM" + end + clockText:SetText(hour..":"..minu) + amText:SetText(AmPmTimeText) + end + + end + if (CalendarGetNumPendingInvites() > 0) then + calendarText:SetText(string.format("%s (|cffffff00%i|r)", "New Event!", (CalendarGetNumPendingInvites()))) + else + calendarText:SetText("") + end + clockFrame:SetWidth(clockText:GetStringWidth() + amText:GetStringWidth()) + clockFrame:SetPoint("CENTER", cfg.SXframe) + elapsed = 0 + end +end) + +--[[ + +--]] + +clockFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + clockText:SetTextColor(unpack(cfg.color.hover)) + if cfg.clock.showTooltip then + hour, minu = GetGameTime() + if minu < 10 then minu = ("0"..minu) end + GameTooltip:SetOwner(clockFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFClock|r]") + GameTooltip:AddLine(" ") + if ( GetCVarBool("timeMgrUseLocalTime") ) then + GameTooltip:AddDoubleLine("Realm Time", hour..":"..minu, 1, 1, 0, 1, 1, 1) + else + GameTooltip:AddDoubleLine("Local Time", date("%H:%M"), 1, 1, 0, 1, 1, 1) + end + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine("", "Open Calendar", 1, 1, 0, 1, 1, 1) + GameTooltip:AddDoubleLine("", "Open Clock", 1, 1, 0, 1, 1, 1) + GameTooltip:Show() + end +end) + +clockFrame:SetScript("OnLeave", function() if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end clockText:SetTextColor(unpack(cfg.color.normal)) end) + +clockFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleCalendar() + elseif button == "RightButton" then + ToggleTimeManager() + end +end) \ No newline at end of file diff --git a/modules/config.lua b/modules/config.lua new file mode 100644 index 0000000..4dc5ad9 --- /dev/null +++ b/modules/config.lua @@ -0,0 +1,268 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- + +if not cfg.useConfig then return end + +local configFrame = CreateFrame("Frame",nil,cfg.SXconfigFrame,"ButtonFrameTemplate") +configFrame:SetSize(350,400) +configFrame:ClearAllPoints() +configFrame:SetPoint("TOPLEFT",UIparent,20,-75) +--configFrame:SetScale(1.5) +configFrame:SetClampedToScreen(true) +configFrame:EnableMouse(true) +configFrame:SetMovable(true) +configFrame:RegisterForDrag("LeftButton") +configFrame:SetScript("OnDragStart",configFrame.StartMoving) +configFrame:SetScript("OnDragStop",configFrame.StopMovingOrSizing) + +local icon = configFrame:CreateTexture("$parentIcon", "OVERLAY", nil, -8) +icon:SetSize(60,60) +icon:SetPoint("TOPLEFT",-5,7) +icon:SetTexture("Interface\\FriendsFrame\\Battlenet-Portrait") +--SetPortraitTexture(icon, "Interface\\FriendsFrame\\Battlenet-Portrait") +--icon:SetTexCoord(0,1,0,1) + +local configFrameText = configFrame:CreateFontString(nil, "OVERLAY") +configFrameText:SetFont(STANDARD_TEXT_FONT, cfg.text.normalFontSize, "OUTLINE") +configFrameText:SetPoint("TOP",0,-6) +configFrameText:SetText(addon.." Configuration") + +local globalCheckButton = CreateFrame("CheckButton", "globalCheckButton", configFrame, "UICheckButtonTemplate") +globalCheckButton:ClearAllPoints() +globalCheckButton:SetPoint("TOPLEFT",60,-25) +_G[globalCheckButton:GetName() .. "Text"]:SetText("Use Module Coloring") +globalCheckButton:SetScript("OnClick", function(self,event,arg1) + if self:GetChecked() then + UIDropDownMenu_EnableDropDown(globalModuleDropdown) + globalActiveModuleText:SetTextColor(1,1,1,1) + else + UIDropDownMenu_DisableDropDown(globalModuleDropdown) + UIDropDownMenu_SetText(dropDown, "Select Module") + globalActiveModuleText:SetTextColor(1,1,1,0.4) + end +end) + + +local resetButton = CreateFrame("Button", "MyButton", configFrame, "UIPanelButtonTemplate") +resetButton:SetSize(80 ,22) -- width, height +resetButton:SetText("Reset Color") +resetButton:SetPoint("TOPRIGHT",-10,-30) +resetButton:SetScript("OnClick", function() + if IsShiftKeyDown() then + cfg.color = { + normal = {1,1,1,.75}, + inactive = {1,1,1,.25}, + hover = {cfg.cc.r,cfg.cc.g,cfg.cc.b,.75}, + barcolor = {.094,.094,.102,.45}, + } + print"The colors have been set to default." + else + print"Hold if you want to set the colors to default." + end +end) + + +local activeModuleText = configFrame:CreateFontString(nil, "OVERLAY") +activeModuleText:SetFont(STANDARD_TEXT_FONT, cfg.text.normalFontSize, "OUTLINE") +activeModuleText:SetPoint("TOPRIGHT",configFrame,"TOP",-20,-75) +activeModuleText:SetText("Active Module:") +globalActiveModuleText = activeModuleText + +local dropDown = CreateFrame("frame", "selectModuleDropDown", configFrame, "UIDropDownMenuTemplate") +dropDown:SetPoint("LEFT",activeModuleText, "RIGHT", -10,-5) +UIDropDownMenu_SetText(dropDown, "Select Module") +UIDropDownMenu_JustifyText(dropDown, "LEFT") + +globalModuleDropdown = dropDown + +local modules = { + "None", + "Micromenu", + "Armor", + "Talent", + "Clock", + "Trade Skill", + "Currency", + "System", + "Gold", + "Heartstone", +} + +local function OnClick(self) + UIDropDownMenu_SetSelectedID(dropDown, self:GetID()) + if self:GetID() == 1 then + + elseif self:GetID() == 2 then + + elseif self:GetID() == 3 then + + elseif self:GetID() == 4 then + + elseif self:GetID() == 5 then + + elseif self:GetID() == 6 then + + elseif self:GetID() == 7 then + + elseif self:GetID() == 8 then + + elseif self:GetID() == 9 then + + elseif self:GetID() == 10 then + + end +end + +local function initialize(self, level) + local info = UIDropDownMenu_CreateInfo() + for k,v in pairs(modules) do + info = UIDropDownMenu_CreateInfo() + info.text = v + info.value = v + info.func = OnClick + UIDropDownMenu_AddButton(info, level) + end +end + +UIDropDownMenu_Initialize(dropDown, initialize) +UIDropDownMenu_SetWidth(dropDown, 100); +UIDropDownMenu_SetButtonWidth(dropDown, 75) + + +local function showColorPicker(r,g,b,a,callback) + ColorPickerFrame:SetColorRGB(r,g,b) + ColorPickerFrame.hasOpacity, ColorPickerFrame.opacity = (a ~= nil), a + ColorPickerFrame.previousValues = {r,g,b,a} + ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc = callback, callback, callback + ColorPickerFrame:Hide() -- Need to run the OnShow handler. + ColorPickerFrame:Show() +end + +local barColorFrame = CreateFrame("FRAME",nil,configFrame) +barColorFrame:SetSize(18,18) +barColorFrame:SetPoint("TOPLEFT",configFrame,15,-100) +--text +barColorFrame.text = barColorFrame:CreateFontString(nil, "OVERLAY") +barColorFrame.text:SetFont(STANDARD_TEXT_FONT, 16, "OUTLINE") +barColorFrame.text:SetPoint("CENTER") +barColorFrame.text:SetText("Bar Color") +barColorFrame.text:SetTextColor(1,1,1,.75) +barColorFrame:SetWidth(barColorFrame.text:GetStringWidth()) + +local normalColor = CreateFrame("FRAME",nil,configFrame) +normalColor:SetSize(100,20) +normalColor:SetPoint("TOPLEFT",barColorFrame,0,-40) +--text +normalColor.text = normalColor:CreateFontString(nil, "OVERLAY") +normalColor.text:SetFont(STANDARD_TEXT_FONT, 16, "OUTLINE") +normalColor.text:SetPoint("CENTER") +normalColor.text:SetText("Normal Color") +normalColor.text:SetTextColor(1,1,1,.75) +normalColor:SetWidth(normalColor.text:GetStringWidth()) + +local inactiveColor = CreateFrame("FRAME",nil,configFrame) +inactiveColor:SetSize(100,20) +inactiveColor:SetPoint("TOPLEFT",normalColor,0,-40) +--text +inactiveColor.text = inactiveColor:CreateFontString(nil, "OVERLAY") +inactiveColor.text:SetFont(STANDARD_TEXT_FONT, 16, "OUTLINE") +inactiveColor.text:SetPoint("CENTER") +inactiveColor.text:SetText("Inactive Color") +inactiveColor.text:SetTextColor(1,1,1,.25) +inactiveColor:SetWidth(normalColor.text:GetStringWidth()) + +local hoverColorFrame = CreateFrame("FRAME",nil,configFrame) +hoverColorFrame:SetSize(18,18) +hoverColorFrame:SetPoint("TOPLEFT",inactiveColor,0,-40) +--text +hoverColorFrame.text = hoverColorFrame:CreateFontString(nil, "OVERLAY") +hoverColorFrame.text:SetFont(STANDARD_TEXT_FONT, 16, "OUTLINE") +hoverColorFrame.text:SetPoint("CENTER") +hoverColorFrame.text:SetText("Hover Color") +hoverColorFrame.text:SetTextColor(cfg.cc.r,cfg.cc.g,cfg.cc.b,.75) +hoverColorFrame:SetWidth(hoverColorFrame.text:GetStringWidth()) + +--recolor callback function +normalColor.recolorTexture = function(color) + local r,g,b,a + if color then + r,g,b,a = unpack(color) + else + r,g,b = ColorPickerFrame:GetColorRGB() + a = OpacitySliderFrame:GetValue() + end + normalColor.text:SetTextColor(r,g,b,a) + cfg.color.normal = {r,g,b,a} + globalNormColSlider:SetValue(a*100) + globalNormColEditBox:SetNumber(a*100) +end +normalColor:EnableMouse(true) +normalColor:SetScript("OnMouseDown", function(self,button,...) + if button == "LeftButton" then + local r,g,b,a = self.text:GetTextColor() + showColorPicker(r,g,b,a,self.recolorTexture) + end +end) + +local normalClassColorCheckButton = CreateFrame("CheckButton", "classColorNormalCheckButton", normalColor, "UIRadioButtonTemplate") +normalClassColorCheckButton:ClearAllPoints() +normalClassColorCheckButton:SetPoint("RIGHT",50,0) +_G[normalClassColorCheckButton:GetName() .. "Text"]:SetText("Class color") +normalClassColorCheckButton:SetScript("OnClick", function(self,event,arg1) + if self:GetChecked() then + normalColor.text:SetTextColor(cfg.cc.r,cfg.cc.g,cfg.cc.b) + normalColor:EnableMouse(false) + globalNormColEditBox:Enable() + globalNormColSlider:Enable() + globalNormColSlider:SetAlpha(1) + else + normalColor.text:SetTextColor(1,1,1,.75) + normalColor:EnableMouse(true) + globalNormColEditBox:Disable() + globalNormColSlider:Disable() + globalNormColSlider:SetAlpha(.4) + end +end) + +local slider = CreateFrame("Slider","MyExampleSlider",normalClassColorCheckButton,"OptionsSliderTemplate") --frameType, frameName, frameParent, frameTemplate +slider:SetPoint("TOPLEFT",0,-30) +slider.textLow = _G["MyExampleSlider".."Low"] +slider.textHigh = _G["MyExampleSlider".."High"] +slider.text = _G["MyExampleSlider".."Text"] +slider:SetMinMaxValues(0, 100) +slider.minValue, slider.maxValue = slider:GetMinMaxValues() +slider.textLow:SetText(slider.minValue) +slider.textHigh:SetText(slider.maxValue) +slider.text:SetText("Class Color Alpha:") +slider:SetValue(100) +slider:SetValueStep(1) +slider:Disable() +slider:SetAlpha(.4) +slider:SetScript("OnValueChanged", function(self,event,arg1) + normalColor.text:SetAlpha(event/100) + globalNormColEditBox:SetNumber(event) +end) +globalNormColSlider = slider + +local EditBox = CreateFrame("EditBox",nil,slider) +EditBox:SetWidth(32) +EditBox:SetHeight(16) +EditBox:SetPoint("LEFT",slider.text,"RIGHT",2,0) +EditBox:SetFontObject(GameFontNormal) +EditBox:SetAutoFocus(false) +EditBox:SetMaxLetters(3) +EditBox:SetNumeric() +EditBox:SetScript("OnEnterPressed", function(self) + self:ClearFocus() + globalNormColSlider:SetValue(EditBox:GetNumber()) +end) + +globalNormColEditBox = EditBox + +--[ +UIDropDownMenu_DisableDropDown(globalModuleDropdown) +globalActiveModuleText:SetTextColor(1,1,1,0.4) +globalNormColEditBox:Disable() +--]] \ No newline at end of file diff --git a/modules/currency.lua b/modules/currency.lua new file mode 100644 index 0000000..8f02ad7 --- /dev/null +++ b/modules/currency.lua @@ -0,0 +1,324 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.currency.show then return end + +local currencyFrame = CreateFrame("Frame",nil, cfg.SXframe) +currencyFrame:SetPoint("LEFT", cfg.SXframe, "CENTER", 340,0) +currencyFrame:SetSize(16, 16) + +--------------------------------------------- +-- XP BAR +--------------------------------------------- +local xpFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +xpFrame:SetPoint("LEFT", cfg.SXframe, "CENTER", 350,0) +xpFrame:SetSize(16, 16) +xpFrame:EnableMouse(true) +xpFrame:RegisterForClicks("AnyUp") + +local xpIcon = xpFrame:CreateTexture(nil,"OVERLAY",nil,7) +xpIcon:SetSize(16, 16) +xpIcon:SetPoint("LEFT") +xpIcon:SetTexture(cfg.mediaFolder.."datatexts\\exp") +xpIcon:SetVertexColor(unpack(cfg.color.normal)) + +local xpText = xpFrame:CreateFontString(nil, "OVERLAY") +xpText:SetFont(cfg.text.font, cfg.text.normalFontSize) +xpText:SetPoint("RIGHT",xpFrame,2,0 ) +xpText:SetTextColor(unpack(cfg.color.normal)) + +local xpStatusbar = CreateFrame("StatusBar", nil, xpFrame) +xpStatusbar:SetStatusBarTexture(1,1,1) +xpStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) +xpStatusbar:SetPoint("TOPLEFT", xpText, "BOTTOMLEFT",0,-2) + +local xpStatusbarBG = xpStatusbar:CreateTexture(nil,"BACKGROUND",nil,7) +xpStatusbarBG:SetPoint("TOPLEFT", xpText, "BOTTOMLEFT",0,-2) +xpStatusbarBG:SetColorTexture(unpack(cfg.color.inactive)) + +xpFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + xpIcon:SetVertexColor(unpack(cfg.color.hover)) + xpStatusbar:SetStatusBarColor(unpack(cfg.color.hover)) + if not cfg.currency.showTooltip then return end + local mxp = UnitXPMax("player") + local xp = UnitXP("player") + local nxp = mxp - xp + local rxp = GetXPExhaustion() + local name, standing, minrep, maxrep, value = GetWatchedFactionInfo() + + if cfg.core.position ~= "BOTTOM" then + GameTooltip:SetOwner(xpStatusbar, cfg.tooltipPos) + else + GameTooltip:SetOwner(xpFrame, cfg.tooltipPos) + end + + GameTooltip:AddLine("[|cff6699FFExperience Bar|r]") + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine(COMBAT_XP_GAIN, format(cfg.SVal(xp)).."|cffffd100/|r"..format(cfg.SVal(mxp)).." |cffffd100/|r "..floor((xp/mxp)*1000)/10 .."%",NORMAL_FONT_COLOR.r,NORMAL_FONT_COLOR.g,NORMAL_FONT_COLOR.b,1,1,1) + GameTooltip:AddDoubleLine(NEED, format(cfg.SVal(nxp)).." |cffffd100/|r "..floor((nxp/mxp)*1000)/10 .."%",NORMAL_FONT_COLOR.r,NORMAL_FONT_COLOR.g,NORMAL_FONT_COLOR.b,1,1,1) + if rxp then + GameTooltip:AddDoubleLine(TUTORIAL_TITLE26, format(cfg.SVal(rxp)) .." |cffffd100/|r ".. floor((rxp/mxp)*1000)/10 .."%", NORMAL_FONT_COLOR.r,NORMAL_FONT_COLOR.g,NORMAL_FONT_COLOR.b,1,1,1) + end + GameTooltip:Show() +end) + +xpFrame:SetScript("OnLeave", function() + xpIcon:SetVertexColor(unpack(cfg.color.normal)) + xpStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end +end) + +--------------------------------------------- +-- REROLL +--------------------------------------------- +local rerollFrame = CreateFrame("BUTTON",nil, currencyFrame) +rerollFrame:SetPoint("LEFT") +rerollFrame:SetSize(16, 16) +rerollFrame:EnableMouse(true) +rerollFrame:RegisterForClicks("AnyUp") + +local rerollIcon = rerollFrame:CreateTexture(nil,"OVERLAY",nil,7) +rerollIcon:SetSize(16, 16) +rerollIcon:SetPoint("RIGHT") +rerollIcon:SetTexture(cfg.mediaFolder.."datatexts\\reroll") +rerollIcon:SetVertexColor(unpack(cfg.color.inactive)) + +local rerollText = rerollFrame:CreateFontString(nil, "OVERLAY") +rerollText:SetFont(cfg.text.font, cfg.text.normalFontSize) +rerollText:SetPoint("RIGHT",rerollIcon,"LEFT",-2,0) +rerollText:SetTextColor(unpack(cfg.color.inactive)) + +rerollFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + rerollIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.currency.showTooltip then return end + GameTooltip:SetOwner(currencyFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFReroll|r]") + GameTooltip:AddLine(" ") + local SoIFname, SoIFamount, SoIFicon, SoIFearnedThisWeek, SoIFweeklyMax, SoIFtotalMax, SoIFisDiscovered = GetCurrencyInfo(1129) + if SoIFamount > 0 then + GameTooltip:AddLine(SoIFname,1,1,0) + GameTooltip:AddDoubleLine("|cffffff00Weekly: |cffffffff"..SoIFearnedThisWeek.."|cffffff00/|cffffffff"..SoIFweeklyMax, "|cffffff00Total: |cffffffff"..SoIFamount.."|cffffff00/|cffffffff"..SoIFtotalMax) + else + local SoTFname, SoTFamount, SoTFicon, SoTFearnedThisWeek, SoTFweeklyMax, SoTFtotalMax, SoTFisDiscovered = GetCurrencyInfo(994) + if SoTFamount > 0 then + GameTooltip:AddDoubleLine(SoTFname, "|cffffff00Total: |cffffffff"..SoTFamount.."|cffffff00/|cffffffff"..SoTFtotalMax) + end + end + GameTooltip:Show() +end) + +rerollFrame:SetScript("OnLeave", function() + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end + rerollIcon:SetVertexColor(unpack(cfg.color.inactive)) +end) + +rerollFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleCharacter("TokenFrame") + end +end) + +--------------------------------------------- +-- HONOR +--------------------------------------------- + +local honorFrame = CreateFrame("BUTTON",nil, currencyFrame) +honorFrame:SetPoint("LEFT",rerollFrame,"RIGHT",2,0) +honorFrame:SetSize(16, 16) +honorFrame:EnableMouse(true) +honorFrame:RegisterForClicks("AnyUp") + +local honorIcon = honorFrame:CreateTexture(nil,"OVERLAY",nil,7) +honorIcon:SetSize(16, 16) +honorIcon:SetPoint("RIGHT") +honorIcon:SetTexture(cfg.mediaFolder.."datatexts\\honor") +honorIcon:SetVertexColor(unpack(cfg.color.inactive)) + +local honorText = honorFrame:CreateFontString(nil, "OVERLAY") +honorText:SetFont(cfg.text.font, cfg.text.normalFontSize) +honorText:SetPoint("LEFT") +honorText:SetTextColor(unpack(cfg.color.inactive)) + +honorFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + honorIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.currency.showTooltip then return end + GameTooltip:SetOwner(currencyFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFPvP Currency|r]") + GameTooltip:AddLine(" ") + local concName, concAmount, _, concEarnedThisWeek, concWeeklyMax, concTotalMax, concIsDiscovered = GetCurrencyInfo(390) + local honorName, honorAmount, _, honorEarnedThisWeek, honorWeeklyMax, honorTotalMax, honorIsDiscovered = GetCurrencyInfo(392) + + GameTooltip:AddDoubleLine(concName,"|cffffff00Weekly: |cffffffff"..concEarnedThisWeek.."|cffffff00/|cffffffff"..format(cfg.SVal(concWeeklyMax))) + + GameTooltip:AddDoubleLine(honorName, "|cffffff00Total: |cffffffff"..honorAmount.."|cffffff00/|cffffffff"..format(cfg.SVal(honorTotalMax))) + GameTooltip:Show() +end) + +honorFrame:SetScript("OnLeave", function() + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end + honorIcon:SetVertexColor(unpack(cfg.color.inactive)) +end) + +honorFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleCharacter("TokenFrame") + end +end) + +--------------------------------------------- +-- GARRISON RECOURCES +--------------------------------------------- + +local garrisonFrame = CreateFrame("BUTTON",nil, currencyFrame) +garrisonFrame:SetPoint("LEFT",honorFrame,"RIGHT",2,0) +garrisonFrame:SetSize(16, 16) +garrisonFrame:EnableMouse(true) +garrisonFrame:RegisterForClicks("AnyUp") + +local garrisonIcon = garrisonFrame:CreateTexture(nil,"OVERLAY",nil,7) +garrisonIcon:SetSize(16, 16) +garrisonIcon:SetPoint("RIGHT") +garrisonIcon:SetTexture(cfg.mediaFolder.."datatexts\\garres") +garrisonIcon:SetVertexColor(unpack(cfg.color.inactive)) + +local garrisonText = garrisonFrame:CreateFontString(nil, "OVERLAY") +garrisonText:SetFont(cfg.text.font, cfg.text.normalFontSize) +garrisonText:SetPoint("LEFT") +garrisonText:SetTextColor(unpack(cfg.color.inactive)) + +garrisonFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + garrisonIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.currency.showTooltip then return end + GameTooltip:SetOwner(currencyFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFGarrison Recources|r]") + GameTooltip:AddLine(" ") + local grName, grAmount, _, _, _, grTotalMax = GetCurrencyInfo(824) + local oilName, oilAmount, _, _, _, oilTotalMax, oilIsDiscovered = GetCurrencyInfo(1101) + local apexisName, apexisAmount = GetCurrencyInfo(823) + local DICName, DICAmount, _, _, _, DICTotalMax = GetCurrencyInfo(980) + + GameTooltip:AddDoubleLine(grName, "|cffffffff"..format(cfg.SVal(grAmount)).."|cffffff00/|cffffffff"..format(cfg.SVal(grTotalMax))) + if oilIsDiscovered then + GameTooltip:AddDoubleLine(oilName, "|cffffffff"..format(cfg.SVal(oilAmount)).."|cffffff00/|cffffffff"..format(cfg.SVal(oilTotalMax))) + end + GameTooltip:AddDoubleLine(apexisName, "|cffffffff"..format(cfg.SVal(apexisAmount))) + if DICAmount > 0 then + GameTooltip:AddDoubleLine(DICName, "|cffffffff"..format(cfg.SVal(DICAmount)).."|cffffff00/|cffffffff"..format(cfg.SVal(DICTotalMax))) + end + GameTooltip:Show() +end) + +garrisonFrame:SetScript("OnLeave", function() + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end + garrisonIcon:SetVertexColor(unpack(cfg.color.inactive)) +end) + +garrisonFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleCharacter("TokenFrame") + end +end) + + +--------------------------------------------- +-- FUNCTIONS +--------------------------------------------- +local function updateXP(xp, mxp) + if UnitLevel("player") == MAX_PLAYER_LEVEL or not cfg.currency.showXPbar then + xpFrame:Hide() + xpFrame:EnableMouse(false) + currencyFrame:Show() + else + currencyFrame:Hide() + xpFrame:Show() + xpFrame:EnableMouse(true) + xpStatusbar:SetMinMaxValues(0, mxp) + xpStatusbar:SetValue(xp) + xpText:SetText("LEVEL "..UnitLevel("player").." "..cfg.CLASS) + xpFrame:SetSize(xpText:GetStringWidth()+18, 16) + xpStatusbar:SetSize(xpText:GetStringWidth(),3) + xpStatusbarBG:SetSize(xpText:GetStringWidth(),3) + end +end + +--------------------------------------------- +-- EVENT HANDELING +--------------------------------------------- + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("PLAYER_XP_UPDATE") +eventframe:RegisterEvent("PLAYER_LEVEL_UP") +eventframe:RegisterEvent("CURRENCY_DISPLAY_UPDATE") +eventframe:RegisterEvent("CHAT_MSG_CURRENCY") +eventframe:RegisterEvent("TRADE_CURRENCY_CHANGED") +eventframe:RegisterEvent("MODIFIER_STATE_CHANGED") + +eventframe:SetScript("OnEvent", function(this, event, arg1, arg2, arg3, arg4, ...) + --if event == "PLAYER_ENTERING_WORLD" or event == "PLAYER_XP_UPDATE" or event == "PLAYER_LEVEL_UP" then + if UnitLevel("player") ~= MAX_PLAYER_LEVEL and cfg.currency.showXPbar then + mxp = UnitXPMax("player") + xp = UnitXP("player") + updateXP(xp, mxp) + currencyFrame:Hide() + else + xpFrame:Hide() + end + + if event == "MODIFIER_STATE_CHANGED" then + if InCombatLockdown() then return end + if arg1 == "LSHIFT" or arg1 == "RSHIFT" then + if UnitLevel("player") == MAX_PLAYER_LEVEL or not cfg.currency.showXPbar then return end + if arg2 == 1 then + xpFrame:Hide() + xpFrame:EnableMouse(false) + currencyFrame:Show() + elseif arg2 == 0 then + currencyFrame:Hide() + xpFrame:EnableMouse(true) + xpFrame:Show() + end + end + end + + + + + -- reroll currency + local SoIFname, SoIFamount, _, _, _, SoIFtotalMax, SoIFisDiscovered = GetCurrencyInfo(1129) + if SoIFamount > 0 then + rerollText:SetText(SoIFamount) + else + local SoTFname, SoTFamount, _, _, _, SoTFtotalMax, SoTFisDiscovered = GetCurrencyInfo(994) + if SoTFamount > 0 then rerollText:SetText(SoTFamount) end + end + rerollFrame:SetSize(rerollText:GetStringWidth()+18, 16) + + -- honor currency + local concName, concAmount, _, concEarnedThisWeek, concWeeklyMax, concTotalMax, concIsDiscovered = GetCurrencyInfo(390) + if concAmount > 0 then + honorText:SetText(concAmount) + else + local honorName, honorAmount, _, honorEarnedThisWeek, honorWeeklyMax, honorTotalMax, honorIsDiscovered = GetCurrencyInfo(392) + if honorAmount > 0 then honorText:SetText(honorAmount) end + end + honorFrame:SetSize(honorText:GetStringWidth()+18, 16) + + currencyFrame:SetSize(rerollFrame:GetWidth()+honorFrame:GetWidth()+6,16) + + -- garrison currency + local grName, grAmount, _, grEarnedThisWeek, grWeeklyMax, grTotalMax, grIsDiscovered = GetCurrencyInfo(824) + garrisonText:SetText(grAmount) + garrisonFrame:SetSize(garrisonText:GetStringWidth()+18, 16) + + currencyFrame:SetSize(rerollFrame:GetWidth()+honorFrame:GetWidth()+garrisonFrame:GetWidth()+6,16) +end) + diff --git a/modules/gold.lua b/modules/gold.lua new file mode 100644 index 0000000..f3d098a --- /dev/null +++ b/modules/gold.lua @@ -0,0 +1,225 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.gold.show then return end + +local onHover = false + +local function goldConverter(money) + local g, s, c = abs(money/10000), abs(mod(money/100, 100)), abs(mod(money, 100)) + local cash + if ( g < 1 ) then g = "" else g = string.format("|cffffffff%d|cffffd700g|r ", g) end + if ( s < 1 ) then s = "" else s = string.format("|cffffffff%d|cffc7c7cfs|r ", s) end + if ( c == 0 ) then c = "" else c = string.format("|cffffffff%d|cffeda55fc|r", c) end + cash = string.format("%s%s%s", g, s, c) + if money == 0 then cash = "|cffffffff0" end + return cash +end + +local playerName, playerFaction, playerRealm = UnitName("player"), UnitFactionGroup("player"), GetRealmName() + +local positiveSign = "|cff00ff00+ " +local negativeSign = "|cffff0000- " + +local goldFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +goldFrame:SetPoint("RIGHT",-230,0) +goldFrame:SetSize(16, 16) +goldFrame:EnableMouse(true) +goldFrame:RegisterForClicks("AnyUp") + + local function goldFrameOnEnter() + if not cfg.gold.showTooltip then return end + if not onHover then return end + GameTooltip:SetOwner(goldFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFGold|r]") + GameTooltip:AddLine(" ") + --------------------------------------------------- + + local gold = GetMoney() + local logDate = ns.playerData.lastLoginDate + + local sessionGold = ns.playerData["money_on_session_start"] + local sessionGoldIcon = "" + sessionGold = sessionGold - gold + + if sessionGold < 0 then + sessionGoldIcon = positiveSign + elseif sessionGold > 0 then + sessionGoldIcon = negativeSign + else + end + + local dayGold = ns.playerData["money_on_first_login_today"] + local dayGoldIcon = "" + dayGold = dayGold - gold + + if dayGold < 0 then + dayGoldIcon = positiveSign + elseif dayGold > 0 then + dayGoldIcon = negativeSign + else + end + + + local weekGold = ns.playerData["money_on_first_weekday"] + local weekGoldIcon = "" + weekGold = weekGold - gold + + if weekGold < 0 then + weekGoldIcon = positiveSign + elseif weekGold > 0 then + weekGoldIcon = negativeSign + else + end + + + local totalGold = 0 + for key, val in pairs(ns.realmData[playerFaction]) do + for k, v in pairs(val) do + if k == "money_on_log_out" then + totalGold = totalGold + v + end + end + end + + local realmDailyGold = 0 + for key, val in pairs(ns.realmData[playerFaction]) do + for k, v in pairs(val) do + if k == "money_on_first_login_today" then + realmDailyGold = realmDailyGold + v + end + end + end + + local realmDayGoldIcon = "" + realmDailyGold = realmDailyGold - totalGold + + if realmDailyGold < 0 then + realmDayGoldIcon = positiveSign + elseif realmDailyGold > 0 then + realmDayGoldIcon = negativeSign + else + end + + + local realmWeeklyGold = 0 + for key, val in pairs(ns.realmData[playerFaction]) do + for k, v in pairs(val) do + if k == "money_on_first_weekday" then + realmWeeklyGold = realmWeeklyGold + v + end + end + end + + local realmWeekGoldIcon = "" + realmWeeklyGold = realmWeeklyGold - totalGold + + if realmWeeklyGold < 0 then + realmWeekGoldIcon = positiveSign + elseif realmWeeklyGold > 0 then + realmWeekGoldIcon = negativeSign + else + end + + GameTooltip:AddDoubleLine(playerName.."|r's Gold",format(goldConverter(gold))) + GameTooltip:AddLine(" ") + + if IsShiftKeyDown() then + GameTooltip:AddDoubleLine("Realm Daily Balance",realmDayGoldIcon..format(goldConverter(realmDailyGold))) + GameTooltip:AddDoubleLine("Realm Weekly Balance",realmWeekGoldIcon..format(goldConverter(realmWeeklyGold))) + GameTooltip:AddLine(" ") + for key, val in pairs(ns.realmData[playerFaction]) do + for k, v in pairs(val) do + if k == "money_on_log_out" then + GameTooltip:AddDoubleLine(key,format(goldConverter(v))) + end + end + end + + else + GameTooltip:AddDoubleLine("Session Balance",sessionGoldIcon..format(goldConverter(sessionGold))) + GameTooltip:AddDoubleLine("Daily Balance",dayGoldIcon..format(goldConverter(dayGold))) + GameTooltip:AddDoubleLine("Weekly Balance",weekGoldIcon..format(goldConverter(weekGold))) + + end + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine("Realm Gold","|cffffffff"..format(goldConverter(totalGold))) + if not IsShiftKeyDown() then + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine("", "Show the |cffffff00"..playerRealm.." - "..playerFaction.."|r gold", 1, 1, 0, 1, 1, 1) + end + GameTooltip:Show() + end + +local goldIcon = goldFrame:CreateTexture(nil,"OVERLAY",nil,7) +goldIcon:SetPoint("LEFT") +goldIcon:SetTexture(cfg.mediaFolder.."datatexts\\gold") +goldIcon:SetVertexColor(unpack(cfg.color.normal)) + +local goldText = goldFrame:CreateFontString(nil, "OVERLAY") +goldText:SetFont(cfg.text.font, cfg.text.normalFontSize) +goldText:SetPoint("RIGHT", goldFrame,2,0) +goldText:SetTextColor(unpack(cfg.color.normal)) + +goldFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + goldIcon:SetVertexColor(unpack(cfg.color.hover)) + onHover = true + goldFrameOnEnter() +end) + +goldFrame:SetScript("OnLeave", function() if ( GameTooltip:IsShown() ) then GameTooltip:Hide() onHover = false end goldIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +goldFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + OpenAllBags() + elseif button == "RightButton" then + CloseAllBags() + end +end) + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("PLAYER_MONEY") +eventframe:RegisterEvent("SEND_MAIL_MONEY_CHANGED") +eventframe:RegisterEvent("SEND_MAIL_COD_CHANGED") +eventframe:RegisterEvent("PLAYER_TRADE_MONEY") +eventframe:RegisterEvent("TRADE_MONEY_CHANGED") +eventframe:RegisterEvent("TRADE_CLOSED") +eventframe:RegisterEvent("MODIFIER_STATE_CHANGED") + +eventframe:SetScript("OnEvent", function(this, event, arg1, arg2, arg3, arg4, ...) + +goldFrameOnEnter() +if event == "MODIFIER_STATE_CHANGED" then + if InCombatLockdown() then return end + if arg1 == "LSHIFT" or arg1 == "RSHIFT" then + if arg2 == 1 then + goldFrameOnEnter() + elseif arg2 == 0 then + goldFrameOnEnter() + end + end + end + + + local gold = GetMoney() + + ns.playerData["money_on_log_out"] = gold + + local g, s, c = abs(gold/10000), abs(mod(gold/100, 100)), abs(mod(gold, 100)) + + if g > 1 then + goldText:SetText(floor(g).."g") + elseif s > 1 then + goldText:SetText(floor(s).."s") + else + goldText:SetText(floor(c).."c") + end + if gold == 0 then goldText:SetText("0") end + + + goldFrame:SetSize(goldText:GetStringWidth()+18, 16) +end) \ No newline at end of file diff --git a/modules/heartstone.lua b/modules/heartstone.lua new file mode 100644 index 0000000..af8be69 --- /dev/null +++ b/modules/heartstone.lua @@ -0,0 +1,251 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.heartstone.show then return end + +local garrOnHover = false +local hsOnHover = false + +local teleportFrame = CreateFrame("Frame",nil, cfg.SXframe) +teleportFrame:SetPoint("RIGHT",-4,0) +teleportFrame:SetSize(16, 16) +--------------------------------------------------------------------- +local HSFrame = CreateFrame("BUTTON","hsButton", teleportFrame, "SecureActionButtonTemplate") +HSFrame:SetPoint("RIGHT") +HSFrame:SetSize(16, 16) +HSFrame:EnableMouse(true) +HSFrame:RegisterForClicks("AnyUp") +HSFrame:SetAttribute("type", "macro") + +local HSText = HSFrame:CreateFontString(nil, "OVERLAY") +HSText:SetFont(cfg.text.font, cfg.text.normalFontSize) +HSText:SetPoint("RIGHT") +HSText:SetTextColor(unpack(cfg.color.normal)) + +local HSIcon = HSFrame:CreateTexture(nil,"OVERLAY",nil,7) +HSIcon:SetSize(16, 16) +HSIcon:SetPoint("RIGHT", HSText,"LEFT",-2,0) +HSIcon:SetTexture(cfg.mediaFolder.."datatexts\\hearth") +HSIcon:SetVertexColor(unpack(cfg.color.normal)) + +HSFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + HSIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.heartstone.showTooltip then return end + local startTime, duration = GetItemCooldown(6948) + if startTime ~= 0 then + local CDremaining = (startTime+duration)-GetTime() + GameTooltip:SetOwner(teleportFrame, cfg.tooltipPos) + GameTooltip:AddDoubleLine("Cooldown",SecondsToTime(CDremaining),1,1,0,1,1,1) + GameTooltip:Show() + end + hsOnHover = true +end) + +HSFrame:SetScript("OnLeave", function() + hsOnHover = false + if IsUsableItem(6948) and GetItemCooldown(6948) == 0 or IsPlayerSpell(556) and GetSpellCooldown(556) == 0 then + HSIcon:SetVertexColor(unpack(cfg.color.normal)) + else + HSIcon:SetVertexColor(unpack(cfg.color.inactive)) + end +end) + +-- Change the button action before the click reaches it: +function HSFrame:ChangeAction(action) + if InCombatLockdown() then return end -- can't change attributes in combat + self:SetAttribute("macrotext", action) +end + +HSFrame:SetScript("PreClick", function(self) + if InCombatLockdown() then return end -- can't change attributes in combat + + -- Innkeeper's Daughter + if IsUsableItem(64488) and GetItemCooldown(64488) == 0 then + local itemName, itemLink, _, _, _, _, _, _, _, itemIcon = GetItemInfo(64488) + return self:ChangeAction("/use " .. itemName) + + -- Hearthstone + elseif IsUsableItem(6948) and GetItemCooldown(6948) == 0 then + local itemName, itemLink, _, _, _, _, _, _, _, itemIcon = GetItemInfo(6948) + return self:ChangeAction("/use " .. itemName) + + -- Astral Recall + elseif IsPlayerSpell(556) and GetSpellCooldown(556) == 0 then + local spellName, _, spellIcon = GetSpellInfo(556) + return self:ChangeAction("/cast " .. spellName) + end + + local playerLevel = UnitLevel("player") + + if playerLevel > 70 and IsUsableItem(44315) and GetItemCooldown(44315) == 0 then + return self:SetAttribute("macrotext", "/use Scroll of Recall III") + + elseif playerLevel > 40 and IsUsableItem(44314) and GetItemCooldown(44314) == 0 then + return self:SetAttribute("macrotext", "/use Scroll of Recall II") + + elseif playerLevel <= 39 and IsUsableItem(37118) and GetItemCooldown(37118) == 0 then + return self:SetAttribute("macrotext", "/use Scroll of Recall") + + end +end) +--------------------------------------------------------------------- +local garrisonFrame = CreateFrame("BUTTON","garrisonButton", teleportFrame, "SecureActionButtonTemplate") +garrisonFrame:SetPoint("LEFT") +garrisonFrame:SetSize(16, 16) +garrisonFrame:EnableMouse(true) +garrisonFrame:RegisterForClicks("AnyUp") +garrisonFrame:SetAttribute("*type1", "macro") + +-- Change the button action before the click reaches it: +function garrisonFrame:ChangeAction(action) + if InCombatLockdown() then return end -- can't change attributes in combat + self:SetAttribute("macrotext", action) +end + +garrisonFrame:SetScript("PreClick", function(self) + if InCombatLockdown() then return end -- can't change attributes in combat + + if IsShiftKeyDown() then + if IsUsableItem(128353) and GetItemCooldown(128353) == 0 then + local itemName, itemLink, _, _, _, _, _, _, _, itemIcon = GetItemInfo(128353) + return self:ChangeAction("/use " .. itemName) + end + else + if IsUsableItem(110560) and GetItemCooldown(110560) == 0 then + local itemName, itemLink, _, _, _, _, _, _, _, itemIcon = GetItemInfo(110560) + return self:ChangeAction("/use " .. itemName) + end + end +end) + + +local garrisonIcon = garrisonFrame:CreateTexture(nil,"OVERLAY",nil,7) +garrisonIcon:SetSize(16, 16) +garrisonIcon:SetPoint("LEFT") +garrisonIcon:SetTexture(cfg.mediaFolder.."datatexts\\garr") +garrisonIcon:SetVertexColor(unpack(cfg.color.normal)) + +local garrisonText = garrisonFrame:CreateFontString(nil, "OVERLAY") +garrisonText:SetFont(cfg.text.font, cfg.text.normalFontSize) +garrisonText:SetPoint("LEFT", garrisonIcon,"RIGHT",2,0) +garrisonText:SetText("GARRISON") +garrisonText:SetTextColor(unpack(cfg.color.normal)) + +garrisonFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + local startTime, duration = GetItemCooldown(110560) + if startTime ~= 0 then + local CDremaining = (startTime+duration)-GetTime() + GameTooltip:SetOwner(teleportFrame, cfg.tooltipPos) + GameTooltip:AddDoubleLine("Cooldown",SecondsToTime(CDremaining),1,1,0,1,1,1) + GameTooltip:Show() + end + garrisonIcon:SetVertexColor(unpack(cfg.color.hover)) + garrOnHover = true +end) + +garrisonFrame:SetScript("OnLeave", function() + garrOnHover = false + if IsUsableItem(110560) and GetItemCooldown(110560) == 0 then + garrisonIcon:SetVertexColor(unpack(cfg.color.normal)) + else + garrisonIcon:SetVertexColor(unpack(cfg.color.inactive)) + end + GameTooltip:Hide() +end) + +local function hsHover() +local startTime, duration = GetItemCooldown(6948) + if startTime ~= 0 then + local CDremaining = (startTime+duration)-GetTime() + GameTooltip:SetOwner(teleportFrame, cfg.tooltipPos) + GameTooltip:AddDoubleLine("Cooldown",SecondsToTime(CDremaining),1,1,0,1,1,1) + GameTooltip:Show() + end + HSIcon:SetVertexColor(unpack(cfg.color.hover)) +end + +local function garrHover() +local startTime, duration = GetItemCooldown(110560) + if startTime ~= 0 then + local CDremaining = (startTime+duration)-GetTime() + GameTooltip:SetOwner(teleportFrame, cfg.tooltipPos) + GameTooltip:AddDoubleLine("Cooldown",SecondsToTime(CDremaining),1,1,0,1,1,1) + GameTooltip:Show() + end + garrisonIcon:SetVertexColor(unpack(cfg.color.hover)) +end + +local function updateTeleportText() +local playerLevel = UnitLevel("player") + if IsUsableItem(64488) and GetItemCooldown(64488) == 0 + or IsUsableItem(6948) and GetItemCooldown(6948) == 0 + or IsPlayerSpell(556) and GetSpellCooldown(556) == 0 + or playerLevel > 70 and IsUsableItem(44315) and GetItemCooldown(44315) == 0 + or playerLevel > 40 and IsUsableItem(44314) and GetItemCooldown(44314) == 0 + or playerLevel <= 39 and IsUsableItem(37118) and GetItemCooldown(37118) == 0 + then + HSIcon:SetVertexColor(unpack(cfg.color.normal)) + HSText:SetTextColor(unpack(cfg.color.normal)) + else + HSIcon:SetVertexColor(unpack(cfg.color.inactive)) + HSText:SetTextColor(unpack(cfg.color.inactive)) + end + + if IsUsableItem(110560) and GetItemCooldown(110560) == 0 then + garrisonIcon:SetVertexColor(unpack(cfg.color.normal)) + garrisonText:SetTextColor(unpack(cfg.color.normal)) + else + garrisonIcon:SetVertexColor(unpack(cfg.color.inactive)) + garrisonText:SetTextColor(unpack(cfg.color.inactive)) + end +end + +local elapsed = 0 +teleportFrame:SetScript('OnUpdate', function(self, e) + elapsed = elapsed + e + if elapsed >= 1 then + updateTeleportText() + if garrOnHover then garrHover() end + if hsOnHover then hsHover() end + elapsed = 0 + end +end) + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("BAG_UPDATE") +eventframe:RegisterEvent("HEARTHSTONE_BOUND") +eventframe:RegisterEvent("MODIFIER_STATE_CHANGED") + +eventframe:SetScript("OnEvent", function(this, event, arg1, arg2, arg3, arg4, ...) +if InCombatLockdown() then return end + +HSText:SetText(strupper(GetBindLocation())) +HSFrame:SetSize(HSText:GetStringWidth()+16, 16) + + +if IsUsableItem(110560) then + garrisonFrame:Show() +else + garrisonFrame:Hide() +end + +if event == "MODIFIER_STATE_CHANGED" then + if arg1 == "LSHIFT" or arg1 == "RSHIFT" then + if arg2 == 1 then + if IsUsableItem(128353) then + garrisonText:SetText("SHIPYARD") + garrisonIcon:SetTexture(cfg.mediaFolder.."datatexts\\shipcomp") + end + elseif arg2 == 0 then + garrisonText:SetText("GARRISON") + garrisonIcon:SetTexture(cfg.mediaFolder.."datatexts\\garr") + end + end +end + garrisonFrame:SetSize(garrisonText:GetStringWidth()+16, 16) + teleportFrame:SetSize(HSFrame:GetWidth()+garrisonFrame:GetWidth()+8, 16) +end) \ No newline at end of file diff --git a/modules/micromenu.lua b/modules/micromenu.lua new file mode 100644 index 0000000..54f23ae --- /dev/null +++ b/modules/micromenu.lua @@ -0,0 +1,371 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.micromenu.show then return end +--------------------------------------------- +-- GAME MENU +--------------------------------------------- + +PlayerFrame.name:SetFont("Interface\\AddOns\\oUF_Drk\\media\\BigNoodleTitling.ttf", 11, "THINOUTLINE") +TargetFrame.name:SetFont("Interface\\AddOns\\oUF_Drk\\media\\BigNoodleTitling.ttf", 11, "THINOUTLINE") + +local isBeautiful = IsAddOnLoaded("Blizzard_RaidUI") --!Beautycase check + +if isBeautiful then + subframes.name:SetFont("Interface\\AddOns\\oUF_Drk\\media\\BigNoodleTitling.ttf",11,"THINOUTLINE") +end + + +local gameMenuFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +gameMenuFrame:SetSize(32, 32) +gameMenuFrame:SetPoint("LEFT",2,0) +gameMenuFrame:EnableMouse(true) +gameMenuFrame:RegisterForClicks("AnyUp") +local gameMenuIcon = gameMenuFrame:CreateTexture(nil,"OVERLAY",nil,7) +gameMenuIcon:SetPoint("CENTER") +gameMenuIcon:SetTexture(cfg.mediaFolder.."microbar\\menu") +gameMenuIcon:SetVertexColor(unpack(cfg.color.normal)) + +gameMenuFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + gameMenuIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +gameMenuFrame:SetScript("OnLeave", function() gameMenuIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +gameMenuFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleFrame(GameMenuFrame) + elseif button == "RightButton" then + if IsShiftKeyDown() then ReloadUI() + elseif IsAltKeyDown() then + if cfg.useConfig then + --if cfg.SXconfigFrame:IsShown() then + ToggleFrame(cfg.SXconfigFrame) + --else + --ToggleFrame(cfg.SXconfigFrame) + --end + end + else ToggleFrame(AddonList) end + end +end) + +--------------------------------------------- +-- CHARACTER FRAME +--------------------------------------------- + +local characterFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +characterFrame:SetSize(32, 32) +characterFrame:SetPoint("LEFT",174,0) +characterFrame:EnableMouse(true) +characterFrame:RegisterForClicks("AnyUp") +local characterFrameIcon = characterFrame:CreateTexture(nil,"OVERLAY",nil,7) +characterFrameIcon:SetAllPoints() +characterFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\char") +characterFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +characterFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + characterFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +characterFrame:SetScript("OnLeave", function() characterFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +characterFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleCharacter("PaperDollFrame") + end +end) + +--------------------------------------------- +-- SPELLS +--------------------------------------------- + +local spellFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +spellFrame:SetSize(32, 32) +spellFrame:SetPoint("LEFT",characterFrame,"RIGHT",4,0) +spellFrame:EnableMouse(true) +spellFrame:RegisterForClicks("AnyUp") +local spellFrameIcon = spellFrame:CreateTexture(nil,"OVERLAY",nil,7) +spellFrameIcon:SetSize(32,32) +spellFrameIcon:SetPoint("CENTER") +spellFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\spell") +spellFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +spellFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + spellFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +spellFrame:SetScript("OnLeave", function() spellFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +spellFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleFrame(SpellBookFrame) + end +end) + +--------------------------------------------- +-- TALENT +--------------------------------------------- + +local talentFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +talentFrame:SetSize(32, 32) +talentFrame:SetPoint("LEFT",spellFrame,"RIGHT",4,0) +talentFrame:EnableMouse(true) +talentFrame:RegisterForClicks("AnyUp") +local talentFrameIcon = talentFrame:CreateTexture(nil,"OVERLAY",nil,7) +talentFrameIcon:SetSize(32,32) +talentFrameIcon:SetPoint("CENTER") +talentFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\talent") +talentFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +talentFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + talentFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +talentFrame:SetScript("OnLeave", function() talentFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +talentFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + TalentMicroButton:Click() + end +end) + +--------------------------------------------- +-- ACHIV +--------------------------------------------- + +local achievementFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +achievementFrame:SetSize(32, 32) +achievementFrame:SetPoint("LEFT",talentFrame,"RIGHT",4,0) +achievementFrame:EnableMouse(true) +achievementFrame:RegisterForClicks("AnyUp") +local achievementFrameIcon = achievementFrame:CreateTexture(nil,"OVERLAY",nil,7) +achievementFrameIcon:SetSize(32,32) +achievementFrameIcon:SetPoint("CENTER") +achievementFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\ach") +achievementFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +achievementFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + achievementFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +achievementFrame:SetScript("OnLeave", function() achievementFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +achievementFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + securecall(ToggleAchievementFrame) + end +end) + +--------------------------------------------- +-- QUEST +--------------------------------------------- + +local questFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +questFrame:SetSize(32, 32) +questFrame:SetPoint("LEFT",achievementFrame,"RIGHT",4,0) +questFrame:EnableMouse(true) +questFrame:RegisterForClicks("AnyUp") +local questFrameIcon = questFrame:CreateTexture(nil,"OVERLAY",nil,7) +questFrameIcon:SetSize(32,32) +questFrameIcon:SetPoint("CENTER") +questFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\quest") +questFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +questFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + questFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +questFrame:SetScript("OnLeave", function() questFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +questFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + QuestLogMicroButton:Click() + end +end) + +--------------------------------------------- +-- LFG +--------------------------------------------- + +local lfgFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +lfgFrame:SetSize(32, 32) +lfgFrame:SetPoint("LEFT",questFrame,"RIGHT",4,0) +lfgFrame:EnableMouse(true) +lfgFrame:RegisterForClicks("AnyUp") +local lfgFrameIcon = lfgFrame:CreateTexture(nil,"OVERLAY",nil,7) +lfgFrameIcon:SetSize(32,32) +lfgFrameIcon:SetPoint("CENTER") +lfgFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\lfg") +lfgFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +lfgFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + lfgFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +lfgFrame:SetScript("OnLeave", function() lfgFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +lfgFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + securecall(PVEFrame_ToggleFrame, 'GroupFinderFrame') + end +end) + +--------------------------------------------- +-- ADVENTURE GUIDE +--------------------------------------------- + +local adventureFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +adventureFrame:SetSize(32, 32) +adventureFrame:SetPoint("LEFT",lfgFrame,"RIGHT",4,0) +adventureFrame:EnableMouse(true) +adventureFrame:RegisterForClicks("AnyUp") +local adventureFrameIcon = adventureFrame:CreateTexture(nil,"OVERLAY",nil,7) +adventureFrameIcon:SetSize(32,32) +adventureFrameIcon:SetPoint("CENTER") +adventureFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\journal") +adventureFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +adventureFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + adventureFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +adventureFrame:SetScript("OnLeave", function() adventureFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +adventureFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + EJMicroButton:Click() + end +end) + +--------------------------------------------- +-- PvP +--------------------------------------------- + +local pvpFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +pvpFrame:SetSize(32, 32) +pvpFrame:SetPoint("LEFT",adventureFrame,"RIGHT",4,0) +pvpFrame:EnableMouse(true) +pvpFrame:RegisterForClicks("AnyUp") +local pvpFrameIcon = pvpFrame:CreateTexture(nil,"OVERLAY",nil,7) +pvpFrameIcon:SetSize(32,32) +pvpFrameIcon:SetPoint("CENTER") +pvpFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\pvp") +pvpFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +pvpFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + pvpFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +pvpFrame:SetScript("OnLeave", function() pvpFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +pvpFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + securecall(PVEFrame_ToggleFrame, 'PVPUIFrame', HonorFrame) + end +end) + +--------------------------------------------- +-- MOUNTS +--------------------------------------------- + +local mountFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +mountFrame:SetSize(32, 32) +mountFrame:SetPoint("LEFT",pvpFrame,"RIGHT",4,0) +mountFrame:EnableMouse(true) +mountFrame:RegisterForClicks("AnyUp") +local mountFrameIcon = mountFrame:CreateTexture(nil,"OVERLAY",nil,7) +mountFrameIcon:SetSize(32,32) +mountFrameIcon:SetPoint("CENTER") +mountFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\pet") +mountFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +mountFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + mountFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +mountFrame:SetScript("OnLeave", function() mountFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +mountFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + securecall(ToggleCollectionsJournal, 1) + end +end) + +--------------------------------------------- +-- SHOP +--------------------------------------------- + +local shopFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +shopFrame:SetSize(32, 32) +shopFrame:SetPoint("LEFT",mountFrame,"RIGHT",4,0) +shopFrame:EnableMouse(true) +shopFrame:RegisterForClicks("AnyUp") +local shopFrameIcon = shopFrame:CreateTexture(nil,"OVERLAY",nil,7) +shopFrameIcon:SetSize(32,32) +shopFrameIcon:SetPoint("CENTER") +shopFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\shop") +shopFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +shopFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + shopFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +shopFrame:SetScript("OnLeave", function() shopFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +shopFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + StoreMicroButton:Click() + end +end) + +--------------------------------------------- +-- HELP +--------------------------------------------- + +local helpFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +helpFrame:SetSize(32, 32) +helpFrame:SetPoint("LEFT",shopFrame,"RIGHT",4,0) +helpFrame:EnableMouse(true) +helpFrame:RegisterForClicks("AnyUp") +local helpFrameIcon = helpFrame:CreateTexture(nil,"OVERLAY",nil,7) +helpFrameIcon:SetSize(32,32) +helpFrameIcon:SetPoint("CENTER") +helpFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\help") +helpFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +helpFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + helpFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +helpFrame:SetScript("OnLeave", function() helpFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +helpFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + securecall(ToggleHelpFrame) + end +end) \ No newline at end of file diff --git a/modules/social.lua b/modules/social.lua new file mode 100644 index 0000000..0f70414 --- /dev/null +++ b/modules/social.lua @@ -0,0 +1,272 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.micromenu.show then return end + +local chatFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +chatFrame:SetSize(32, 32) +chatFrame:SetPoint("LEFT",52,0) +chatFrame:EnableMouse(true) +chatFrame:RegisterForClicks("AnyUp") +local chatFrameIcon = chatFrame:CreateTexture(nil,"OVERLAY",nil,7) +chatFrameIcon:SetSize(32,32) +chatFrameIcon:SetPoint("CENTER") +chatFrameIcon:SetTexture(cfg.mediaFolder.."microbar\\chat") +chatFrameIcon:SetVertexColor(unpack(cfg.color.normal)) + +chatFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + chatFrameIcon:SetVertexColor(unpack(cfg.color.hover)) +end) + +chatFrame:SetScript("OnLeave", function() chatFrameIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +chatFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ChatMenu:SetScale(cfg.core.scale) + ChatMenu:ClearAllPoints() + if not ChatMenu:IsShown() then + if cfg.core.position == "BOTTOM" then + ChatMenu:SetPoint("BOTTOMLEFT", chatFrame, "TOPLEFT") + else + ChatMenu:SetPoint("TOPLEFT", chatFrame, "BOTTOMLEFT") + end + ChatFrameMenuButton:Click() + else ChatMenu:Hide() end + end +end) + + +local guildFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +guildFrame:SetSize(32, 32) +guildFrame:SetPoint("LEFT",chatFrame,36,0) +guildFrame:EnableMouse(true) +guildFrame:RegisterForClicks("AnyUp") + +local guildIcon = guildFrame:CreateTexture(nil,"OVERLAY",nil,7) +guildIcon:SetPoint("CENTER") +guildIcon:SetTexture(cfg.mediaFolder.."microbar\\guild") +guildIcon:SetVertexColor(unpack(cfg.color.normal)) + +local guildText = guildFrame:CreateFontString(nil, "OVERLAY") +guildText:SetFont(cfg.text.font, cfg.text.smallFontSize) +guildText:SetPoint("CENTER", guildFrame, "TOP") +if cfg.core.position ~= "BOTTOM" then + guildText:SetPoint("CENTER", guildFrame, "BOTTOM") +end + +local guildTextBG = guildFrame:CreateTexture(nil,"OVERLAY",nil,7) +guildTextBG:SetPoint("CENTER",guildText) +guildTextBG:SetColorTexture(unpack(cfg.color.barcolor)) + +guildFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + guildIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.micromenu.showTooltip then return end +if ( IsInGuild() ) then + GameTooltip:SetOwner(guildFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFGuild|r]") + GameTooltip:AddLine(" ") + -------------------------- + + guildList = {} + guildName, guildRank, _ = GetGuildInfo("player") + guildMotto = GetGuildRosterMOTD() + + GameTooltip:AddDoubleLine("Guild:", guildName, 1, 1, 0, 0, 1, 0) + for i = 0, select(1, GetNumGuildMembers()) do + local name, rank, rankIndex, level, class, zone, note, officernote, online, status, classFileName, achievementPoints, achievementRank, isMobile, canSoR = GetGuildRosterInfo(i) + if ( online ) then + if status == 0 then status = "" elseif status == 1 then status = "AFK" elseif status == 2 then status = "DND" end + local cCol = string.format("%02X%02X%02X", RAID_CLASS_COLORS[classFileName].r*255, RAID_CLASS_COLORS[classFileName].g*255, RAID_CLASS_COLORS[classFileName].b*255) + local lineL = string.format("%s |cff%s%s|r %s %s", level, cCol, name, status, note) + local lineR = string.format("%s|cffffffff %s", isMobile and "|cffffff00[M]|r " or "", zone or "") + GameTooltip:AddDoubleLine(lineL,lineR) + end + end +else + --GameTooltip:AddLine("No Guild") +end +GameTooltip:AddLine(" ") +if ( IsInGuild() ) then GameTooltip:AddDoubleLine("", "Open Guild Page", 1, 1, 0, 1, 1, 1) end +----------------------- +GameTooltip:Show() +end) + +guildFrame:SetScript("OnLeave", function() if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end guildIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +guildFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + if ( IsInGuild() ) then + ToggleGuildFrame() + GuildFrameTab2:Click() + else + print"|cff6699FFSXUI|r: You are not in a guild" + end + end +end) + +local friendFrame = CreateFrame("BUTTON",nil, cfg.SXframe) +friendFrame:SetSize(32, 32) +friendFrame:SetPoint("LEFT",guildFrame,36,0) +friendFrame:EnableMouse(true) +friendFrame:RegisterForClicks("AnyUp") + +local friendIcon = friendFrame:CreateTexture(nil,"OVERLAY",nil,7) +friendIcon:SetSize(32,32) +friendIcon:SetPoint("CENTER") +friendIcon:SetTexture(cfg.mediaFolder.."microbar\\social") +friendIcon:SetVertexColor(unpack(cfg.color.normal)) + +local friendText = guildFrame:CreateFontString(nil, "OVERLAY") +friendText:SetFont(cfg.text.font, cfg.text.smallFontSize) +friendText:SetPoint("CENTER", friendFrame, "TOP") +if cfg.core.position ~= "BOTTOM" then + friendText:SetPoint("CENTER", friendFrame, "BOTTOM") +end + +local friendTextBG = guildFrame:CreateTexture(nil,"OVERLAY",nil,7) +friendTextBG:SetColorTexture(unpack(cfg.color.barcolor)) + + +friendFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + friendIcon:SetVertexColor(unpack(cfg.color.hover)) + if not cfg.micromenu.showTooltip then return end + local totalBNet, numBNetOnline = BNGetNumFriends() + if numBNetOnline then + GameTooltip:SetOwner(friendFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFSocial|r]") + GameTooltip:AddLine(" ") + -------------------------- + local onlineBnetFriends = false + for j = 1, BNGetNumFriends() do + local BNid, BNname, battleTag, _, toonname, toonid, client, online, lastonline, isafk, isdnd, broadcast, note = BNGetFriendInfo(j) + if ( online ) then + + if (not battleTag) then battleTag = "[noTag]" end + local status = "" + + local statusIcon = "Interface\\FriendsFrame\\StatusIcon-Online.blp" + if ( isafk ) then + statusIcon = "Interface\\FriendsFrame\\StatusIcon-Away.blp" + status = "(AFK)" + end + if ( isdnd ) == "D3" then + statusIcon = "Interface\\FriendsFrame\\StatusIcon-DnD.blp" + status = "(DND)" + end + + local gameIcon = "Interface\\Icons\\INV_Misc_QuestionMark.blp" + if client == "App" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-Battleneticon.blp" + client = "Bnet" + elseif client == "D3" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-D3icon.blp" + client = "Diablo III" + elseif client == "Hero" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-HotSicon.blp" + client = "Hero of the Storm" + elseif client == "S2" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-Sc2icon.blp" + client = "Starcraft 2" + elseif client == "WoW" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-WoWicon.blp" + elseif client == "WTCG" then + gameIcon = "Interface\\FriendsFrame\\Battlenet-WTCGicon.blp" + client = "Heartstone" + end + if client == "WoW" then + toonname = ("(|cffecd672"..toonname.."|r)") + else + toonname = "" + end + + if not note then + note = "" + else + note = ("(|cffecd672"..note.."|r)") + end + + local lineL = string.format("|T%s:16|t|cff82c5ff %s|r %s",statusIcon, BNname, note) + local lineR = string.format("%s %s |T%s:16|t",toonname, client or "", gameIcon) + GameTooltip:AddDoubleLine(lineL,lineR) + onlineBnetFriends = true + end + end + +if onlineBnetFriends then GameTooltip:AddLine(" ") end + +local onlineFriends = false + for i = 1, GetNumFriends() do + local name, lvl, class, area, online, status, note = GetFriendInfo(i) + if ( online ) then + local status = "" + local statusIcon = "Interface\\FriendsFrame\\StatusIcon-Online.blp" + if ( isafk ) then + statusIcon = "Interface\\FriendsFrame\\StatusIcon-Away.blp" + status = "(AFK)" + end + if ( isdnd ) == "D3" then + statusIcon = "Interface\\FriendsFrame\\StatusIcon-DnD.blp" + status = "(DND)" + end + local lineL = string.format("|T%s:16|t %s, lvl:%s %s", statusIcon, name, lvl, class) + local lineR = string.format("%s", area or "") + GameTooltip:AddDoubleLine(lineL,lineR) + onlineFriends = true + end + end +if onlineFriends then GameTooltip:AddLine(" ") end +GameTooltip:AddDoubleLine("", "Open Friends List", 1, 1, 0, 1, 1, 1) +----------------------- +GameTooltip:Show() +end +end) + +friendFrame:SetScript("OnLeave", function() if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end friendIcon:SetVertexColor(unpack(cfg.color.normal)) end) + +friendFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleFriendsFrame() + end +end) + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") + +eventframe:RegisterEvent("FRIENDLIST_UPDATE") +eventframe:RegisterEvent("BN_FRIEND_ACCOUNT_ONLINE") +eventframe:RegisterEvent("BN_FRIEND_ACCOUNT_OFFLINE") + +eventframe:RegisterEvent("GUILD_ROSTER_UPDATE") +eventframe:RegisterEvent("GUILD_TRADESKILL_UPDATE") +eventframe:RegisterEvent("GUILD_MOTD") +eventframe:RegisterEvent("GUILD_NEWS_UPDATE") +eventframe:RegisterEvent("PLAYER_GUILD_UPDATE") + +eventframe:SetScript("OnEvent", function(self,event, ...) + local numOnline = "" + if IsInGuild() then + _, numOnline, _ = GetNumGuildMembers() + end + guildText:SetText(numOnline) + guildTextBG:SetSize(guildText:GetWidth()+4,guildText:GetHeight()+2) + guildTextBG:SetPoint("CENTER",guildText) + + local totalBNet, numBNetOnline = BNGetNumFriends() + friendText:SetText(numBNetOnline) + + if numBNetOnline == 0 then + friendText:SetText("") + else + + end + friendTextBG:SetSize(friendText:GetWidth()+4,friendText:GetHeight()+2) + friendTextBG:SetPoint("CENTER",friendText) + +end) \ No newline at end of file diff --git a/modules/system.lua b/modules/system.lua new file mode 100644 index 0000000..bec0ae8 --- /dev/null +++ b/modules/system.lua @@ -0,0 +1,223 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.system.show then return end + +local onHover = false + + local memformat = function(number) + if number > 1024 then + return string.format("%.2f|r mb", (number / 1024)) + else + return string.format("%.1f|r kb", floor(number)) + end + end + +local systemFrame = CreateFrame("Frame",nil, cfg.SXframe) +systemFrame:SetPoint("RIGHT", -290,0) +systemFrame:SetSize(120, 16) +--------------------------------------------------------------------- + +local addoncompare = function(a, b) + return a.memory > b.memory +end + + local function systemBarOnEnter() + if not cfg.system.showTooltip then return end + GameTooltip:SetOwner(systemFrame, cfg.tooltipPos) + GameTooltip:AddLine("[|cff6699FFPerformance|r]") + GameTooltip:AddLine(" ") + --------------------------------------------------- + local color = { r=1, g=1, b=0 } + local blizz = collectgarbage("count") + local addons = {} + local enry, memory + local total = 0 + local nr = 0 + local numberOfAddons = 0 + UpdateAddOnMemoryUsage() + if IsShiftKeyDown() then + GameTooltip:AddLine("Top "..cfg.system.addonListShift.." AddOns", 1,1,0) + else + GameTooltip:AddLine("Top "..cfg.system.addonList.." AddOns", 1,1,0) + end + GameTooltip:AddLine(" ") + for i=1, GetNumAddOns(), 1 do + if (GetAddOnMemoryUsage(i) > 0 ) then + memory = GetAddOnMemoryUsage(i) + entry = {name = GetAddOnInfo(i), memory = memory} + table.insert(addons, entry) + total = total + memory + end + end + table.sort(addons, addoncompare) + for _, entry in pairs(addons) do + if IsShiftKeyDown() then + numberOfAddons = cfg.system.addonListShift + else + numberOfAddons = cfg.system.addonList + end + if nr < numberOfAddons then + GameTooltip:AddDoubleLine(entry.name, memformat(entry.memory), 1, 1, 0, 1, 1, 1) + nr = nr+1 + end + end + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine("Total", memformat(total), 1,1,0, 1,1,0) + GameTooltip:AddDoubleLine("Total incl. Blizzard", memformat(blizz), 1,1,0, 1,1,0) + GameTooltip:AddLine(" ") + GameTooltip:AddDoubleLine("", "Force garbage collection", 1, 1, 0, 1, 1, 1) + if not IsShiftKeyDown() then + GameTooltip:AddDoubleLine("", "Show |cffffff00"..cfg.system.addonListShift.."|r addons", 1, 1, 0, 1, 1, 1) + end + ------------------------------------------- + GameTooltip:Show() +end + +local function systemBarOnLeave() + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end +end + +--------------------------------------------------------------------- + +local pingFrame = CreateFrame("BUTTON",nil, systemFrame) +pingFrame:SetPoint("CENTER") +pingFrame:SetSize(16, 16) +pingFrame:EnableMouse(true) +pingFrame:RegisterForClicks("AnyUp") + +local pingIcon = pingFrame:CreateTexture(nil,"OVERLAY",nil,7) +pingIcon:SetSize(16, 16) +pingIcon:SetPoint("CENTER") +pingIcon:SetTexture(cfg.mediaFolder.."datatexts\\ping") +pingIcon:SetVertexColor(unpack(cfg.color.normal)) + +local pingText = pingFrame:CreateFontString(nil, "OVERLAY") +pingText:SetFont(cfg.text.font, cfg.text.normalFontSize) +pingText:SetPoint("LEFT", pingIcon,"RIGHT",2,0) +pingText:SetTextColor(unpack(cfg.color.normal)) + +pingFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + pingIcon:SetVertexColor(unpack(cfg.color.hover)) + onHover = true + systemBarOnEnter() +end) + +pingFrame:SetScript("OnLeave", function() + pingIcon:SetVertexColor(unpack(cfg.color.normal)) + onHover = false + systemBarOnLeave() +end) + +pingFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + UpdateAddOnMemoryUsage() + local before = gcinfo() + collectgarbage() + UpdateAddOnMemoryUsage() + local after = gcinfo() + print("|cff6699FFSXUI|r: Cleaned: |cffffff00"..memformat(before-after)) + elseif button == "RightButton" then + ToggleFrame(VideoOptionsFrame) + end +end) +--------------------------------------------------------------------- +local fpsFrame = CreateFrame("BUTTON",nil, systemFrame) +fpsFrame:SetPoint("LEFT") +fpsFrame:SetSize(16, 16) +fpsFrame:EnableMouse(true) +fpsFrame:RegisterForClicks("AnyUp") + +local fpsIcon = fpsFrame:CreateTexture(nil,"OVERLAY",nil,7) +fpsIcon:SetSize(16, 16) +fpsIcon:SetPoint("LEFT") +fpsIcon:SetTexture(cfg.mediaFolder.."datatexts\\fps") +fpsIcon:SetVertexColor(unpack(cfg.color.normal)) + +local fpsText = fpsFrame:CreateFontString(nil, "OVERLAY") +fpsText:SetFont(cfg.text.font, cfg.text.normalFontSize) +fpsText:SetPoint("LEFT", fpsIcon,"RIGHT",2,0) +fpsText:SetTextColor(unpack(cfg.color.normal)) + +fpsFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + fpsIcon:SetVertexColor(unpack(cfg.color.hover)) + onHover = true + systemBarOnEnter() +end) + +fpsFrame:SetScript("OnLeave", function() + fpsIcon:SetVertexColor(unpack(cfg.color.normal)) + onHover = false + systemBarOnLeave() +end) + +fpsFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + UpdateAddOnMemoryUsage() + local before = gcinfo() + collectgarbage() + UpdateAddOnMemoryUsage() + local after = gcinfo() + print("|cff6699FFSXUI|r: Cleaned: |cffffff00"..memformat(before-after)) + elseif button == "RightButton" then + ToggleFrame(VideoOptionsFrame) + end +end) +--------------------------------------------------------------------- + +local function SXUImemory() +local t = 0 +UpdateAddOnMemoryUsage() +for i=1, GetNumAddOns(), 1 do + t = t + GetAddOnMemoryUsage(i) +end +return cfg.memformat(t) + +end + +local function updatePerformanceText() + local fps = floor(GetFramerate()) + local BWIn, BWOut, LCHome, LCWorld = GetNetStats() + pingText:SetText(LCHome.."ms") + pingFrame:SetSize(pingText:GetStringWidth()+18, 16) + fpsText:SetText(fps.."fps") + fpsFrame:SetSize(fpsText:GetStringWidth()+18, 16) + if onHover then + systemBarOnEnter() + end +end + +local elapsed = 0 +systemFrame:SetScript('OnUpdate', function(self, e) + elapsed = elapsed + e + if elapsed >= 1 then + updatePerformanceText() + elapsed = 0 + end +end) + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("MODIFIER_STATE_CHANGED") + +eventframe:SetScript("OnEvent", function(this, event, arg1, arg2, arg3, arg4, ...) + +if event == "MODIFIER_STATE_CHANGED" then + if InCombatLockdown() then return end + if arg1 == "LSHIFT" or arg1 == "RSHIFT" then + if arg2 == 1 then + if onHover then + systemBarOnEnter() + end + elseif arg2 == 0 then + if onHover then + systemBarOnEnter() + end + end + end + end +end) \ No newline at end of file diff --git a/modules/talent.lua b/modules/talent.lua new file mode 100644 index 0000000..8117c75 --- /dev/null +++ b/modules/talent.lua @@ -0,0 +1,228 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.talent.show then return end + +local currentSpec = 0 -- from 1-4 +local currentSpecID, currentSpecName = 0,0 --global id +local lootspecid = 0 +local id, name = 0,0 + +local talentFrame = CreateFrame("Frame",'SX_TalentFrame', cfg.SXframe) +talentFrame:SetPoint("RIGHT", cfg.SXframe, "CENTER", -110,0) +talentFrame:SetSize(16, 16) +--------------------------------------------- +-- LOOTSPEC FRAME +--------------------------------------------- +local lootSpecFrame = CreateFrame("BUTTON",'SX_LootSpecFrame', talentFrame) +if cfg.core.position ~= "BOTTOM" then + lootSpecFrame:SetPoint("TOP", talentFrame, "BOTTOM", 0,-6) +else + lootSpecFrame:SetPoint("BOTTOM", talentFrame, "TOP", 0,8) +end +lootSpecFrame:RegisterForClicks("AnyUp") +lootSpecFrame:Hide() +lootSpecFrame:EnableMouse(true) + +lootSpecFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "RightButton" then + lootSpecFrame:Hide() + end +end) + +local lootSpecText = lootSpecFrame:CreateFontString(nil, "OVERLAY") +lootSpecText:SetFont(cfg.text.font, cfg.text.normalFontSize) +lootSpecText:SetPoint("TOP") +lootSpecText:SetText("LOOT SPECIALIZATION") +lootSpecText:SetTextColor(unpack(cfg.color.normal)) + +local defaultLootTypeButton = CreateFrame("BUTTON",nil, lootSpecFrame) +defaultLootTypeButton:SetSize(lootSpecText:GetStringWidth(),cfg.text.normalFontSize) +defaultLootTypeButton:SetPoint("CENTER",lootSpecText) +defaultLootTypeButton:EnableMouse(true) +defaultLootTypeButton:RegisterForClicks("AnyUp") + +defaultLootTypeButton:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + if GetLootSpecialization() ~= 0 then + SetLootSpecialization(0) + print("|cffffff00Loot Specialization set to: Current Specialization") + lootSpecFrame:Hide() + end + elseif button == "RightButton" then + lootSpecFrame:Hide() + end +end) + +local lootSpectBG = lootSpecFrame:CreateTexture(nil,"OVERLAY",nil,7) +lootSpectBG:SetPoint("TOP") +lootSpectBG:SetColorTexture(unpack(cfg.color.barcolor)) +globalLootSpecFrame = lootSpecFrame + +--------------------------------------------- +-- PRIMARY SPEC FRAME +--------------------------------------------- + +local primarySpecFrame = CreateFrame("BUTTON",nil, talentFrame) +primarySpecFrame:SetPoint("RIGHT") +primarySpecFrame:SetSize(16, 16) +primarySpecFrame:EnableMouse(true) +primarySpecFrame:RegisterForClicks("AnyUp") + +local primarySpecText = primarySpecFrame:CreateFontString(nil, "OVERLAY") +primarySpecText:SetFont(cfg.text.font, cfg.text.normalFontSize) +primarySpecText:SetPoint("RIGHT") +primarySpecText:SetTextColor(unpack(cfg.color.normal)) + +local primarySpecIcon = primarySpecFrame:CreateTexture(nil,"OVERLAY",nil,7) +primarySpecIcon:SetSize(16, 16) +primarySpecIcon:SetPoint("RIGHT", primarySpecText,"LEFT",-2,0) +primarySpecIcon:SetVertexColor(unpack(cfg.color.normal)) + +primarySpecFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + GameTooltip:SetOwner(talentFrame, cfg.tooltipPos) + currentSpec = GetSpecialization() + currentSpecID, currentSpecName = GetSpecializationInfo(currentSpec) + lootspecid = GetLootSpecialization() + if lootspecid == 0 then lootspecid = currentSpecID end + id, name = GetSpecializationInfoByID(lootspecid) + if currentSpecID ~= id then + GameTooltip:AddLine("|cffffffffLoot is currently set to |cffffff00"..name.."|cffffffff spec") + GameTooltip:AddDoubleLine("", "Change lootspec", 1, 1, 0, 1, 1, 1) + end + primarySpecIcon:SetVertexColor(unpack(cfg.color.hover)) + GameTooltip:Show() +end) + +primarySpecFrame:SetScript("OnLeave", function() + if GetActiveSpecGroup() == 1 then + primarySpecIcon:SetVertexColor(unpack(cfg.color.normal)) + else + primarySpecIcon:SetVertexColor(unpack(cfg.color.inactive)) + end + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end +end) + +primarySpecFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + ToggleTalentFrame(1) + elseif button == "RightButton" then + if globalLootSpecFrame:IsShown() then + globalLootSpecFrame:Hide() + else + globalLootSpecFrame:Show() + end + end +end) +--------------------------------------------------------------------- + +local function createLootSpecButtons() +for index = 1,4 do + local id, name = GetSpecializationInfo(index) + if ( name ) then + lootSpecFrame:SetSize(lootSpecText:GetStringWidth()+16, (index+1)*18) + lootSpectBG:SetSize(lootSpecFrame:GetSize()) + currentSpecID, currentSpecName = GetSpecializationInfo(index) + + local lootSpecButton = CreateFrame("BUTTON",nil, lootSpecFrame) + lootSpecButton:SetPoint("TOPLEFT", lootSpecText, 0, index*-18) + lootSpecButton:SetSize(16, 16) + lootSpecButton:EnableMouse(true) + lootSpecButton:RegisterForClicks("AnyUp") + + + local lootSpecbuttonText = lootSpecButton:CreateFontString(nil, "OVERLAY") + lootSpecbuttonText:SetFont(cfg.text.font, cfg.text.smallFontSize) + lootSpecbuttonText:SetPoint("RIGHT") + if currentSpecName then currentSpecName = string.upper(currentSpecName) end + lootSpecbuttonText:SetText(currentSpecName) + + local lootSpecbuttonIcon = lootSpecButton:CreateTexture(nil,"OVERLAY",nil,7) + lootSpecbuttonIcon:SetSize(16, 16) + lootSpecbuttonIcon:SetPoint("LEFT") + lootSpecbuttonIcon:SetTexture(cfg.mediaFolder.."spec\\"..cfg.CLASS) + lootSpecbuttonIcon:SetTexCoord(unpack(cfg.specCoords[index])) + + local id = GetSpecializationInfo(index) + if GetLootSpecialization() == id then + lootSpecbuttonText:SetTextColor(unpack(cfg.color.normal)) + lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.normal)) + else + lootSpecbuttonText:SetTextColor(unpack(cfg.color.inactive)) + lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.inactive)) + end + lootSpecButton:SetSize(lootSpecbuttonText:GetStringWidth()+18,16) + + lootSpecButton:SetScript("OnEnter", function() if InCombatLockdown() then return end lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.hover)) end) + lootSpecButton:SetScript("OnLeave", function() + local id = GetSpecializationInfo(index) + if GetLootSpecialization() == id then + lootSpecbuttonText:SetTextColor(unpack(cfg.color.normal)) + lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.normal)) + else + lootSpecbuttonText:SetTextColor(unpack(cfg.color.inactive)) + lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.inactive)) + end + end) + + lootSpecButton:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + local id = GetSpecializationInfo(index) + SetLootSpecialization(id) + lootSpecbuttonText:SetTextColor(unpack(cfg.color.normal)) + lootSpecbuttonIcon:SetVertexColor(unpack(cfg.color.normal)) + lootSpecFrame:Hide() + elseif button == "RightButton" then + lootSpecFrame:Hide() + end + end) + end +end +end + +--------------------------------------------- +-- EVENTS +--------------------------------------------- + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED") +eventframe:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED") +eventframe:RegisterEvent("PLAYER_LOOT_SPEC_UPDATED") +eventframe:RegisterEvent("PLAYER_REGEN_DISABLED") + +eventframe:SetScript("OnEvent", function(self,event, ...) + if event == ("PLAYER_ENTERING_WORLD") then + createLootSpecButtons() + end + if event == ("PLAYER_REGEN_DISABLED") then + if lootSpecFrame:IsShown() then + lootSpecFrame:Hide() + end + end + + local primarySpec = GetSpecialization(false, false, 1) + if primarySpec ~= nil then + local id, name = GetSpecializationInfo(primarySpec) + if name then name = string.upper(name) end + --name = string.upper(name) + primarySpecText:SetText(name) + primarySpecIcon:SetTexture(cfg.mediaFolder.."spec\\"..cfg.CLASS) + primarySpecIcon:SetTexCoord(unpack(cfg.specCoords[primarySpec])) + primarySpecFrame:SetSize(primarySpecText:GetStringWidth()+18, 16) + primarySpecFrame:Show() + primarySpecFrame:EnableMouse(true) + else + primarySpecFrame:Hide() + primarySpecFrame:EnableMouse(false) + end + primarySpecIcon:SetVertexColor(unpack(cfg.color.normal)) + primarySpecText:SetTextColor(unpack(cfg.color.normal)) + talentFrame:SetSize((primarySpecFrame:GetWidth()), 16) +end) diff --git a/modules/tradeskill.lua b/modules/tradeskill.lua new file mode 100644 index 0000000..4852711 --- /dev/null +++ b/modules/tradeskill.lua @@ -0,0 +1,274 @@ +local addon, ns = ... +local cfg = ns.cfg +local unpack = unpack +-------------------------------------------------------------- +if not cfg.tradeSkill.show then return end + +local proffessions = { + ['ALCHEMY'] = {"Alchemical Catalyst", "Secrets of Draenor Alchemy", "Northrend Alchemy Research"}, + ['BLACKSMITHING'] = {"Truesteel Ignot", "Secrets of Draenor Blacksmithing"}, + ['ENCHANTING'] = {"Temporal Crystal", "Secrets of Draenor Enchanting"}, + ['ENGINEERING'] = {"Gearsoring Parts", "Secrets of Draenor Engineering"}, + ['INSCRIPTION'] = {"War Paints", "Secrets of Draenor Inscription","Draenor Merchant Order"}, + ['JEWELCRAFTING'] = {"Taladite Crystal", "Secrets of Draenor Jewelcrafting"}, + ['LEATHERWORKING'] = {"Burnished Leather", "Secrets of Draenor Leatherworking"}, + ['TAILORING'] = {"Hexweave Cloth", "Secrets of Draenor Tailoring"}, +} + +local prof1OnCooldown = false +local prof2OnCooldown = false + +local tradeSkillFrame = CreateFrame("Frame",nil, cfg.SXframe) +tradeSkillFrame:SetPoint("LEFT", cfg.SXframe, "CENTER", 110,0) +tradeSkillFrame:SetSize(16, 16) +--------------------------------------------------------------------- +local primaryTradeSkillFrame = CreateFrame("BUTTON",nil, tradeSkillFrame) +primaryTradeSkillFrame:SetSize(16, 16) +primaryTradeSkillFrame:SetPoint("LEFT") +primaryTradeSkillFrame:EnableMouse(true) +primaryTradeSkillFrame:RegisterForClicks("AnyUp") + +local primaryTradeSkillIcon = primaryTradeSkillFrame:CreateTexture(nil,"OVERLAY",nil,7) +primaryTradeSkillIcon:SetSize(16, 16) +primaryTradeSkillIcon:SetPoint("LEFT") +primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + +local primaryTradeSkillText = primaryTradeSkillFrame:CreateFontString(nil, "OVERLAY") +primaryTradeSkillText:SetFont(cfg.text.font, cfg.text.normalFontSize) +primaryTradeSkillText:SetPoint("RIGHT",primaryTradeSkillFrame,2,0 ) +primaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + +local primaryTradeSkillStatusbar = CreateFrame("StatusBar", nil, primaryTradeSkillFrame) +primaryTradeSkillStatusbar:SetStatusBarTexture(1,1,1) +primaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) +primaryTradeSkillStatusbar:SetPoint("TOPLEFT", primaryTradeSkillText, "BOTTOMLEFT",0,-2) + +local primaryTradeSkillStatusbarBG = primaryTradeSkillStatusbar:CreateTexture(nil,"BACKGROUND",nil,7) +primaryTradeSkillStatusbarBG:SetPoint("TOPLEFT", primaryTradeSkillText, "BOTTOMLEFT",0,-2) +primaryTradeSkillStatusbarBG:SetColorTexture(unpack(cfg.color.inactive)) + +primaryTradeSkillFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.hover)) + primaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.hover)) + if not cfg.tradeSkill.showTooltip then return end + GameTooltip:SetOwner(tradeSkillFrame, cfg.tooltipPos) + addCooldownsToTooltip() + GameTooltip:Show() +end) + +primaryTradeSkillFrame:SetScript("OnLeave", function() + if prof1OnCooldown then + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.inactive)) + primaryTradeSkillText:SetTextColor(unpack(cfg.color.inactive)) + else + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + primaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + end + primaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end +end) + +primaryTradeSkillFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + local prof1, prof2 = GetProfessions() + if prof1 then + if (GetProfessionInfo(prof1) == ('Herbalism')) then + ToggleSpellBook(BOOKTYPE_PROFESSION) + elseif(GetProfessionInfo(prof1) == ('Skinning')) then + ToggleSpellBook(BOOKTYPE_PROFESSION) + elseif(GetProfessionInfo(prof1) == ('Mining')) then + CastSpellByName("Smelting") + else + CastSpellByName((GetProfessionInfo(prof1))) + end + end + elseif button == "RightButton" then + ToggleSpellBook(BOOKTYPE_PROFESSION) + end +end) +--------------------------------------------------------------------- +local secondaryTradeSkillFrame = CreateFrame("BUTTON",nil, tradeSkillFrame) +secondaryTradeSkillFrame:SetPoint("RIGHT") +secondaryTradeSkillFrame:SetSize(16, 16) +secondaryTradeSkillFrame:EnableMouse(true) +secondaryTradeSkillFrame:RegisterForClicks("AnyUp") + +local secondaryTradeSkillIcon = secondaryTradeSkillFrame:CreateTexture(nil,"OVERLAY",nil,7) +secondaryTradeSkillIcon:SetSize(16, 16) +secondaryTradeSkillIcon:SetPoint("LEFT") +secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + +local secondaryTradeSkillText = secondaryTradeSkillFrame:CreateFontString(nil, "OVERLAY") +secondaryTradeSkillText:SetFont(cfg.text.font, cfg.text.normalFontSize) +secondaryTradeSkillText:SetPoint("LEFT", secondaryTradeSkillIcon,"RIGHT",2,0) +secondaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + +local secondaryTradeSkillStatusbar = CreateFrame("StatusBar", nil, secondaryTradeSkillFrame) +secondaryTradeSkillStatusbar:SetStatusBarTexture(1,1,1) +secondaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) +secondaryTradeSkillStatusbar:SetPoint("TOPLEFT", secondaryTradeSkillText, "BOTTOMLEFT",0,-2) + +local secondaryTradeSkillStatusbarBG = secondaryTradeSkillStatusbar:CreateTexture(nil,"BACKGROUND",nil,7) +secondaryTradeSkillStatusbarBG:SetPoint("TOPLEFT", secondaryTradeSkillText, "BOTTOMLEFT",0,-2) +secondaryTradeSkillStatusbarBG:SetColorTexture(unpack(cfg.color.inactive)) + +secondaryTradeSkillFrame:SetScript("OnEnter", function() + if InCombatLockdown() then return end + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.hover)) + secondaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.hover)) + if not cfg.tradeSkill.showTooltip then return end + GameTooltip:SetOwner(tradeSkillFrame, cfg.tooltipPos) + addCooldownsToTooltip() + GameTooltip:Show() +end) + +secondaryTradeSkillFrame:SetScript("OnLeave", function() + if prof2OnCooldown then + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.inactive)) + secondaryTradeSkillText:SetTextColor(unpack(cfg.color.inactive)) + else + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + secondaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + end + secondaryTradeSkillStatusbar:SetStatusBarColor(unpack(cfg.color.normal)) + if ( GameTooltip:IsShown() ) then GameTooltip:Hide() end +end) + +secondaryTradeSkillFrame:SetScript("OnClick", function(self, button, down) + if InCombatLockdown() then return end + if button == "LeftButton" then + local prof1, prof2 = GetProfessions() + if prof2 then + if (GetProfessionInfo(prof2) == ('Herbalism')) then + ToggleSpellBook(BOOKTYPE_PROFESSION) + elseif(GetProfessionInfo(prof2) == ('Skinning')) then + ToggleSpellBook(BOOKTYPE_PROFESSION) + elseif(GetProfessionInfo(prof2) == ('Mining')) then + CastSpellByName("Smelting") + else + CastSpellByName((GetProfessionInfo(prof2))) + end + end + elseif button == "RightButton" then + ToggleSpellBook(BOOKTYPE_PROFESSION) + end +end) +--------------------------------------------------------------------- + +local eventframe = CreateFrame("Frame") +eventframe:RegisterEvent("PLAYER_ENTERING_WORLD") +eventframe:RegisterEvent("TRADE_SKILL_UPDATE") +eventframe:RegisterEvent("TRAINER_CLOSED") +eventframe:RegisterEvent("SPELLS_CHANGED") +eventframe:RegisterUnitEvent("UNIT_SPELLCAST_STOP", "player") + +eventframe:SetScript("OnEvent", function(self,event, ...) + local prof1, prof2 = GetProfessions() + if prof1 then + local prof1Name, _, prof1Rank, prof1MaxRank = GetProfessionInfo(prof1) + prof1Name = string.upper(prof1Name) + primaryTradeSkillText:SetText(prof1Name) + primaryTradeSkillIcon:SetTexture(cfg.mediaFolder.."profession\\"..prof1Name) + if prof1Rank == prof1MaxRank then + primaryTradeSkillStatusbar:Hide() + else + primaryTradeSkillStatusbar:Show() + end + primaryTradeSkillStatusbar:SetMinMaxValues(0, prof1MaxRank) + primaryTradeSkillStatusbar:SetValue(prof1Rank) + primaryTradeSkillFrame:SetSize(primaryTradeSkillText:GetStringWidth()+18, 16) + primaryTradeSkillStatusbar:SetSize(primaryTradeSkillText:GetStringWidth(),3) + primaryTradeSkillStatusbarBG:SetSize(primaryTradeSkillText:GetStringWidth(),3) + primaryTradeSkillFrame:Show() + primaryTradeSkillFrame:EnableMouse(true) + + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + primaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + + --[[for i=1,GetNumTradeSkills() do + local cooldown = GetTradeSkillCooldown(i) + if cooldown then + local name = GetTradeSkillInfo(i) + for k, v in pairs(proffessions) do + for u = 1, #v do + if k == prof1Name then + if v[u] == name then + if not prof1OnCooldown then prof1OnCooldown = true end + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.inactive)) + primaryTradeSkillText:SetTextColor(unpack(cfg.color.inactive)) + if not prof1OnCooldown then + primaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + primaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + end + end + end + end + end + end + end]]-- + else + primaryTradeSkillFrame:Hide() + primaryTradeSkillFrame:EnableMouse(false) + end + + if prof2 then + local prof2Name, _, prof2rank, prof2maxRank = GetProfessionInfo(prof2) + prof2Name = string.upper(prof2Name) + secondaryTradeSkillText:SetText(prof2Name) + secondaryTradeSkillIcon:SetTexture(cfg.mediaFolder.."profession\\"..prof2Name) + if prof2rank == prof2maxRank then + secondaryTradeSkillStatusbar:Hide() + else + secondaryTradeSkillStatusbar:Show() + end + secondaryTradeSkillStatusbar:SetMinMaxValues(0, prof2maxRank) + secondaryTradeSkillStatusbar:SetValue(prof2rank) + secondaryTradeSkillFrame:SetSize(secondaryTradeSkillText:GetStringWidth()+18, 16) + secondaryTradeSkillStatusbar:SetSize(secondaryTradeSkillText:GetStringWidth(),3) + secondaryTradeSkillStatusbarBG:SetSize(secondaryTradeSkillText:GetStringWidth(),3) + secondaryTradeSkillFrame:Show() + secondaryTradeSkillFrame:EnableMouse(true) + + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + secondaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + + --[[for i=1,GetNumTradeSkills() do + local cooldown = GetTradeSkillCooldown(i) + if cooldown then + local name = GetTradeSkillInfo(i) + for k, v in pairs(proffessions) do + for u = 1, #v do + if k == prof2Name then + if v[u] == name then + if not prof2OnCooldown then prof2OnCooldown = true end + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.inactive)) + secondaryTradeSkillText:SetTextColor(unpack(cfg.color.inactive)) + if not prof2OnCooldown then + secondaryTradeSkillIcon:SetVertexColor(unpack(cfg.color.normal)) + secondaryTradeSkillText:SetTextColor(unpack(cfg.color.normal)) + end + end + end + end + end + end + end]]-- + else + secondaryTradeSkillFrame:Hide() + secondaryTradeSkillFrame:EnableMouse(false) + end + tradeSkillFrame:SetSize((primaryTradeSkillFrame:GetWidth())+(secondaryTradeSkillFrame:GetWidth()+4), 16) +end) + + +function addCooldownsToTooltip() + for i,v in pairs(C_TradeSkillUI.GetFilteredRecipeIDs()) do + local _, cooldown, secondsToCooldown, dunno = C_TradeSkillUI.GetRecipeCooldown(v) + if cooldown then + local name = C_TradeSkillUI.GetRecipeInfo(v).name + GameTooltip:AddDoubleLine(name, SecondsToTime(secondsToCooldown), 1, 1, 0, 1, 1, 1) + end + end +end diff --git a/settings.lua b/settings.lua new file mode 100644 index 0000000..07976aa --- /dev/null +++ b/settings.lua @@ -0,0 +1,314 @@ +----------------------------------------------------------------- +-- CONFIGURATION FILE DO NOT TOUCH ANYTHING BELLOW HERE +----------------------------------------------------------------- +local addon, ns = ... +local cfg = {} +ns.cfg = cfg + + +cfg.NAME = UnitName("player") +cfg.CLASS = select(2, UnitClass("player")) +cfg.cc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[cfg.CLASS] --CLASS COLOR + +--media path +cfg.mediaFolder = "Interface\\AddOns\\"..addon.."\\media\\" + +--------------------------------------------- +-- DO NOT TOUCH ANYTHING ABOVE HERE +--------------------------------------------- + +cfg.color = { + normal = {1,1,1,.75}, -- SETS THE SAME COLOR FOR THE TEXT + inactive = {1,1,1,.25}, -- SET THE COLOR FOR THE INACTICE ICONS + hover = {cfg.cc.r,cfg.cc.g,cfg.cc.b,.75}, -- DOES NOT CHANGE THE TEXTCOLOR + barcolor = {.094,.094,.094,.75}, -- THE COLOR OF THE BAR + --barcolor = {.05,.05,.05,0}, -- THE COLOR OF THE BAR +} +if cfg.CLASS == "PRIEST" then cfg.color.hover = {.5,.5,0,.75} end -- ADDED BEACUSE NORMALY THE PRIEST COLOR IS THE SAME AS THE NORMAL COLOR + +cfg.text = { + font = cfg.mediaFolder.."homizio_bold.ttf", -- SETS THE FONT + normalFontSize = 12, -- SET THE SIZE OF THE TEXTS + smallFontSize = 11, -- SETS THE SIZE OF THE SMALLER TEXTS +} + +cfg.core = { + height = 35, + position = "BOTTOM", -- THE POSITION OF THE BAR USE "BOTTOM" OR "TOP" + scale = 0.83, -- SCALE BAR TO GET ROOM FOR ALL THE ICONS AND TEXT + strata = "HIGH", -- AT WHAT STRATA THE BAR SHOULD BE AT +} + +cfg.micromenu = { + show = true, -- USES THIS MODULE + showTooltip = true, -- ADDS TOOLTIPS FOR THE SOSIAL FRAMES +} + +cfg.armor = { + show = true, -- USES THIS MODULE + minArmor = 20, -- WHEN THE ANVIL GOES FROM INACTIVE TO ACTIVE + maxArmor = 75, -- AT WHAT % IT WILL SHOW ARMORTEXT INSTEAD OF ILVL +} + +cfg.talent = { + show = true, -- USES THIS MODULE +} + +cfg.clock = { + show = true, -- USES THIS MODULE + showTooltip = true, -- SHOWS SOME INFO AND REALMTIME OR LOCAL TIME +} + +cfg.tradeSkill = { + show = true, -- USES THIS MODULE + showTooltip = true, -- SHOW WHAT TRADESKILLS THAT ARE ON COOLDOWN +} + +cfg.currency = { + show = true, -- USES THIS MODULE + showXPbar = true, -- SHOW A XP-BAR ON YOUR CHARACTERS THAT HAS NOT REACHED MAX LVL + showTooltip = true, -- SHOWS YOUR RECOURCES ACCORING TO THE DESCRIPTION OR YOUR XP INFO +} + +cfg.system = { + show = true, -- USES THIS MODULE + showTooltip = true, -- SHOWS A LIST OF ADDONS AND HOW MUCH SYSTEM THEY USE + addonList = 10, -- SHOW HOW MANY ADDONS TO SHOW ON HOVER + addonListShift = 25, -- SHOW HOW MANY ADDONS TO SHOW ON HOVER WHILE SHIFT IS DOWN +} + +cfg.gold = { + showTooltip = true, -- SHOWS THE GOLD OF YOUR OTHER CHARACTERS ON THE SAME SERVER AND SAME SIDE + show = true, -- USES THIS MODULE + firstWeekday = 2, -- 1 is Sunday, 2 is Monday, different countries have different first day of the week +} + +cfg.heartstone = { + show = true, -- USES THIS MODULE + showTooltip = true, -- SHOWS THE COOLDOWN ON MOUSEOVER +} + +cfg.useConfig = false -- !! DO NOT TOUCH !! +--------------------------------------------- +-- DO NOT TOUCH ANYTHING BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING !! +--------------------------------------------- +-- CREATE THE CORE FRAME +--------------------------------------------- + +local unpack = unpack +local SX_bottombar = CreateFrame("Frame","SX_bottombar", UIParent) +SX_bottombar:SetSize(0, cfg.core.height) +SX_bottombar:SetScale(cfg.core.scale) +SX_bottombar:SetFrameStrata(cfg.core.strata) + +SX_bottombar:SetPoint(cfg.core.position) +SX_bottombar:SetPoint("LEFT") +SX_bottombar:SetPoint("RIGHT") + +cfg.SXframe = SX_bottombar + +local coreTexture = SX_bottombar:CreateTexture(nil,"BACKGROUND",nil,-8) +coreTexture:SetAllPoints() +coreTexture:SetColorTexture(unpack(cfg.color.barcolor)) + +cfg.tooltipPos = "ANCHOR_TOP" +if cfg.core.position ~= "BOTTOM" then + cfg.tooltipPos = "ANCHOR_BOTTOM",0,-20 +end + + +local SX_databarConfig = CreateFrame("Frame",nil, UIParent) + +SX_databarConfig:SetPoint("CENTER") +--SX_databarConfig:Hide() + +cfg.SXconfigFrame = nil +if cfg.useConfig then + cfg.SXconfigFrame = SX_databarConfig +end + +local eventframe = CreateFrame("Frame",nil, UIParent) +eventframe:RegisterEvent("PET_BATTLE_OPENING_START") +eventframe:RegisterEvent("PET_BATTLE_CLOSE") +eventframe:SetScript("OnEvent", function(self,event, ...) + if (event == "PET_BATTLE_OPENING_START") then + SX_bottombar:Hide() + elseif (event == "PET_BATTLE_CLOSE") then + SX_bottombar:Show() + end +end) +--------------------------------------------- +-- SAVED VARIABLES TABLE +--------------------------------------------- + +-- copies missing fields from source table +function CopyTable(src, dest) + if type(dest) ~= "table" then + dest = {} + end + + for k, v in pairs(src) do + if type(v) == "table" then + dest[k] = CopyTable(v, dest[k]) + elseif type(v) ~= type(dest[k]) then + dest[k] = v + end + end + + return dest +end + +-- removes everything that is present in source table from another table +function DiffTable(src, dest) + if type(dest) ~= "table" then + return {} + end + + if type(src) ~= "table" then + return dest + end + + for k, v in pairs(dest) do + if type(v) == "table" then + if not next(DiffTable(src[k], v)) then + dest[k] = nil + end + elseif v == src[k] then + dest[k] = nil + end + end + + return dest +end + +local function ConvertDateToNumber(month, day, year) + month = gsub(month, "(%d)(%d?)", function(d1, d2) return d2 == "" and "0"..d1 or d1..d2 end) -- converts M to MM + day = gsub(day, "(%d)(%d?)", function(d1, d2) return d2 == "" and "0"..d1 or d1..d2 end) -- converts D to DD + + return tonumber(year..month..day) +end + +-------------- +-- DEFAULTS -- +-------------- + +local D = { + ["money_related_stuff"] = {} +} + +----------- +-- STUFF -- +----------- + +local function Controller_OnEvent(self, event, arg) + if event == "ADDON_LOADED" and arg == addon then -- "test" is addon name +local CONFIG = CopyTable(D, TEST_CONFIG) +ns.CONFIG = CONFIG -- makes this table available throughout addon + +local playerName, playerFaction, playerRealm = UnitName("player"), UnitFactionGroup("player"), GetRealmName() + +if not CONFIG["money_related_stuff"][playerRealm] then + CONFIG["money_related_stuff"][playerRealm] = {} -- creates a table if it doesn't exist +end + +local realmData = CONFIG["money_related_stuff"][playerRealm] -- just an alias +ns.realmData = realmData + +if not realmData[playerFaction] then + realmData[playerFaction] = {} -- creates a table if it doesn't exist +end + +local factionData = realmData[playerFaction] +ns.factionData = factionData + +if not factionData[playerName] then + factionData[playerName] = {} -- creates a table if it doesn't exist +end + +ns.playerData = factionData[playerName] + +self:UnregisterEvent("ADDON_LOADED") + elseif event == "PLAYER_LOGIN" then + local playerData = ns.playerData + + if not playerData["CLASS"] then + playerData["CLASS"] = cfg.CLASS + end + + local weekday, month, day, year = CalendarGetDate() + local today = ConvertDateToNumber(month, day, year) + local updateData + + if playerData.lastLoginDate then + if playerData.lastLoginDate < today then -- is true, if last time player logged in was the day before or even earlier + playerData.lastLoginDate = today + updateData = true + end + else + playerData.lastLoginDate = today + updateData = true + end + + if updateData then -- daily updates + if playerData["money_on_first_weekday"] then + if weekday == cfg.gold.firstWeekday then -- 1 is Sunday, 2 is Monday, different countries have different first day of the week + playerData["money_on_first_weekday"] = GetMoney() + end + else + playerData["money_on_first_weekday"] = GetMoney() + end + + playerData["money_on_first_login_today"] = GetMoney() + end + + playerData["money_on_session_start"] = GetMoney() -- this one resets on every single login or UI reload + + self:UnregisterEvent("PLAYER_LOGIN") + elseif event == "PLAYER_LOGOUT" then + TEST_CONFIG = DiffTable(D, ns.CONFIG) -- writes data into TEST_CONFIG table + end +end + +local Controller = CreateFrame("Frame") +Controller:RegisterEvent("ADDON_LOADED") +Controller:RegisterEvent("PLAYER_LOGIN") +Controller:RegisterEvent("PLAYER_LOGOUT") +Controller:SetScript("OnEvent", Controller_OnEvent) + +--------------------------------------------- +-- SHORTENER FUNCTIONS +--------------------------------------------- +cfg.specCoords = { +-- index left right top bottom + [ 1] = { 0.00, 0.25, 0.00, 1 }, + [ 2] = { 0.25, 0.50, 0.00, 1 }, + [ 3] = { 0.50, 0.75, 0.00, 1 }, + [ 4] = { 0.75, 1.00, 0.00, 1 }, +} + +cfg.SVal = function(val) + if val > 1E10 then + return (floor(val/1E9)).."b" + elseif val > 1E9 then + return (floor((val/1E9)*10)/10).."b" + elseif val > 1E7 then + return (floor(val/1E6)).."m" + elseif val > 1E6 then + return (floor((val/1E6)*10)/10).."m" + elseif val > 1E4 then + return (floor(val/1E3)).."k" + elseif val >= 1E3 then + return (floor(val/1E3)) .. (" %03d"):format(val % 1E3) + else + return val + end +end + +function cfg.hex(r, g, b) + if r then + if (type(r) == "table") then + if(r.r) then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end + end + return ("|cff%02x%02x%02x"):format(r * 255, g * 255, b * 255) + end +end -- 1.7.9.5