Compare commits

...

343 Commits

Author SHA1 Message Date
1cf5f3df25 Merge branch 'release/v2.11-Release' into main 2022-03-27 21:05:07 +02:00
13a26d82c6 bump version + readme changelog 2022-03-27 21:04:47 +02:00
c408448aad health bar options update 2022-03-27 20:57:53 +02:00
c576adec2f test data updated 2022-03-27 20:53:52 +02:00
b8e75b6804 - health bar new option classcolored / customcolor / custom currentvalue gradient option added
- move stealth from rangecheck to healthbar
- custom stealth color added
- powerbar fix eventhandling
2022-03-27 20:53:28 +02:00
eaf7c6a517 remove Test from ClassIcon 2022-03-27 20:51:28 +02:00
764c8a971b fix poison/disease cleansing pulse timer 2022-03-27 20:51:07 +02:00
dbaaccd3ec fix cooldowns out of stealth 2022-03-27 20:49:02 +02:00
02e9b2e41a add diminish group option 2022-03-27 18:51:04 +02:00
96c42b1522 fix totempulse bar background not showing 2022-03-27 18:50:46 +02:00
29c3a7596c - fix cooldowns not showing when spec detected
- fix nature's swiftness cd starts when buff fades (shaman + druid)
- change order (always detect spec before cd usage)
2022-03-27 18:50:02 +02:00
f1fde07e6c optional dependencies nameplate addons added 2022-03-26 18:22:42 +01:00
73a54b4489 detect spec before CD used 2022-03-26 18:22:21 +01:00
6f50bc96ef Healthbar show nametext when custom tags enabled 2022-03-26 18:21:58 +01:00
9afc359b57 intercept cd adjusted 2022-03-26 02:07:11 +01:00
f673850eb0 Merge tag 'v2.1-Release-new' into develop
v2.10-Release
2022-03-26 00:47:50 +01:00
45eacbde7f Merge branch 'release/v2.1-Release-new' into main 2022-03-26 00:47:40 +01:00
80eee574a9 cleanup ArenaCountDown 2022-03-26 00:16:13 +01:00
cb6de72b93 version string trailing zeros 2022-03-26 00:11:34 +01:00
2720e25cea fix ArenaCooldown not showing 2022-03-25 22:34:04 +01:00
7d77054a7b update readme 2022-03-25 22:33:27 +01:00
3d4479cc06 castbar font outline option added 2022-03-25 22:25:54 +01:00
d43d8e9284 updated Mir Profile 2022-03-25 17:57:04 +01:00
a8a6002f47 fixed UNIT_HEALTH_FREQUENT 2022-03-25 17:56:53 +01:00
f283ea994a updated Mir Profile 2022-03-25 17:16:17 +01:00
15fb697258 readme + version 2022-03-25 17:02:37 +01:00
eddd7588f4 #31 frames expand a centric point option added 2022-03-25 16:36:27 +01:00
5b32b8c793 grouping auras, interrupts, classicon, racial, trinket 2022-03-25 15:59:43 +01:00
10caa05e31 cooldowns test only active icons 2022-03-25 00:02:25 +01:00
c6c3d23074 add custom tags to PowerBar 2022-03-25 00:01:18 +01:00
1a8cd81f7a fix totemtick set parent and SetPoint 2022-03-25 00:00:44 +01:00
d348b87ddf switch UNIT_HEALTH to UNIT_HEALTH_FREQUENT 2022-03-24 20:23:50 +01:00
2f20d305b6 unified lang commented out 2022-03-03 23:42:35 +01:00
24bb84663f configurable health bar text by tags 2022-03-03 23:41:54 +01:00
d6351dbe88 add riposte, disarm, will of the forsaken to auras 2022-03-03 23:41:25 +01:00
26241d73d6 add test once and adjust testdata 2022-03-03 23:40:47 +01:00
8fa481affe racial cleanup 2022-03-03 23:40:23 +01:00
3c82edc441 detect certain racials and spells when used in stealth 2022-03-03 23:40:00 +01:00
d23d749f1e add disarm riposte to dr data 2022-03-03 23:39:20 +01:00
34b0a18d9a Util 2022-03-03 23:39:03 +01:00
ad4ba087f5 config frame totemplate ignore parent scale 2022-03-03 23:38:50 +01:00
b14406f75f totempulse 2022-03-03 23:38:28 +01:00
907c64a864 grouping first step 2022-03-03 23:38:05 +01:00
27573b7530 cooldown refactor + positioning 2022-03-03 23:37:42 +01:00
051571f4ef change identifying totems by name to identifying by guid (npcId) - faster and localization independent 2022-02-15 23:17:51 +01:00
3e59a03ce9 disable options for disabled module + (un)register messages when enabled/disabled 2022-02-15 22:59:21 +01:00
86337919b8 fix UnitIsUnit errors when unitCaster is nil 2022-02-12 02:08:51 +01:00
5212479dae completely hide nameplate TotemPlates added 2022-02-05 04:19:53 +01:00
09bfb99681 add improved wingclip, entrapment, disarm to DRs 2022-02-05 04:17:41 +01:00
803abd6f07 initial TotemPulse 2022-02-05 04:17:03 +01:00
41b299e0b1 initial TotemPulse 2022-02-05 04:16:44 +01:00
d8391b0f66 Anouncements + Gladdy RegisterMessages 2022-01-27 14:00:59 +01:00
ce3812d234 improve warrior icon 2022-01-27 01:51:02 +01:00
23729f5960 move DetectSpec to EventListener 2022-01-27 01:30:28 +01:00
0b512af2b7 cooldowns first refactor:
- no more lastCooldownSpell
- unused icons are in iconCache for later reuse
- only create as many icons as needed
- no more weired indexing
- cleanup duplicate code
- testmode cleanup
2022-01-27 01:02:31 +01:00
5ceedb53de temp fix for legacy xOffset yOffset not present 2022-01-25 20:42:33 +01:00
66931e18f9 fix castbar width/height being 0 on import 2022-01-25 20:41:32 +01:00
27eeade507 better class icons 2022-01-25 20:40:42 +01:00
37902e37e7 hide countdown frame when not used 2022-01-25 20:03:17 +01:00
9266274c16 legacy to newlayout fix when frame has width = 0 or height = 0 2022-01-25 20:01:42 +01:00
19eba81faa shadowsight fix enabled/disabled 2022-01-25 19:58:51 +01:00
2d58d3fb77 add Tree of Life druid spec detection 2022-01-14 06:50:39 +01:00
016327c659 add Conflagrate cd 2022-01-14 06:35:49 +01:00
4885e11b10 fix avenging wrath resets Divine Shield to 60s when Divine Shield CD > 60 2022-01-14 06:20:06 +01:00
4583cbdf24 add Flat Statusbar texture 2022-01-14 05:51:56 +01:00
35e119160a no more restoration warlocks 2022-01-14 05:51:39 +01:00
ddccf7a62e frFR localization by Macumba 2022-01-14 03:14:02 +01:00
89a5511fb9 perception cd tracking improved (rogue out of stealth) 2022-01-14 03:06:02 +01:00
874d8471e8 Merge tag 'v2.00' into develop
v2.00-Release
2022-01-14 00:40:28 +01:00
7c145752f7 Merge branch 'release/v2.00' into main 2022-01-14 00:40:17 +01:00
47a15bd2a1 dump version 2022-01-14 00:39:46 +01:00
cd64e8b481 add Mir pixel perfect edited profil 2022-01-14 00:36:46 +01:00
7ce6cdd5e0 readme 2022-01-13 23:48:54 +01:00
5f94e971f0 readme 2022-01-13 23:45:46 +01:00
fd37f588ac readme Attention 2022-01-13 23:42:42 +01:00
038688bd5b fix Gladdy:Hide() should call Gladdy:Reset() 2022-01-13 23:37:09 +01:00
cf485a91a1 cleanup 2022-01-13 23:12:34 +01:00
9dbab9939f mover disabled on module disabled 2022-01-13 23:11:33 +01:00
0d9e9735da add unregister messages to gladdy messages 2022-01-13 23:11:06 +01:00
83763aa016 fix colored trinket option toggle 2022-01-12 23:17:35 +01:00
b22756b6ab readme 2022-01-12 23:09:01 +01:00
5f4bf034e5 use Gladdy:SetColor for all color setters 2022-01-12 23:07:23 +01:00
042a8f7812 colored trinket option wording 2022-01-12 23:04:23 +01:00
ea10481c13 configurable trinket color 2022-01-12 22:39:06 +01:00
99fa6c0664 readme added disclaimer 2022-01-12 22:20:53 +01:00
61c50b3e32 readme 2022-01-12 22:18:34 +01:00
e5151f1605 added option to hide castbar icon 2022-01-12 22:17:28 +01:00
d24b330411 added option to hide castbar icon 2022-01-12 22:16:02 +01:00
298ce642fc fixed racial cooldowncircle 2022-01-12 22:15:39 +01:00
061bc5859c imp blink is Arcane 2022-01-12 21:31:56 +01:00
12abedfd0f readme added features 2022-01-12 21:08:30 +01:00
22526c0386 cleanup 2022-01-12 21:04:25 +01:00
1e926024ce green colored trinket option added 2022-01-12 20:58:20 +01:00
1dd411fed7 green colored trinket option added 2022-01-12 20:57:53 +01:00
242c45b8c4 frame strata option added for all visual elements 2022-01-12 20:21:53 +01:00
2edca9b11e readme 2022-01-12 16:33:49 +01:00
55860fc157 fix fear ward cooldown tracking 2022-01-12 16:18:34 +01:00
6954fb05d0 shadowsight timer fix timer tracking when friendly units take buff 2022-01-12 16:18:11 +01:00
114a7b14e4 fix CLEU destUnit events 2022-01-12 16:15:53 +01:00
978ba56f85 fix cooldowns not showing on reloadui during arena 2022-01-12 16:11:10 +01:00
61e49ffb8c fix auras not showing 2022-01-12 16:09:47 +01:00
b351bd9c23 update Readme v2.00 2022-01-12 07:33:20 +01:00
2c4308712d hide AnnouncementFrame when not in arena 2022-01-12 02:25:40 +01:00
91f7fcb998 classIcon add enable option 2022-01-12 02:25:11 +01:00
5766484f92 detach auras and interrupts 2022-01-12 02:24:46 +01:00
035942abbe bump version 2022-01-11 04:33:41 +01:00
2e3fb06269 DR Level text default on 2022-01-11 04:27:45 +01:00
b5f67d066f fix castbar hiding 2022-01-11 04:27:16 +01:00
c3a7c6cbc8 shadowsight:
- reset timer when shadowsight buff is active
- add a second timer
- show one or two timers option added
2022-01-11 04:26:59 +01:00
65daef4cd4 fix announcement throttle 2022-01-11 03:01:32 +01:00
6b94fdc32f fix minor castbar issue 2022-01-11 03:01:16 +01:00
2571df3052 cleanup 2022-01-11 03:00:57 +01:00
1c42523a2f bump version + backwards compatible imports 2022-01-11 00:30:32 +01:00
114c0ac96d clean up 2022-01-11 00:29:30 +01:00
59da6f34c6 movable frames 2022-01-11 00:29:17 +01:00
adb06d0c7f add spec detection spells:
- Expose Weakness (Survival Hunter)
- Slow (Arcane Mage)
- Improved Blink (Fire Mage)
- Vindication (Retribution Paladin)
- Holy Shield (Protection Paladin)
- Vampiric Embrace (Shadow Priest)
- Blade Flurry (Combat Rogue)
- Unleashed Rage (Enhancement Shaman)
- Flurry (Enhancement Shaman)
- Shamanistic Rage (Enhancement Shaman)
- Healing Way (Restoration Shaman)
- Totem of Wrath (Elemental Shaman)
- Dark Pact (Affliction Warlock)
- Conflagate (Destruction Warlock)
- Shield Slam (Protection Warrior)

Added Cooldowns:
- Scare Beast (Hunter)
- Feign Death (Hunter)
- Viper Sting (Hunter)
- Flare (Hunter)
- Fear Ward (Priest)
- Shadow Word: Death (Priest)
- Evocation (Mage)
- Grounding Totem (Shaman)
- Spell Lock (Warlock)
- Devour Magic (Warlock)
- Intercept (Warrior)

Added Auras:
- Scare Beast (Hunter)
- Fear Ward (Priest)
2022-01-11 00:13:31 +01:00
be292401cc pixel perfect scale minor adjustments 2022-01-11 00:05:57 +01:00
8df7aae3b6 detect fear ward cd when buffed pre arena start 2022-01-11 00:05:31 +01:00
1b2311fea2 debug messages 2022-01-11 00:04:54 +01:00
0a5176aaed detect arena and pets faster on reload 2022-01-11 00:04:08 +01:00
f923f471d8 detect spelllock and devour magic 2022-01-11 00:03:36 +01:00
2dcdc9c978 fix dr level text 2022-01-11 00:02:21 +01:00
7db32cceef fix grow up positioning 2022-01-11 00:02:10 +01:00
e2a78c717b fixed DRs Hibernate/Chastice/Dragonsbreath/ImpConcussiveShot/Counterattack 2022-01-11 00:01:57 +01:00
b2c8ed9c44 fixed spec detection 2022-01-11 00:00:17 +01:00
fed5d1c341 reload during arena 2022-01-10 23:59:33 +01:00
92322a4d9b spell interrupt announce 2022-01-10 23:59:20 +01:00
91c25edcfe zhCN Locale 2022-01-10 23:59:08 +01:00
41f74f5896 DR Level Icon Text by ManneN1 2021-09-27 13:40:02 +02:00
69c1eca49b add contributors 2021-09-27 13:38:40 +02:00
09a47e81f1 CI movable frames 2021-09-26 14:06:50 +02:00
ebb56c4127 testmode only movable frames 2021-09-25 14:03:57 +02:00
fabd9ae048 grouping of pets first step 2021-09-24 16:40:36 +02:00
3f28947b05 move modules with mouse 2021-09-24 15:51:24 +02:00
1010d59bd3 pixel perfect option added 2021-09-22 17:12:10 +02:00
069ca47210 Merge tag 'v1.22-Release' into develop
v1.22-ReÃlease#
2021-09-19 12:44:37 +02:00
d2f307fca0 Merge branch 'release/v1.22-Release' into main 2021-09-19 12:44:19 +02:00
033aa260f4 bump version 2021-09-19 12:43:20 +02:00
4925195de6 update klimp profile 2021-09-19 12:42:35 +02:00
ff4799ceef add option cooldown number alpha 2021-09-18 15:00:34 +02:00
548234aaaa grounding totem effect fix 2021-09-18 15:00:16 +02:00
df2721f1cf cleanup 2021-09-18 15:00:00 +02:00
01f907f71c fix import for TW and general issue with BuffsDebuffs 2021-09-18 13:15:27 +02:00
94efa7a112 Merge tag 'v1.21-Release' into develop
v1.21-Release
2021-09-15 19:41:27 +02:00
e93f7c54c6 Merge branch 'hotfix/v1.21-Release' into main 2021-09-15 19:41:16 +02:00
7a7c50e283 bump version 2021-09-15 19:40:24 +02:00
f29e8eff3b added Pummel to CoolDowns 2021-09-15 19:40:07 +02:00
a0ed3be791 fix ArenaEnemyFrame hide only if exists 2021-09-15 19:33:33 +02:00
95106eab1e Merge tag 'v1.20-Release' into develop
v1.20-Release
2021-09-15 00:55:40 +02:00
2c845547a4 Merge branch 'release/v1.20-Release' into main 2021-09-15 00:55:29 +02:00
b861091d44 added 1.20 changelist 2021-09-15 00:55:06 +02:00
c3a1555932 bump version 2021-09-15 00:42:49 +02:00
f36883df31 add version in options 2021-09-15 00:42:36 +02:00
f9b1ac9c51 possible localization on DR-Categories 2021-09-15 00:29:12 +02:00
b6d243b8c0 fix GetItemInfo item not loaded from server yet... fallback to constant 2021-09-15 00:24:36 +02:00
ce5c8fc5a0 added zhTW locale 2021-09-14 23:55:27 +02:00
60c823fa07 LSM replace 2021-09-14 23:55:17 +02:00
f1e1ee4e0b added Mir's profile 2021-09-14 23:53:12 +02:00
d2884e777a - Repentance, Freezing Trap & Wyvern Sting are now disorients
- import string now ignores errors on deleted options
2021-09-14 23:52:13 +02:00
b651eb39ce add reload ui button 2021-09-03 02:01:17 +02:00
73b01c28d7 add duration for grounding effect (still needs testing) 2021-09-03 01:57:04 +02:00
dd75f267f4 add Test & Hide Button 2021-09-03 01:56:38 +02:00
7108598603 update Klimp profile 2021-09-03 01:56:10 +02:00
6b4c35c66b error handling for font/statusbar/border not found added 2021-09-03 01:42:35 +02:00
75d4dfe9fe adjust countdown numbers 2021-09-03 01:39:21 +02:00
776464f551 add Aura Flee - Skull of Impending Doom 2021-09-03 01:38:46 +02:00
dd8a35857d shadowsight register AURA_GAIN 2021-09-01 08:16:37 +02:00
1c93e4ce4d cleanup 2021-08-19 18:58:17 +02:00
e2d0af1e2b fix paladin spec detect to discipline 2021-08-19 18:58:05 +02:00
9e81455ec5 fix SpotEnemy 2021-08-19 18:57:27 +02:00
fad4321bf6 add mangle 2021-08-19 18:56:52 +02:00
9c8c78bb83 DRData update add Nature's Grasp and Pyroclasm 2021-08-10 13:19:52 +02:00
bb7b820cbb add Net-o-Matic, Nigh Invulnerablility Shield & Nigh Invulnerablility Backfire to Auras 2021-08-10 13:19:17 +02:00
890cf80531 LibClassAuras update 2021-08-10 13:18:25 +02:00
f7f703d33a Auras description 2021-08-10 13:18:02 +02:00
a7cdacb55d ArenaCountDown update 2021-08-10 13:17:46 +02:00
237130e3ce announcement show MSBT option only when MSBT is loaded 2021-07-29 17:27:37 +02:00
2c73188e15 cleanup 2021-07-29 17:24:33 +02:00
5da6d1d7c9 added (un)checkAll button in DR-Categories in Diminishing Module 2021-07-29 17:23:09 +02:00
8a17592842 optimize and randomize DR and Aura test mode 2021-07-29 17:11:54 +02:00
51cd2b7311 clean up 2021-07-29 15:53:34 +02:00
720e5b63ec totemplates fix option to alter all colors/alphas 2021-07-29 15:53:13 +02:00
74753e327c testmode random Auras + Interrupts only with enabled Auras + Interrupts 2021-07-29 15:13:19 +02:00
0d5b5644a9 testmode DR only with enabled DRs 2021-07-29 14:19:13 +02:00
d53f89c6d4 hide blizzard arena pets as well 2021-07-29 14:06:15 +02:00
79371b72b0 fix shadowsight timer showing when not in arena or testmode 2021-07-29 14:05:37 +02:00
b73bc33630 scale in 0.01 percent steps 2021-07-29 13:34:10 +02:00
4c239cd599 configurable DR duration 2021-07-29 13:33:43 +02:00
6de5a60309 Merge tag 'v1.19-hotfix' into develop
v1.19-hotfix
2021-07-27 16:55:37 +02:00
31360bf695 Merge branch 'hotfix/v1.19-hotfix' into main 2021-07-27 16:55:27 +02:00
599fde6581 minor fix healthbar 2021-07-27 16:55:00 +02:00
382e5c3948 Merge tag 'v1.19' into develop
v1.19
2021-07-27 16:36:02 +02:00
582ca88b59 Merge branch 'release/v1.19' into main 2021-07-27 16:35:55 +02:00
aa53bfc241 bump version + readme 2021-07-27 16:35:23 +02:00
bd2c15088d fix range check Warrior intercept 2021-07-27 16:33:04 +02:00
d2da0a22ae Revert "fix entering arena in combat bug"
This reverts commit 755a3e52b5.
2021-07-27 16:32:37 +02:00
915c213eb5 Merge tag 'v1.18' into develop
v1.18-Beta
2021-07-26 18:20:04 +02:00
0cfba040f1 Merge branch 'hotfix/v1.18' into main 2021-07-26 18:19:56 +02:00
2a5a0fa394 bump version + readme 2021-07-26 18:19:29 +02:00
a1387f8ecd castbarfont hotfix 2021-07-26 18:17:37 +02:00
e7a83d61f3 Merge tag 'v1.17' into develop
v1.17-Beta
2021-07-26 17:47:31 +02:00
90b146e433 Merge branch 'release/v1.17' into main 2021-07-26 17:47:22 +02:00
61f79adda2 bump version and update readme 2021-07-26 17:46:32 +02:00
9b8c6a1426 allow import of values not in db... will be ignored anyways 2021-07-26 17:34:36 +02:00
d44ac29f43 cleanup 2021-07-26 17:32:25 +02:00
751e84c61d added single background for all frames 2021-07-26 17:30:46 +02:00
f92b3a4964 fix taint (Gladdy show in combat) 2021-07-26 17:01:04 +02:00
c2fec39202 update Klimp BLP 2021-07-26 14:55:38 +02:00
9f1bda3e80 ArenaX to X 2021-07-26 14:55:23 +02:00
fdeea258be Rukk1 profile added to XiconProfiles 2021-07-26 14:35:46 +02:00
960a98d244 Rukk1 profile added to XiconProfiles 2021-07-26 14:35:37 +02:00
82ec1460f8 fix feign death 2021-07-26 14:35:20 +02:00
23b9e2dfae buffs debuffs updated testmode - only show auras that are enabled 2021-07-26 14:35:01 +02:00
755a3e52b5 fix entering arena in combat bug 2021-07-26 12:58:40 +02:00
5767bc7ae3 updated klimp profile + added rukk1 profile 2021-07-26 12:51:23 +02:00
b1070d070a added banish to auras 2021-07-26 12:50:52 +02:00
5f4ab71a5a enhanced totemplates functionality 2021-07-26 11:46:30 +02:00
c43228f0b9 hide blizzard frames 2021-07-26 11:30:24 +02:00
b54ed1cda1 add evasion to auras 2021-07-26 11:28:57 +02:00
19d0460501 add all modifier to clicks module 2021-07-26 11:28:41 +02:00
cb6e519afe add MSBT to Announcements 2021-07-26 11:28:04 +02:00
d9f0c1491a option show seconds or milliseconds added 2021-07-26 11:27:32 +02:00
17a983fad6 Shadowshight timer lockable 2021-07-26 11:20:54 +02:00
4e0ea70bfa Merge tag 'ci-disable' into develop
ci-disable hotfix
2021-06-22 12:19:19 +02:00
da54c659bc Merge branch 'hotfix/ci-disable' into main 2021-06-22 12:19:11 +02:00
6be94215b9 CI disable hotfix 2021-06-22 12:18:45 +02:00
964a4b4f88 Merge tag 'v1.16' into develop
v1.16
2021-06-22 12:08:00 +02:00
03a55395b8 Merge branch 'release/v1.16' into main 2021-06-22 12:07:50 +02:00
8409ac1b96 bump version + readme 2021-06-22 12:07:15 +02:00
d653c76e37 stealth unit when rangecheck disabled 2021-06-22 12:04:59 +02:00
984c22a861 Merge tag 'entangling-roots-ng' into develop
v1.15-Beta hotfix nature's grasp
2021-06-20 14:03:06 +02:00
ede4b93ad8 Merge branch 'hotfix/entangling-roots-ng' into main 2021-06-20 14:02:49 +02:00
ca211e047f bump version and readme 2021-06-20 14:02:26 +02:00
8121cf3c6c nature's grasp added to auras 2021-06-20 14:01:03 +02:00
5b348b760c Merge tag 'button-fix-up' into develop
v1.14-Beta hotfix
2021-06-20 13:16:05 +02:00
6a66bcb0ca Merge branch 'hotfix/button-fix-up' into main 2021-06-20 13:15:51 +02:00
50716f3f63 fix button secure grow direction up 2021-06-20 13:15:27 +02:00
9dab6b7299 Merge tag 'miraage-mention' into develop
miraage readme
2021-06-20 11:12:43 +02:00
43bd5af2cc Merge branch 'hotfix/miraage-mention' into main 2021-06-20 11:12:32 +02:00
9780922fec readme - miraage 2021-06-20 11:12:06 +02:00
2c21a6e770 Merge tag 'v1.13-Beta' into develop
v1.13-Beta
2021-06-20 02:57:50 +02:00
88b769c12d Merge branch 'release/v1.13-Beta' into main 2021-06-20 02:57:40 +02:00
4ff3ed487b bump version and edit readme 2021-06-20 02:57:04 +02:00
92dc847909 show xiconprofiles on first login 2021-06-20 02:46:52 +02:00
fa01d38989 add interrupts to auras 2021-06-20 02:30:28 +02:00
326af8e796 fix cooldowns trigger 2021-06-20 02:30:03 +02:00
af17c7e1b9 fix clicks 2021-06-20 02:27:27 +02:00
4148e775a9 shadowsight announce option added 2021-06-20 01:00:55 +02:00
0d7bd3c688 clicks fix 2021-06-20 00:55:06 +02:00
2988177128 adding cooldowns Swiftmend & Berserker Rage 2021-06-20 00:54:31 +02:00
b17e58f558 pets mouseover macros enabled 2021-06-20 00:50:06 +02:00
9edb632efc compressed blps 2021-06-17 19:15:24 +02:00
56de506ef1 buffs debuffs force test auras 2021-06-17 16:59:22 +02:00
6c471a0fad RangeCheck added ENEMY_SPOTTED 2021-06-17 16:43:28 +02:00
6f5cb0498b DR bigger icons possible 2021-06-17 16:40:19 +02:00
df2ff4c9e7 castbar arena4-5 2021-06-17 16:40:02 +02:00
b03b05b2bb classic profile no pet added 2021-06-17 16:39:40 +02:00
09a07c7201 safe unit death on UNIT_HEALTH events 2021-06-16 14:34:17 +02:00
152573124f reset powerType on Gladdy:Reset 2021-06-16 14:33:48 +02:00
3378cfcd0b import string classic profile updated 2021-06-16 14:12:49 +02:00
53228a0e39 leader highlight commented out 2021-06-16 14:12:11 +02:00
cbf8c1a13b totem plates fix UpdateFrameOnce 2021-06-16 14:11:34 +02:00
993de572cd range check fix class colors 2021-06-16 14:10:49 +02:00
f0c0286708 cooldowns enable/disable in testmode 2021-06-16 14:10:09 +02:00
20a654c810 Merge tag 'classic-profile' into develop
v1.12-Beta
2021-06-16 10:07:15 +02:00
c5f2ee1eff Merge branch 'hotfix/classic-profile' into main 2021-06-16 10:07:06 +02:00
4eda8cea8f bump version 2021-06-16 10:06:33 +02:00
fb953530b6 fix classic profile 2021-06-16 10:05:33 +02:00
bc1a617b6e Clicks description example for macro 2021-06-16 02:08:00 +02:00
505154e699 adding Clicks module again 2021-06-16 01:14:11 +02:00
5776dde270 fix aura UpdateFrame 2021-06-16 00:14:18 +02:00
0b9c33b867 mouseover macros now possible 2021-06-15 17:10:31 +02:00
d7f31dbdab Merge branch 'feature/totemplates-compatibility' into develop 2021-06-15 17:09:51 +02:00
b363df73a3 TotemPlates compatible with:
- Plater
- KUI Nameplates
- NeatPlates
- TidyPlates ThreatPlates
- TukUI
- ElvUI
2021-06-15 17:09:25 +02:00
54e0aa4a47 Auras sorting by name and alt textures 2021-06-15 12:20:33 +02:00
c970fe576f Auras add altName, altTexture and
- Blackout Stun
- Charge Stun
- Intercept Stun
- Improved Hamstring
- Mace Stun
- Storm Herald Stun
- Shadowsight Buff
2021-06-15 12:19:55 +02:00
2be103fb88 readme 2021-06-15 11:01:15 +02:00
4cd4ff982c Merge tag 'totemplates-fix' into develop
v1.11-Beta
2021-06-15 09:11:04 +02:00
9d26713dc1 Merge branch 'hotfix/totemplates-fix' into main 2021-06-15 09:10:55 +02:00
db1e3da6fc totemplates fix & bump version 2021-06-15 09:10:27 +02:00
5cad55e91a honorable mentions 2021-06-15 09:07:23 +02:00
5972ef8c05 cleanup 2021-06-15 09:06:50 +02:00
779e81727c performance tweaks 2021-06-15 09:06:40 +02:00
0c4409fe16 hide blizzard 2021-06-15 09:06:32 +02:00
85f63e590b fix aura border hide in testmode 2021-06-15 09:06:21 +02:00
da5a8ea67d powerbar enable/disable 2021-06-15 09:06:05 +02:00
4f370f4e63 send version check by group type 2021-06-15 09:05:50 +02:00
06884ae043 shadowsight timer added 2021-06-15 09:05:32 +02:00
7b0bf921c4 Range Check added 2021-06-15 09:05:20 +02:00
a83c1ad0c2 castbar enable/disable 2021-06-15 09:05:07 +02:00
8ba1f84047 Merge tag 'v1.10-Beta' into develop
v1.10-Beta
2021-05-24 13:12:19 +02:00
4721324a2a Merge branch 'release/v1.10-Beta' into main 2021-05-24 13:12:12 +02:00
51e484eadd minor fixes module names 2021-05-24 13:11:36 +02:00
46f379c1e4 bump version v1.10-Beta 2021-05-24 12:54:36 +02:00
5e42a9b51f fix ArenaX option being overwritten by unit name 2021-05-24 12:53:33 +02:00
df58544f6e cleanup 2021-05-24 12:44:23 +02:00
43518055f0 Localization 2021-05-24 12:41:21 +02:00
9ef174e290 Merge tag 'v1.09-Beta' into develop
v1.09-Beta
2021-05-22 15:02:42 +02:00
a60119caa2 Merge branch 'release/v1.09-Beta' into main 2021-05-22 15:02:35 +02:00
1546e3db6e bump version 2021-05-22 15:02:12 +02:00
82a9a014e4 - fix Blizzard Profile 2021-05-22 15:00:35 +02:00
a9a1a77dd3 Merge tag 'v1.08-Beta' into develop
v1.08-Beta
2021-05-22 14:25:00 +02:00
084fad0074 Merge branch 'release/v1.08-Beta' into main 2021-05-22 14:24:51 +02:00
2b9e219839 - added blizzard profile
- bump version
2021-05-22 14:24:20 +02:00
ba8ea87863 klimp profile aura border colors reset to default 2021-05-22 13:52:59 +02:00
f498a0dde1 TODO 2021-05-22 13:42:55 +02:00
673dc72b3b minor bugfixes 2021-05-22 13:42:47 +02:00
6da33b6c68 grow direction added 2021-05-22 13:41:42 +02:00
0c6cae0b04 highlight inset option added 2021-05-22 13:41:31 +02:00
ded321e772 fix AuraModule not showing Buffs 2021-05-22 13:29:48 +02:00
7015bb989e Announcement default options changed 2021-05-22 13:28:46 +02:00
eaeccf5595 CombatIndicator set border properly 2021-05-22 13:28:27 +02:00
c7d07c62ee Merge tag 'v1.07-Beta' into develop
v1.07-Beta
2021-05-20 01:32:45 +02:00
cf804546c2 Merge branch 'release/v1.07-Beta' into main 2021-05-20 01:32:35 +02:00
467b459898 bump version and update readme 2021-05-20 01:32:08 +02:00
0d9cbc8f45 DRData cleanup 2021-05-20 01:24:20 +02:00
2c858e1c84 XiconProfile image update 2021-05-20 01:23:55 +02:00
ffc5d32b80 delete Bindings.xml 2021-05-20 01:11:03 +02:00
1956b3a568 BuffDebuff options width for icons updated 2021-05-20 01:07:20 +02:00
84f542b3b8 add a couple buffs to LibClassAuras 2021-05-20 01:06:42 +02:00
ccf7d08832 add blessing of sacrifice and intervene to auras 2021-05-20 01:06:03 +02:00
2e093950e2 cleanup 2021-05-20 00:16:18 +02:00
2f9356f8de classicon warrior slight change 2021-05-20 00:16:09 +02:00
8c4a70fd04 general options updated to apply font/borders/etc for all frames 2021-05-20 00:15:50 +02:00
cac0124f1a XiconProfiles updated 2021-05-20 00:15:06 +02:00
cef9de3819 cleanup 2021-05-19 19:33:22 +02:00
a84178edbf /gladdy test1-5 now possible 2021-05-19 19:33:13 +02:00
c05fab9454 spec icon option added to Classicon module 2021-05-19 19:32:31 +02:00
be54619576 arena1-5 for name option added 2021-05-19 19:31:13 +02:00
c70560e66a Highlight remove framestrata 2021-05-19 19:30:54 +02:00
de4adaec16 fix PowerBar text updates 2021-05-19 19:30:46 +02:00
01d748f37e combat indicator fix anchoring 2021-05-19 19:30:40 +02:00
ad130af188 click through frames health/power bar 2021-05-19 19:30:32 +02:00
67edecf8d1 arena countdown refactor 2021-05-19 19:29:59 +02:00
e01b86e1e6 cleanup Totemplates 2021-05-19 16:35:45 +02:00
8b69f5ef93 CombatIndicator module added 2021-05-19 16:35:26 +02:00
4f774b1ddb mask applied to icons 2021-05-19 14:57:29 +02:00
3a846add3b totem icons removed and mask applied 2021-05-19 14:56:38 +02:00
9dfec29f16 add mask texture for icons 2021-05-19 13:55:55 +02:00
28d33d2f9a Merge tag 'aura-fix' into develop
v1.06-Beta hotfix
2021-05-18 18:31:33 +02:00
2d53df2b5f Merge branch 'hotfix/aura-fix' into main 2021-05-18 18:31:22 +02:00
cddea2e094 v1.06-Beta hotfix BuffDebuff module 2021-05-18 18:31:03 +02:00
ee1a78000e Merge tag 'v1.05-Beta' into develop
v1.05-Beta
2021-05-18 16:47:54 +02:00
78 changed files with 12709 additions and 3781 deletions

3
.gitignore vendored
View File

@ -5,4 +5,5 @@ BuffLib
*.psd *.psd
Ace-Libs Ace-Libs
Images_Raw Images_Raw
Gladdy_old Gladdy_old
Gladdy_TW

View File

@ -1,38 +1,31 @@
<Bindings> <Bindings>
<Binding name="GLADDYBUTTON1_LEFT" header="GLADDY" category="ADDONS"/> <Binding name="GLADDYBUTTON1_LEFT" header="GLADDY" Category="Gladdy"/>
<Binding name="GLADDYBUTTON2_LEFT" category="ADDONS"/> <Binding name="GLADDYBUTTON2_LEFT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON3_LEFT" category="ADDONS"/> <Binding name="GLADDYBUTTON3_LEFT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON4_LEFT" category="ADDONS"/> <Binding name="GLADDYBUTTON4_LEFT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON5_LEFT" category="ADDONS"/> <Binding name="GLADDYBUTTON5_LEFT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON1_RIGHT" category="ADDONS"/> <Binding name="GLADDYBUTTON1_RIGHT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON2_RIGHT" category="ADDONS"/> <Binding name="GLADDYBUTTON2_RIGHT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON3_RIGHT" category="ADDONS"/> <Binding name="GLADDYBUTTON3_RIGHT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON4_RIGHT" category="ADDONS"/> <Binding name="GLADDYBUTTON4_RIGHT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON5_RIGHT" category="ADDONS"/> <Binding name="GLADDYBUTTON5_RIGHT" Category="Gladdy"/>
<Binding name="GLADDYBUTTON1_MIDDLE" category="ADDONS"/> <Binding name="GLADDYBUTTON1_MIDDLE" Category="Gladdy"/>
<Binding name="GLADDYBUTTON2_MIDDLE" category="ADDONS"/> <Binding name="GLADDYBUTTON2_MIDDLE" Category="Gladdy"/>
<Binding name="GLADDYBUTTON3_MIDDLE" category="ADDONS"/> <Binding name="GLADDYBUTTON3_MIDDLE" Category="Gladdy"/>
<Binding name="GLADDYBUTTON4_MIDDLE" category="ADDONS"/> <Binding name="GLADDYBUTTON4_MIDDLE" Category="Gladdy"/>
<Binding name="GLADDYBUTTON5_MIDDLE" category="ADDONS"/> <Binding name="GLADDYBUTTON5_MIDDLE" Category="Gladdy"/>
<Binding name="GLADDYBUTTON1_BUTTON4" category="ADDONS"/> <Binding name="GLADDYBUTTON1_BUTTON4" Category="Gladdy"/>
<Binding name="GLADDYBUTTON2_BUTTON4" category="ADDONS"/> <Binding name="GLADDYBUTTON2_BUTTON4" Category="Gladdy"/>
<Binding name="GLADDYBUTTON3_BUTTON4" category="ADDONS"/> <Binding name="GLADDYBUTTON3_BUTTON4" Category="Gladdy"/>
<Binding name="GLADDYBUTTON4_BUTTON4" category="ADDONS"/> <Binding name="GLADDYBUTTON4_BUTTON4" Category="Gladdy"/>
<Binding name="GLADDYBUTTON5_BUTTON4" category="ADDONS"/> <Binding name="GLADDYBUTTON5_BUTTON4" Category="Gladdy"/>
<Binding name="GLADDYBUTTON1_BUTTON5" category="ADDONS"/> <Binding name="GLADDYBUTTON1_BUTTON5" Category="Gladdy"/>
<Binding name="GLADDYBUTTON2_BUTTON5" category="ADDONS"/> <Binding name="GLADDYBUTTON2_BUTTON5" Category="Gladdy"/>
<Binding name="GLADDYBUTTON3_BUTTON5" category="ADDONS"/> <Binding name="GLADDYBUTTON3_BUTTON5" Category="Gladdy"/>
<Binding name="GLADDYBUTTON4_BUTTON5" category="ADDONS"/> <Binding name="GLADDYBUTTON4_BUTTON5" Category="Gladdy"/>
<Binding name="GLADDYBUTTON5_BUTTON5" category="ADDONS"/> <Binding name="GLADDYBUTTON5_BUTTON5" Category="Gladdy"/>
<Binding header="GLADDYTRINKET" name="GLADDYTRINKET1" category="ADDONS"/>
<Binding name="GLADDYTRINKET2" category="ADDONS"/>
<Binding name="GLADDYTRINKET3" category="ADDONS"/>
<Binding name="GLADDYTRINKET4" category="ADDONS"/>
<Binding name="GLADDYTRINKET5" category="ADDONS"/>
</Bindings> </Bindings>

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,21 @@
local select, string_gsub, tostring = select, string.gsub, tostring local select, string_gsub, tostring, pairs, ipairs = select, string.gsub, tostring, pairs, ipairs
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
local AURA_TYPE_BUFF = AURA_TYPE_BUFF local AURA_TYPE_BUFF = AURA_TYPE_BUFF
local UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit = UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit local UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists = UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists
local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local FindAuraByName = AuraUtil.FindAuraByName local FindAuraByName = AuraUtil.FindAuraByName
local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local Cooldowns = Gladdy.modules["Cooldowns"] local Cooldowns = Gladdy.modules["Cooldowns"]
local Diminishings = Gladdy.modules["Diminishings"] local Diminishings = Gladdy.modules["Diminishings"]
local EventListener = Gladdy:NewModule("EventListener", nil, { local EventListener = Gladdy:NewModule("EventListener", 101, {
test = true, test = true,
}) })
@ -34,7 +35,16 @@ function EventListener:JOINED_ARENA()
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
self:SetScript("OnEvent", EventListener.OnEvent) self:SetScript("OnEvent", EventListener.OnEvent)
Gladdy:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", UnitName("player"))
-- in case arena has started already we check for units
for i=1,Gladdy.curBracket do
if UnitExists("arena" .. i) then
Gladdy:SpotEnemy("arena" .. i, true)
end
if UnitExists("arenapet" .. i) then
Gladdy:SendMessage("PET_SPOTTED", "arenapet" .. i)
end
end
end end
function EventListener:Reset() function EventListener:Reset()
@ -42,95 +52,116 @@ function EventListener:Reset()
self:SetScript("OnEvent", nil) self:SetScript("OnEvent", nil)
end end
function Gladdy:DetectSpec(unit, specSpell)
if specSpell then
self.modules["Cooldowns"]:DetectSpec(unit, specSpell)
end
end
function Gladdy:SpotEnemy(unit, auraScan) function Gladdy:SpotEnemy(unit, auraScan)
local button = self.buttons[unit] local button = self.buttons[unit]
button.raceLoc = UnitRace(unit) if not unit or not button then
button.race = select(2, UnitRace(unit)) return
button.classLoc = select(1, UnitClass(unit)) end
button.class = select(2, UnitClass(unit))
button.name = UnitName(unit)
button.stealthed = false button.stealthed = false
Gladdy.guids[UnitGUID(unit)] = unit if UnitExists(unit) then
Gladdy:SendMessage("ENEMY_SPOTTED", unit) button.raceLoc = UnitRace(unit)
button.race = select(2, UnitRace(unit))
button.classLoc = select(1, UnitClass(unit))
button.class = select(2, UnitClass(unit))
button.name = UnitName(unit)
Gladdy.guids[UnitGUID(unit)] = unit
end
if button.class and button.race then
Gladdy:SendMessage("ENEMY_SPOTTED", unit)
end
if auraScan and not button.spec then if auraScan and not button.spec then
for n = 1, 30 do for n = 1, 30 do
local spellName,_,_,_,_,_,unitCaster = UnitAura(unit, n, "HELPFUL") local spellName,_,_,_,_,expirationTime,unitCaster = UnitAura(unit, n, "HELPFUL")
if ( not spellName ) then if ( not spellName ) then
break break
end end
if Gladdy.specBuffs[spellName] then if Gladdy.specBuffs[spellName] and unitCaster then -- Check for auras that detect a spec
local unitPet = string_gsub(unit, "%d$", "pet%1") local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName]) EventListener:DetectSpec(unit, Gladdy.specBuffs[spellName])
end end
end end
if Gladdy.cooldownBuffs[spellName] and unitCaster then -- Check for auras that detect used CDs (like Fear Ward)
for arenaUnit,v in pairs(self.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, Gladdy.cooldownBuffs[spellName].spellId, Gladdy.cooldownBuffs[spellName].cd(expirationTime - GetTime()))
-- /run LibStub("Gladdy").modules["Cooldowns"]:CooldownUsed("arena5", "PRIEST", 6346, 10)
end
end
end
if Gladdy.cooldownBuffs.racials[spellName] and Gladdy.cooldownBuffs.racials[spellName] then
Gladdy:SendMessage("RACIAL_USED", unit, spellName, Gladdy.cooldownBuffs.racials[spellName].cd(expirationTime - GetTime()), spellName)
end
end end
end end
end end
function EventListener:COMBAT_LOG_EVENT_UNFILTERED() function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
-- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool -- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName = CombatLogGetCurrentEventInfo() local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo()
local srcUnit = Gladdy.guids[sourceGUID] local srcUnit = Gladdy.guids[sourceGUID] -- can be a PET
local destUnit = Gladdy.guids[destGUID] local destUnit = Gladdy.guids[destGUID] -- can be a PET
if (Gladdy.db.shadowsightTimerEnabled and eventType == "SPELL_AURA_APPLIED" and spellID == 34709) then
if Gladdy.specSpells[spellName] and srcUnit then Gladdy.modules["Shadowsight Timer"]:AURA_GAIN(nil, nil, 34709)
--Gladdy:Print(eventType, spellName, Gladdy.specSpells[spellName], srcUnit)
end
if (eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
if destUnit then
--Gladdy:Print(eventType, "destUnit", destUnit)
elseif srcUnit then
--Gladdy:Print(eventType, "srcUnit", srcUnit)
end
end end
if destUnit then if destUnit then
-- diminish tracker -- diminish tracker
if (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then if Gladdy.buttons[destUnit] and (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then
Diminishings:AuraFade(destUnit, spellID) Diminishings:AuraFade(destUnit, spellID)
end end
-- death detection -- death detection
if (eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then if (Gladdy.buttons[destUnit] and eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
Gladdy:SendMessage("UNIT_DEATH", destUnit) Gladdy:SendMessage("UNIT_DEATH", destUnit)
end end
-- spec detection -- spec detection
if not Gladdy.buttons[destUnit].class then if Gladdy.buttons[destUnit] and (not Gladdy.buttons[destUnit].class or not Gladdy.buttons[destUnit].race) then
Gladdy:SpotEnemy(destUnit, true) Gladdy:SpotEnemy(destUnit, true)
end end
--interrupt detection
if Gladdy.buttons[destUnit] and eventType == "SPELL_INTERRUPT" then
Gladdy:SendMessage("SPELL_INTERRUPT", destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
end
end end
if srcUnit then if srcUnit then
local unitRace = Gladdy.buttons[srcUnit].race srcUnit = string_gsub(srcUnit, "pet", "")
-- cooldown tracker if (not UnitExists(srcUnit)) then
if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then return
local unitClass
local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank
if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
unitClass = Gladdy.buttons[srcUnit].class
else
unitClass = Gladdy.buttons[srcUnit].race
end
Cooldowns:CooldownUsed(srcUnit, unitClass, spellId, spellName)
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
end end
if not Gladdy.buttons[srcUnit].class or not Gladdy.buttons[srcUnit].race then
if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
Gladdy:SendMessage("RACIAL_USED", srcUnit)
end
if not Gladdy.buttons[srcUnit].class then
Gladdy:SpotEnemy(srcUnit, true) Gladdy:SpotEnemy(srcUnit, true)
end end
if not Gladdy.buttons[srcUnit].spec then if not Gladdy.buttons[srcUnit].spec then
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName]) self:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED") then
local unitRace = Gladdy.buttons[srcUnit].race
-- cooldown tracker
if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then
local unitClass
local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank
if spellID == 16188 or spellID == 17116 then -- Nature's Swiftness (same name for druid and shaman)
spellId = spellID
end
if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
unitClass = Gladdy.buttons[srcUnit].class
else
unitClass = Gladdy.buttons[srcUnit].race
end
self:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
if spellID ~= 16188 and spellID ~= 17116 then -- Nature's Swiftness CD starts when buff fades
Cooldowns:CooldownUsed(srcUnit, unitClass, spellId)
end
end
end
if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
Gladdy:SendMessage("RACIAL_USED", srcUnit)
end
end
if (eventType == "SPELL_AURA_REMOVED" and (spellID == 16188 or spellID == 17116) and Gladdy.buttons[srcUnit].class) then
Cooldowns:CooldownUsed(srcUnit, Gladdy.buttons[srcUnit].class, spellID)
end end
end end
end end
@ -143,12 +174,11 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
if button or pet then if button or pet then
if updateReason == "seen" then if updateReason == "seen" then
-- ENEMY_SPOTTED -- ENEMY_SPOTTED
if button and not button.class then if button then
Gladdy:SpotEnemy(unit, true) Gladdy:SendMessage("ENEMY_STEALTH", unit, false)
end if not button.class or not button.race then
if button and button.stealthed then Gladdy:SpotEnemy(unit, true)
local class = Gladdy.buttons[unit].class end
button.healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[class].r, RAID_CLASS_COLORS[class].g, RAID_CLASS_COLORS[class].b, 1)
end end
if pet then if pet then
Gladdy:SendMessage("PET_SPOTTED", unit) Gladdy:SendMessage("PET_SPOTTED", unit)
@ -156,9 +186,7 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
elseif updateReason == "unseen" then elseif updateReason == "unseen" then
-- STEALTH -- STEALTH
if button then if button then
Gladdy:SendMessage("ENEMY_STEALTH", unit) Gladdy:SendMessage("ENEMY_STEALTH", unit, true)
button.healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1)
button.stealthed = true
end end
if pet then if pet then
Gladdy:SendMessage("PET_STEALTH", unit) Gladdy:SendMessage("PET_STEALTH", unit)
@ -177,7 +205,7 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
end end
end end
local exceptionNames = { Gladdy.exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB
[31117] = GetSpellInfo(30405) .. " Silence", -- Unstable Affliction Silence [31117] = GetSpellInfo(30405) .. " Silence", -- Unstable Affliction Silence
[43523] = GetSpellInfo(30405) .. " Silence", [43523] = GetSpellInfo(30405) .. " Silence",
[24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot [24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot
@ -193,13 +221,36 @@ local exceptionNames = {
[27010] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)), [27010] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
} }
Gladdy.cooldownBuffs = {
[GetSpellInfo(6346)] = { cd = function(expTime) -- 180s uptime == cd
return expTime
end, spellId = 6346 }, -- Fear Ward
[GetSpellInfo(11305)] = { cd = function(expTime) -- 15s uptime
return 300 - (15 - expTime)
end, spellId = 11305 }, -- Sprint
[36554] = { cd = function(expTime) -- 3s uptime
return 30 - (3 - expTime)
end, spellId = 36554 }, -- Shadowstep speed buff
[36563] = { cd = function(expTime) -- 10s uptime
return 30 - (10 - expTime)
end, spellId = 36554 }, -- Shadowstep dmg buff
[GetSpellInfo(26889)] = { cd = function(expTime) -- 3s uptime
return 180 - (10 - expTime)
end, spellId = 26889 }, -- Vanish
racials = {
[GetSpellInfo(20600)] = { cd = function(expTime) -- 20s uptime
return GetTime() - (20 - expTime)
end, spellId = 20600 }, -- Perception
}
}
function EventListener:UNIT_AURA(unit) function EventListener:UNIT_AURA(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if not button then if not button then
return return
end end
for i = 1, 2 do for i = 1, 2 do
if not Gladdy.buttons[unit].class then if not Gladdy.buttons[unit].class or not Gladdy.buttons[unit].race then
Gladdy:SpotEnemy(unit, false) Gladdy:SpotEnemy(unit, false)
end end
local filter = (i == 1 and "HELPFUL" or "HARMFUL") local filter = (i == 1 and "HELPFUL" or "HARMFUL")
@ -211,17 +262,27 @@ function EventListener:UNIT_AURA(unit)
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1) Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1)
break break
end end
if not button.spec and Gladdy.specBuffs[spellName] then if not button.spec and Gladdy.specBuffs[spellName] and unitCaster then
local unitPet = string_gsub(unit, "%d$", "pet%1") local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName]) self:DetectSpec(unit, Gladdy.specBuffs[spellName])
end end
end end
if exceptionNames[spellID] then if (Gladdy.cooldownBuffs[spellName] or Gladdy.cooldownBuffs[spellID]) and unitCaster then -- Check for auras that hint used CDs (like Fear Ward)
spellName = exceptionNames[spellID] local cooldownBuff = Gladdy.cooldownBuffs[spellID] or Gladdy.cooldownBuffs[spellName]
for arenaUnit,v in pairs(Gladdy.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, cooldownBuff.spellId, cooldownBuff.cd(expirationTime - GetTime()))
end
end
end
if Gladdy.cooldownBuffs.racials[spellName] and Gladdy.cooldownBuffs.racials[spellName] then
Gladdy:SendMessage("RACIAL_USED", unit, spellName, Gladdy.cooldownBuffs.racials[spellName].cd(expirationTime - GetTime()), spellName)
end
if Gladdy.exceptionNames[spellID] then
spellName = Gladdy.exceptionNames[spellID]
end end
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i) Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i)
Gladdy:Call("Announcements", "CheckDrink", unit, spellName)
end end
end end
end end
@ -230,7 +291,7 @@ function EventListener:UNIT_SPELLCAST_START(unit)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit) local spellName = UnitCastingInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName]) self:DetectSpec(unit, Gladdy.specSpells[spellName])
end end
end end
end end
@ -239,7 +300,7 @@ function EventListener:UNIT_SPELLCAST_CHANNEL_START(unit)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local spellName = UnitChannelInfo(unit) local spellName = UnitChannelInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName]) self:DetectSpec(unit, Gladdy.specSpells[spellName])
end end
end end
end end
@ -248,11 +309,47 @@ function EventListener:UNIT_SPELLCAST_SUCCEEDED(unit)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit) local spellName = UnitCastingInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName]) self:DetectSpec(unit, Gladdy.specSpells[spellName])
end end
end end
end end
function EventListener:GetOptions() local function notIn(spec, list)
return nil for _,v in ipairs(list) do
if spec == v then
return false
end
end
return true
end
function EventListener:DetectSpec(unit, spec)
local button = Gladdy.buttons[unit]
if (not button or not spec or button.spec) then
return
end
if button.class == "PALADIN" and notIn(spec, {L["Holy"], L["Retribution"], L["Protection"]})
or button.class == "SHAMAN" and notIn(spec, {L["Restoration"], L["Enhancement"], L["Elemental"]})
or button.class == "ROGUE" and notIn(spec, {L["Subtlety"], L["Assassination"], L["Combat"]})
or button.class == "WARLOCK" and notIn(spec, {L["Demonology"], L["Destruction"], L["Affliction"]})
or button.class == "PRIEST" and notIn(spec, {L["Shadow"], L["Discipline"], L["Holy"]})
or button.class == "MAGE" and notIn(spec, {L["Frost"], L["Fire"], L["Arcane"]})
or button.class == "DRUID" and notIn(spec, {L["Restoration"], L["Feral"], L["Balance"]})
or button.class == "HUNTER" and notIn(spec, {L["Beast Mastery"], L["Marksmanship"], L["Survival"]})
or button.class == "WARRIOR" and notIn(spec, {L["Arms"], L["Protection"], L["Fury"]}) then
return
end
if not button.spec then
button.spec = spec
Gladdy:SendMessage("UNIT_SPEC", unit, spec)
end
end
function EventListener:Test(unit)
local button = Gladdy.buttons[unit]
if (button and Gladdy.testData[unit].testSpec) then
button.spec = nil
Gladdy:SpotEnemy(unit, false)
self:DetectSpec(unit, button.testSpec)
end
end end

426
Frame.lua
View File

@ -1,6 +1,9 @@
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local UIParent = UIParent local UIParent = UIParent
local InCombatLockdown = InCombatLockdown local InCombatLockdown = InCombatLockdown
local math_abs = math.abs
local pairs = pairs
local LibStub = LibStub
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
@ -26,15 +29,26 @@ Gladdy.BUTTON_DEFAULTS = {
damaged = 0, damaged = 0,
click = false, click = false,
stealthed = false, stealthed = false,
classColors = {},
lastState = 0,
} }
function Gladdy:CreateFrame() function Gladdy:CreateFrame()
self.frame = CreateFrame("Frame", "GladdyFrame", UIParent) self.frame = CreateFrame("Frame", "GladdyFrame", UIParent)
self.frame.background = CreateFrame("Frame", nil, self.frame, BackdropTemplateMixin and "BackdropTemplate")
self.frame.background:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = false, tileSize = 16})
self.frame.background:SetFrameStrata("BACKGROUND")
self.frame.background:SetBackdropColor(Gladdy:SetColor(self.db.backgroundColor))
self.frame.background:SetAllPoints(self.frame)
--self.frame.texture = self.frame:CreateTexture(nil, "OVERLAY")
--self.frame.texture:SetAllPoints(self.frame)
--self.frame.texture:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
self.frame:SetClampedToScreen(true) self.frame:SetClampedToScreen(true)
self.frame:EnableMouse(true) self.frame:EnableMouse(false)
self.frame:SetMovable(true) self.frame:SetMovable(true)
self.frame:RegisterForDrag("LeftButton") --self.frame:RegisterForDrag("LeftButton")
self.frame:SetScript("OnDragStart", function(f) self.frame:SetScript("OnDragStart", function(f)
if (not InCombatLockdown() and not self.db.locked) then if (not InCombatLockdown() and not self.db.locked) then
@ -47,7 +61,7 @@ function Gladdy:CreateFrame()
local scale = f:GetEffectiveScale() local scale = f:GetEffectiveScale()
self.db.x = f:GetLeft() * scale self.db.x = f:GetLeft() * scale
self.db.y = (self.db.growUp and f:GetBottom() or f:GetTop()) * scale self.db.y = (self.db.growDirection == "TOP" and f:GetBottom() or f:GetTop()) * scale
end end
end) end)
@ -71,7 +85,7 @@ function Gladdy:CreateFrame()
local scale = self.frame:GetEffectiveScale() local scale = self.frame:GetEffectiveScale()
self.db.x = self.frame:GetLeft() * scale self.db.x = self.frame:GetLeft() * scale
self.db.y = (self.db.growUp and self.frame:GetBottom() or self.frame:GetTop()) * scale self.db.y = (self.db.growDirection == "TOP" and self.frame:GetBottom() or self.frame:GetTop()) * scale
end end
end) end)
self.anchor:SetScript("OnClick", function() self.anchor:SetScript("OnClick", function()
@ -104,133 +118,175 @@ end
function Gladdy:UpdateFrame() function Gladdy:UpdateFrame()
if (InCombatLockdown()) then
return
end
if (not self.frame) then if (not self.frame) then
self:CreateFrame() self:CreateFrame()
end end
local teamSize = self.curBracket or 0 local teamSize = self.curBracket or 0
local iconSize = self.db.healthBarHeight local highlightBorderSize = (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2)
local margin = 0 local powerBarHeight = self.db.powerBarEnabled and (self.db.powerBarHeight + 1) or 0
local width = self.db.barWidth + self.db.padding * 2 + 5
local height = self.db.healthBarHeight * teamSize + margin * (teamSize - 1) + self.db.padding * 2 + 5
local extraBarWidth = 0
local extraBarHeight = 0
-- Powerbar local margin = powerBarHeight
iconSize = iconSize + self.db.powerBarHeight local height = (self.db.healthBarHeight + powerBarHeight) * teamSize
margin = margin + self.db.powerBarHeight + (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2 * teamSize)
height = height + self.db.powerBarHeight * teamSize + self.db.bottomMargin * (teamSize - 1)
extraBarHeight = extraBarHeight + self.db.powerBarHeight local singleFrameHeight = self.db.healthBarHeight + powerBarHeight +
(self.db.highlightInset and 0 or self.db.highlightBorderSize * 2) + self.db.bottomMargin
-- Cooldown -- Highlight
margin = margin + 1 + self.db.highlightBorderSize * 2 + 1 -- + 1 space between health and power bar margin = margin + highlightBorderSize
height = height + self.db.highlightBorderSize * teamSize margin, height = Gladdy:LegacyPositioning(margin, height, teamSize)
if (self.db.cooldownYPos == "TOP" or self.db.cooldownYPos == "BOTTOM") and self.db.cooldown then -- GrowDirection
margin = margin + self.db.cooldownSize if (self.db.growDirection == "LEFT" or self.db.growDirection == "RIGHT") then
height = height + self.db.cooldownSize * teamSize height = self.db.healthBarHeight + powerBarHeight
end end
if (self.db.buffsCooldownPos == "TOP" or self.db.buffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsIconSize
height = height + self.db.buffsIconSize * teamSize
end
if (self.db.buffsBuffsCooldownPos == "TOP" or self.db.buffsBuffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsBuffsIconSize
height = height + self.db.buffsBuffsIconSize * teamSize
end
if self.db.buffsCooldownPos == "TOP" and self.db.cooldownYPos == "TOP" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
end
if self.db.buffsCooldownPos == "BOTTOM" and self.db.cooldownYPos == "BOTTOM" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
end
-- Classicon
width = width + iconSize
extraBarWidth = extraBarWidth + iconSize
-- Trinket
width = width + iconSize
self.frame:SetScale(self.db.frameScale) self.frame:SetScale(self.db.frameScale)
self.frame:SetWidth(width) self:PixelPerfectScale(false)
self.frame:SetWidth(self.db.barWidth + highlightBorderSize)
self.frame:SetHeight(height) self.frame:SetHeight(height)
--self.frame:SetBackdropColor(self.db.frameColor.r, self.db.frameColor.g, self.db.frameColor.b, self.db.frameColor.a) self.frame:ClearAllPoints()
self.frame.background:SetBackdropColor(Gladdy:SetColor(self.db.backgroundColor))
self.frame:ClearAllPoints() self.frame:ClearAllPoints()
if (self.db.x == 0 and self.db.y == 0) then if (self.db.x == 0 and self.db.y == 0) then
self.frame:SetPoint("CENTER") self.frame:SetPoint("CENTER")
else else
local scale = self.frame:GetEffectiveScale() local scale = self.frame:GetEffectiveScale()
if (self.db.growUp) then local growMiddle = self.db.growMiddle and teamSize > 0 and teamSize / 2 >= 1 and (teamSize - 1) * (singleFrameHeight / 2) or 0
self.frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, self.db.y / scale) if (self.db.growDirection == "TOP") then
self.frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale) - growMiddle)
elseif self.db.growDirection == "BOTTOM" then
self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale) + growMiddle)
else else
self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, self.db.y / scale) self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale))
end end
end end
self.anchor:SetWidth(width) --Anchor
self.anchor:SetWidth(self.db.barWidth * 2 + highlightBorderSize)
self.anchor:ClearAllPoints() self.anchor:ClearAllPoints()
if (self.db.growUp) then if (self.db.growDirection == "TOP") then
self.anchor:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") self.anchor:SetPoint("TOP", self.frame, "BOTTOM")
elseif self.growDirection == "BOTTOM" or self.growDirection == "RIGHT" then
self.anchor:SetPoint("BOTTOM", self.frame, "TOP")
else else
self.anchor:SetPoint("BOTTOMLEFT", self.frame, "TOPLEFT") self.anchor:SetPoint("BOTTOM", self.frame, "TOP")
end end
if (self.db.locked) then if (self.db.locked) then
self.anchor:Hide() self.anchor:Hide()
self.anchor:Hide()
else else
self.anchor:Show() self.anchor:Show()
end end
for i = 1, teamSize do for i = 1, teamSize do
local button = self.buttons["arena" .. i] local button = self.buttons["arena" .. i]
button:SetWidth(self.db.barWidth + extraBarWidth) button:SetWidth(self.db.barWidth)
button:SetHeight(self.db.healthBarHeight) button:SetHeight(self.db.healthBarHeight)
button.secure:SetWidth(self.db.barWidth + extraBarWidth) button.secure:SetWidth(self.db.barWidth)
button.secure:SetHeight(self.db.healthBarHeight + extraBarHeight) button.secure:SetHeight(self.db.healthBarHeight + powerBarHeight)
button:ClearAllPoints() button:ClearAllPoints()
button.secure:ClearAllPoints() button.secure:ClearAllPoints()
if (self.db.growUp) then if (self.db.growDirection == "TOP") then
if (i == 1) then if (i == 1) then
button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", self.db.padding + 2, 0) button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", 0, powerBarHeight)
button.secure:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", self.db.padding + 2, 0) button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin) button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin)
button.secure:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin) button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end end
else elseif (self.db.growDirection == "BOTTOM") then
if (i == 1) then if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", self.db.padding + 2, 0) button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, 0)
button.secure:SetPoint("TOPLEFT", self.frame, "TOPLEFT", self.db.padding + 2, 0) button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin) button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin)
button.secure:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin) button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "LEFT") then
if (i == 1) then
button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -0, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPRIGHT", self.buttons["arena" .. (i - 1)], "TOPLEFT", - self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "RIGHT") then
if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "TOPRIGHT", self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end end
end end
for k, v in self:IterModules() do for _, v in self:IterModules() do
self:Call(v, "UpdateFrame", button.unit) self:Call(v, "UpdateFrame", "arena" .. i)
end end
end end
for k, v in self:IterModules() do for _, v in self:IterModules() do
self:Call(v, "UpdateFrameOnce") self:Call(v, "UpdateFrameOnce")
end end
if Gladdy.db.hideBlizzard == "always" then
Gladdy:BlizzArenaSetAlpha(0)
elseif Gladdy.db.hideBlizzard == "arena" then
if Gladdy.curBracket then
Gladdy:BlizzArenaSetAlpha(0)
else
Gladdy:BlizzArenaSetAlpha(1)
end
elseif Gladdy.db.hideBlizzard == "never" then
Gladdy:BlizzArenaSetAlpha(1)
end
if (not Gladdy.db.newLayout) then
Gladdy.db.newLayout = true
--get margin
local arena1Bottom
local arena2Top
if (self.db.growDirection == "BOTTOM") then
arena1Bottom = self.buttons["arena1"].secure:GetBottom()
arena2Top = self.buttons["arena2"].secure:GetTop()
elseif (self.db.growDirection == "TOP") then
arena1Bottom = self.buttons["arena1"].secure:GetTop()
arena2Top = self.buttons["arena2"].secure:GetBottom()
elseif (self.db.growDirection == "LEFT") then
arena1Bottom = self.buttons["arena1"].secure:GetLeft()
arena2Top = self.buttons["arena2"].secure:GetRight()
elseif (self.db.growDirection == "RIGHT") then
arena1Bottom = self.buttons["arena1"].secure:GetRight()
arena2Top = self.buttons["arena2"].secure:GetLeft()
end
Gladdy.db.bottomMargin = math_abs(arena1Bottom - arena2Top)
Gladdy:UpdateFrame()
end
end end
function Gladdy:HideFrame() function Gladdy:HideFrame()
if (self.frame) then if (self.frame) then
self.frame:Hide() if InCombatLockdown() then
self.startTest = nil
self.hideFrame = true
else
self:Reset()
self.frame:Hide()
end
self.frame.testing = nil self.frame.testing = nil
end end
end end
function Gladdy:ToggleFrame(i) function Gladdy:ToggleFrame(i)
self:Reset() self:Reset()
if (self.frame and self.frame:IsShown() and i == self.curBracket) then if (self.frame and self.frame:IsShown() and i == self.curBracket) then
self.frame.testing = nil
self:HideFrame() self:HideFrame()
else else
self.curBracket = i self.curBracket = i
@ -238,6 +294,7 @@ function Gladdy:ToggleFrame(i)
if (not self.frame) then if (not self.frame) then
self:CreateFrame() self:CreateFrame()
end end
self.frame.testing = true
for o = 1, self.curBracket do for o = 1, self.curBracket do
local unit = "arena" .. o local unit = "arena" .. o
@ -245,9 +302,17 @@ function Gladdy:ToggleFrame(i)
self:CreateButton(o) self:CreateButton(o)
end end
end end
self:Reset()
self.curBracket = i
self:UpdateFrame() self:UpdateFrame()
self:Test() if InCombatLockdown() then
self.frame:Show() Gladdy:Print("Gladdy frames show as soon as you leave combat")
self.showFrame = true
self.startTest = true
else
self:Test()
self.frame:Show()
end
end end
end end
@ -257,32 +322,225 @@ function Gladdy:CreateButton(i)
end end
local button = CreateFrame("Frame", "GladdyButtonFrame" .. i, self.frame) local button = CreateFrame("Frame", "GladdyButtonFrame" .. i, self.frame)
button:SetAlpha(0) button:EnableMouse(false)
--button:SetAlpha(0)
--button.texture = button:CreateTexture(nil, "OVERLAY")
--button.texture:SetAllPoints(button)
--button.texture:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
local secure = CreateFrame("Button", "GladdyButton" .. i, button, "SecureActionButtonTemplate") local secure = CreateFrame("Button", "GladdyButton" .. i, button, "SecureActionButtonTemplate, SecureHandlerEnterLeaveTemplate")
secure:RegisterForClicks("AnyUp") secure:RegisterForClicks("AnyUp")
secure:RegisterForClicks("AnyUp") secure:RegisterForClicks("AnyDown")
secure:SetAttribute("*type1", "target")
secure:SetAttribute("*type2", "focus") secure:SetAttribute("target", "arena" .. i)
secure:SetAttribute("focus", "arena" .. i)
secure:SetAttribute("unit", "arena" .. i) secure:SetAttribute("unit", "arena" .. i)
button:RegisterEvent("UNIT_NAME_UPDATE") --[[
button:RegisterEvent("ARENA_OPPONENT_UPDATE") secure:SetAttribute("target", i == 1 and "player" or "focus")
button:RegisterEvent("ARENA_COOLDOWNS_UPDATE") secure:SetAttribute("focus", i == 1 and "player" or "focus")
button:RegisterEvent("ARENA_CROWD_CONTROL_SPELL_UPDATE") secure:SetAttribute("unit", i == 1 and "player" or "focus")
button:RegisterUnitEvent("UNIT_CONNECTION", "arena" .. i) --]]
--secure.texture = secure:CreateTexture(nil, "OVERLAY")
--secure.texture:SetAllPoints(secure)
--secure.texture:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
button.id = i button.id = i
--button.unit = i == 1 and "player" or "focus"
button.unit = "arena" .. i button.unit = "arena" .. i
button.secure = secure button.secure = secure
self:ResetButton(button.unit) self:ResetButton("arena" .. i)
self.buttons[button.unit] = button self.buttons["arena" .. i] = button
for k, v in self:IterModules() do for _, v in self:IterModules() do
self:Call(v, "CreateFrame", button.unit) self:Call(v, "CreateFrame", "arena" .. i)
end
self:ResetButton("arena" .. i)
end
function Gladdy:SetPosition(frame, unit, xOffsetDB, yOffsetDB, newLayout, module)
local button = self.buttons[unit]
if not button or not frame or not xOffsetDB or not yOffsetDB then
return
end
if (not newLayout) then
--Gladdy:Debug("INFO", name, "old X/Y:", frame:GetCenter())
local xOffset, yOffset = frame:GetLeft(), frame:GetTop()
if not xOffset or not yOffset then
xOffset = frame:GetCenter()-- - frame:GetWidth()/2
yOffset = select(2, frame:GetCenter())-- + frame:GetHeight()/2
end
local x,y = button.healthBar:GetLeft(), button.healthBar:GetTop()
local newXOffset = math_abs(x - xOffset) * (x > xOffset and -1 or 1)
local newYOffset = math_abs(y - yOffset) * (y > yOffset and -1 or 1)
frame:ClearAllPoints()
frame:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", newXOffset, newYOffset)
--Gladdy:Debug("INFO", name, "new X/Y:", frame:GetCenter())
if unit == "arena1" then
Gladdy.db[xOffsetDB] = newXOffset
Gladdy.db[yOffsetDB] = newYOffset
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end
else
frame:ClearAllPoints()
frame:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", Gladdy.db[xOffsetDB], Gladdy.db[yOffsetDB])
end
if (self.newDefaults[module.name]) then
for k,v in pairs(self.newDefaults[module.name]) do
module.defaults[k] = v
end
end
end
function Gladdy:CreateMover(frame, xConfig, yConfig, name, points, width, height, xOffset, yOffset, activated)
if not frame.mover then
frame:EnableMouse(false)
frame:SetMovable(true)
frame.mover = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate")
frame.mover:SetFrameStrata("TOOLTIP")
frame.mover:SetPoint(points[1], frame, points[2], xOffset or 0, yOffset or 0)
frame.mover:SetHeight(height or frame:GetHeight())
frame.mover:SetWidth(width or frame:GetWidth())
local backdrop = {
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "",
tile = true, tileSize = 16, edgeSize = 10,
insets = {left = 0, right = 0, top = 0, bottom = 0}
}
frame.mover:SetBackdrop(backdrop)
frame.mover:SetBackdropColor(0,1,0,0.5)
frame.mover.border = CreateFrame("Frame", nil, frame.mover, BackdropTemplateMixin and "BackdropTemplate")
frame.mover.border:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = 2 })
frame.mover.border:SetAllPoints(frame.mover)
frame.mover.border:SetBackdropBorderColor(0,1,0,1)
frame.mover.border:SetFrameStrata("TOOLTIP")
frame.mover.text = frame.mover.border:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
frame.mover.text:SetText(name)
frame.mover.text:SetPoint("CENTER")
frame.mover:SetMovable(true)
frame.mover:EnableMouse(true)
frame.mover:SetScript("OnMouseDown", function(self)
self.point = { frame:GetPoint() }
self.start = { frame:GetCenter() }
frame:StartMoving()
self:StartMoving()
end)
frame.mover:SetScript("OnMouseUp", function(self)
frame:StopMovingOrSizing()
self:StopMovingOrSizing()
self.stop = { frame:GetCenter() }
local diffX = math_abs(self.start[1] - self.stop[1])
diffX = self.start[1] > self.stop[1] and -diffX or diffX
local diffY = math_abs(self.start[2] - self.stop[2])
diffY = self.start[2] > self.stop[2] and -diffY or diffY
frame:ClearAllPoints()
frame:SetPoint(self.point[1], self.point[2], self.point[3], self.point[4] + diffX, self.point[5] + diffY)
Gladdy.db[xConfig] = self.point[4] + diffX
Gladdy.db[yConfig] = self.point[5] + diffY
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
Gladdy:UpdateFrame()
end)
else
frame.mover:ClearAllPoints()
frame.mover:SetPoint(points[1], frame, points[2], xOffset or 0, yOffset or 0)
frame.mover:SetHeight(height or frame:GetHeight())
frame.mover:SetWidth(width or frame:GetWidth())
end
if self.frame and self.frame.testing and self.db.showMover then
if (activated ~= nil and not Gladdy.db[activated]) then
frame.mover:Hide()
else
frame.mover:Show()
end
else
frame.mover:Hide()
end
end
---------------------------
-- LAGACY SUPPORT
---------------------------
function Gladdy:LegacyPositioning(margin, height, teamSize)
if not Gladdy.db.newLayout then
for k,v in pairs(Gladdy.legacy) do
if Gladdy.db[k] == nil then
Gladdy:Debug("INFO", "Gladdy:LegacyPositioning write", k,v)
Gladdy.db[k] = v
else
Gladdy:Debug("INFO", "Gladdy:LegacyPositioning found", k,v)
end
end
if (self.db.cooldownYPos == "TOP" or self.db.cooldownYPos == "BOTTOM") and self.db.cooldown then
margin = margin + self.db.cooldownSize
height = height + self.db.cooldownSize * (teamSize - 1)
end
if (self.db.buffsCooldownPos == "TOP" or self.db.buffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsIconSize
height = height + self.db.buffsIconSize * (teamSize - 1)
end
if (self.db.buffsBuffsCooldownPos == "TOP" or self.db.buffsBuffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsBuffsIconSize
height = height + self.db.buffsBuffsIconSize * (teamSize - 1)
end
if self.db.buffsCooldownPos == "TOP" and self.db.cooldownYPos == "TOP" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
if self.db.buffsCooldownPos == "BOTTOM" and self.db.cooldownYPos == "BOTTOM" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
end
return margin, height
end
function Gladdy:PositionButton(button, i, leftSize, rightSize, powerBarHeight, margin)
if (self.db.growDirection == "TOP") then
if (i == 1) then
button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", leftSize, powerBarHeight)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "BOTTOM") then
if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "LEFT") then
if (i == 1) then
button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -rightSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPRIGHT", self.buttons["arena" .. (i - 1)], "TOPLEFT", -rightSize - leftSize - self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "RIGHT") then
if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "TOPRIGHT", leftSize + rightSize + self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
end end
end end

View File

@ -5,15 +5,21 @@ local select = select
local pairs = pairs local pairs = pairs
local tinsert = table.insert local tinsert = table.insert
local tsort = table.sort local tsort = table.sort
local str_lower = string.lower
local GetTime = GetTime
local GetPhysicalScreenSize = GetPhysicalScreenSize
local InCombatLockdown = InCombatLockdown
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME
local IsAddOnLoaded = IsAddOnLoaded local IsAddOnLoaded = IsAddOnLoaded
local IsInInstance = IsInInstance
local GetBattlefieldStatus = GetBattlefieldStatus local GetBattlefieldStatus = GetBattlefieldStatus
local IsActiveBattlefieldArena = IsActiveBattlefieldArena local IsActiveBattlefieldArena = IsActiveBattlefieldArena
local IsInInstance = IsInInstance
local GetNumArenaOpponents = GetNumArenaOpponents
local RELEASE_TYPES = { alpha = "Alpha", beta = "Beta", release = "Release"} local RELEASE_TYPES = { alpha = "Alpha", beta = "Beta", release = "Release"}
local PREFIX = "TBC-Classic_v" local PREFIX = "Gladdy v"
local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)" local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)"
local LibStub = LibStub
--------------------------- ---------------------------
@ -21,16 +27,18 @@ local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)"
--------------------------- ---------------------------
local MAJOR, MINOR = "Gladdy", 4 local MAJOR, MINOR = "Gladdy", 7
local Gladdy = LibStub:NewLibrary(MAJOR, MINOR) local Gladdy = LibStub:NewLibrary(MAJOR, MINOR)
local L local L
Gladdy.version_major_num = 1 Gladdy.version_major_num = 2
Gladdy.version_minor_num = 0.05 Gladdy.version_minor_num = 0.11
Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num
Gladdy.version_releaseType = RELEASE_TYPES.beta Gladdy.version_releaseType = RELEASE_TYPES.release
Gladdy.version = PREFIX .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType Gladdy.version = PREFIX .. string.format("%.2f", Gladdy.version_num) .. "-" .. Gladdy.version_releaseType
Gladdy.VERSION_REGEX = VERSION_REGEX Gladdy.VERSION_REGEX = VERSION_REGEX
Gladdy.debug = false
LibStub("AceTimer-3.0"):Embed(Gladdy) LibStub("AceTimer-3.0"):Embed(Gladdy)
LibStub("AceComm-3.0"):Embed(Gladdy) LibStub("AceComm-3.0"):Embed(Gladdy)
Gladdy.modules = {} Gladdy.modules = {}
@ -52,6 +60,17 @@ function Gladdy:Print(...)
end end
function Gladdy:Warn(...) function Gladdy:Warn(...)
local text = "|cfff29f05Gladdy|r:"
local val
for i = 1, select("#", ...) do
val = select(i, ...)
if (type(val) == 'boolean') then val = val and "true" or false end
text = text .. " " .. tostring(val)
end
DEFAULT_CHAT_FRAME:AddMessage(text)
end
function Gladdy:Error(...)
local text = "|cfffc0303Gladdy|r:" local text = "|cfffc0303Gladdy|r:"
local val local val
for i = 1, select("#", ...) do for i = 1, select("#", ...) do
@ -62,13 +81,38 @@ function Gladdy:Warn(...)
DEFAULT_CHAT_FRAME:AddMessage(text) DEFAULT_CHAT_FRAME:AddMessage(text)
end end
function Gladdy:Debug(lvl, ...)
if Gladdy.debug then
if lvl == "INFO" then
Gladdy:Print(...)
elseif lvl == "WARN" then
Gladdy:Warn(...)
elseif lvl == "ERROR" then
Gladdy:Error(...)
end
end
end
Gladdy.events = CreateFrame("Frame") Gladdy.events = CreateFrame("Frame")
Gladdy.events.registered = {} Gladdy.events.registered = {}
Gladdy.events:RegisterEvent("PLAYER_LOGIN") Gladdy.events:RegisterEvent("PLAYER_LOGIN")
Gladdy.events:RegisterEvent("PLAYER_LOGOUT")
Gladdy.events:RegisterEvent("CVAR_UPDATE")
hooksecurefunc("VideoOptionsFrameOkay_OnClick", function(self, button, down, apply)
if (self:GetName() == "VideoOptionsFrameApply") then
Gladdy:PixelPerfectScale(true)
end
end)
Gladdy.events:SetScript("OnEvent", function(self, event, ...) Gladdy.events:SetScript("OnEvent", function(self, event, ...)
if (event == "PLAYER_LOGIN") then if (event == "PLAYER_LOGIN") then
Gladdy:OnInitialize() Gladdy:OnInitialize()
Gladdy:OnEnable() Gladdy:OnEnable()
elseif (event == "CVAR_UPDATE") then
if (str_lower(select(1, ...)) == "uiscale") then
Gladdy:PixelPerfectScale(true)
end
elseif (event == "PLAYER_LOGOUT") then
Gladdy:DeleteUnknownOptions(Gladdy.db, Gladdy.defaults.profile)
else else
local func = self.registered[event] local func = self.registered[event]
@ -131,8 +175,8 @@ function Gladdy:Call(module, func, ...)
end end
end end
function Gladdy:SendMessage(message, ...) function Gladdy:SendMessage(message, ...)
for k, v in self:IterModules() do for _, module in self:IterModules() do
self:Call(v, v.messages[message], ...) self:Call(module, module.messages[message], ...)
end end
end end
@ -143,10 +187,32 @@ function Gladdy:NewModule(name, priority, defaults)
module.defaults = defaults or {} module.defaults = defaults or {}
module.messages = {} module.messages = {}
module.RegisterMessages = function(self, ...)
for _,message in pairs({...}) do
self.messages[message] = message
end
end
module.RegisterMessage = function(self, message, func) module.RegisterMessage = function(self, message, func)
self.messages[message] = func or message self.messages[message] = func or message
end end
module.UnregisterMessage = function(self, message)
self.messages[message] = nil
end
module.UnregisterMessages = function(self, ...)
for _,message in pairs({...}) do
self.messages[message] = nil
end
end
module.UnregisterAllMessages = function(self)
for msg,_ in pairs(self.messages) do
self.messages[msg] = nil
end
end
module.GetOptions = function() module.GetOptions = function()
return nil return nil
end end
@ -172,11 +238,11 @@ function Gladdy:DeleteUnknownOptions(tbl, refTbl, str)
end end
for k,v in pairs(tbl) do for k,v in pairs(tbl) do
if refTbl[k] == nil then if refTbl[k] == nil then
--Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "not found!") Gladdy:Debug("INFO", "SavedVariable deleted:", str .. "." .. k, "not found!")
tbl[k] = nil tbl[k] = nil
else else
if type(v) ~= type(refTbl[k]) then if type(v) ~= type(refTbl[k]) then
--Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "type error!", "Expected", type(refTbl[k]), "but found", type(v)) Gladdy:Debug("INFO", "SavedVariable deleted:", str .. "." .. k, "type error!", "Expected", type(refTbl[k]), "but found", type(v))
tbl[k] = nil tbl[k] = nil
elseif type(v) == "table" then elseif type(v) == "table" then
Gladdy:DeleteUnknownOptions(v, refTbl[k], str .. "." .. k) Gladdy:DeleteUnknownOptions(v, refTbl[k], str .. "." .. k)
@ -185,11 +251,28 @@ function Gladdy:DeleteUnknownOptions(tbl, refTbl, str)
end end
end end
function Gladdy:PixelPerfectScale(update)
local physicalWidth, physicalHeight = GetPhysicalScreenSize()
local perfectUIScale = 768.0/physicalHeight--768/select(2, strsplit("x",({ GetScreenResolutions()})[GetCurrentResolution()]))
if self.db and self.db.pixelPerfect and self.frame then
self.frame:SetIgnoreParentScale(true)
self.frame:SetScale(perfectUIScale)
--local adaptiveScale = (GetCVar("useUiScale") == "1" and 1.0 + perfectUIScale - GetCVar("UIScale") or perfectUIScale)
--self.frame:SetScale(adaptiveScale)
if update then
self:UpdateFrame()
end
elseif self.frame then
self.frame:SetScale(self.db.frameScale)
self.frame:SetIgnoreParentScale(false)
end
end
function Gladdy:OnInitialize() function Gladdy:OnInitialize()
self.dbi = LibStub("AceDB-3.0"):New("GladdyXZ", self.defaults) self.dbi = LibStub("AceDB-3.0"):New("GladdyXZ", self.defaults)
self.dbi.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged") self.dbi.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged")
self.dbi.RegisterCallback(self, "OnProfileCopied", "OnProfileChanged") self.dbi.RegisterCallback(self, "OnProfileCopied", "OnProfileChanged")
self.dbi.RegisterCallback(self, "OnProfileReset", "OnProfileChanged") self.dbi.RegisterCallback(self, "OnProfileReset", "OnProfileReset")
self.db = self.dbi.profile self.db = self.dbi.profile
self.LSM = LibStub("LibSharedMedia-3.0") self.LSM = LibStub("LibSharedMedia-3.0")
@ -197,18 +280,20 @@ function Gladdy:OnInitialize()
self.LSM:Register("statusbar", "Smooth", "Interface\\AddOns\\Gladdy\\Images\\Smooth") self.LSM:Register("statusbar", "Smooth", "Interface\\AddOns\\Gladdy\\Images\\Smooth")
self.LSM:Register("statusbar", "Minimalist", "Interface\\AddOns\\Gladdy\\Images\\Minimalist") self.LSM:Register("statusbar", "Minimalist", "Interface\\AddOns\\Gladdy\\Images\\Minimalist")
self.LSM:Register("statusbar", "LiteStep", "Interface\\AddOns\\Gladdy\\Images\\LiteStep.tga") self.LSM:Register("statusbar", "LiteStep", "Interface\\AddOns\\Gladdy\\Images\\LiteStep.tga")
self.LSM:Register("statusbar", "Flat", "Interface\\AddOns\\Gladdy\\Images\\UI-StatusBar")
self.LSM:Register("border", "Gladdy Tooltip round", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_round_selfmade") self.LSM:Register("border", "Gladdy Tooltip round", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_round_selfmade")
self.LSM:Register("border", "Gladdy Tooltip squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade") self.LSM:Register("border", "Gladdy Tooltip squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade")
self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF") self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF")
self.LSM:Register("border", "Square Full White", "Interface\\AddOns\\Gladdy\\Images\\Square_FullWhite.tga")
L = self.L L = self.L
self.testData = { self.testData = {
["arena1"] = { name = "Swift", raceLoc = L["Tauren"], classLoc = L["Warrior"], class = "WARRIOR", health = 9635, healthMax = 14207, power = 76, powerMax = 100, powerType = 1, testSpec = L["Arms"], race = "Tauren" }, ["arena1"] = { name = "Swift", raceLoc = L["NightElf"], classLoc = L["Druid"], class = "DRUID", health = 67, healthMax = 100, power = 76, powerMax = 100, powerType = 1, testSpec = L["Restoration"], race = "NightElf" },
["arena2"] = { name = "Vilden", raceLoc = L["Undead"], classLoc = L["Mage"], class = "MAGE", health = 10969, healthMax = 11023, power = 7833, powerMax = 10460, powerType = 0, testSpec = L["Frost"], race = "Scourge" }, ["arena2"] = { name = "Vilden", raceLoc = L["Undead"], classLoc = L["Mage"], class = "MAGE", health = 99, healthMax = 100, power = 7833, powerMax = 10460, powerType = 0, testSpec = L["Frost"], race = "Scourge" },
["arena3"] = { name = "Krymu", raceLoc = L["Human"], classLoc = L["Rogue"], class = "ROGUE", health = 1592, healthMax = 11740, power = 45, powerMax = 110, powerType = 3, testSpec = L["Subtlety"], race = "Human" }, ["arena3"] = { name = "Krymu", raceLoc = L["Human"], classLoc = L["Rogue"], class = "ROGUE", health = 10, healthMax = 100, power = 45, powerMax = 110, powerType = 3, testSpec = L["Subtlety"], race = "Human" },
["arena4"] = { name = "Talmon", raceLoc = L["Human"], classLoc = L["Warlock"], class = "WARLOCK", health = 10221, healthMax = 14960, power = 9855, powerMax = 9855, powerType = 0, testSpec = L["Demonology"], race = "Human" }, ["arena4"] = { name = "Talmon", raceLoc = L["Human"], classLoc = L["Warlock"], class = "WARLOCK", health = 40, healthMax = 100, power = 9855, powerMax = 9855, powerType = 0, testSpec = L["Demonology"], race = "Human" },
["arena5"] = { name = "Hydra", raceLoc = L["Undead"], classLoc = L["Priest"], class = "PRIEST", health = 11960, healthMax = 11960, power = 2515, powerMax = 10240, powerType = 0, testSpec = L["Discipline"], race = "Human" }, ["arena5"] = { name = "Hydra", raceLoc = L["Undead"], classLoc = L["Priest"], class = "PRIEST", health = 70, healthMax = 100, power = 2515, powerMax = 10240, powerType = 0, testSpec = L["Discipline"], race = "Human" },
} }
self.cooldownSpellIds = {} self.cooldownSpellIds = {}
@ -219,27 +304,44 @@ function Gladdy:OnInitialize()
self.guids = {} self.guids = {}
self.curBracket = nil self.curBracket = nil
self.curUnit = 1 self.curUnit = 1
self.lastInstance = nil
self:SetupOptions() self:SetupOptions()
for k, v in self:IterModules() do for _, module in self:IterModules() do
self:Call(v, "Initialize") -- B.E > A.E :D self:Call(module, "Initialize") -- B.E > A.E :D
end end
self:DeleteUnknownOptions(self.db, self.defaults.profile) if Gladdy.db.hideBlizzard == "always" then
Gladdy:BlizzArenaSetAlpha(0)
end
if not self.db.newLayout then
self:ToggleFrame(3)
self:HideFrame()
end
end
function Gladdy:OnProfileReset()
self.db = self.dbi.profile
Gladdy:Debug("INFO", "OnProfileReset")
self:HideFrame()
self:ToggleFrame(3)
Gladdy.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
Gladdy.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end end
function Gladdy:OnProfileChanged() function Gladdy:OnProfileChanged()
self.db = self.dbi.profile self.db = self.dbi.profile
self:DeleteUnknownOptions(self.db, self.defaults.profile)
self:HideFrame() self:HideFrame()
self:ToggleFrame(3) self:ToggleFrame(3)
Gladdy.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
Gladdy.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end end
function Gladdy:OnEnable() function Gladdy:OnEnable()
self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS")
self:RegisterEvent("PLAYER_ENTERING_WORLD") self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("PLAYER_REGEN_ENABLED")
if (IsAddOnLoaded("Clique")) then if (IsAddOnLoaded("Clique")) then
for i = 1, 5 do for i = 1, 5 do
@ -266,6 +368,7 @@ function Gladdy:OnEnable()
self:HideFrame() self:HideFrame()
self:ToggleFrame(3) self:ToggleFrame(3)
self.showConfig = true
end end
end end
@ -285,23 +388,28 @@ end
--------------------------- ---------------------------
function Gladdy:Test() function Gladdy:Test()
Gladdy.frame.testing = true self.frame.testing = true
for i = 1, self.curBracket do if self.curBracket then
local unit = "arena" .. i for i = 1, self.curBracket do
if (not self.buttons[unit]) then local unit = "arena" .. i
self:CreateButton(i) if (not self.buttons[unit]) then
end self:CreateButton(i)
local button = self.buttons[unit] end
local button = self.buttons[unit]
for k, v in pairs(self.testData[unit]) do for k, v in pairs(self.testData[unit]) do
button[k] = v button[k] = v
end end
for k, v in self:IterModules() do for _, module in self:IterModules() do
self:Call(v, "Test", unit) self:Call(module, "Test", unit)
end end
button:SetAlpha(1) button:SetAlpha(1)
end
for _, module in self:IterModules() do
self:Call(module, "TestOnce")
end
end end
end end
@ -312,26 +420,44 @@ end
--------------------------- ---------------------------
function Gladdy:PLAYER_ENTERING_WORLD() function Gladdy:PLAYER_ENTERING_WORLD()
local instance = select(2, IsInInstance()) if self.showConfig then
if (instance ~= "arena" and self.frame and self.frame:IsVisible() and not self.frame.testing) then LibStub("AceConfigDialog-3.0"):Open("Gladdy", nil, LibStub("AceConfigDialog-3.0"):SelectGroup("Gladdy", "XiconProfiles"))
self.showConfig = nil
end
if (self.frame and self.frame:IsVisible()) then
self:Reset() self:Reset()
self:HideFrame() self:HideFrame()
end end
if (instance == "arena") then
self:Reset()
self:HideFrame()
end
self.lastInstance = instance
end end
function Gladdy:UPDATE_BATTLEFIELD_STATUS(_, index) function Gladdy:UPDATE_BATTLEFIELD_STATUS(_, index)
local status, mapName, instanceID, levelRangeMin, levelRangeMax, teamSize, isRankedArena, suspendedQueue, bool, queueType = GetBattlefieldStatus(index) local status, mapName, instanceID, levelRangeMin, levelRangeMax, teamSize, isRankedArena, suspendedQueue, bool, queueType = GetBattlefieldStatus(index)
if (status == "active" and teamSize > 0 and IsActiveBattlefieldArena()) then local instanceType = select(2, IsInInstance())
Gladdy:Debug("INFO", "UPDATE_BATTLEFIELD_STATUS", instanceType, status, teamSize)
if ((instanceType == "arena" or GetNumArenaOpponents() > 0) and status == "active" and teamSize > 0) then
self.curBracket = teamSize self.curBracket = teamSize
self:JoinedArena() self:JoinedArena()
end end
end end
function Gladdy:PLAYER_REGEN_ENABLED()
if self.showFrame then
self:UpdateFrame()
if self.startTest then
self:Test()
self.startTest = nil
end
self.frame:Show()
self:SendMessage("JOINED_ARENA")
self.showFrame = nil
end
if self.hideFrame then
self:Reset()
self.frame:Hide()
self.hideFrame = nil
end
end
--------------------------- ---------------------------
-- RESET FUNCTIONS (ARENA LEAVE) -- RESET FUNCTIONS (ARENA LEAVE)
@ -340,7 +466,7 @@ end
function Gladdy:Reset() function Gladdy:Reset()
if type(self.guids) == "table" then if type(self.guids) == "table" then
for k, v in pairs(self.guids) do for k,_ in pairs(self.guids) do
self.guids[k] = nil self.guids[k] = nil
end end
end end
@ -348,13 +474,16 @@ function Gladdy:Reset()
self.curBracket = nil self.curBracket = nil
self.curUnit = 1 self.curUnit = 1
for k1, v1 in self:IterModules() do for _, module in self:IterModules() do
self:Call(v1, "Reset") self:Call(module, "Reset")
end end
for unit in pairs(self.buttons) do for unit in pairs(self.buttons) do
self:ResetUnit(unit) self:ResetUnit(unit)
end end
if Gladdy.db.hideBlizzard == "never" or Gladdy.db.hideBlizzard == "arena" then
Gladdy:BlizzArenaSetAlpha(1)
end
end end
function Gladdy:ResetUnit(unit) function Gladdy:ResetUnit(unit)
@ -366,8 +495,8 @@ function Gladdy:ResetUnit(unit)
button:SetAlpha(0) button:SetAlpha(0)
self:ResetButton(unit) self:ResetButton(unit)
for k2, v2 in self:IterModules() do for _, module in self:IterModules() do
self:Call(v2, "ResetUnit", unit) self:Call(module, "ResetUnit", unit)
end end
end end
@ -381,7 +510,7 @@ function Gladdy:ResetButton(unit)
button[k1] = nil button[k1] = nil
elseif (type(v1) == "number") then elseif (type(v1) == "number") then
button[k1] = 0 button[k1] = 0
elseif (type(v1) == "array") then elseif (type(v1) == "table") then
button[k1] = {} button[k1] = {}
elseif (type(v1) == "boolean") then elseif (type(v1) == "boolean") then
button[k1] = false button[k1] = false
@ -406,10 +535,83 @@ function Gladdy:JoinedArena()
end end
end end
self:SendMessage("JOINED_ARENA") if InCombatLockdown() then
self:UpdateFrame() Gladdy:Print("Gladdy frames show as soon as you leave combat")
self.frame:Show() self.showFrame = true
else
self:UpdateFrame()
self.frame:Show()
self:SendMessage("JOINED_ARENA")
end
for i=1, self.curBracket do for i=1, self.curBracket do
self.buttons["arena" .. i]:SetAlpha(1) self.buttons["arena" .. i]:SetAlpha(1)
end end
if Gladdy.db.hideBlizzard == "arena" or Gladdy.db.hideBlizzard == "always" then
Gladdy:BlizzArenaSetAlpha(0)
end
end end
---------------------------
-- BLIZZARD FRAMES
---------------------------
function Gladdy:BlizzArenaSetAlpha(alpha)
if IsAddOnLoaded("Blizzard_ArenaUI") then
if (ArenaEnemyFrames) then
ArenaEnemyFrames:SetAlpha(alpha)
end
if ArenaEnemyFrame1 then
ArenaEnemyFrame1:SetAlpha(alpha)
end
if ArenaEnemyFrame1PetFrame then
ArenaEnemyFrame1PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame2 then
ArenaEnemyFrame2:SetAlpha(alpha)
end
if ArenaEnemyFrame2PetFrame then
ArenaEnemyFrame2PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame3 then
ArenaEnemyFrame3:SetAlpha(alpha)
end
if ArenaEnemyFrame3PetFrame then
ArenaEnemyFrame3PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame4 then
ArenaEnemyFrame4:SetAlpha(alpha)
end
if ArenaEnemyFrame4PetFrame then
ArenaEnemyFrame4PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame5 then
ArenaEnemyFrame5:SetAlpha(alpha)
end
if ArenaEnemyFrame5PetFrame then
ArenaEnemyFrame5PetFrame:SetAlpha(alpha)
end
end
end
---------------------------
-- FONT/STATUSBAR/BORDER
---------------------------
local defaults = {["statusbar"] = "Smooth", ["border"] = "Gladdy Tooltip round", ["font"] = "DorisPP"}
local lastWarning = {}
function Gladdy:SMFetch(lsmType, key)
local smMediaType = self.LSM:Fetch(lsmType, Gladdy.db[key])
if (smMediaType == nil and Gladdy.db[key] ~= "None") then
if not lastWarning[key] or GetTime() - lastWarning[key] > 120 then
lastWarning[key] = GetTime()
Gladdy:Warn("Could not find", "\"" .. lsmType .. "\" \"", Gladdy.db[key], " \" for", "\"" .. key .. "\"", "- setting it to", "\"" .. defaults[lsmType] .. "\"")
end
return self.LSM:Fetch(lsmType, defaults[lsmType])
end
return smMediaType
end

View File

@ -1,11 +1,11 @@
## Interface: 20501 ## Interface: 20504
## Title: Gladdy - TBC ## Title: Gladdy - TBC
## Version: 1.0.5-Beta ## Version: 2.11-Release
## Notes: The most powerful arena AddOn for WoW 2.5.1 ## Notes: The most powerful arena AddOn for WoW 2.5.4
## Author: XiconQoo, DnB_Junkee, Knall ## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751 ## X-Email: contact me on discord Knall#1751
## SavedVariables: GladdyXZ ## SavedVariables: GladdyXZ
## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText ## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText, Plater, Kui_Nameplates, NeatPlates, TidyPlates_ThreatPlates, Tukui, ElvUI
embeds.xml embeds.xml
@ -15,6 +15,7 @@ Frame.lua
Options.lua Options.lua
Constants.lua Constants.lua
ImportStrings.lua ImportStrings.lua
Util.lua
Modules\Announcements.lua Modules\Announcements.lua
Modules\Healthbar.lua Modules\Healthbar.lua
@ -22,9 +23,11 @@ Modules\Powerbar.lua
Modules\Auras.lua Modules\Auras.lua
Modules\Castbar.lua Modules\Castbar.lua
Modules\Classicon.lua Modules\Classicon.lua
Modules\Clicks.lua
Modules\Diminishings.lua Modules\Diminishings.lua
Modules\Highlight.lua Modules\Highlight.lua
Modules\TotemPlates.lua Modules\TotemPlates.lua
Modules\TotemPulse.lua
Modules\Trinket.lua Modules\Trinket.lua
Modules\Racial.lua Modules\Racial.lua
Modules\Cooldowns.lua Modules\Cooldowns.lua
@ -34,4 +37,7 @@ Modules\VersionCheck.lua
Modules\XiconProfiles.lua Modules\XiconProfiles.lua
Modules\Pets.lua Modules\Pets.lua
Modules\ExportImport.lua Modules\ExportImport.lua
Modules\CombatIndicator.lua
Modules\RangeCheck.lua
Modules\ShadowsightTimer.lua
EventListener.lua EventListener.lua

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Images/Countdown/Horde.blp Normal file

Binary file not shown.

BIN
Images/Square_FullWhite.tga Normal file

Binary file not shown.

BIN
Images/UI-StatusBar.blp Normal file

Binary file not shown.

BIN
Images/downarrow.blp Normal file

Binary file not shown.

BIN
Images/mask.blp Normal file

Binary file not shown.

BIN
Images/trinket.blp Normal file

Binary file not shown.

BIN
Images/uparrow.blp Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

1800
Lang.lua

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
local major = "DRData-1.0" local major = "DRData-1.0-BCC"
local minor = tonumber(string.match("$Revision: 793$", "(%d+)") or 1) local minor = tonumber(string.match("$Revision: 793$", "(%d+)") or 1)
assert(LibStub, string.format("%s requires LibStub.", major)) assert(LibStub, string.format("%s requires LibStub.", major))
@ -6,8 +6,6 @@ assert(LibStub, string.format("%s requires LibStub.", major))
local Data = LibStub:NewLibrary(major, minor) local Data = LibStub:NewLibrary(major, minor)
if( not Data ) then return end if( not Data ) then return end
if( IS_WRATH_BUILD == nil ) then IS_WRATH_BUILD = (select(4, GetBuildInfo()) >= 30000) end
-- How long before DR resets -- How long before DR resets
Data.RESET_TIME = 18 Data.RESET_TIME = 18
@ -141,6 +139,9 @@ Data.spells = {
-- Revenge Stun -- Revenge Stun
[12798] = "rndstun", [12798] = "rndstun",
-- Pyroclasm
[18093] = "rndstun",
--[[ CYCLONE ]]-- --[[ CYCLONE ]]--
-- Blind -- Blind
@ -169,54 +170,69 @@ Data.spells = {
[9853] = "root", [9853] = "root",
[26989] = "root", [26989] = "root",
-- Nature's Grasp
[19975] = "root",
[19974] = "root",
[19973] = "root",
[19972] = "root",
[19971] = "root",
[19970] = "root",
[27010] = "root",
--[[ RANDOM ROOTS ]]-- --[[ RANDOM ROOTS ]]--
-- Improved Hamstring -- Improved Hamstring
[23694] = "rndroot", [23694] = "rndroot",
-- Entrapment (Hunter Talent)
[19185] = "rndroot",
-- Improved Wingclip
[19229] = "rndroot",
-- Frostbite -- Frostbite
[12494] = "rndroot", [12494] = "rndroot",
--[[ SLEEPS ]]-- --[[ SLEEPS ]]--
-- Hibernate -- Hibernate
[2637] = "sleep", [2637] = "disorient",
[18657] = "sleep", [18657] = "disorient",
[18658] = "sleep", [18658] = "disorient",
-- Wyvern Sting -- Wyvern Sting
[19386] = "sleep", [19386] = "disorient",
[24132] = "sleep", [24132] = "disorient",
[24133] = "sleep", [24133] = "disorient",
[27068] = "sleep", [27068] = "disorient",
--[[ MISC ]]-- --[[ MISC ]]--
-- Chastise (Maybe this shares DR with Imp HS?) -- Chastise
[44041] = "root", [44041] = "chastise",
[44043] = "root", [44043] = "chastise",
[44044] = "root", [44044] = "chastise",
[44045] = "root", [44045] = "chastise",
[44046] = "root", [44046] = "chastise",
[44047] = "root", [44047] = "chastise",
-- Dragon's Breath -- Dragon's Breath
[31661] = "dragonsbreath", -- Dragon's Breath [31661] = "scatters", -- Dragon's Breath
[33041] = "dragonsbreath", -- Dragon's Breath [33041] = "scatters", -- Dragon's Breath
[33042] = "dragonsbreath", -- Dragon's Breath [33042] = "scatters", -- Dragon's Breath
[33043] = "dragonsbreath", -- Dragon's Breath [33043] = "scatters", -- Dragon's Breath
-- Repentance -- Repentance
[20066] = "repentance", [20066] = "disorient",
-- Scatter Shot -- Scatter Shot
[19503] = "scatters", [19503] = "scatters",
-- Freezing Trap -- Freezing Trap
[3355] = "freezetrap", [3355] = "disorient",
[14308] = "freezetrap", [14308] = "disorient",
[14309] = "freezetrap", [14309] = "disorient",
-- Improved Conc Shot -- Improved Conc Shot
[19410] = "impconc", [19410] = "rndstun",
[22915] = "impconc", [22915] = "rndstun",
[28445] = "impconc", [28445] = "rndstun",
-- Death Coil -- Death Coil
[6789] = "dc", [6789] = "dc",
@ -232,43 +248,14 @@ Data.spells = {
[605] = "charm", [605] = "charm",
[10911] = "charm", [10911] = "charm",
[10912] = "charm", [10912] = "charm",
}
-- Add WoTLK spells -- Counterattack
if( IS_WRATH_BUILD ) then [19306] = "counterattack",
-- Death Coil
Data.spells[47859] = "dc" -- Disarm
Data.spells[47860] = "dc" [676] = "disarm",
[14251] = "disarm",
-- Wyvern Sting }
Data.spells[49011] = "sleep"
Data.spells[49012] = "sleep"
-- Entangling Roots
Data.spells[53308] = "root"
-- Frost Nova
Data.spells[42917] = "root"
-- Intercept (Remove all except this one come WoTLK)
Data.spells[20252] = "ctrlstun"
-- Pounce
Data.spells[49803] = "ctrlstun"
-- Polymorph
Data.spells[61305] = "disorient"
Data.spells[61025] = "disorient"
-- Sap
Data.spells[51724] = "disorient"
-- Maim
Data.spells[49802] = "disorient"
-- Hex (Guessing)
Data.spells[51514] = "disorient"
end
-- DR Category names -- DR Category names
Data.typeNames = { Data.typeNames = {
@ -290,6 +277,8 @@ Data.typeNames = {
["repentance"] = "Repentance", ["repentance"] = "Repentance",
["dragonsbreath"] = "Dragon's Breath", ["dragonsbreath"] = "Dragon's Breath",
["ua"] = "Unstable Affliction Silence", ["ua"] = "Unstable Affliction Silence",
["counterattack"] = "Counterattack Immobilize",
["disarm"] = "Disarm"
} }
-- Categories that have DR in PvE as well as PvP -- Categories that have DR in PvE as well as PvP

View File

@ -59,41 +59,108 @@ Buff({ 33891 }, { buffType = "form"}, "DRUID") -- Tree of Life
Buff({ 16864 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity Buff({ 16864 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity
Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp
Buff({ 45281, 45282, 45283 }, { buffType = "magic"}, "DRUID") -- Natural Perfection Buff({ 45281, 45282, 45283 }, { buffType = "magic"}, "DRUID") -- Natural Perfection
Buff({ 16188 }, { buffType = "magic"}, "DRUID") -- Nature's Swiftness Buff({ 17116 }, { buffType = "magic"}, "DRUID") -- Nature's Swiftness
Buff({ 17007 }, { buffType = "aura"}, "DRUID") -- Leader of the Pack Buff({ 17007 }, { buffType = "aura"}, "DRUID") -- Leader of the Pack
------------- -------------
-- WARRIOR -- WARRIOR -- TODO
------------- -------------
--Buff({ 29703 }, { buffType = "physical"}, "WARRIOR") -- Dazed Buff({ 29838 }, { buffType = "physical"}, "WARRIOR") -- Second Wind
Buff({ 12292 }, { buffType = "physical"}, "WARRIOR") -- Death Wish
Buff({ 6673 }, { buffType = "physical"}, "WARRIOR") -- Battle Shout
Buff({ 469 }, { buffType = "physical"}, "WARRIOR") -- Commanding Shout
Buff({ 12328 }, { buffType = "physical"}, "WARRIOR") -- Sweeping Strikes
Buff({ 30032 }, { buffType = "physical"}, "WARRIOR") -- Rampage
Buff({ 2687 }, { buffType = "physical"}, "WARRIOR") -- Blood Rage
Buff({ 20230 }, { buffType = "physical"}, "WARRIOR") -- Retaliation
Buff({ 871 }, { buffType = "physical"}, "WARRIOR") -- Shield Wall
Buff({ 18499 }, { buffType = "physical"}, "WARRIOR") -- Berserker Rage
Buff({ 23885 }, { buffType = "physical"}, "WARRIOR") -- Bloodthirst
Buff({ 3411 }, { buffType = "physical"}, "WARRIOR") -- Intervene
-------------- --------------
-- ROGUE -- ROGUE -- TODO
-------------- --------------
Buff({ 2983 }, { buffType = "physical" }, "ROGUE") -- Sprint Buff({ 2983 }, { buffType = "physical" }, "ROGUE") -- Sprint
Buff({ 5277 }, { buffType = "physical" }, "ROGUE") -- Evasion Buff({ 5277 }, { buffType = "physical" }, "ROGUE") -- Evasion
Buff({ 31224 }, { buffType = "physical" }, "ROGUE") -- Cloak of Shadows
Buff({ 14278 }, { buffType = "physical" }, "ROGUE") -- Ghostly Strike
------------ ------------
-- WARLOCK -- WARLOCK --TODO
------------ ------------
Buff({ 19028 }, { buffType = "immune"}, "WARLOCK") -- Soul Link Buff({ 19028 }, { buffType = "aura"}, "WARLOCK") -- Soul Link
Buff({ 23759 }, { buffType = "immune"}, "WARLOCK") -- Master Demonologist Buff({ 696 }, { buffType = "aura"}, "WARLOCK") -- Demon Skin
Buff({ 706 }, { buffType = "aura"}, "WARLOCK") -- Demon Armor
Buff({ 28176 }, { buffType = "aura"}, "WARLOCK") -- Fel Armor
Buff({ 23759 }, { buffType = "aura"}, "WARLOCK") -- Master Demonologist
Buff({ 34936 }, { buffType = "magic"}, "WARLOCK") -- Backlash
Buff({ 5697 }, { buffType = "magic"}, "WARLOCK") -- Unending Breath
Buff({ 132 }, { buffType = "magic"}, "WARLOCK") -- Detect Invisibility
Buff({ 1949 }, { buffType = "aura"}, "WARLOCK") -- Hellfire
Buff({ 6229 }, { buffType = "magic"}, "WARLOCK") -- Shadow Ward
Buff({ 19480 }, { buffType = "magic"}, "WARLOCK") -- Paranoia
Buff({ 7812 }, { buffType = "magic"}, "WARLOCK") -- Sacrifice
Buff({ 2947 }, { buffType = "magic"}, "WARLOCK") -- Fire Shield
--------------- ---------------
-- SHAMAN -- SHAMAN
--------------- ---------------
Buff({ 8178 } ,{ buffType = "magic" }, "SHAMAN") -- Grounding Totem Effect Buff({ 8178 } ,{ buffType = "magic" }, "SHAMAN") -- Grounding Totem Effect
Buff({ 30823 } ,{ buffType = "magic" }, "SHAMAN") -- Shamanistic Rage
Buff({ 32182 } ,{ buffType = "magic" }, "SHAMAN") -- Heroism
Buff({ 2825 } ,{ buffType = "magic" }, "SHAMAN") -- Bloodlust
Buff({ 974 } ,{ buffType = "magic" }, "SHAMAN") -- Earth Shield
Buff({ 24398 } ,{ buffType = "magic" }, "SHAMAN") -- Water Shield
Buff({ 324 } ,{ buffType = "magic" }, "SHAMAN") -- Lightning Shield
Buff({ 16188 } ,{ buffType = "magic" }, "SHAMAN") -- Nature's Swiftness
Buff({ 16166 } ,{ buffType = "magic" }, "SHAMAN") -- Elemental Mastery
-------------- --------------
-- PALADIN -- PALADIN --TODO
-------------- --------------
--Blessings
--Buff( { 25771 }, { buffType = "immune"}, "PALADIN") -- Forbearance Buff( { 1022, 5599, 10278 }, { buffType = "magic"}, "PALADIN") -- Blessing of Protection
Buff( { 6940 }, { buffType = "magic"}, "PALADIN") -- Blessing of Sacrifice
Buff( { 1044 }, { buffType = "magic"}, "PALADIN") -- Blessing of Freedom
Buff( { 19740, 19834, 19835, 19836, 19837, 19838, 25291, 27140 }, { buffType = "magic"}, "PALADIN") -- Blessing of Might
Buff( { 19742 }, { buffType = "magic"}, "PALADIN") -- Blessing of Wisdom
Buff( { 20217 }, { buffType = "magic"}, "PALADIN") -- Blessing of Kings
Buff( { 19977 }, { buffType = "magic"}, "PALADIN") -- Blessing of Light
Buff( { 1038 }, { buffType = "magic"}, "PALADIN") -- Blessing of Salvation
Buff( { 20911 }, { buffType = "magic"}, "PALADIN") -- Blessing of Sanctuary
Buff( { 25898 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Kings
Buff( { 25890 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Light
Buff( { 25782 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Might
Buff( { 25895 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Salvation
Buff( { 25899 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Sanctuary
Buff( { 25894 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Wisdom
Buff( { 642 }, { buffType = "immune"}, "PALADIN") -- Divine Shield
Buff( { 31884 }, { buffType = "magic"}, "PALADIN") -- Avenging Wrath
--Auras
Buff( { 465, 10290, 643, 10291, 1032, 10292, 10293, 27149 }, { buffType = "aura"}, "PALADIN") -- Devotion Aura
Buff( { 7294 }, { buffType = "aura"}, "PALADIN") -- Retribution Aura
Buff( { 19746 }, { buffType = "aura"}, "PALADIN") -- Concentration Aura
Buff( { 19876 }, { buffType = "aura"}, "PALADIN") -- Shadow Resistance Aura
Buff( { 20218 }, { buffType = "aura"}, "PALADIN") -- Sanctity Aura
Buff( { 19888 }, { buffType = "aura"}, "PALADIN") -- Frost Resistance Aura
Buff( { 19891 }, { buffType = "aura"}, "PALADIN") -- Fire Resistance Aura
Buff( { 32223 }, { buffType = "aura"}, "PALADIN") -- Crusader Aura
--Seals
Buff( { 20154, 20287, 20288, 20289, 20290, 20291, 20292, 20293, 27155 }, { buffType = "magic"}, "PALADIN") -- Seal of Righteousness
Buff( { 31892 }, { buffType = "magic"}, "PALADIN") -- Seal of Blood
Buff( { 20375 }, { buffType = "magic"}, "PALADIN") -- Seal of Command
Buff( { 20164 }, { buffType = "magic"}, "PALADIN") -- Seal of Justice
Buff( { 20165 }, { buffType = "magic"}, "PALADIN") -- Seal of Light
Buff( { 15277 }, { buffType = "magic"}, "PALADIN") -- Seal of Reckoning
Buff( { 31801 }, { buffType = "magic"}, "PALADIN") -- Seal of Vengeance
Buff( { 20166 }, { buffType = "magic"}, "PALADIN") -- Seal of Wisdom
Buff( { 21082 }, { buffType = "magic"}, "PALADIN") -- Seal of the Crusade
------------- -------------
@ -101,6 +168,8 @@ Buff({ 8178 } ,{ buffType = "magic" }, "SHAMAN") -- Grounding Totem Effect
------------- -------------
Buff( { 5384 }, { buffType = "physical"}, "HUNTER") -- Feign Death Buff( { 5384 }, { buffType = "physical"}, "HUNTER") -- Feign Death
Buff( { 19263 }, { buffType = "physical"}, "HUNTER") -- Deterrence
Buff( { 3045 }, { buffType = "physical"}, "HUNTER") -- Rapid Fire
--local FEIGN_DEATH = GetSpellInfo(5384) -- Localized name for Feign Death --local FEIGN_DEATH = GetSpellInfo(5384) -- Localized name for Feign Death

View File

@ -20,7 +20,8 @@ Debuff({ 15286 } ,{ buffType = "magic" }, "PRIEST") -- Vampiric Embrace
Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387 }, { buffType = "magic" }, "PRIEST") -- Mind Flay Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387 }, { buffType = "magic" }, "PRIEST") -- Mind Flay
Debuff({ 605, 10911, 10912 }, { buffType = "magic" }, "PRIEST") -- Mind Control Debuff({ 605, 10911, 10912 }, { buffType = "magic" }, "PRIEST") -- Mind Control
Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream
Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") -- Blackout
Debuff({ 44041, 44043, 44044, 44045, 44046, 44047 }, { buffType = "magic"}, "PRIEST") -- Chastise
--------------- ---------------
-- DRUID -- DRUID
@ -44,6 +45,8 @@ Debuff({ 1822, 1823, 1824, 9904, 27003 }, { stacking = true, buffType = "physica
Debuff({ 1079, 9492, 9493, 9752, 9894, 9896, 27008 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rip Debuff({ 1079, 9492, 9493, 9752, 9894, 9896, 27008 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rip
Debuff({ 5570, 24974, 24975, 24976, 24977, 27013 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Insect Swarm Debuff({ 5570, 24974, 24975, 24976, 24977, 27013 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Insect Swarm
Debuff({ 33745 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Lacerate Debuff({ 33745 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Lacerate
Debuff({ 33878, 33986, 33987 }, { buffType = "physical" }, "DRUID") -- Mangle (Bear)
Debuff({ 33876, 33982, 33983 }, { buffType = "physical" }, "DRUID") -- Mangle (Cat)
------------- -------------
-- WARRIOR -- WARRIOR

View File

@ -1,11 +1,13 @@
local type, ipairs, pairs, tinsert = type, ipairs, pairs, tinsert local type, ipairs, pairs, tinsert = type, ipairs, pairs, tinsert
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
local LibClassAuras = LibStub:NewLibrary("LibClassAuras-1.0", 1) local LibClassAuras = LibStub:NewLibrary("LibClassAuras-1.0", 1)
LibClassAuras.debuffs = {} LibClassAuras.debuffs = {}
LibClassAuras.debuffToId = {} LibClassAuras.debuffToId = {}
LibClassAuras.buffs = {} LibClassAuras.buffs = {}
LibClassAuras.buffToId = {} LibClassAuras.buffToId = {}
LibClassAuras.altNames = {}
local function Spell(id, opts, class, spellTable, idTable) local function Spell(id, opts, class, spellTable, idTable)
if not opts or not class then if not opts or not class then
@ -25,9 +27,20 @@ local function Spell(id, opts, class, spellTable, idTable)
return return
end end
if opts.altName then if opts.altName then
idTable[opts.altName] = {id = id , class = class} for _,v in ipairs(id) do
LibClassAuras.altNames[v] = opts.altName
end
if idTable[opts.altName] then
tinsert(idTable[opts.altName], {id = id , class = class})
else
idTable[opts.altName] = {[1] = {id = id , class = class}}
end
else else
idTable[spellName] = {id = id , class = class} if idTable[spellName] then
tinsert(idTable[spellName], {id = id , class = class})
else
idTable[spellName] = {[1] = {id = id , class = class}}
end
end end
if type(id) == "table" then if type(id) == "table" then
@ -53,9 +66,11 @@ LibClassAuras.Buff = Buff
local function getClassDebuffs(class) local function getClassDebuffs(class)
local classSpells = {} local classSpells = {}
for k,v in pairs(LibClassAuras.debuffToId) do for name, spells in pairs(LibClassAuras.debuffToId) do
if v.class == class then for _, spellInfo in ipairs(spells) do
tinsert(classSpells, {name = k, id = v.id}) if spellInfo.class == class then
tinsert(classSpells, {name = name, id = spellInfo.id})
end
end end
end end
return classSpells return classSpells
@ -64,11 +79,28 @@ LibClassAuras.GetClassDebuffs = getClassDebuffs
local function getClassBuffs(class) local function getClassBuffs(class)
local classSpells = {} local classSpells = {}
for k,v in pairs(LibClassAuras.buffToId) do for name, spells in pairs(LibClassAuras.buffToId) do
if v.class == class then for _, spellInfo in ipairs(spells) do
tinsert(classSpells, {name = k, id = v.id}) if spellInfo.class == class then
tinsert(classSpells, {name = name, id = spellInfo.id})
end
end end
end end
return classSpells return classSpells
end end
LibClassAuras.GetClassBuffs = getClassBuffs LibClassAuras.GetClassBuffs = getClassBuffs
local function getSpellNameToId(auraType)
if auraType == AURA_TYPE_DEBUFF then
return LibClassAuras.debuffToId
else
return LibClassAuras.buffToId
end
end
LibClassAuras.GetSpellNameToId = getSpellNameToId
local function getAltName(spellID)
return LibClassAuras.altNames[spellID]
end
LibClassAuras.GetAltName = getAltName

View File

@ -0,0 +1,232 @@
--- = Background =
-- Blizzard's IsSpellInRange API has always been very limited - you either must have the name of the spell, or its spell book ID. Checking directly by spellID is simply not possible.
-- Now, in Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work - instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
-- = Usage =
-- **LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
-- * Allows ranged checking based on both spell name and spellID.
-- * Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
--
-- @class file
-- @name LibSpellRange-1.0.lua
local major = "SpellRange-1.0"
local minor = 15
assert(LibStub, format("%s requires LibStub.", major))
local Lib = LibStub:NewLibrary(major, minor)
if not Lib then return end
local tonumber = _G.tonumber
local strlower = _G.strlower
local wipe = _G.wipe
local type = _G.type
local GetSpellTabInfo = _G.GetSpellTabInfo
local GetNumSpellTabs = _G.GetNumSpellTabs
local GetSpellBookItemInfo = _G.GetSpellBookItemInfo
local GetSpellBookItemName = _G.GetSpellBookItemName
local GetSpellLink = _G.GetSpellLink
local GetSpellInfo = _G.GetSpellInfo
local IsSpellInRange = _G.IsSpellInRange
local SpellHasRange = _G.SpellHasRange
-- isNumber is basically a tonumber cache for maximum efficiency
Lib.isNumber = Lib.isNumber or setmetatable({}, {
__mode = "kv",
__index = function(t, i)
local o = tonumber(i) or false
t[i] = o
return o
end})
local isNumber = Lib.isNumber
-- strlower cache for maximum efficiency
Lib.strlowerCache = Lib.strlowerCache or setmetatable(
{}, {
__index = function(t, i)
if not i then return end
local o
if type(i) == "number" then
o = i
else
o = strlower(i)
end
t[i] = o
return o
end,
}) local strlowerCache = Lib.strlowerCache
-- Matches lowercase player spell names to their spellBookID
Lib.spellsByName_spell = Lib.spellsByName_spell or {}
local spellsByName_spell = Lib.spellsByName_spell
-- Matches player spellIDs to their spellBookID
Lib.spellsByID_spell = Lib.spellsByID_spell or {}
local spellsByID_spell = Lib.spellsByID_spell
-- Matches lowercase pet spell names to their spellBookID
Lib.spellsByName_pet = Lib.spellsByName_pet or {}
local spellsByName_pet = Lib.spellsByName_pet
-- Matches pet spellIDs to their spellBookID
Lib.spellsByID_pet = Lib.spellsByID_pet or {}
local spellsByID_pet = Lib.spellsByID_pet
-- Updates spellsByName and spellsByID
local function UpdateBook(bookType)
local max = 0
for i = 1, GetNumSpellTabs() do
local _, _, offs, numspells, _, specId = GetSpellTabInfo(i)
if specId == 0 then
max = offs + numspells
end
end
local spellsByName = Lib["spellsByName_" .. bookType]
local spellsByID = Lib["spellsByID_" .. bookType]
wipe(spellsByName)
wipe(spellsByID)
for spellBookID = 1, max do
local type, baseSpellID = GetSpellBookItemInfo(spellBookID, bookType)
if type == "SPELL" or type == "PETACTION" then
local currentSpellName = GetSpellBookItemName(spellBookID, bookType)
local link = GetSpellLink(currentSpellName)
local currentSpellID = tonumber(link and link:gsub("|", "||"):match("spell:(%d+)"))
-- For each entry we add to a table,
-- only add it if there isn't anything there already.
-- This prevents weird passives from overwriting real, legit spells.
-- For example, in WoW 7.3.5 the ret paladin mastery
-- was coming back with a base spell named "Judgement",
-- which was overwriting the real "Judgement".
-- Passives usually come last in the spellbook,
-- so this should work just fine as a workaround.
-- This issue with "Judgement" is gone in BFA because the mastery changed.
if currentSpellName and not spellsByName[strlower(currentSpellName)] then
spellsByName[strlower(currentSpellName)] = spellBookID
end
if currentSpellID and not spellsByID[currentSpellID] then
spellsByID[currentSpellID] = spellBookID
end
if type == "SPELL" then
-- PETACTION (pet abilities) don't return a spellID for baseSpellID,
-- so base spells only work for proper player spells.
local baseSpellName = GetSpellInfo(baseSpellID)
if baseSpellName and not spellsByName[strlower(baseSpellName)] then
spellsByName[strlower(baseSpellName)] = spellBookID
end
if baseSpellID and not spellsByID[baseSpellID] then
spellsByID[baseSpellID] = spellBookID
end
end
end
end
end
-- Handles updating spellsByName and spellsByID
if not Lib.updaterFrame then
Lib.updaterFrame = CreateFrame("Frame")
end
Lib.updaterFrame:UnregisterAllEvents()
Lib.updaterFrame:RegisterEvent("SPELLS_CHANGED")
local function UpdateSpells()
UpdateBook("spell")
UpdateBook("pet")
end
Lib.updaterFrame:SetScript("OnEvent", UpdateSpells)
UpdateSpells()
--- Improved spell range checking function.
-- @name SpellRange.IsSpellInRange
-- @paramsig spell, unit
-- @param spell Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
-- @param unit UnitID of the spell that you wish to check the range on.
-- @return Exact same returns as http://wowprogramming.com/docs/api/IsSpellInRange
-- @usage
-- -- Check spell range by spell name on unit "target"
-- local SpellRange = LibStub("SpellRange-1.0")
-- local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
--
-- -- Check spell range by spellID on unit "mouseover"
-- local SpellRange = LibStub("SpellRange-1.0")
-- local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
function Lib.IsSpellInRange(spellInput, unit)
if isNumber[spellInput] then
local spell = spellsByID_spell[spellInput]
if spell then
return IsSpellInRange(spell, "spell", unit)
else
local spell = spellsByID_pet[spellInput]
if spell then
return IsSpellInRange(spell, "pet", unit)
end
end
else
local spellInput = strlowerCache[spellInput]
local spell = spellsByName_spell[spellInput]
if spell then
return IsSpellInRange(spell, "spell", unit)
else
local spell = spellsByName_pet[spellInput]
if spell then
return IsSpellInRange(spell, "pet", unit)
end
end
return IsSpellInRange(spellInput, unit)
end
end
--- Improved SpellHasRange.
-- @name SpellRange.SpellHasRange
-- @paramsig spell
-- @param spell Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
-- @return Exact same returns as http://wowprogramming.com/docs/api/SpellHasRange
-- @usage
-- -- Check if a spell has a range by spell name
-- local SpellRange = LibStub("SpellRange-1.0")
-- local hasRange = SpellRange.SpellHasRange("Stormstrike")
--
-- -- Check if a spell has a range by spellID
-- local SpellRange = LibStub("SpellRange-1.0")
-- local hasRange = SpellRange.SpellHasRange(17364)
function Lib.SpellHasRange(spellInput)
if isNumber[spellInput] then
local spell = spellsByID_spell[spellInput]
if spell then
return SpellHasRange(spell, "spell")
else
local spell = spellsByID_pet[spellInput]
if spell then
return SpellHasRange(spell, "pet")
end
end
else
local spellInput = strlowerCache[spellInput]
local spell = spellsByName_spell[spellInput]
if spell then
return SpellHasRange(spell, "spell")
else
local spell = spellsByName_pet[spellInput]
if spell then
return SpellHasRange(spell, "pet")
end
end
return SpellHasRange(spellInput)
end
end

View File

@ -0,0 +1,61 @@
# LibSpellRange-1.0
## Background
Blizzard's `IsSpellInRange` API has always been very limited - you either must have the name of the spell,
or its spell book ID. Checking directly by spellID is simply not possible.
Now, since Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work -
instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do
not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
## Usage
**LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
* Allows ranged checking based on both spell name and spellID.
* Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
### `SpellRange.IsSpellInRange(spell, unit)` - Improved `IsSpellInRange`
#### Parameters
- `spell` - Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
- `unit` - UnitID of the spell that you wish to check the range on.
#### Return value
Exact same returns as [the built-in `IsSpellInRange`](http://wowprogramming.com/docs/api/IsSpellInRange.html)
#### Usage
``` lua
-- Check spell range by spell name on unit "target"
local SpellRange = LibStub("SpellRange-1.0")
local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
-- Check spell range by spellID on unit "mouseover"
local SpellRange = LibStub("SpellRange-1.0")
local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
```
### `SpellRange.SpellHasRange(spell)` - Improved `SpellHasRange`
#### Parameters
- `spell` - Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
#### Return value
Exact same returns as [the built-in `SpellHasRange`](http://wowprogramming.com/docs/api/SpellHasRange.html)
#### Usage
``` lua
-- Check if a spell has a range by spell name
local SpellRange = LibStub("SpellRange-1.0")
local hasRange = SpellRange.SpellHasRange("Stormstrike")
-- Check if a spell has a range by spellID
local SpellRange = LibStub("SpellRange-1.0")
local hasRange = SpellRange.SpellHasRange(17364)
```

View File

@ -0,0 +1,3 @@
<Ui>
<Script file="LibSpellRange-1.0.lua"/>
</Ui>

View File

@ -16,17 +16,18 @@ local UnitName = UnitName
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Announcements = Gladdy:NewModule("Announcements", nil, { local Announcements = Gladdy:NewModule("Announcements", 101, {
announcements = { announcements = {
drinks = true, drinks = true,
resurrections = true, resurrections = true,
enemy = false, enemy = false,
spec = false, spec = true,
health = false, health = false,
healthThreshold = 20, healthThreshold = 20,
trinketUsed = true, trinketUsed = true,
trinketReady = false, trinketReady = false,
dest = "self", spellInterrupt = true,
dest = "party",
}, },
}) })
@ -41,15 +42,20 @@ function Announcements:Initialize()
[GetSpellInfo(20777)] = true, [GetSpellInfo(20777)] = true,
} }
self:RegisterMessage("CAST_START") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_HEALTH")
self:RegisterMessage("TRINKET_USED")
self:RegisterMessage("TRINKET_READY")
end end
function Announcements:Reset() function Announcements:Reset()
self:UnregisterMessages(
"CAST_START",
"ENEMY_SPOTTED",
"UNIT_SPEC",
"AURA_GAIN",
"UNIT_HEALTH",
"TRINKET_USED",
"TRINKET_READY",
"SHADOWSIGHT",
"SPELL_INTERRUPT")
self.enemy = {} self.enemy = {}
self.throttled = {} self.throttled = {}
end end
@ -59,17 +65,25 @@ function Announcements:Test(unit)
if (not button) then if (not button) then
return return
end end
self:JOINED_ARENA()
if (unit == "arena1") then if unit == "arena1" then
self:UNIT_SPEC(unit, button.testSpec) self:AURA_GAIN(unit, nil, nil, self.DRINK_AURA)
elseif (unit == "arena2") then
self:CheckDrink(unit, self.DRINK_AURA)
elseif (unit == "arena3") then
self:UNIT_HEALTH(unit, button.health, button.healthMax)
self:ENEMY_SPOTTED(unit)
end end
end end
function Announcements:JOINED_ARENA()
self:RegisterMessages(
"CAST_START",
"ENEMY_SPOTTED",
"UNIT_SPEC",
"AURA_GAIN",
"UNIT_HEALTH",
"TRINKET_USED",
"TRINKET_READY",
"SHADOWSIGHT",
"SPELL_INTERRUPT")
end
function Announcements:CAST_START(unit, spell) function Announcements:CAST_START(unit, spell)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if (not button or not Gladdy.db.announcements.resurrections) then if (not button or not Gladdy.db.announcements.resurrections) then
@ -137,24 +151,39 @@ function Announcements:TRINKET_READY(unit)
self:Send(L["TRINKET READY: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class]) self:Send(L["TRINKET READY: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
end end
function Announcements:CheckDrink(unit, aura) function Announcements:SPELL_INTERRUPT(destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
local button = Gladdy.buttons[destUnit]
if (not button or not Gladdy.db.announcements.spellInterrupt) then
return
end
self:Send(L["INTERRUPTED: %s (%s)"]:format(extraSpellName, button.name or ""), nil, RAID_CLASS_COLORS[button.class])
end
function Announcements:AURA_GAIN(unit, auraType, spellID, spellName)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if (not button or not Gladdy.db.announcements.drinks) then if (not button or not Gladdy.db.announcements.drinks) then
return return
end end
if (aura == self.DRINK_AURA) then if (spellName == self.DRINK_AURA) then
self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class]) self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
end end
end end
function Announcements:SHADOWSIGHT(msg)
self:Send(msg, 2)
end
function Announcements:Send(msg, throttle, color) function Announcements:Send(msg, throttle, color)
if (throttle and throttle > 0) then if (throttle and throttle > 0) then
if (not self.throttled[msg]) then if (not self.throttled[msg]) then
self.throttled[msg] = GetTime() + throttle self.throttled[msg] = GetTime() + throttle
Gladdy:Debug("INFO", msg, "- NOT THROTTLED -", self.throttled[msg])
elseif (self.throttled[msg] < GetTime()) then elseif (self.throttled[msg] < GetTime()) then
self.throttled[msg] = nil Gladdy:Debug("INFO", msg, "- THROTTLED OVER -", self.throttled[msg])
self.throttled[msg] = GetTime() + throttle
else else
Gladdy:Debug("INFO", msg, "- THROTTLED -", self.throttled[msg])
return return
end end
end end
@ -172,9 +201,9 @@ function Announcements:Send(msg, throttle, color)
RaidNotice_AddMessage(RaidBossEmoteFrame, msg, color) RaidNotice_AddMessage(RaidBossEmoteFrame, msg, color)
elseif (dest == "fct" and IsAddOnLoaded("Blizzard_CombatText")) then elseif (dest == "fct" and IsAddOnLoaded("Blizzard_CombatText")) then
CombatText_AddMessage(msg, nil, color.r, color.g, color.b, "crit", 1) CombatText_AddMessage(msg, nil, color.r, color.g, color.b, "crit", 1)
--[[elseif (dest == "msbt" and IsAddOnLoaded("MikScrollingBattleText")) then elseif (dest == "msbt" and IsAddOnLoaded("MikScrollingBattleText")) then
MikSBT.DisplayMessage(msg, MikSBT.DISPLAYTYPE_NOTIFICATION, true, color.r * 255, color.g * 255, color.b * 255) MikSBT.Animations.DisplayMessage(msg, MikSBT.DISPLAYTYPE_NOTIFICATION, true, color.r * 255, color.g * 255, color.b * 255)
elseif (dest == "sct" and IsAddOnLoaded("sct")) then --[[elseif (dest == "sct" and IsAddOnLoaded("sct")) then
SCT:DisplayText(msg, color, true, "event", 1) SCT:DisplayText(msg, color, true, "event", 1)
elseif (dest == "parrot" and IsAddOnLoaded("parrot")) then elseif (dest == "parrot" and IsAddOnLoaded("parrot")) then
Parrot:ShowMessage(msg, "Notification", true, color.r, color.g, color.b)--]] Parrot:ShowMessage(msg, "Notification", true, color.r, color.g, color.b)--]]
@ -205,12 +234,15 @@ function Announcements:GetOptions()
["self"] = L["Self"], ["self"] = L["Self"],
["party"] = L["Party"], ["party"] = L["Party"],
["rw"] = L["Raid Warning"], ["rw"] = L["Raid Warning"],
["fct"] = L["Blizzard's Floating Combat Text"],
--["msbt"] = L["MikScrollingBattleText"],
--["sct"] = L["Scrolling Combat Text"],
--["parrot"] = L["Parrot"],
} }
if IsAddOnLoaded("Blizzard_CombatText") then
destValues["fct"] = L["Blizzard's Floating Combat Text"]
end
if IsAddOnLoaded("MikScrollingBattleText") then
destValues["msbt"] = L["MikScrollingBattleText"]
end
return { return {
headerAnnouncements = { headerAnnouncements = {
type = "header", type = "header",
@ -229,41 +261,47 @@ function Announcements:GetOptions()
desc = L["Announce when an enemy's trinket is ready again"], desc = L["Announce when an enemy's trinket is ready again"],
order = 4, order = 4,
}), }),
spellInterrupt = option({
type = "toggle",
name = L["Interrupts"],
desc = L["Announces when enemies' spells are interrupted"],
order = 5,
}),
drinks = option({ drinks = option({
type = "toggle", type = "toggle",
name = L["Drinking"], name = L["Drinking"],
desc = L["Announces when enemies sit down to drink"], desc = L["Announces when enemies sit down to drink"],
order = 5, order = 6,
}), }),
resurrections = option({ resurrections = option({
type = "toggle", type = "toggle",
name = L["Resurrection"], name = L["Resurrection"],
desc = L["Announces when an enemy tries to resurrect a teammate"], desc = L["Announces when an enemy tries to resurrect a teammate"],
order = 6, order = 7,
}), }),
enemy = option({ enemy = option({
type = "toggle", type = "toggle",
name = L["New enemies"], name = L["New enemies"],
desc = L["Announces when new enemies are discovered"], desc = L["Announces when new enemies are discovered"],
order = 7, order = 8,
}), }),
spec = option({ spec = option({
type = "toggle", type = "toggle",
name = L["Spec Detection"], name = L["Spec Detection"],
desc = L["Announces when the spec of an enemy was detected"], desc = L["Announces when the spec of an enemy was detected"],
order = 8, order = 9,
}), }),
health = option({ health = option({
type = "toggle", type = "toggle",
name = L["Low health"], name = L["Low health"],
desc = L["Announces when an enemy drops below a certain health threshold"], desc = L["Announces when an enemy drops below a certain health threshold"],
order = 9, order = 10,
}), }),
healthThreshold = option({ healthThreshold = option({
type = "range", type = "range",
name = L["Low health threshold"], name = L["Low health threshold"],
desc = L["Choose how low an enemy must be before low health is announced"], desc = L["Choose how low an enemy must be before low health is announced"],
order = 10, order = 11,
min = 1, min = 1,
max = 100, max = 100,
step = 1, step = 1,
@ -275,7 +313,7 @@ function Announcements:GetOptions()
type = "select", type = "select",
name = L["Destination"], name = L["Destination"],
desc = L["Choose how your announcements are displayed"], desc = L["Choose how your announcements are displayed"],
order = 11, order = 12,
values = destValues, values = destValues,
}), }),
} }

View File

@ -1,157 +1,176 @@
local select, floor, str_len, tostring, str_sub, str_find = select, math.floor, string.len, tostring, string.sub, string.find local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs
local IsInInstance = IsInInstance local CreateFrame = CreateFrame
local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local ACDFrame = Gladdy:NewModule("Countdown", nil, { local ACDFrame = Gladdy:NewModule("Arena Countdown", nil, {
countdown = true, countdown = true,
arenaCountdownSize = 256 arenaCountdownSize = 256,
arenaCountdownFrameStrata = "HIGH",
arenaCountdownFrameLevel = 50,
}) })
function ACDFrame:OnEvent(event, ...)
self[event](self, ...)
end
function ACDFrame:Initialize() function ACDFrame:Initialize()
self.locale = Gladdy:GetArenaTimer()
self.hidden = false self.hidden = false
self.countdown = -1 self.countdown = -1
self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\"; self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\";
ACDFrame:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
ACDFrame:RegisterEvent("PLAYER_ENTERING_WORLD") local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent)
self.ACDNumFrame = ACDNumFrame
self.ACDNumFrame:EnableMouse(false)
self.ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetPoint("CENTER", 0, 128)
self.ACDNumFrame:Hide()
local ACDNumTens = ACDNumFrame:CreateTexture("ACDNumTens", "HIGH")
self.ACDNumTens = ACDNumTens
self.ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumTens:SetPoint("CENTER", self.ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
local ACDNumOnes = ACDNumFrame:CreateTexture("ACDNumOnes", "HIGH")
self.ACDNumOnes = ACDNumOnes
self.ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetPoint("CENTER", self.ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
local ACDNumOne = ACDNumFrame:CreateTexture("ACDNumOne", "HIGH")
self.ACDNumOne = ACDNumOne
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
if Gladdy.db.countdown then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
end
self.faction = UnitFactionGroup("player")
end end
function ACDFrame:OnEvent(event, ...) function ACDFrame:UpdateFrameOnce()
-- functions created in "object:method"-style have an implicit first parameter of "self", which points to object if Gladdy.db.countdown then
self[event](self, ...) -- route event parameters to LoseControl:event methods self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
else
self:UnregisterAllMessages()
end
self.ACDNumFrame:SetFrameStrata(Gladdy.db.arenaCountdownFrameStrata)
self.ACDNumFrame:SetFrameLevel(Gladdy.db.arenaCountdownFrameLevel)
self.ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetPoint("CENTER", 0, 128)
self.ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumTens:SetPoint("CENTER", self.ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
self.ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetPoint("CENTER", self.ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
end end
ACDFrame:SetScript("OnEvent", ACDFrame.OnEvent)
function ACDFrame.OnUpdate(self, elapse)
if (self.countdown > 0 and Gladdy.db.countdown) then
self.hidden = false;
self.ACDNumFrame:Show()
if ((floor(self.countdown) ~= floor(self.countdown - elapse)) and (floor(self.countdown - elapse) >= 0)) then
local str = tostring(floor(self.countdown - elapse));
local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent) if (str_len(str) == 2) then
ACDNumFrame:SetHeight(256) -- Display has 2 digits
ACDNumFrame:SetWidth(256) self.ACDNumOne:Hide();
ACDNumFrame:SetPoint("CENTER", 0, 128) self.ACDNumTens:Show();
ACDNumFrame:Show() self.ACDNumOnes:Show();
local ACDNumTens = ACDNumFrame:CreateTexture("ACDNumTens", "HIGH") self.ACDNumTens:SetTexture(self.texturePath .. str_sub(str, 0, 1));
ACDNumTens:SetWidth(256) self.ACDNumOnes:SetTexture(self.texturePath .. str_sub(str, 2, 2));
ACDNumTens:SetHeight(128) self.ACDNumFrame:SetScale(0.7)
ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -48, 0) elseif (str_len(str) == 1) then
-- Display has 1 digit
local ACDNumOnes = ACDNumFrame:CreateTexture("ACDNumOnes", "HIGH") local numStr = str_sub(str, 0, 1)
ACDNumOnes:SetWidth(256) local path = numStr == "0" and self.faction or numStr
ACDNumOnes:SetHeight(128) self.ACDNumOne:Show();
ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", 48, 0) self.ACDNumOne:SetTexture(self.texturePath .. path);
self.ACDNumOnes:Hide();
local ACDNumOne = ACDNumFrame:CreateTexture("ACDNumOne", "HIGH") self.ACDNumTens:Hide();
ACDNumOne:SetWidth(256) self.ACDNumFrame:SetScale(1.0)
ACDNumOne:SetHeight(128)
ACDNumOne:SetPoint("CENTER", ACDNumFrame, "CENTER", 0, 0)
function ACDFrame:PLAYER_ENTERING_WORLD()
local instanceType = select(2, IsInInstance())
if (( instanceType == "arena" )) then
ACDFrame:SetScript("OnUpdate", function(self, elapse)
if (self.countdown > 0 and Gladdy.db.countdown) then
self.hidden = false;
if ((floor(self.countdown) ~= floor(self.countdown - elapse)) and (floor(self.countdown - elapse) >= 0)) then
local str = tostring(floor(self.countdown - elapse));
if (floor(self.countdown - elapse) == 0) then
ACDNumTens:Hide();
ACDNumOnes:Hide();
ACDNumOne:Hide();
elseif (str_len(str) == 2) then
-- Display has 2 digits
ACDNumOne:Hide();
ACDNumTens:Show();
ACDNumOnes:Show();
ACDNumTens:SetTexture(self.texturePath .. str_sub(str, 0, 1));
ACDNumOnes:SetTexture(self.texturePath .. str_sub(str, 2, 2));
ACDNumFrame:SetScale(0.7)
elseif (str_len(str) == 1) then
-- Display has 1 digit
ACDNumOne:Show();
ACDNumOne:SetTexture(self.texturePath .. str_sub(str, 0, 1));
ACDNumOnes:Hide();
ACDNumTens:Hide();
ACDNumFrame:SetScale(1.0)
end
end
self.countdown = self.countdown - elapse;
else
self.hidden = true;
ACDNumTens:Hide();
ACDNumOnes:Hide();
ACDNumOne:Hide();
end end
end
self.countdown = self.countdown - elapse;
else
self.hidden = true;
self.ACDNumFrame:Hide()
self.ACDNumTens:Hide();
self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
end
if (GetTime() > self.endTime) then
self:SetScript("OnUpdate", nil)
end
end
end) function ACDFrame:JOINED_ARENA()
if Gladdy.db.countdown then
self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnEvent", ACDFrame.OnEvent)
self.endTime = GetTime() + 70
self:SetScript("OnUpdate", ACDFrame.OnUpdate)
end
end
function ACDFrame:ENEMY_SPOTTED()
if not Gladdy.frame.testing then
ACDFrame:Reset()
end
end
function ACDFrame:UNIT_SPEC()
if not Gladdy.frame.testing then
ACDFrame:Reset()
end end
end end
function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
if (str_find(msg, "L'ar\195\168ne ouvre ses portes dans 60 secondes !")) then for k,v in pairs(self.locale) do
self.countdown = 61 if str_find(msg, v) then
return if k == 0 then
end ACDFrame:Reset()
if (str_find(msg, "L'ar\195\168ne ouvre ses portes dans 30 secondes !")) then else
self.countdown = 31 self.countdown = k
return end
end end
if (str_find(msg, "L'ar\195\168ne ouvre ses portes dans 15 secondes !")) then
self.countdown = 16
return
end
if (str_find(msg, "L'ar\195\168ne ouvre ses portes dans 10 secondes !")) then
self.countdown = 11
return
end
if (str_find(msg, "One minute until the Arena battle begins!")) then
self.countdown = 61
return
end
if (str_find(msg, "Thirty seconds until the Arena battle begins!")) then
self.countdown = 31
return
end
if (str_find(msg, "Fifteen seconds until the Arena battle begins!")) then
self.countdown = 16
return
end
if (str_find(msg, "Ten seconds until the Arena battle begins!")) then
self.countdown = 10
return
end
if (str_find(msg, "The Arena battle has begun!")) then
ACDFrame:SetScript("OnUpdate", nil)
return
end end
end end
function ACDFrame:UpdateFrame() function ACDFrame:TestOnce()
ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize)
ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize)
ACDNumFrame:SetPoint("CENTER", 0, 128)
ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize)
ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize/2)
ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize)
ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize/2)
ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize/2)
ACDNumOne:SetPoint("CENTER", ACDNumFrame, "CENTER", 0, 0)
end
function ACDFrame:Test()
self.countdown = 30 self.countdown = 30
self:JOINED_ARENA()
end end
function ACDFrame:Reset() function ACDFrame:Reset()
self.endTime = 0
self.countdown = 0 self.countdown = 0
self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnUpdate", nil)
self.hidden = true;
self.ACDNumFrame:Hide()
self.ACDNumTens:Hide();
self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
end end
function ACDFrame:GetOptions() function ACDFrame:GetOptions()
@ -163,7 +182,7 @@ function ACDFrame:GetOptions()
}, },
countdown = Gladdy:option({ countdown = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Turn on/off"], name = L["Enabled"],
desc = L["Turns countdown before the start of an arena match on/off."], desc = L["Turns countdown before the start of an arena match on/off."],
order = 3, order = 3,
width = "full", width = "full",
@ -175,6 +194,31 @@ function ACDFrame:GetOptions()
min = 64, min = 64,
max = 512, max = 512,
step = 16, step = 16,
width = "full",
disabled = function() return not Gladdy.db.countdown end,
}),
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 5,
},
arenaCountdownFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 6,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
disabled = function() return not Gladdy.db.countdown end,
}),
arenaCountdownFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 7,
width = "full",
disabled = function() return not Gladdy.db.countdown end,
}), }),
} }
end end

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +1,20 @@
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetTime = GetTime local GetTime = GetTime
local select, lower, ceil, tremove, tinsert, pairs, ipairs = select, string.lower, ceil, tremove, tinsert, pairs, ipairs local select, lower, ceil, tremove, tinsert, pairs, ipairs, tostring, random = select, string.lower, ceil, tremove, tinsert, pairs, ipairs, tostring, math.random
local auraTypeColor = { }
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
local auraTypes = {AURA_TYPE_BUFF, AURA_TYPE_DEBUFF} local auraTypes = {AURA_TYPE_BUFF, AURA_TYPE_DEBUFF}
auraTypeColor["none"] = { r = 0.80, g = 0, b = 0 , a = 1}
auraTypeColor["magic"] = { r = 0.20, g = 0.60, b = 1.00, a = 1}
auraTypeColor["curse"] = { r = 0.60, g = 0.00, b = 1.00, a = 1 }
auraTypeColor["disease"] = { r = 0.60, g = 0.40, b = 0, a = 1 }
auraTypeColor["poison"] = { r = 0.00, g = 0.60, b = 0, a = 1 }
auraTypeColor["immune"] = { r = 1.00, g = 0.02, b = 0.99, a = 1 }
auraTypeColor["form"] = auraTypeColor["none"]
auraTypeColor["aura"] = auraTypeColor["none"]
auraTypeColor[""] = auraTypeColor["none"]
--------------------------- ---------------------------
-- Module init -- Module init
--------------------------- ---------------------------
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local LibClassAuras = LibStub("LibClassAuras-1.0")
local L = Gladdy.L local L = Gladdy.L
local defaultTrackedDebuffs = select(2, Gladdy:GetAuras("debuff")) local defaultTrackedDebuffs = select(2, Gladdy:GetAuras(AURA_TYPE_DEBUFF))
local defaultTrackedBuffs = select(2, Gladdy:GetAuras("buff")) local defaultTrackedBuffs = select(2, Gladdy:GetAuras(AURA_TYPE_BUFF))
local BuffsDebuffs = Gladdy:NewModule("BuffsDebuffs", nil, { local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsEnabled = true, buffsEnabled = true,
buffsShowAuraDebuffs = false, buffsShowAuraDebuffs = false,
buffsAlpha = 1, buffsAlpha = 1,
@ -41,11 +31,9 @@ local BuffsDebuffs = Gladdy:NewModule("BuffsDebuffs", nil, {
buffsFontScale = 1, buffsFontScale = 1,
buffsFontColor = {r = 1, g = 1, b = 0, a = 1}, buffsFontColor = {r = 1, g = 1, b = 0, a = 1},
buffsDynamicColor = true, buffsDynamicColor = true,
buffsCooldownPos = "TOP",
buffsCooldownGrowDirection = "RIGHT", buffsCooldownGrowDirection = "RIGHT",
buffsXOffset = 0, buffsXOffset = 0,
buffsYOffset = 0, buffsYOffset = 0,
buffsBuffsCooldownPos = "BOTTOM",
buffsBuffsCooldownGrowDirection = "RIGHT", buffsBuffsCooldownGrowDirection = "RIGHT",
buffsBuffsXOffset = 0, buffsBuffsXOffset = 0,
buffsBuffsYOffset = 0, buffsBuffsYOffset = 0,
@ -54,14 +42,16 @@ local BuffsDebuffs = Gladdy:NewModule("BuffsDebuffs", nil, {
buffsBorderColorsEnabled = true, buffsBorderColorsEnabled = true,
trackedDebuffs = defaultTrackedDebuffs, trackedDebuffs = defaultTrackedDebuffs,
trackedBuffs = defaultTrackedBuffs, trackedBuffs = defaultTrackedBuffs,
buffsBorderColorCurse = auraTypeColor["curse"], buffsBorderColorCurse = Gladdy:GetAuraTypeColor()["curse"],
buffsBorderColorMagic = auraTypeColor["magic"], buffsBorderColorMagic = Gladdy:GetAuraTypeColor()["magic"],
buffsBorderColorPoison = auraTypeColor["poison"], buffsBorderColorPoison = Gladdy:GetAuraTypeColor()["poison"],
buffsBorderColorPhysical = auraTypeColor["none"], buffsBorderColorPhysical = Gladdy:GetAuraTypeColor()["none"],
buffsBorderColorImmune = auraTypeColor["immune"], buffsBorderColorImmune = Gladdy:GetAuraTypeColor()["immune"],
buffsBorderColorDisease = auraTypeColor["disease"], buffsBorderColorDisease = Gladdy:GetAuraTypeColor()["disease"],
buffsBorderColorForm = auraTypeColor["form"], buffsBorderColorForm = Gladdy:GetAuraTypeColor()["form"],
buffsBorderColorAura = auraTypeColor["aura"] buffsBorderColorAura = Gladdy:GetAuraTypeColor()["aura"],
buffFrameStrata = "MEDIUM",
buffsFrameLevel = 9,
}) })
local spellSchoolToOptionValueTable local spellSchoolToOptionValueTable
@ -72,7 +62,7 @@ local function spellSchoolToOptionValue(spellSchool)
spellSchoolToOptionValueTable[spellSchool].b, spellSchoolToOptionValueTable[spellSchool].b,
spellSchoolToOptionValueTable[spellSchool].a spellSchoolToOptionValueTable[spellSchool].a
else else
return Gladdy.db.buffsBorderColor.r,Gladdy.db.buffsBorderColor.g,Gladdy.db.buffsBorderColor.b,Gladdy.db.buffsBorderColor.a return Gladdy:SetColor(Gladdy.db.buffsBorderColor)
end end
end end
@ -86,13 +76,16 @@ function BuffsDebuffs:Initialize()
self.icons = {} self.icons = {}
self.trackedCC = {} self.trackedCC = {}
self.framePool = {} self.framePool = {}
self:RegisterMessage("JOINED_ARENA") if Gladdy.db.buffsEnabled then
self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessages(
self:RegisterMessage("UNIT_DEATH") "JOINED_ARENA",
self:RegisterMessage("AURA_FADE") "UNIT_DESTROYED",
self:RegisterMessage("AURA_GAIN") "UNIT_DEATH",
self:RegisterMessage("AURA_GAIN_LIMIT") "AURA_FADE",
self:SetScript("OnEvent", BuffsDebuffs.OnEvent) "AURA_GAIN",
"AURA_GAIN_LIMIT")
self:SetScript("OnEvent", BuffsDebuffs.OnEvent)
end
spellSchoolToOptionValueTable = { spellSchoolToOptionValueTable = {
curse = Gladdy.db.buffsBorderColorCurse, curse = Gladdy.db.buffsBorderColorCurse,
magic = Gladdy.db.buffsBorderColorMagic, magic = Gladdy.db.buffsBorderColorMagic,
@ -144,19 +137,31 @@ end
function BuffsDebuffs:Test(unit) function BuffsDebuffs:Test(unit)
if Gladdy.db.buffsEnabled then if Gladdy.db.buffsEnabled then
if unit == "arena1" or unit == "arena3" then local spellSchools = { "physical", "magic", "curse", "poison", "disease", "immune" }
self:AddOrRefreshAura(unit, 1943, AURA_TYPE_DEBUFF, 10, 10, 1,"physical", select(3, GetSpellInfo(1943)), 1)
self:AddOrRefreshAura(unit, 18647, AURA_TYPE_DEBUFF, 10, 10,1, "immune", select(3, GetSpellInfo(18647)), 2) BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF)
self:AddOrRefreshAura(unit, 27218, AURA_TYPE_DEBUFF, 24, 20,1, "curse", select(3, GetSpellInfo(27218)), 3) BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF)
self:AddOrRefreshAura(unit, 27216, AURA_TYPE_DEBUFF, 18, 18,1, "magic", select(3, GetSpellInfo(27216)), 4) --BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 1243, select(1, GetSpellInfo(1243)), select(3, GetSpellInfo(1243)), 10, GetTime() + 10, 1, "physical")
self:AddOrRefreshAura(unit, 27189, AURA_TYPE_DEBUFF, 12, 12,5, "poison", select(3, GetSpellInfo(27189)), 5) --self:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 31117, select(1, GetSpellInfo(31117)), select(3, GetSpellInfo(31117)), 10, GetTime() + 10, 1, "physical")
self:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 20, 20,5, "magic", select(3, GetSpellInfo(32999)), 1) local i = 1
self:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 20, 20,5, "magic", select(3, GetSpellInfo(25389)), 2) for spellID, enabled in pairs(Gladdy.db.trackedDebuffs) do
elseif unit == "arena2" then if i > 4 then
self:AddOrRefreshAura(unit, 1943, AURA_TYPE_DEBUFF, 10, 10, 1, "physical", select(3, GetSpellInfo(1943)), 1) break
self:AddOrRefreshAura(unit, 1, AURA_TYPE_DEBUFF, 20, 20,5, "poison", select(3, GetSpellInfo(1)), 2) end
self:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 20, 20,5, "magic", select(3, GetSpellInfo(32999)), 1) if enabled then
self:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 20, 20,5, "magic", select(3, GetSpellInfo(25389)), 2) BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_DEBUFF, 15, 15, random(1,5), spellSchools[random(1,6)], select(3, GetSpellInfo(spellID)), i)
i = i + 1
end
end
i = 1
for spellID, enabled in pairs(Gladdy.db.trackedBuffs) do
if i > 4 then
break
end
if enabled then
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_BUFF, 15, 15, random(1,5), spellSchools[random(1,6)], select(3, GetSpellInfo(spellID)), i)
i = i + 1
end
end end
end end
end end
@ -196,11 +201,24 @@ function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, dur
return return
end end
local auraFrame = self.frames[unit] local auraFrame = self.frames[unit]
local aura = Gladdy.db.auraListDefault[spellName] and Gladdy.db.auraListDefault[spellName].enabled spellName = LibClassAuras.GetAltName(spellID) or spellName
local aura = Gladdy:GetImportantAuras()[spellName] and Gladdy.db.auraListDefault[tostring(Gladdy:GetImportantAuras()[spellName].spellID)].enabled
if aura and Gladdy.db.buffsShowAuraDebuffs then if aura and Gladdy.db.buffsShowAuraDebuffs then
aura = false aura = false
end end
if not aura and spellID and expirationTime and (Gladdy.db.trackedBuffs[spellName] or Gladdy.db.trackedDebuffs[spellName]) then local auraNames = LibClassAuras.GetSpellNameToId(auraType)
local spellId
local isTracked = false
if auraNames[spellName] then
for _, spellInfo in ipairs(auraNames[spellName]) do
spellId = spellInfo.id[1]
if (Gladdy.db.trackedBuffs[tostring(spellId)] or Gladdy.db.trackedDebuffs[tostring(spellId)]) then
isTracked = true
break
end
end
end
if not aura and spellID and expirationTime and isTracked then
local index local index
if auraType == AURA_TYPE_DEBUFF then if auraType == AURA_TYPE_DEBUFF then
auraFrame.numDebuffs = auraFrame.numDebuffs + 1 auraFrame.numDebuffs = auraFrame.numDebuffs + 1
@ -219,14 +237,18 @@ end
function BuffsDebuffs:CreateFrame(unit) function BuffsDebuffs:CreateFrame(unit)
local debuffFrame = CreateFrame("Frame", "GladdyDebuffs" .. unit, Gladdy.buttons[unit]) local debuffFrame = CreateFrame("Frame", "GladdyDebuffs" .. unit, Gladdy.buttons[unit])
debuffFrame:SetFrameStrata(Gladdy.db.buffFrameStrata)
debuffFrame:SetFrameLevel(Gladdy.db.buffsFrameLevel)
debuffFrame:SetMovable(true)
debuffFrame:SetHeight(Gladdy.db.buffsIconSize) debuffFrame:SetHeight(Gladdy.db.buffsIconSize)
debuffFrame:SetWidth(1) debuffFrame:SetWidth(1)
debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPLEFT", 0, Gladdy.db.highlightBorderSize + Gladdy.db.padding)
debuffFrame.unit = unit debuffFrame.unit = unit
local buffFrame = CreateFrame("Frame", "GladdyBuffs" .. unit, Gladdy.buttons[unit]) local buffFrame = CreateFrame("Frame", "GladdyBuffs" .. unit, Gladdy.buttons[unit])
buffFrame:SetFrameStrata(Gladdy.db.buffFrameStrata)
buffFrame:SetFrameLevel(Gladdy.db.buffsFrameLevel)
buffFrame:SetMovable(true)
buffFrame:SetHeight(Gladdy.db.buffsIconSize) buffFrame:SetHeight(Gladdy.db.buffsIconSize)
buffFrame:SetWidth(1) buffFrame:SetWidth(1)
buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPLEFT", 0, Gladdy.db.highlightBorderSize + Gladdy.db.padding)
buffFrame.unit = unit buffFrame.unit = unit
self.frames[unit] = {} self.frames[unit] = {}
self.frames[unit].buffFrame = buffFrame self.frames[unit].buffFrame = buffFrame
@ -258,150 +280,56 @@ local function styleIcon(aura, auraType)
aura.cooldowncircle:SetAlpha(Gladdy.db.buffsCooldownAlpha) aura.cooldowncircle:SetAlpha(Gladdy.db.buffsCooldownAlpha)
end end
aura:SetFrameStrata(Gladdy.db.buffFrameStrata)
aura:SetFrameLevel(Gladdy.db.buffsFrameLevel)
aura.cooldowncircle:SetFrameLevel(Gladdy.db.buffsFrameLevel + 1)
aura.overlay:SetFrameLevel(Gladdy.db.buffsFrameLevel + 2)
aura.border:SetTexture(Gladdy.db.buffsBorderStyle) aura.border:SetTexture(Gladdy.db.buffsBorderStyle)
aura.border:SetVertexColor(spellSchoolToOptionValue(aura.spellSchool)) aura.border:SetVertexColor(spellSchoolToOptionValue(aura.spellSchool))
aura.cooldown:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.buffsFont), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.cooldown:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE")
aura.cooldown:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a) aura.cooldown:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a)
aura.stacks:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.buffsFont), (Gladdy.db.buffsIconSize/3 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.stacks:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/3 - 1) * Gladdy.db.buffsFontScale, "OUTLINE")
aura.stacks:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a) aura.stacks:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, 1)
end
function BuffsDebuffs:UpdateFrameOnce()
if Gladdy.db.buffsEnabled then
self:RegisterMessages(
"JOINED_ARENA",
"UNIT_DESTROYED",
"UNIT_DEATH",
"AURA_FADE",
"AURA_GAIN",
"AURA_GAIN_LIMIT")
self:SetScript("OnEvent", BuffsDebuffs.OnEvent)
else
self:UnregisterAllMessages()
self:SetScript("OnEvent", nil)
end
end end
function BuffsDebuffs:UpdateFrame(unit) function BuffsDebuffs:UpdateFrame(unit)
--DEBUFFS
self.frames[unit].debuffFrame:SetHeight(Gladdy.db.buffsIconSize) self.frames[unit].debuffFrame:SetHeight(Gladdy.db.buffsIconSize)
self.frames[unit].debuffFrame:ClearAllPoints() Gladdy:SetPosition(self.frames[unit].debuffFrame, unit, "buffsXOffset", "buffsYOffset", BuffsDebuffs:LegacySetPositionDebuffs(unit), BuffsDebuffs)
local horizontalMargin = Gladdy.db.highlightBorderSize if (unit == "arena1") then
local verticalMargin = -(Gladdy.db.powerBarHeight)/2 Gladdy:CreateMover(self.frames[unit].debuffFrame, "buffsXOffset", "buffsYOffset", L["Debuffs"],
if Gladdy.db.buffsCooldownPos == "TOP" then {"TOPRIGHT", "TOPRIGHT"},
verticalMargin = horizontalMargin + 1 Gladdy.db.buffsIconSize * Gladdy.db.buffsWidthFactor, Gladdy.db.buffsIconSize,
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then 0, 0, "buffsEnabled")
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin)
else
self.frames[unit].debuffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin)
end
elseif Gladdy.db.buffsCooldownPos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].powerBar, "BOTTOMRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin)
else
self.frames[unit].debuffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].powerBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin)
end
elseif Gladdy.db.buffsCooldownPos == "LEFT" then
horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
end
elseif Gladdy.db.buffsCooldownPos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
end
end end
--BUFFS
self.frames[unit].buffFrame:SetHeight(Gladdy.db.buffsBuffsIconSize) self.frames[unit].buffFrame:SetHeight(Gladdy.db.buffsBuffsIconSize)
self.frames[unit].buffFrame:ClearAllPoints() Gladdy:SetPosition(self.frames[unit].buffFrame, unit, "buffsBuffsXOffset", "buffsBuffsYOffset", BuffsDebuffs:LegacySetPositionBuffs(unit), BuffsDebuffs)
horizontalMargin = Gladdy.db.highlightBorderSize if (unit == "arena1") then
verticalMargin = -(Gladdy.db.powerBarHeight)/2 Gladdy:CreateMover(self.frames[unit].buffFrame, "buffsBuffsXOffset", "buffsBuffsYOffset", L["Buffs"],
if Gladdy.db.buffsBuffsCooldownPos == "TOP" then {"TOPRIGHT", "TOPRIGHT"},
verticalMargin = horizontalMargin + 1 Gladdy.db.buffsBuffsIconSize * Gladdy.db.buffsBuffsWidthFactor, Gladdy.db.buffsBuffsIconSize,
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then 0, 0, "buffsEnabled")
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
else
self.frames[unit].buffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
end
elseif Gladdy.db.buffsBuffsCooldownPos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].powerBar, "BOTTOMRIGHT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin)
else
self.frames[unit].buffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].powerBar, "BOTTOMLEFT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin)
end
elseif Gladdy.db.buffsBuffsCooldownPos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "LEFT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "LEFT")
horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
end
elseif Gladdy.db.buffsBuffsCooldownPos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "RIGHT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
end
end end
for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do
styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF) styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF)
end end
@ -421,13 +349,8 @@ end
function BuffsDebuffs:UpdateAurasOnUnit(unit) function BuffsDebuffs:UpdateAurasOnUnit(unit)
for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do
if i == 1 then if i == 1 then
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("RIGHT", self.frames[unit].buffFrame, "LEFT")
self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("RIGHT", self.frames[unit].buffFrame, "LEFT")
else
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("LEFT", self.frames[unit].buffFrame, "RIGHT")
end
else else
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
@ -440,13 +363,8 @@ function BuffsDebuffs:UpdateAurasOnUnit(unit)
end end
for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do
if i == 1 then if i == 1 then
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("RIGHT", self.frames[unit].debuffFrame, "LEFT")
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("RIGHT", self.frames[unit].debuffFrame, "LEFT")
else
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("LEFT", self.frames[unit].debuffFrame, "RIGHT")
end
else else
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
@ -459,37 +377,28 @@ function BuffsDebuffs:UpdateAurasOnUnit(unit)
end end
end end
function BuffsDebuffs:UNIT_DEATH(destUnit)
self:RemoveAuras(destUnit)
end
local function iconTimer(auraFrame, elapsed) local function iconTimer(auraFrame, elapsed)
if auraFrame.endtime ~= "undefined" then if auraFrame.endtime ~= "undefined" then
local timeLeftMilliSec = auraFrame.endtime - GetTime() local timeLeftMilliSec = auraFrame.endtime - GetTime()
local timeLeftSec = ceil(timeLeftMilliSec) local timeLeftSec = ceil(timeLeftMilliSec)
auraFrame.timeLeft = timeLeftMilliSec auraFrame.timeLeft = timeLeftMilliSec
--auraFrame.cooldowncircle:SetCooldown(auraFrame.startTime, auraFrame.endtime) if Gladdy.db.buffsDynamicColor then
if timeLeftSec >= 60 then if timeLeftSec >= 60 then
if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(0.7, 1, 0) end auraFrame.cooldown:SetTextColor(0.7, 1, 0, Gladdy.db.buffsFontColor.a)
auraFrame.cooldown:SetFormattedText("%dm", ceil(timeLeftSec / 60)) elseif timeLeftSec < 60 and timeLeftSec >= 11 then
elseif timeLeftSec < 60 and timeLeftSec >= 11 then auraFrame.cooldown:SetTextColor(0.7, 1, 0, Gladdy.db.buffsFontColor.a)
--if it's less than 60s elseif timeLeftSec <= 10 and timeLeftSec >= 5 then
if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(0.7, 1, 0) end auraFrame.cooldown:SetTextColor(1, 0.7, 0, Gladdy.db.buffsFontColor.a)
auraFrame.cooldown:SetFormattedText("%d", timeLeftSec) elseif timeLeftSec <= 4 and timeLeftSec >= 3 then
elseif timeLeftSec <= 10 and timeLeftSec >= 5 then auraFrame.cooldown:SetTextColor(1, 0, 0, Gladdy.db.buffsFontColor.a)
if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(1, 0.7, 0) end elseif timeLeftMilliSec <= 3 and timeLeftMilliSec > 0 then
auraFrame.cooldown:SetFormattedText("%d", timeLeftSec) auraFrame.cooldown:SetTextColor(1, 0, 0, Gladdy.db.buffsFontColor.a)
elseif timeLeftSec <= 4 and timeLeftSec >= 3 then end
if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(1, 0, 0) end end
auraFrame.cooldown:SetFormattedText("%d", timeLeftSec) if timeLeftMilliSec < 0 then
elseif timeLeftMilliSec <= 3 and timeLeftMilliSec > 0 then
if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(1, 0, 0) end
auraFrame.cooldown:SetFormattedText("%.1f", timeLeftMilliSec >= 0.0 and timeLeftMilliSec or 0.0)
elseif timeLeftMilliSec <= 0 and timeLeftMilliSec > -0.05 then -- 50ms ping max wait for SPELL_AURA_REMOVED event
auraFrame.cooldown:SetText("")
else -- fallback in case SPELL_AURA_REMOVED is not fired
auraFrame:Hide() auraFrame:Hide()
end end
Gladdy:FormatTimer(auraFrame.cooldown, timeLeftMilliSec, timeLeftMilliSec <= 3)
else else
auraFrame.cooldown:SetText("") auraFrame.cooldown:SetText("")
end end
@ -502,17 +411,20 @@ function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stack
aura = tremove(self.framePool, #self.framePool) aura = tremove(self.framePool, #self.framePool)
else else
aura = CreateFrame("Frame") aura = CreateFrame("Frame")
aura:SetFrameLevel(3) aura:EnableMouse(false)
aura:SetFrameStrata(Gladdy.db.buffFrameStrata)
aura:SetFrameLevel(Gladdy.db.buffsFrameLevel)
aura.texture = aura:CreateTexture(nil, "BACKGROUND") aura.texture = aura:CreateTexture(nil, "BACKGROUND")
aura.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
aura.texture:SetAllPoints(aura) aura.texture:SetAllPoints(aura)
aura.cooldowncircle = CreateFrame("Cooldown", nil, aura, "CooldownFrameTemplate") aura.cooldowncircle = CreateFrame("Cooldown", nil, aura, "CooldownFrameTemplate")
aura.cooldowncircle:SetFrameLevel(4) aura.cooldowncircle:SetFrameLevel(Gladdy.db.buffsFrameLevel + 1)
aura.cooldowncircle.noCooldownCount = true -- disable OmniCC aura.cooldowncircle.noCooldownCount = true -- disable OmniCC
aura.cooldowncircle:SetAllPoints(aura) aura.cooldowncircle:SetAllPoints(aura)
aura.cooldowncircle:SetReverse(true) aura.cooldowncircle:SetReverse(true)
aura.cooldowncircle:SetHideCountdownNumbers(true) aura.cooldowncircle:SetHideCountdownNumbers(true)
aura.overlay = CreateFrame("Frame", nil, aura) aura.overlay = CreateFrame("Frame", nil, aura)
aura.overlay:SetFrameLevel(5) aura.overlay:SetFrameLevel(Gladdy.db.buffsFrameLevel + 2)
aura.overlay:SetAllPoints(aura) aura.overlay:SetAllPoints(aura)
aura.border = aura.overlay:CreateTexture(nil, "OVERLAY") aura.border = aura.overlay:CreateTexture(nil, "OVERLAY")
aura.border:SetAllPoints(aura) aura.border:SetAllPoints(aura)
@ -574,36 +486,6 @@ end
-- OPTIONS -- OPTIONS
------------ ------------
local function option(params)
local defaults = {
get = function(info)
local key = info.arg or info[#info]
return Gladdy.dbi.profile[key]
end,
set = function(info, value)
local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value
if Gladdy.db.buffsCooldownPos == "LEFT" then
Gladdy.db.buffsCooldownGrowDirection = "LEFT"
elseif Gladdy.db.buffsCooldownPos == "RIGHT" then
Gladdy.db.buffsCooldownGrowDirection = "RIGHT"
end
if Gladdy.db.buffsBuffsCooldownPos == "LEFT" then
Gladdy.db.buffsBuffsCooldownGrowDirection = "LEFT"
elseif Gladdy.db.buffsBuffsCooldownPos == "RIGHT" then
Gladdy.db.buffsBuffsCooldownGrowDirection = "RIGHT"
end
Gladdy:UpdateFrame()
end,
}
for k, v in pairs(params) do
defaults[k] = v
end
return defaults
end
function BuffsDebuffs:GetOptions() function BuffsDebuffs:GetOptions()
return { return {
headerBuffs = { headerBuffs = {
@ -613,7 +495,7 @@ function BuffsDebuffs:GetOptions()
}, },
buffsEnabled = Gladdy:option({ buffsEnabled = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Enable"], name = L["Enabled"],
desc = L["Enabled Buffs and Debuffs module"], desc = L["Enabled Buffs and Debuffs module"],
order = 3, order = 3,
}), }),
@ -622,12 +504,14 @@ function BuffsDebuffs:GetOptions()
name = L["Show CC"], name = L["Show CC"],
desc = L["Shows all debuffs, which are displayed on the ClassIcon as well"], desc = L["Shows all debuffs, which are displayed on the ClassIcon as well"],
order = 4, order = 4,
disabled = function() return not Gladdy.db.buffsEnabled end,
}), }),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 5, order = 5,
disabled = function() return not Gladdy.db.buffsEnabled end,
args = { args = {
buffs = { buffs = {
type = "group", type = "group",
@ -636,7 +520,7 @@ function BuffsDebuffs:GetOptions()
args = { args = {
size = { size = {
type = "group", type = "group",
name = "Size & Padding", name = L["Size & Padding"],
order = 1, order = 1,
args = { args = {
header = { header = {
@ -652,6 +536,7 @@ function BuffsDebuffs:GetOptions()
min = 5, min = 5,
max = 50, max = 50,
step = 1, step = 1,
width = "full",
}), }),
buffsBuffsWidthFactor = Gladdy:option({ buffsBuffsWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -661,6 +546,7 @@ function BuffsDebuffs:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
width = "full",
}), }),
buffsBuffsIconPadding = Gladdy:option({ buffsBuffsIconPadding = Gladdy:option({
type = "range", type = "range",
@ -670,12 +556,13 @@ function BuffsDebuffs:GetOptions()
min = 0, min = 0,
max = 10, max = 10,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
position = { position = {
type = "group", type = "group",
name = "Position", name = L["Position"],
order = 3, order = 3,
args = { args = {
header = { header = {
@ -683,18 +570,6 @@ function BuffsDebuffs:GetOptions()
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
buffsBuffsCooldownPos = option({
type = "select",
name = L["Aura Position"],
desc = L["Position of the aura icons"],
order = 21,
values = {
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
buffsBuffsCooldownGrowDirection = Gladdy:option({ buffsBuffsCooldownGrowDirection = Gladdy:option({
type = "select", type = "select",
name = L["Grow Direction"], name = L["Grow Direction"],
@ -712,6 +587,7 @@ function BuffsDebuffs:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
buffsBuffsYOffset = Gladdy:option({ buffsBuffsYOffset = Gladdy:option({
type = "range", type = "range",
@ -720,6 +596,7 @@ function BuffsDebuffs:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -740,6 +617,7 @@ function BuffsDebuffs:GetOptions()
min = 0, min = 0,
max = 1, max = 1,
step = 0.05, step = 0.05,
width = "full",
}), }),
} }
} }
@ -752,7 +630,7 @@ function BuffsDebuffs:GetOptions()
args = { args = {
size = { size = {
type = "group", type = "group",
name = "Size & Padding", name = L["Size & Padding"],
order = 1, order = 1,
args = { args = {
header = { header = {
@ -768,6 +646,7 @@ function BuffsDebuffs:GetOptions()
min = 5, min = 5,
max = 50, max = 50,
step = 1, step = 1,
width = "full",
}), }),
buffsWidthFactor = Gladdy:option({ buffsWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -777,6 +656,7 @@ function BuffsDebuffs:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
width = "full",
}), }),
buffsIconPadding = Gladdy:option({ buffsIconPadding = Gladdy:option({
type = "range", type = "range",
@ -786,12 +666,13 @@ function BuffsDebuffs:GetOptions()
min = 0, min = 0,
max = 10, max = 10,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
position = { position = {
type = "group", type = "group",
name = "Position", name = L["Position"],
order = 3, order = 3,
args = { args = {
header = { header = {
@ -799,18 +680,6 @@ function BuffsDebuffs:GetOptions()
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
buffsCooldownPos = option({
type = "select",
name = L["Aura Position"],
desc = L["Position of the aura icons"],
order = 21,
values = {
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
buffsCooldownGrowDirection = Gladdy:option({ buffsCooldownGrowDirection = Gladdy:option({
type = "select", type = "select",
name = L["Grow Direction"], name = L["Grow Direction"],
@ -828,6 +697,7 @@ function BuffsDebuffs:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
buffsYOffset = Gladdy:option({ buffsYOffset = Gladdy:option({
type = "range", type = "range",
@ -836,6 +706,7 @@ function BuffsDebuffs:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -856,6 +727,7 @@ function BuffsDebuffs:GetOptions()
min = 0, min = 0,
max = 1, max = 1,
step = 0.05, step = 0.05,
width = "full",
}), }),
} }
} }
@ -863,7 +735,7 @@ function BuffsDebuffs:GetOptions()
}, },
cooldown = { cooldown = {
type = "group", type = "group",
name = "Cooldown", name = L["Cooldown"],
order = 3, order = 3,
args = { args = {
header = { header = {
@ -875,6 +747,7 @@ function BuffsDebuffs:GetOptions()
type = "toggle", type = "toggle",
name = L["No Cooldown Circle"], name = L["No Cooldown Circle"],
order = 9, order = 9,
width = "full",
}), }),
buffsCooldownAlpha = Gladdy:option({ buffsCooldownAlpha = Gladdy:option({
type = "range", type = "range",
@ -883,12 +756,29 @@ function BuffsDebuffs:GetOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
order = 10, order = 10,
width = "full",
}), }),
buffsCooldownNumberAlpha = {
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 11,
width = "full",
set = function(info, value)
Gladdy.db.buffsFontColor.a = value
Gladdy:UpdateFrame()
end,
get = function(info)
return Gladdy.db.buffsFontColor.a
end,
},
}, },
}, },
font = { font = {
type = "group", type = "group",
name = "Font", name = L["Font"],
order = 4, order = 4,
args = { args = {
header = { header = {
@ -912,6 +802,7 @@ function BuffsDebuffs:GetOptions()
min = 0.1, min = 0.1,
max = 2, max = 2,
step = 0.1, step = 0.1,
width = "full",
}), }),
buffsDynamicColor = Gladdy:option({ buffsDynamicColor = Gladdy:option({
type = "toggle", type = "toggle",
@ -930,7 +821,7 @@ function BuffsDebuffs:GetOptions()
}, },
border = { border = {
type = "group", type = "group",
name = "Border", name = L["Border"],
order = 5, order = 5,
args = { args = {
header = { header = {
@ -1014,14 +905,44 @@ function BuffsDebuffs:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
buffFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
buffsFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
debuffList = { debuffList = {
name = "Debuff Lists", name = L["Debuff Lists"],
type = "group", type = "group",
order = 11, order = 11,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree", childGroups = "tree",
args = select(1, Gladdy:GetAuras("debuff")), args = select(1, Gladdy:GetAuras(AURA_TYPE_DEBUFF)),
set = function(info, state) set = function(info, state)
local optionKey = info[#info] local optionKey = info[#info]
Gladdy.dbi.profile.trackedDebuffs[optionKey] = state Gladdy.dbi.profile.trackedDebuffs[optionKey] = state
@ -1032,11 +953,12 @@ function BuffsDebuffs:GetOptions()
end, end,
}, },
buffList = { buffList = {
name = "Buff Lists", name = L["Buff Lists"],
type = "group", type = "group",
order = 12, order = 12,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree", childGroups = "tree",
args = select(1, Gladdy:GetAuras("buffs")), args = select(1, Gladdy:GetAuras(AURA_TYPE_BUFF)),
set = function(info, state) set = function(info, state)
local optionKey = info[#info] local optionKey = info[#info]
Gladdy.dbi.profile.trackedBuffs[optionKey] = state Gladdy.dbi.profile.trackedBuffs[optionKey] = state
@ -1049,3 +971,168 @@ function BuffsDebuffs:GetOptions()
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function BuffsDebuffs:LegacySetPositionDebuffs(unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit].debuffFrame:ClearAllPoints()
local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
local verticalMargin = -(Gladdy.db.powerBarHeight)/2
local offset = 0
if (Gladdy.db.buffsCooldownGrowDirection == "RIGHT") then
offset = Gladdy.db.buffsIconSize * Gladdy.db.buffsWidthFactor
end
local pos = Gladdy.db.buffsCooldownPos
if pos == "TOP" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset + verticalMargin)
else
self.frames[unit].debuffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset + verticalMargin)
end
elseif pos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].debuffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
end
elseif pos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
end
elseif pos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
end
end
return Gladdy.db.newLayout
end
function BuffsDebuffs:LegacySetPositionBuffs(unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit].buffFrame:ClearAllPoints()
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
local verticalMargin = -(Gladdy.db.powerBarHeight)/2
local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local offset = 0
if (Gladdy.db.buffsBuffsCooldownGrowDirection == "RIGHT") then
offset = Gladdy.db.buffsBuffsIconSize * Gladdy.db.buffsBuffsWidthFactor
end
local pos = Gladdy.db.buffsBuffsCooldownPos
if pos == "TOP" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
else
self.frames[unit].buffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
end
elseif pos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].buffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
end
elseif pos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "LEFT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "LEFT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
end
elseif pos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "RIGHT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
end
end
return Gladdy.db.newLayout
end

View File

@ -18,12 +18,14 @@ local BackdropTemplateMixin = BackdropTemplateMixin
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists
local Castbar = Gladdy:NewModule("Castbar", 70, { local Castbar = Gladdy:NewModule("Cast Bar", 70, {
castBarEnabled = true,
castBarHeight = 20, castBarHeight = 20,
castBarWidth = 160, castBarWidth = 160,
castBarIconSize = 22, castBarIconSize = 22,
castBarBorderSize = 8, castBarBorderSize = 8,
castBarFontSize = 12, castBarFontSize = 12,
castBarFontOutline = false,
castBarTexture = "Smooth", castBarTexture = "Smooth",
castBarIconStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", castBarIconStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
castBarBorderStyle = "Gladdy Tooltip round", castBarBorderStyle = "Gladdy Tooltip round",
@ -32,8 +34,8 @@ local Castbar = Gladdy:NewModule("Castbar", 70, {
castBarIconColor = { r = 0, g = 0, b = 0, a = 1 }, castBarIconColor = { r = 0, g = 0, b = 0, a = 1 },
castBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, castBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
castBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, castBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
castBarIconEnabled = true,
castBarGuesses = true, castBarGuesses = true,
castBarPos = "LEFT",
castBarXOffset = 0, castBarXOffset = 0,
castBarYOffset = 0, castBarYOffset = 0,
castBarIconPos = "LEFT", castBarIconPos = "LEFT",
@ -41,12 +43,16 @@ local Castbar = Gladdy:NewModule("Castbar", 70, {
castBarTimerFormat = "LEFT", castBarTimerFormat = "LEFT",
castBarSparkEnabled = true, castBarSparkEnabled = true,
castBarSparkColor = { r = 1, g = 1, b = 1, a = 1 }, castBarSparkColor = { r = 1, g = 1, b = 1, a = 1 },
castBarFrameStrata = "MEDIUM",
castBarFrameLevel = 5,
}) })
function Castbar:Initialize() function Castbar:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("UNIT_DEATH") if Gladdy.db.castBarEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA")
end
end end
--------------------------- ---------------------------
@ -56,19 +62,28 @@ end
--------------------------- ---------------------------
function Castbar:CreateFrame(unit) function Castbar:CreateFrame(unit)
local castBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local castBar = CreateFrame("Frame", nil, Gladdy.buttons[unit])
castBar:EnableMouse(false)
castBar:SetMovable(true)
castBar.unit = unit castBar.unit = unit
castBar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle), castBar.backdrop = CreateFrame("Frame", nil, castBar, BackdropTemplateMixin and "BackdropTemplate")
castBar.backdrop:SetAllPoints(castBar)
castBar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"),
edgeSize = Gladdy.db.castBarBorderSize }) edgeSize = Gladdy.db.castBarBorderSize })
castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a) castBar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.castBarBorderColor))
castBar:SetFrameLevel(1) castBar.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.backdrop:SetFrameLevel(Gladdy.db.castBarFrameLevel - 1)
castBar.bar = CreateFrame("StatusBar", nil, castBar) castBar.bar = CreateFrame("StatusBar", nil, castBar)
castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture"))
castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a) castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
castBar.bar:SetMinMaxValues(0, 100) castBar.bar:SetMinMaxValues(0, 100)
castBar.bar:SetFrameLevel(0) castBar.bar:SetFrameLevel(0)
castBar.bar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.bar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.spark = castBar:CreateTexture(nil, "OVERLAY") castBar.spark = castBar:CreateTexture(nil, "OVERLAY")
castBar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark") castBar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
@ -79,12 +94,15 @@ function Castbar:CreateFrame(unit)
castBar.bg = castBar.bar:CreateTexture(nil, "BACKGROUND") castBar.bg = castBar.bar:CreateTexture(nil, "BACKGROUND")
castBar.bg:SetAlpha(1) castBar.bg:SetAlpha(1)
castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture"))
castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a) castBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarBgColor))
castBar.bg:SetAllPoints(castBar.bar) castBar.bg:SetAllPoints(castBar.bar)
castBar.icon = CreateFrame("Frame", nil, castBar) castBar.icon = CreateFrame("Frame", nil, castBar)
castBar.icon:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.icon:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.icon.texture = castBar.icon:CreateTexture(nil, "BACKGROUND") castBar.icon.texture = castBar.icon:CreateTexture(nil, "BACKGROUND")
castBar.icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
castBar.icon.texture:SetAllPoints(castBar.icon) castBar.icon.texture:SetAllPoints(castBar.icon)
castBar.icon.texture.overlay = castBar.icon:CreateTexture(nil, "BORDER") castBar.icon.texture.overlay = castBar.icon:CreateTexture(nil, "BORDER")
castBar.icon.texture.overlay:SetAllPoints(castBar.icon.texture) castBar.icon.texture.overlay:SetAllPoints(castBar.icon.texture)
@ -98,16 +116,16 @@ function Castbar:CreateFrame(unit)
end end
castBar.spellText = castBar:CreateFontString(nil, "LOW") castBar.spellText = castBar:CreateFontString(nil, "LOW")
castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) castBar.spellText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.spellText:SetShadowOffset(1, -1) castBar.spellText:SetShadowOffset(1, -1)
castBar.spellText:SetShadowColor(0, 0, 0, 1) castBar.spellText:SetShadowColor(0, 0, 0, 1)
castBar.spellText:SetJustifyH("CENTER") castBar.spellText:SetJustifyH("CENTER")
castBar.spellText:SetPoint("LEFT", 7, 0) -- Text of the spell castBar.spellText:SetPoint("LEFT", 7, 0) -- Text of the spell
castBar.timeText = castBar:CreateFontString(nil, "LOW") castBar.timeText = castBar:CreateFontString(nil, "LOW")
castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) castBar.timeText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.timeText:SetShadowOffset(1, -1) castBar.timeText:SetShadowOffset(1, -1)
castBar.timeText:SetShadowColor(0, 0, 0, 1) castBar.timeText:SetShadowColor(0, 0, 0, 1)
castBar.timeText:SetJustifyH("CENTER") castBar.timeText:SetJustifyH("CENTER")
@ -118,31 +136,48 @@ function Castbar:CreateFrame(unit)
self:ResetUnit(unit) self:ResetUnit(unit)
end end
function Castbar:UpdateFrameOnce()
if Gladdy.db.castBarEnabled then
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function Castbar:UpdateFrame(unit) function Castbar:UpdateFrame(unit)
local button = Gladdy.buttons[unit]
local castBar = self.frames[unit] local castBar = self.frames[unit]
if (not castBar) then if (not castBar) then
return return
end end
castBar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.backdrop:SetFrameLevel(Gladdy.db.castBarFrameLevel - 1)
castBar.bar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.bar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.icon:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.icon:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar:SetWidth(Gladdy.db.castBarWidth) castBar:SetWidth(Gladdy.db.castBarWidth)
castBar:SetHeight(Gladdy.db.castBarHeight) castBar:SetHeight(Gladdy.db.castBarHeight)
castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle), castBar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"),
edgeSize = Gladdy.db.castBarBorderSize }) edgeSize = Gladdy.db.castBarBorderSize })
castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a) castBar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.castBarBorderColor))
castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture"))
castBar.bar:ClearAllPoints() castBar.bar:ClearAllPoints()
castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a) castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
castBar.bar:SetPoint("TOPLEFT", castBar, "TOPLEFT", (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) castBar.bar:SetPoint("TOPLEFT", castBar, "TOPLEFT", (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset))
castBar.bar:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) castBar.bar:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset))
castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture"))
castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a) castBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarBgColor))
if Gladdy.db.castBarSparkEnabled then if Gladdy.db.castBarSparkEnabled then
castBar.spark:SetHeight(Gladdy.db.castBarHeight * 1.8) castBar.spark:SetHeight(Gladdy.db.castBarHeight * 1.8)
castBar.spark:SetVertexColor(Gladdy.db.castBarSparkColor.r, Gladdy.db.castBarSparkColor.g, Gladdy.db.castBarSparkColor.b, Gladdy.db.castBarSparkColor.a) castBar.spark:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarSparkColor))
else else
castBar.spark:SetAlpha(0) castBar.spark:SetAlpha(0)
end end
@ -151,6 +186,11 @@ function Castbar:UpdateFrame(unit)
castBar.icon:SetHeight(Gladdy.db.castBarIconSize) castBar.icon:SetHeight(Gladdy.db.castBarIconSize)
castBar.icon.texture:SetAllPoints(castBar.icon) castBar.icon.texture:SetAllPoints(castBar.icon)
castBar.icon:ClearAllPoints() castBar.icon:ClearAllPoints()
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
else
castBar.icon:Hide()
end
local rightMargin = 0 local rightMargin = 0
local leftMargin = 0 local leftMargin = 0
@ -162,33 +202,25 @@ function Castbar:UpdateFrame(unit)
leftMargin = Gladdy.db.castBarIconSize + 1 leftMargin = Gladdy.db.castBarIconSize + 1
end end
castBar:ClearAllPoints() Gladdy:SetPosition(castBar, unit, "castBarXOffset", "castBarYOffset", Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin), Castbar)
local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding
if (Gladdy.db.castBarPos == "LEFT") then
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
if (Gladdy.db.castBarPos == "RIGHT") then
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) castBar.spellText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) castBar.timeText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle) castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle)
castBar.icon.texture.overlay:SetVertexColor(Gladdy.db.castBarIconColor.r, Gladdy.db.castBarIconColor.g, Gladdy.db.castBarIconColor.b, Gladdy.db.castBarIconColor.a) castBar.icon.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarIconColor))
if (unit == "arena1") then
Gladdy:CreateMover(castBar, "castBarXOffset", "castBarYOffset", L["Cast Bar"],
{"TOPLEFT", "TOPLEFT"}, Gladdy.db.castBarWidth, Gladdy.db.castBarHeight,
0, 0, "castBarEnabled")
end
if not Gladdy.db.castBarEnabled then
self:CAST_STOP(unit)
end
end end
--------------------------- ---------------------------
@ -229,7 +261,7 @@ function Castbar.OnUpdate(castBar, elapsed)
castBar.spark:SetPoint("CENTER", castBar.bar, "LEFT", castBar.spark.position, 0) castBar.spark:SetPoint("CENTER", castBar.bar, "LEFT", castBar.spark.position, 0)
castBar.spark:Show() castBar.spark:Show()
end end
elseif ( GetTime() < castBar.holdTime ) then elseif ( castBar.holdTime and GetTime() < castBar.holdTime ) then
castBar.timeText:Hide() castBar.timeText:Hide()
castBar.spark:Hide() castBar.spark:Hide()
return return
@ -241,7 +273,7 @@ function Castbar.OnUpdate(castBar, elapsed)
castBar.fadeOut = nil; castBar.fadeOut = nil;
castBar.timeText:Show() castBar.timeText:Show()
castBar.spark:Show() castBar.spark:Show()
castBar:Hide(); castBar:SetAlpha(0)
end end
end end
end end
@ -250,7 +282,7 @@ Castbar.CastEventsFunc = {}
Castbar.CastEventsFunc["UNIT_SPELLCAST_START"] = function(castBar, event, ...) Castbar.CastEventsFunc["UNIT_SPELLCAST_START"] = function(castBar, event, ...)
local name, text, texture, startTime, endTime, isTradeSkill, castID = UnitCastingInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill, castID = UnitCastingInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:Hide() castBar:SetAlpha(0)
return return
end end
@ -281,7 +313,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_SUCCEEDED"] = function(castBar, event, ..
end end
Castbar.CastEventsFunc["UNIT_SPELLCAST_STOP"] = function(castBar, event, ...) Castbar.CastEventsFunc["UNIT_SPELLCAST_STOP"] = function(castBar, event, ...)
if ( not castBar:IsVisible() ) then if ( not castBar:IsVisible() ) then
castBar:Hide() castBar:SetAlpha(0)
end end
if ( (castBar.casting and event == "UNIT_SPELLCAST_STOP" and select(2, ...) == castBar.castID) or if ( (castBar.casting and event == "UNIT_SPELLCAST_STOP" and select(2, ...) == castBar.castID) or
(castBar.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP") ) then (castBar.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP") ) then
@ -329,7 +361,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_DELAYED"] = function(castBar, event, ...)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
-- if there is no name, there is no bar -- if there is no name, there is no bar
castBar:Hide() castBar:SetAlpha(0)
return return
end end
castBar.value = (GetTime() - (startTime / 1000)) castBar.value = (GetTime() - (startTime / 1000))
@ -347,7 +379,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_CHANNEL_START"] = function(castBar, event
local name, text, texture, startTime, endTime, isTradeSkill, spellID = UnitChannelInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill, spellID = UnitChannelInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:Hide() castBar:SetAlpha(0)
return return
end end
if ( castBar.spark ) then if ( castBar.spark ) then
@ -365,7 +397,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_CHANNEL_UPDATE"] = function(castBar, even
if ( castBar:IsShown() ) then if ( castBar:IsShown() ) then
local name, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:Hide() castBar:SetAlpha(0)
return return
end end
castBar.value = ((endTime / 1000) - GetTime()) castBar.value = ((endTime / 1000) - GetTime())
@ -394,18 +426,26 @@ function Castbar:CAST_START(unit, spell, icon, value, maxValue, test)
castBar.channeling = test == "channel" castBar.channeling = test == "channel"
end end
castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a) castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
castBar.value = value castBar.value = value
castBar.maxValue = maxValue castBar.maxValue = maxValue
castBar.bar:SetMinMaxValues(0, maxValue) castBar.bar:SetMinMaxValues(0, maxValue)
castBar.bar:SetValue(value) castBar.bar:SetValue(value)
castBar.icon:SetAlpha(1)
castBar.icon.texture:SetTexture(icon) castBar.icon.texture:SetTexture(icon)
castBar.spellText:SetText(spell) castBar.spellText:SetText(spell)
castBar.timeText:SetText(maxValue) castBar.timeText:SetText(maxValue)
castBar.bg:Show() castBar.bg:Show()
castBar:Show() castBar.backdrop:Show()
if Gladdy.db.castBarSparkEnabled then
castBar.spark:Show()
end
castBar:SetAlpha(1) castBar:SetAlpha(1)
castBar.icon:Show() if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
else
castBar.icon:Hide()
end
end end
function Castbar:CAST_STOP(unit, ...) function Castbar:CAST_STOP(unit, ...)
@ -418,12 +458,14 @@ function Castbar:CAST_STOP(unit, ...)
castBar.channeling = nil castBar.channeling = nil
castBar.value = 0 castBar.value = 0
castBar.maxValue = 0 castBar.maxValue = 0
castBar.icon:SetAlpha(0)
castBar.icon.texture:SetTexture("") castBar.icon.texture:SetTexture("")
castBar.spellText:SetText("") castBar.spellText:SetText("")
castBar.timeText:SetText("") castBar.timeText:SetText("")
castBar.bar:SetValue(0) castBar.bar:SetValue(0)
castBar.bg:Hide() castBar.bg:Hide()
castBar:Hide() castBar.backdrop:Hide()
castBar.spark:Hide()
castBar.icon:Hide() castBar.icon:Hide()
else else
castBar.bar:SetStatusBarColor(...) castBar.bar:SetStatusBarColor(...)
@ -437,42 +479,41 @@ end
--------------------------- ---------------------------
function Castbar:JOINED_ARENA() function Castbar:JOINED_ARENA()
for i=1, Gladdy.curBracket do if Gladdy.db.castBarEnabled then
local unit = "arena" .. i for i=1, Gladdy.curBracket do
local castBar = self.frames[unit] local unit = "arena" .. i
castBar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") local castBar = self.frames[unit]
castBar:RegisterEvent("UNIT_SPELLCAST_DELAYED") castBar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") castBar:RegisterEvent("UNIT_SPELLCAST_DELAYED")
castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE") castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP") castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
castBar:RegisterUnitEvent("UNIT_SPELLCAST_START", unit) castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
castBar:RegisterUnitEvent("UNIT_SPELLCAST_STOP", unit) castBar:RegisterUnitEvent("UNIT_SPELLCAST_START", unit)
castBar:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", unit) castBar:RegisterUnitEvent("UNIT_SPELLCAST_STOP", unit)
castBar:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", unit) castBar:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", unit)
castBar:SetScript("OnEvent", Castbar.OnEvent) castBar:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", unit)
castBar:SetScript("OnUpdate", Castbar.OnUpdate) castBar:SetScript("OnEvent", Castbar.OnEvent)
castBar.fadeOut = nil castBar:SetScript("OnUpdate", Castbar.OnUpdate)
self:CAST_STOP(unit) castBar.fadeOut = nil
--Castbar.OnEvent(castBar, "PLAYER_ENTERING_WORLD") self:CAST_STOP(unit)
--Castbar.OnEvent(castBar, "PLAYER_ENTERING_WORLD")
end
end end
end end
function Castbar:ResetUnit(unit) function Castbar:ResetUnit(unit)
local castBar = self.frames[unit] local castBar = self.frames[unit]
castBar:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED") castBar:UnregisterAllEvents()
castBar:UnregisterEvent("UNIT_SPELLCAST_DELAYED")
castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START")
castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
castBar:UnregisterEvent("UNIT_SPELLCAST_START")
castBar:UnregisterEvent("UNIT_SPELLCAST_STOP")
castBar:UnregisterEvent("UNIT_SPELLCAST_FAILED")
castBar:SetScript("OnEvent", nil) castBar:SetScript("OnEvent", nil)
castBar:SetScript("OnUpdate", nil) castBar:SetScript("OnUpdate", nil)
castBar.fadeOut = nil castBar.fadeOut = nil
self:CAST_STOP(unit) self:CAST_STOP(unit)
end end
function Castbar:Reset()
self.test = nil
end
--------------------------- ---------------------------
-- TEST -- TEST
@ -480,25 +521,30 @@ end
--------------------------- ---------------------------
function Castbar:Test(unit) function Castbar:Test(unit)
local spell, _, icon, value, maxValue, event, endTime, startTime self.test = true
if Gladdy.db.castBarEnabled then
local spell, _, icon, value, maxValue, event, endTime, startTime
if (unit == "arena2") then if (unit == "arena2") then
spell, _, icon = GetSpellInfo(27072) spell, _, icon = GetSpellInfo(27072)
value, maxValue, event = 0, 40, "cast" value, maxValue, event = 0, 40, "cast"
elseif (unit == "arena1") then elseif (unit == "arena1") then
spell, _, icon = GetSpellInfo(27220) spell, _, icon = GetSpellInfo(27220)
endTime = GetTime() * 1000 + 60*1000 endTime = GetTime() * 1000 + 60*1000
startTime = GetTime() * 1000 startTime = GetTime() * 1000
value = (endTime / 1000) - GetTime() value = (endTime / 1000) - GetTime()
maxValue = (endTime - startTime) / 1000 maxValue = (endTime - startTime) / 1000
event = "channel" event = "channel"
elseif (unit == "arena3") then else
spell, _, icon = GetSpellInfo(20770) spell, _, icon = GetSpellInfo(20770)
value, maxValue, event = 0, 60, "cast" value, maxValue, event = 0, 60, "cast"
end end
if (spell) then if (spell) then
self:CAST_START(unit, spell, icon, value, maxValue, event) self:CAST_START(unit, spell, icon, value, maxValue, event)
end
else
self:CAST_STOP(unit)
end end
end end
@ -517,7 +563,7 @@ local function option(params)
set = function(info, value) set = function(info, value)
local key = info.arg or info[#info] local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value Gladdy.dbi.profile[key] = value
Gladdy.options.args.Castbar.args.group.args.barFrame.args.castBarBorderSize.max = Gladdy.db.castBarHeight/2 Gladdy.options.args["Cast Bar"].args.group.args.barFrame.args.castBarBorderSize.max = Gladdy.db.castBarHeight/2
if Gladdy.db.castBarBorderSize > Gladdy.db.castBarHeight/2 then if Gladdy.db.castBarBorderSize > Gladdy.db.castBarHeight/2 then
Gladdy.db.castBarBorderSize = Gladdy.db.castBarHeight/2 Gladdy.db.castBarBorderSize = Gladdy.db.castBarHeight/2
end end
@ -539,15 +585,22 @@ function Castbar:GetOptions()
name = L["Cast Bar"], name = L["Cast Bar"],
order = 2, order = 2,
}, },
castBarEnabled = option({
type = "toggle",
name = L["Enabled"],
desc = L["If test is running, type \"/gladdy test\" again"],
order = 3,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 3, order = 4,
disabled = function() return not Gladdy.db.castBarEnabled end,
args = { args = {
barFrame = { barFrame = {
type = "group", type = "group",
name = "Bar", name = L["Bar"],
order = 1, order = 1,
args = { args = {
headerSize = { headerSize = {
@ -561,8 +614,9 @@ function Castbar:GetOptions()
desc = L["Height of the bar"], desc = L["Height of the bar"],
order = 3, order = 3,
min = 0, min = 0,
max = 50, max = 200,
step = 1, step = 1,
width = "full",
}), }),
castBarWidth = option({ castBarWidth = option({
type = "range", type = "range",
@ -570,8 +624,9 @@ function Castbar:GetOptions()
desc = L["Width of the bars"], desc = L["Width of the bars"],
order = 4, order = 4,
min = 0, min = 0,
max = 300, max = 600,
step = 1, step = 1,
width = "full",
}), }),
headerTexture = { headerTexture = {
type = "header", type = "header",
@ -612,6 +667,7 @@ function Castbar:GetOptions()
min = 0.5, min = 0.5,
max = Gladdy.db.castBarHeight/2, max = Gladdy.db.castBarHeight/2,
step = 0.5, step = 0.5,
width = "full",
}), }),
castBarBorderStyle = option({ castBarBorderStyle = option({
type = "select", type = "select",
@ -630,7 +686,7 @@ function Castbar:GetOptions()
}, },
icon = { icon = {
type = "group", type = "group",
name = "Icon", name = L["Icon"],
order = 2, order = 2,
args = { args = {
headerSize = { headerSize = {
@ -638,6 +694,12 @@ function Castbar:GetOptions()
name = L["Icon Size"], name = L["Icon Size"],
order = 1, order = 1,
}, },
castBarIconEnabled = option({
type = "toggle",
name = L["Icon Enabled"],
order = 2,
width = "full",
}),
castBarIconSize = option({ castBarIconSize = option({
type = "range", type = "range",
name = L["Icon size"], name = L["Icon size"],
@ -645,6 +707,7 @@ function Castbar:GetOptions()
min = 0, min = 0,
max = 100, max = 100,
step = 1, step = 1,
width = "full",
}), }),
headerBorder = { headerBorder = {
type = "header", type = "header",
@ -667,7 +730,7 @@ function Castbar:GetOptions()
}, },
spark = { spark = {
type = "group", type = "group",
name = "Spark", name = L["Spark"],
order = 3, order = 3,
args = { args = {
header = { header = {
@ -691,7 +754,7 @@ function Castbar:GetOptions()
}, },
font = { font = {
type = "group", type = "group",
name = "Font", name = L["Font"],
order = 4, order = 4,
args = { args = {
header = { header = {
@ -721,6 +784,13 @@ function Castbar:GetOptions()
order = 4, order = 4,
min = 1, min = 1,
max = 20, max = 20,
width = "full",
}),
castBarFontOutline = option({
type = "toggle",
name = L["Outline"],
order = 5,
width = "full",
}), }),
headerFormat = { headerFormat = {
type = "header", type = "header",
@ -741,7 +811,7 @@ function Castbar:GetOptions()
}, },
position = { position = {
type = "group", type = "group",
name = "Position", name = L["Position"],
order = 5, order = 5,
args = { args = {
header = { header = {
@ -749,15 +819,6 @@ function Castbar:GetOptions()
name = L["Position"], name = L["Position"],
order = 1, order = 1,
}, },
castBarPos = option({
type = "select",
name = L["Castbar position"],
order = 2,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
castBarIconPos = option( { castBarIconPos = option( {
type = "select", type = "select",
name = L["Icon position"], name = L["Icon position"],
@ -779,6 +840,7 @@ function Castbar:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
castBarYOffset = option({ castBarYOffset = option({
type = "range", type = "range",
@ -787,10 +849,77 @@ function Castbar:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
} }
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
castBarFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
castBarFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end
---------------------------
-- LAGACY HANDLER
---------------------------
function Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
castBar:ClearAllPoints()
if Gladdy.db.castBarWidth <= 0 then
castBar:SetWidth(0.1)
end
if Gladdy.db.castBarHeight <= 0 then
castBar:SetHeight(0.1)
end
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.castBarPos == "LEFT") then
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
if (Gladdy.db.castBarPos == "RIGHT") then
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
return Gladdy.db.newLayout
end end

View File

@ -1,27 +1,114 @@
local select, str_gsub = select, string.gsub
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetSpellInfo = GetSpellInfo
local L = Gladdy.L local L = Gladdy.L
local Classicon = Gladdy:NewModule("Classicon", 80, { local Classicon = Gladdy:NewModule("Class Icon", 81, {
classIconPos = "LEFT", classIconEnabled = true,
classIconSize = 60 + 20 + 1, classIconSize = 60 + 20 + 1,
classIconWidthFactor = 0.9, classIconWidthFactor = 0.9,
classIconBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", classIconBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
classIconBorderColor = { r = 0, g = 0, b = 0, a = 1 }, classIconBorderColor = { r = 0, g = 0, b = 0, a = 1 },
classIconSpecIcon = false,
classIconXOffset = 0,
classIconYOffset = 0,
classIconFrameStrata = "MEDIUM",
classIconFrameLevel = 5,
classIconGroup = false,
classIconGroupDirection = "DOWN"
}) })
local classIconPath = "Interface\\Addons\\Gladdy\\Images\\Classes\\"
local classIcons = {
["DRUID"] = classIconPath .. "inv_misc_monsterclaw_04",
["HUNTER"] = classIconPath .. "inv_weapon_bow_07",
["MAGE"] = classIconPath .. "inv_staff_13",
["PALADIN"] = classIconPath .. "inv_hammer_01",
["PRIEST"] = classIconPath .. "inv_staff_30",
["ROGUE"] = classIconPath .. "inv_throwingknife_04",
["SHAMAN"] = classIconPath .. "inv_jewelry_talisman_04",
["WARLOCK"] = classIconPath .. "spell_nature_drowsy",
["WARRIOR"] = classIconPath .. "inv_sword_27",
}
local specIcons = {
--DRUID
["DRUID"] = {
[L["Balance"]] = select(3, GetSpellInfo(8921)), -- Moonfire
[L["Feral"]] = select(3, GetSpellInfo(27545)), -- Cat Form
[L["Restoration"]] = select(3, GetSpellInfo(5185)), -- Healing Touch
},
["HUNTER"] = {
[L["Beast Mastery"]] = select(3, GetSpellInfo(1515)), -- Tame Beast
[L["Marksmanship"]] = select(3, GetSpellInfo(42243)), -- Volley
[L["Survival"]] = select(3, GetSpellInfo(1495)), -- Mongoose Bite
},
["MAGE"] = {
[L["Arcane"]] = select(3, GetSpellInfo(1459)), -- Arcane Intellect
[L["Fire"]] = select(3, GetSpellInfo(133)), -- Fireball
[L["Frost"]] = select(3, GetSpellInfo(116)), -- Frostbolt
},
["PALADIN"] = {
[L["Holy"]] = select(3, GetSpellInfo(635)), -- Holy Light
[L["Retribution"]] = select(3, GetSpellInfo(7294)), -- Retribution Aura
[L["Protection"]] = select(3, GetSpellInfo(32828)), -- Protection Aura
},
["PRIEST"] = {
[L["Discipline"]] = select(3, GetSpellInfo(1243)), -- Power Word: Fortitude
[L["Shadow"]] = select(3, GetSpellInfo(589)), -- Shadow Word: Pain
[L["Holy"]] = select(3, GetSpellInfo(635)), -- Holy Light
},
["ROGUE"] = {
[L["Assassination"]] = select(3, GetSpellInfo(1329)), -- Mutilate (Eviscerate? 2098)
[L["Combat"]] = select(3, GetSpellInfo(53)), -- Backstab
[L["Subtlety"]] = select(3, GetSpellInfo(1784)), -- Stealth
},
["SHAMAN"] = {
[L["Elemental"]] = select(3, GetSpellInfo(403)), -- Lightning Bolt
[L["Enhancement"]] = select(3, GetSpellInfo(324)), -- Lightning Shield
[L["Restoration"]] = select(3, GetSpellInfo(331)), -- Healing Wave
},
["WARLOCK"] = {
[L["Affliction"]] = select(3, GetSpellInfo(6789)), -- Affliction
[L["Demonology"]] = select(3, GetSpellInfo(5500)), -- Sense Demons
[L["Destruction"]] = select(3, GetSpellInfo(5740)), -- Rain of Fire
},
["WARRIOR"] = {
[L["Arms"]] = select(3, GetSpellInfo(12294)), -- Mortal Strike
[L["Fury"]] = select(3, GetSpellInfo(12325)), -- Inner Rage
[L["Protection"]] = select(3, GetSpellInfo(71)), -- Defensive Stance
},
}
function Classicon:Initialize() function Classicon:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("ENEMY_SPOTTED") if Gladdy.db.classIconEnabled then
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_SPEC")
end
end
function Classicon:UpdateFrameOnce()
if Gladdy.db.classIconEnabled then
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_SPEC")
else
self:UnregisterAllMessages()
end
end end
function Classicon:CreateFrame(unit) function Classicon:CreateFrame(unit)
local classIcon = CreateFrame("Frame", nil, Gladdy.buttons[unit]) local classIcon = CreateFrame("Frame", nil, Gladdy.buttons[unit])
classIcon:EnableMouse(false)
classIcon:SetFrameStrata("MEDIUM") classIcon:SetFrameStrata("MEDIUM")
classIcon:SetFrameLevel(1) classIcon:SetFrameLevel(1)
classIcon.texture = classIcon:CreateTexture(nil, "BACKGROUND") classIcon.texture = classIcon:CreateTexture(nil, "BACKGROUND")
classIcon.texture:SetAllPoints(classIcon) classIcon.texture:SetAllPoints(classIcon)
classIcon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
classIcon.texture.overlay = classIcon:CreateTexture(nil, "BORDER") classIcon.texture.overlay = classIcon:CreateTexture(nil, "BORDER")
classIcon.texture.overlay:SetAllPoints(classIcon) classIcon.texture.overlay:SetAllPoints(classIcon)
@ -30,13 +117,6 @@ function Classicon:CreateFrame(unit)
classIcon:SetFrameStrata("MEDIUM") classIcon:SetFrameStrata("MEDIUM")
classIcon:SetFrameLevel(2) classIcon:SetFrameLevel(2)
classIcon:ClearAllPoints()
if (Gladdy.db.classIconPos == "RIGHT") then
classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", 2, 2)
else
classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -2, 2)
end
Gladdy.buttons[unit].classIcon = classIcon Gladdy.buttons[unit].classIcon = classIcon
self.frames[unit] = classIcon self.frames[unit] = classIcon
end end
@ -47,26 +127,68 @@ function Classicon:UpdateFrame(unit)
return return
end end
classIcon:SetFrameStrata(Gladdy.db.classIconFrameStrata)
classIcon:SetFrameLevel(Gladdy.db.classIconFrameLevel)
classIcon:SetWidth(Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) classIcon:SetWidth(Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor)
classIcon:SetHeight(Gladdy.db.classIconSize) classIcon:SetHeight(Gladdy.db.classIconSize)
classIcon:ClearAllPoints() Gladdy:SetPosition(classIcon, unit, "classIconXOffset", "classIconYOffset", Classicon:LegacySetPosition(classIcon, unit), Classicon)
local margin = Gladdy.db.highlightBorderSize + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then if (Gladdy.db.classIconGroup) then
classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0) if (unit ~= "arena1") then
else local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPRIGHT", margin, 0) self.frames[unit]:ClearAllPoints()
if Gladdy.db.classIconGroupDirection == "RIGHT" then
self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
elseif Gladdy.db.classIconGroupDirection == "LEFT" then
self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
elseif Gladdy.db.classIconGroupDirection == "UP" then
self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
elseif Gladdy.db.classIconGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end
end
if (unit == "arena1") then
Gladdy:CreateMover(classIcon, "classIconXOffset", "classIconYOffset", L["Class Icon"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor,
Gladdy.db.classIconSize,
0,
0, "classIconEnabled")
end end
classIcon.texture:ClearAllPoints() classIcon.texture:ClearAllPoints()
classIcon.texture:SetAllPoints(classIcon) classIcon.texture:SetAllPoints(classIcon)
classIcon.texture.overlay:SetTexture(Gladdy.db.classIconBorderStyle) classIcon.texture.overlay:SetTexture(Gladdy.db.classIconBorderStyle)
classIcon.texture.overlay:SetVertexColor(Gladdy.db.classIconBorderColor.r, Gladdy.db.classIconBorderColor.g, Gladdy.db.classIconBorderColor.b, Gladdy.db.classIconBorderColor.a) classIcon.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.classIconBorderColor))
if Gladdy.db.classIconEnabled then
classIcon:Show()
else
classIcon:Hide()
end
end end
function Classicon:Test(unit) function Classicon:ENEMY_SPOTTED(unit)
self:ENEMY_SPOTTED(unit) local classIcon = self.frames[unit]
if (not classIcon) then
return
end
classIcon.texture:SetTexture(classIcons[Gladdy.buttons[unit].class])
--classIcon.texture:SetTexCoord(unpack(CLASS_BUTTONS[Gladdy.buttons[unit].class]))
classIcon.texture:SetAllPoints(classIcon)
end
function Classicon:UNIT_SPEC(unit, spec)
local classIcon = self.frames[unit]
if (not Gladdy.db.classIconSpecIcon or not classIcon) then
return
end
classIcon.texture:SetTexture(specIcons[Gladdy.buttons[unit].class][spec])
end end
function Classicon:ResetUnit(unit) function Classicon:ResetUnit(unit)
@ -85,24 +207,76 @@ function Classicon:GetOptions()
name = L["Class Icon"], name = L["Class Icon"],
order = 2, order = 2,
}, },
classIconEnabled = Gladdy:option({
type = "toggle",
name = L["Class Icon Enabled"],
order = 3,
}),
classIconSpecIcon = {
type = "toggle",
name = L["Show Spec Icon"],
desc = L["Shows Spec Icon once spec is detected"],
order = 4,
disabled = function() return not Gladdy.db.classIconEnabled end,
get = function() return Gladdy.db.classIconSpecIcon end,
set = function(_, value)
Gladdy.db.classIconSpecIcon = value
if Gladdy.curBracket and Gladdy.curBracket > 0 then
for i=1,Gladdy.curBracket do
local unit = "arena" .. i
if (Gladdy.buttons[unit] and Gladdy.buttons[unit].spec) then
self:ENEMY_SPOTTED(unit)
self:UNIT_SPEC(unit, Gladdy.buttons[unit].spec)
end
end
end
end
},
classIconGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Class Icon"],
order = 5,
disabled = function() return not Gladdy.db.classIconEnabled end,
}),
classIconGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 6,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.classIconGroup or not Gladdy.db.classIconEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 3, order = 7,
disabled = function() return not Gladdy.db.classIconEnabled end,
args = { args = {
size = { size = {
type = "group", type = "group",
name = L["Icon size"], name = L["Icon size"],
order = 1, order = 1,
args = { args = {
header = {
type = "header",
name = L["Icon size"],
order = 1,
},
classIconSize = Gladdy:option({ classIconSize = Gladdy:option({
type = "range", type = "range",
name = L["Icon size"], name = L["Icon size"],
min = 1, min = 3,
max = 100, max = 100,
step = 1, step = .1,
order = 3, order = 3,
width = "full",
}), }),
classIconWidthFactor = Gladdy:option({ classIconWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -111,35 +285,44 @@ function Classicon:GetOptions()
max = 2, max = 2,
step = 0.05, step = 0.05,
order = 4, order = 4,
width = "full",
}), }),
}, },
}, },
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 1, order = 3,
args = { args = {
headerPosition = { headerPosition = {
type = "header", type = "header",
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
classIconPos = Gladdy:option({ classIconXOffset = Gladdy:option({
type = "select", type = "range",
name = L["Icon position"], name = L["Horizontal offset"],
desc = L["This changes positions with trinket"], order = 11,
order = 6, min = -800,
values = { max = 800,
["LEFT"] = L["Left"], step = 0.1,
["RIGHT"] = L["Right"], width = "full",
}, }),
classIconYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 12,
min = -800,
max = 800,
step = 0.1,
width = "full",
}), }),
}, },
}, },
border = { border = {
type = "group", type = "group",
name = L["Border"], name = L["Border"],
order = 1, order = 2,
args = { args = {
headerBorder = { headerBorder = {
type = "header", type = "header",
@ -161,42 +344,55 @@ function Classicon:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
classIconFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
classIconFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
local function getClassIcon(class) ---------------------------
-- see https://wow.gamepedia.com/Class_icon
local classIcon = "Interface\\Addons\\Gladdy\\Images\\Classes\\"
if class == "DRUID" then
return classIcon .. "inv_misc_monsterclaw_04"
elseif class == "HUNTER" then
return classIcon .. "inv_weapon_bow_07"
elseif class == "MAGE" then
return classIcon .. "inv_staff_13"
elseif class == "PALADIN" then
return classIcon .. "inv_hammer_01"
elseif class == "PRIEST" then
return classIcon .. "inv_staff_30"
elseif class == "ROGUE" then
return classIcon .. "inv_throwingknife_04"
elseif class == "SHAMAN" then
return classIcon .. "inv_jewelry_talisman_04"
elseif class == "WARLOCK" then
return classIcon .. "spell_nature_drowsy"
elseif class == "WARRIOR" then
return classIcon .. "inv_sword_27"
end
end
function Classicon:ENEMY_SPOTTED(unit) -- LAGACY HANDLER
local classIcon = self.frames[unit]
if (not classIcon) then
return
end
classIcon.texture:SetTexture(getClassIcon(Gladdy.buttons[unit].class)) ---------------------------
--classIcon.texture:SetTexCoord(unpack(CLASS_BUTTONS[Gladdy.buttons[unit].class]))
classIcon.texture:SetAllPoints(classIcon) function Classicon:LegacySetPosition(classIcon, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
classIcon:ClearAllPoints()
local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
else
classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPRIGHT", margin, 0)
end
end end

217
Modules/Clicks.lua Normal file
View File

@ -0,0 +1,217 @@
local tinsert = table.insert
local pairs = pairs
local tonumber = tonumber
local tostring = tostring
local GetBindingKey = GetBindingKey
local ClearOverrideBindings = ClearOverrideBindings
local SetOverrideBindingClick = SetOverrideBindingClick
local MACRO, TARGET, FOCUS, ADDON_DISABLED = MACRO, TARGET, FOCUS, ADDON_DISABLED
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local attributes = {
{ name = L["Target"], button = "1", modifier = "", action = "target", spell = "" },
{ name = L["Focus"], button = "2", modifier = "", action = "focus", spell = "" },
}
for i = 3, 10 do
tinsert(attributes, { name = L["Action #%d"]:format(i), button = "", modifier = "", action = "disabled", spell = "" })
end
local Clicks = Gladdy:NewModule("Clicks", nil, {
attributes = attributes,
})
BINDING_HEADER_GLADDY = "Gladdy"
BINDING_NAME_GLADDYBUTTON1_LEFT = L["Left Click Enemy 1"]
BINDING_NAME_GLADDYBUTTON2_LEFT = L["Left Click Enemy 2"]
BINDING_NAME_GLADDYBUTTON3_LEFT = L["Left Click Enemy 3"]
BINDING_NAME_GLADDYBUTTON4_LEFT = L["Left Click Enemy 4"]
BINDING_NAME_GLADDYBUTTON5_LEFT = L["Left Click Enemy 5"]
BINDING_NAME_GLADDYBUTTON1_RIGHT = L["Right Click Enemy 1"]
BINDING_NAME_GLADDYBUTTON2_RIGHT = L["Right Click Enemy 2"]
BINDING_NAME_GLADDYBUTTON3_RIGHT = L["Right Click Enemy 3"]
BINDING_NAME_GLADDYBUTTON4_RIGHT = L["Right Click Enemy 4"]
BINDING_NAME_GLADDYBUTTON5_RIGHT = L["Right Click Enemy 5"]
BINDING_NAME_GLADDYBUTTON1_MIDDLE = L["Middle Click Enemy 1"]
BINDING_NAME_GLADDYBUTTON2_MIDDLE = L["Middle Click Enemy 2"]
BINDING_NAME_GLADDYBUTTON3_MIDDLE = L["Middle Click Enemy 3"]
BINDING_NAME_GLADDYBUTTON4_MIDDLE = L["Middle Click Enemy 4"]
BINDING_NAME_GLADDYBUTTON5_MIDDLE = L["Middle Click Enemy 5"]
BINDING_NAME_GLADDYBUTTON1_BUTTON4 = L["Button4 Click Enemy 1"]
BINDING_NAME_GLADDYBUTTON2_BUTTON4 = L["Button4 Click Enemy 2"]
BINDING_NAME_GLADDYBUTTON3_BUTTON4 = L["Button4 Click Enemy 3"]
BINDING_NAME_GLADDYBUTTON4_BUTTON4 = L["Button4 Click Enemy 4"]
BINDING_NAME_GLADDYBUTTON5_BUTTON4 = L["Button4 Click Enemy 5"]
BINDING_NAME_GLADDYBUTTON1_BUTTON5 = L["Button5 Click Enemy 1"]
BINDING_NAME_GLADDYBUTTON2_BUTTON5 = L["Button5 Click Enemy 2"]
BINDING_NAME_GLADDYBUTTON3_BUTTON5 = L["Button5 Click Enemy 3"]
BINDING_NAME_GLADDYBUTTON4_BUTTON5 = L["Button5 Click Enemy 4"]
BINDING_NAME_GLADDYBUTTON5_BUTTON5 = L["Button5 Click Enemy 5"]
function Clicks:Initialize()
--
end
function Clicks:Reset()
--
end
function Clicks:ResetUnit(unit)
--
end
function Clicks:UpdateFrame(unit)
self:SetupAttributes(unit)
end
function Clicks:UpdateFrameOnce()
for _, v in pairs(Gladdy.buttons) do
local left = GetBindingKey(("GLADDYBUTTON%d_LEFT"):format(v.id))
local right = GetBindingKey(("GLADDYBUTTON%d_RIGHT"):format(v.id))
local middle = GetBindingKey(("GLADDYBUTTON%d_MIDDLE"):format(v.id))
local button4 = GetBindingKey(("GLADDYBUTTON%d_BUTTON4"):format(v.id))
local button5 = GetBindingKey(("GLADDYBUTTON%d_BUTTON5"):format(v.id))
ClearOverrideBindings(v.secure)
if (left) then
SetOverrideBindingClick(v.secure, false, left, v.secure:GetName(), "LeftButton")
end
if (right) then
SetOverrideBindingClick(v.secure, false, right, v.secure:GetName(), "RightButton")
end
if (middle) then
SetOverrideBindingClick(v.secure, false, middle, v.secure:GetName(), "MiddleButton")
end
if (button4) then
SetOverrideBindingClick(v.secure, false, button4, v.secure:GetName(), "Button4")
end
if (button5) then
SetOverrideBindingClick(v.secure, false, button5, v.secure:GetName(), "Button5")
end
end
end
function Clicks:SetupAttributes(unit)
local button = Gladdy.buttons[unit]
if (not button) then
return
end
for _, v in pairs(Gladdy.db.attributes) do
self:SetupAttribute(button, v.button, v.modifier, v.action, v.spell)
end
end
function Clicks:SetupAttribute(button, key, mod, action, spell)
local attr = ""
local text = ""
if (action == "macro") then
attr = mod .. "macrotext" .. key
text = spell:gsub("%*arena%*", button.unit)
button.secure:SetAttribute(mod .. "type" .. key, "macro")
elseif (action ~= "disabled") then
if (action == "target") then
attr = mod .. "type" .. key
text = "target"
elseif (action == "focus") then
attr = mod .. "type" .. key
text = "focus"
elseif (action == "spell") then
attr = mod .. "type" .. key
text = "spell"
button.secure:SetAttribute(mod .. "spell" .. key, spell)
end
end
button.secure:SetAttribute(attr, text)
end
local buttons = { ["1"] = L["Left button"], ["2"] = L["Right button"], ["3"] = L["Middle button"], ["4"] = L["Button 4"], ["5"] = L["Button 5"] }
local modifiers = { [""] = L["None"], ["*"] = L["All"], ["ctrl-"] = L["CTRL"], ["shift-"] = L["SHIFT"], ["alt-"] = L["ALT"] }
local clickValues = { ["macro"] = MACRO, ["target"] = TARGET, ["focus"] = FOCUS, ["spell"] = L["Cast Spell"], ["disabled"] = ADDON_DISABLED }
local function SetupAttributeOption(i)
return {
type = "group",
name = Gladdy.dbi.profile.attributes[i].name,
desc = Gladdy.dbi.profile.attributes[i].name,
order = i + 1,
get = function(info)
return Gladdy.dbi.profile.attributes[tonumber(info[#info - 1])][info[#info]]
end,
set = function(info, value)
Gladdy.dbi.profile.attributes[tonumber(info[#info - 1])][info[#info]] = value
if (info[#info] == "name") then
Gladdy.options.args.Clicks.args[info[#info - 1]].name = value
end
Gladdy:UpdateFrame()
end,
args = {
name = {
type = "input",
name = L["Name"],
desc = L["Select the name of the click option"],
order = 1,
},
button = {
type = "select",
name = L["Button"],
desc = L["Select which mouse button to use"],
order = 2,
values = buttons,
},
modifier = {
type = "select",
name = L["Modifier"],
desc = L["Select which modifier to use"],
order = 3,
values = modifiers,
},
action = {
type = "select",
name = L["Action"],
desc = L["Select what action this mouse button does"],
order = 4,
values = clickValues,
},
spell = {
type = "input",
name = L["Cast Spell / Macro"],
desc = L["\n|cff1ac742Cast Spell:|r\n" ..
"Type in the spell name.\n" ..
"For example:\n" ..
"|cff17d1c8Polymorph|r\n" ..
"\n" ..
"|cff1ac742Macro:|r\n" ..
"Use *arena* as placeholder.\n" ..
"For example:\n" ..
"|cff17d1c8/cast [@*arena*] Blind\n" ..
"/run SendChatMessage(\"Blinding \" .. UnitName(\"*arena*\"), \"PARTY\")|r"],
order = 5,
width = "full",
multiline = 10,
},
},
}
end
function Clicks:GetOptions()
local options = {}
for i = 1, 10 do
options[tostring(i)] = SetupAttributeOption(i)
end
return options
end

294
Modules/CombatIndicator.lua Normal file
View File

@ -0,0 +1,294 @@
local select = select
local UnitExists, UnitAffectingCombat, GetSpellInfo = UnitExists, UnitAffectingCombat, GetSpellInfo
local CreateFrame = CreateFrame
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local CombatIndicator = Gladdy:NewModule("Combat Indicator", nil, {
ciEnabled = true,
ciSize = 20,
ciAlpha = 1,
ciWidthFactor = 1,
ciXOffset = 0,
ciYOffset = -31,
ciBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
ciBorderColor = { r = 0, g = 0, b = 0, a = 1 },
ciFrameStrata = "HIGH",
ciFrameLevel = 5,
})
function CombatIndicator:Initialize()
self.frames = {}
if Gladdy.db.ciEnabled then
self:RegisterMessage("JOINED_ARENA")
end
self.updateInterval = 0.05
self.combatIndicatorIcon = select(3, GetSpellInfo(674))
end
function CombatIndicator:JOINED_ARENA()
self:SetScript("OnUpdate", CombatIndicator.OnEvent)
self.lastTimeUpdated = 0
end
function CombatIndicator:CreateFrame(unit)
local button = Gladdy.buttons[unit]
if not button then
return
end
local ciFrame = CreateFrame("Frame", "GladdyCombatindicator" .. unit, button)
ciFrame:EnableMouse(false)
ciFrame:SetMovable(true)
ciFrame:SetFrameStrata(Gladdy.db.ciFrameStrata)
ciFrame:SetFrameLevel(Gladdy.db.ciFrameLevel)
ciFrame:SetHeight(Gladdy.db.ciSize)
ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor)
ciFrame.texture = ciFrame:CreateTexture(nil, "OVERLAY")
ciFrame.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
ciFrame.texture:SetTexture(self.combatIndicatorIcon)
ciFrame.texture:SetAllPoints(ciFrame)
ciFrame.border = ciFrame:CreateTexture(nil, "OVERLAY")
ciFrame.border:SetAllPoints(ciFrame)
ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle)
ciFrame.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.ciBorderColor))
self.frames[unit] = ciFrame
button.ciFrame = ciFrame
end
function CombatIndicator:UpdateFrameOnce()
if Gladdy.db.ciEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function CombatIndicator:UpdateFrame(unit)
local button = Gladdy.buttons[unit]
local ciFrame = self.frames[unit]
if (not button or not ciFrame) then
return
end
ciFrame:SetFrameStrata(Gladdy.db.ciFrameStrata)
ciFrame:SetFrameLevel(Gladdy.db.ciFrameLevel)
ciFrame:SetHeight(Gladdy.db.ciSize)
ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor)
ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle)
ciFrame.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.ciBorderColor))
Gladdy:SetPosition(ciFrame, unit, "ciXOffset", "ciYOffset", CombatIndicator:LegacySetPosition(ciFrame, unit), CombatIndicator)
ciFrame:SetAlpha(Gladdy.db.ciAlpha)
if (Gladdy.db.ciEnabled == false) then
ciFrame:Hide()
else
ciFrame:Show()
end
if (unit == "arena1") then
Gladdy:CreateMover(ciFrame, "ciXOffset", "ciYOffset", L["Combat Indicator"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.ciSize * Gladdy.db.ciWidthFactor, Gladdy.db.ciSize,
0, 0, "ciEnabled")
end
end
function CombatIndicator:Test()
self.test = true
self:JOINED_ARENA()
end
function CombatIndicator:Reset()
self:SetScript("OnUpdate", nil)
self.test = false
end
function CombatIndicator.OnEvent(self, elapsed)
self.lastTimeUpdated = self.lastTimeUpdated + elapsed
if (self.lastTimeUpdated > self.updateInterval) then
for i=1,Gladdy.curBracket do
local unit = "arena" .. i
if Gladdy.db.ciEnabled and (CombatIndicator.test or (UnitExists(unit) and UnitAffectingCombat(unit))) then
CombatIndicator.frames[unit]:Show()
else
CombatIndicator.frames[unit]:Hide()
end
end
self.lastTimeUpdated = 0
end
end
function CombatIndicator:GetOptions()
return {
header = {
type = "header",
name = L["Combat Indicator"],
order = 2,
},
ciEnabled = Gladdy:option({
type = "toggle",
name = L["Enabled"],
desc = L["Enable Combat Indicator icon"],
order = 3,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.ciEnabled end,
args = {
general = {
type = "group",
name = L["Frame"],
order = 1,
args = {
header = {
type = "header",
name = L["Frame"],
order = 1,
},
ciSize = Gladdy:option({
type = "range",
name = L["Icon size"],
min = 5,
max = 100,
step = 1,
order = 2,
width = "full",
}),
ciWidthFactor = Gladdy:option({
type = "range",
name = L["Icon width factor"],
min = 0.5,
max = 2,
step = 0.05,
order = 3,
width = "full",
}),
ciAlpha = Gladdy:option({
type = "range",
name = L["Alpha"],
min = 0,
max = 1,
step = 0.05,
order = 4,
width = "full",
}),
},
},
position = {
type = "group",
name = L["Position"],
order = 3,
args = {
header = {
type = "header",
name = L["Position"],
order = 4,
},
ciXOffset = Gladdy:option({
type = "range",
name = L["Horizontal offset"],
order = 23,
min = -400,
max = 400,
step = 0.1,
width = "full",
}),
ciYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 24,
min = -400,
max = 400,
step = 0.1,
width = "full",
}),
},
},
border = {
type = "group",
name = L["Border"],
order = 2,
args = {
header = {
type = "header",
name = L["Border"],
order = 4,
},
ciBorderStyle = Gladdy:option({
type = "select",
name = L["Border style"],
order = 31,
values = Gladdy:GetIconStyles()
}),
ciBorderColor = Gladdy:colorOption({
type = "color",
name = L["Border color"],
desc = L["Color of the border"],
order = 32,
hasAlpha = true,
}),
},
},
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 5,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
ciFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
ciFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
},
},
}
end
---------------------------
-- LAGACY HANDLER
---------------------------
function CombatIndicator:LegacySetPosition(ciFrame, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
-- LEGACY options
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
local ciAnchor = Gladdy.db.ciAnchor or Gladdy.legacy.ciAnchor
local ciPos = Gladdy.db.ciPos
ciFrame:ClearAllPoints()
ciFrame:SetPoint(ANCHORS[ciPos], Gladdy.buttons[unit][ciAnchor], ciPos, Gladdy.db.ciXOffset, Gladdy.db.ciYOffset)
return Gladdy.db.newLayout
end

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,13 @@
local select = select local select = select
local pairs,ipairs,tbl_sort,tinsert,format = pairs,ipairs,table.sort,tinsert,format local pairs,ipairs,tbl_sort,tinsert,format,rand = pairs,ipairs,table.sort,tinsert,format,math.random
local str_gsub = string.gsub
local drDuration = 18
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetTime = GetTime local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local DRData = LibStub("DRData-1.0") local DRData = LibStub("DRData-1.0-BCC")
local L = Gladdy.L local L = Gladdy.L
local function defaultCategories() local function defaultCategories()
local categories = {} local categories = {}
@ -17,7 +16,7 @@ local function defaultCategories()
tinsert(indexList, {spellID = k, category = v}) tinsert(indexList, {spellID = k, category = v})
end end
tbl_sort(indexList, function(a, b) return a.spellID < b.spellID end) tbl_sort(indexList, function(a, b) return a.spellID < b.spellID end)
for i,v in ipairs(indexList) do for _,v in ipairs(indexList) do
if not categories[v.category] then if not categories[v.category] then
categories[v.category] = { categories[v.category] = {
enabled = true, enabled = true,
@ -30,9 +29,10 @@ local function defaultCategories()
end end
local Diminishings = Gladdy:NewModule("Diminishings", nil, { local Diminishings = Gladdy:NewModule("Diminishings", nil, {
drFont = "DorisPP", drFont = "DorisPP",
drFontColorsEnabled = false,
drFontColor = { r = 1, g = 1, b = 0, a = 1 }, drFontColor = { r = 1, g = 1, b = 0, a = 1 },
drFontScale = 1, drFontScale = 1,
drCooldownPos = "RIGHT", drGrowDirection = "RIGHT",
drXOffset = 0, drXOffset = 0,
drYOffset = 0, drYOffset = 0,
drIconSize = 36, drIconSize = 36,
@ -46,34 +46,60 @@ local Diminishings = Gladdy:NewModule("Diminishings", nil, {
drHalfColor = {r = 1, g = 1, b = 0, a = 1 }, drHalfColor = {r = 1, g = 1, b = 0, a = 1 },
drQuarterColor = {r = 1, g = 0.7, b = 0, a = 1 }, drQuarterColor = {r = 1, g = 0.7, b = 0, a = 1 },
drNullColor = {r = 1, g = 0, b = 0, a = 1 }, drNullColor = {r = 1, g = 0, b = 0, a = 1 },
drLevelTextEnabled = true,
drLevelTextFont = "DorisPP",
drLevelTextScale = 0.8,
drLevelTextColor = { r = 1, g = 1, b = 0, a = 1 },
drLevelTextColorsEnabled = true,
drWidthFactor = 1, drWidthFactor = 1,
drCategories = defaultCategories() drCategories = defaultCategories(),
drDuration = 18,
drFrameStrata = "MEDIUM",
drFrameLevel = 3,
drGroup = false,
drGroupDirection = "DOWN"
}) })
local function getDiminishColor(dr) local function getDiminishColor(dr)
if dr == 0.5 then if dr == 0.5 then
return Gladdy.db.drHalfColor.r, Gladdy.db.drHalfColor.g, Gladdy.db.drHalfColor.b, Gladdy.db.drHalfColor.a return Gladdy:SetColor(Gladdy.db.drHalfColor)
elseif dr == 0.25 then elseif dr == 0.25 then
return Gladdy.db.drQuarterColor.r, Gladdy.db.drQuarterColor.g, Gladdy.db.drQuarterColor.b, Gladdy.db.drQuarterColor.a return Gladdy:SetColor(Gladdy.db.drQuarterColor)
else else
return Gladdy.db.drNullColor.r, Gladdy.db.drNullColor.g, Gladdy.db.drNullColor.b, Gladdy.db.drNullColor.a return Gladdy:SetColor(Gladdy.db.drNullColor)
end
end
local function getDiminishText(dr)
if dr == 0.5 then
return "½"
elseif dr == 0.25 then
return "¼"
else
return "ø"
end end
end end
function Diminishings:Initialize() function Diminishings:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("UNIT_DEATH", "ResetUnit", "AURA_FADE", "UNIT_DESTROYED") self:RegisterMessage("UNIT_DESTROYED")
end end
function Diminishings:CreateFrame(unit) function Diminishings:CreateFrame(unit)
local drFrame = CreateFrame("Frame", nil, Gladdy.buttons[unit]) local drFrame = CreateFrame("Frame", nil, Gladdy.buttons[unit])
drFrame:EnableMouse(false)
drFrame:SetMovable(true)
drFrame:SetFrameStrata(Gladdy.db.drFrameStrata)
drFrame:SetFrameLevel(Gladdy.db.drFrameLevel)
for i = 1, 16 do for i = 1, 16 do
local icon = CreateFrame("Frame", "GladdyDr" .. unit .. "Icon" .. i, drFrame) local icon = CreateFrame("Frame", "GladdyDr" .. unit .. "Icon" .. i, drFrame)
icon:Hide() icon:Hide()
icon:EnableMouse(false) icon:EnableMouse(false)
icon:SetFrameLevel(3) icon:SetFrameStrata(Gladdy.db.drFrameStrata)
icon:SetFrameLevel(Gladdy.db.drFrameLevel)
icon.texture = icon:CreateTexture(nil, "BACKGROUND") icon.texture = icon:CreateTexture(nil, "BACKGROUND")
icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
icon.texture:SetAllPoints(icon) icon.texture:SetAllPoints(icon)
icon:SetScript("OnUpdate", function(self, elapsed) icon:SetScript("OnUpdate", function(self, elapsed)
if (self.active) then if (self.active) then
@ -86,16 +112,12 @@ function Diminishings:CreateFrame(unit)
self.dr = nil self.dr = nil
self.diminishing = 1.0 self.diminishing = 1.0
self.texture:SetTexture("") self.texture:SetTexture("")
self.text:SetText("") self.timeText:SetText("")
self:Hide() self:Hide()
Diminishings:Positionate(unit) Diminishings:Positionate(unit)
else else
self.timeLeft = self.timeLeft - elapsed self.timeLeft = self.timeLeft - elapsed
if self.timeLeft >=5 then Gladdy:FormatTimer(self.timeText, self.timeLeft, self.timeLeft < 5)
self.timeText:SetFormattedText("%d", self.timeLeft)
else
self.timeText:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0)
end
end end
end end
end) end)
@ -103,13 +125,15 @@ function Diminishings:CreateFrame(unit)
icon.cooldown = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate") icon.cooldown = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate")
icon.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC icon.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC
icon.cooldown:SetHideCountdownNumbers(true) icon.cooldown:SetHideCountdownNumbers(true)
icon.cooldown:SetFrameLevel(4) icon.cooldown:SetFrameStrata(Gladdy.db.drFrameStrata)
icon.cooldown:SetFrameLevel(Gladdy.db.drFrameLevel + 1)
icon.cooldownFrame = CreateFrame("Frame", nil, icon) icon.cooldownFrame = CreateFrame("Frame", nil, icon)
icon.cooldownFrame:ClearAllPoints() icon.cooldownFrame:ClearAllPoints()
icon.cooldownFrame:SetPoint("TOPLEFT", icon, "TOPLEFT") icon.cooldownFrame:SetPoint("TOPLEFT", icon, "TOPLEFT")
icon.cooldownFrame:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT") icon.cooldownFrame:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT")
icon.cooldownFrame:SetFrameLevel(5) icon.cooldownFrame:SetFrameStrata(Gladdy.db.drFrameStrata)
icon.cooldownFrame:SetFrameLevel(Gladdy.db.drFrameLevel + 2)
--icon.overlay = CreateFrame("Frame", nil, icon) --icon.overlay = CreateFrame("Frame", nil, icon)
--icon.overlay:SetAllPoints(icon) --icon.overlay:SetAllPoints(icon)
@ -117,24 +141,24 @@ function Diminishings:CreateFrame(unit)
icon.border:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp") icon.border:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
icon.border:SetAllPoints(icon) icon.border:SetAllPoints(icon)
icon.text = icon.cooldownFrame:CreateFontString(nil, "OVERLAY")
icon.text:SetDrawLayer("OVERLAY")
icon.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), 10, "OUTLINE")
icon.text:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a)
icon.text:SetShadowOffset(1, -1)
icon.text:SetShadowColor(0, 0, 0, 1)
icon.text:SetJustifyH("CENTER")
icon.text:SetPoint("CENTER")
icon.timeText = icon.cooldownFrame:CreateFontString(nil, "OVERLAY") icon.timeText = icon.cooldownFrame:CreateFontString(nil, "OVERLAY")
icon.timeText:SetDrawLayer("OVERLAY") icon.timeText:SetDrawLayer("OVERLAY")
icon.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), 10, "OUTLINE") icon.timeText:SetFont(Gladdy:SMFetch("font", "drFont"), 10, "OUTLINE")
icon.timeText:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.drFontColor))
icon.timeText:SetShadowOffset(1, -1) icon.timeText:SetShadowOffset(1, -1)
icon.timeText:SetShadowColor(0, 0, 0, 1) icon.timeText:SetShadowColor(0, 0, 0, 1)
icon.timeText:SetJustifyH("CENTER") icon.timeText:SetJustifyH("CENTER")
icon.timeText:SetPoint("CENTER", icon, "CENTER", 0, 1) icon.timeText:SetPoint("CENTER", icon, "CENTER", 0, 1)
icon.drLevelText = icon.cooldownFrame:CreateFontString(nil, "OVERLAY")
icon.drLevelText:SetDrawLayer("OVERLAY")
icon.drLevelText:SetFont(Gladdy:SMFetch("font", "drLevelTextFont"), 10, "OUTLINE")
icon.drLevelText:SetTextColor(getDiminishColor(1))
icon.drLevelText:SetShadowOffset(1, -1)
icon.drLevelText:SetShadowColor(0, 0, 0, 1)
icon.drLevelText:SetJustifyH("CENTER")
icon.drLevelText:SetPoint("BOTTOM", icon, "BOTTOM", 0, 0)
icon.diminishing = 1 icon.diminishing = 1
drFrame["icon" .. i] = icon drFrame["icon" .. i] = icon
@ -159,27 +183,37 @@ function Diminishings:UpdateFrame(unit)
drFrame:Show() drFrame:Show()
end end
drFrame:ClearAllPoints() drFrame:SetWidth(Gladdy.db.drIconSize)
local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding drFrame:SetHeight(Gladdy.db.drIconSize)
if (Gladdy.db.drCooldownPos == "LEFT") then drFrame:SetFrameStrata(Gladdy.db.drFrameStrata)
local anchor = Gladdy:GetAnchor(unit, "LEFT") drFrame:SetFrameLevel(Gladdy.db.drFrameLevel)
if anchor == Gladdy.buttons[unit].healthBar then
drFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset) Gladdy:SetPosition(drFrame, unit, "drXOffset", "drYOffset", Diminishings:LegacySetPosition(drFrame, unit), Diminishings)
else
drFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset) if (Gladdy.db.drGroup) then
end if (unit ~= "arena1") then
end local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
if (Gladdy.db.drCooldownPos == "RIGHT") then self.frames[unit]:ClearAllPoints()
local anchor = Gladdy:GetAnchor(unit, "RIGHT") if Gladdy.db.classIconGroupDirection == "RIGHT" then
if anchor == Gladdy.buttons[unit].healthBar then self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
drFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset) elseif Gladdy.db.classIconGroupDirection == "LEFT" then
else self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
drFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset) elseif Gladdy.db.classIconGroupDirection == "UP" then
self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
elseif Gladdy.db.classIconGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end end
end end
drFrame:SetWidth(Gladdy.db.drIconSize * 16) if (unit == "arena1") then
drFrame:SetHeight(Gladdy.db.drIconSize) Gladdy:CreateMover(drFrame,"drXOffset", "drYOffset", L["Diminishings"],
Gladdy.db.drGrowDirection == "RIGHT" and {"TOPLEFT", "TOPLEFT"} or {"TOPRIGHT", "TOPRIGHT"},
Gladdy.db.drIconSize * Gladdy.db.drWidthFactor,
Gladdy.db.drIconSize,
0,
0, "drEnabled")
end
for i = 1, 16 do for i = 1, 16 do
local icon = drFrame["icon" .. i] local icon = drFrame["icon" .. i]
@ -187,10 +221,26 @@ function Diminishings:UpdateFrame(unit)
icon:SetWidth(Gladdy.db.drIconSize * Gladdy.db.drWidthFactor) icon:SetWidth(Gladdy.db.drIconSize * Gladdy.db.drWidthFactor)
icon:SetHeight(Gladdy.db.drIconSize) icon:SetHeight(Gladdy.db.drIconSize)
icon.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") icon:SetFrameStrata(Gladdy.db.drFrameStrata)
icon.text:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon:SetFrameLevel(Gladdy.db.drFrameLevel)
icon.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") icon.cooldown:SetFrameStrata(Gladdy.db.drFrameStrata)
icon.timeText:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon.cooldown:SetFrameLevel(Gladdy.db.drFrameLevel + 1)
icon.cooldownFrame:SetFrameStrata(Gladdy.db.drFrameStrata)
icon.cooldownFrame:SetFrameLevel(Gladdy.db.drFrameLevel + 2)
icon.timeText:SetFont(Gladdy:SMFetch("font", "drFont"), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE")
if Gladdy.db.drFontColorsEnabled then
icon.timeText:SetTextColor(getDiminishColor(icon.diminishing))
else
icon.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.drFontColor))
end
icon.drLevelText:SetFont(Gladdy:SMFetch("font", "drLevelTextFont"), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drLevelTextScale, "OUTLINE")
if Gladdy.db.drLevelTextColorsEnabled then
icon.drLevelText:SetTextColor(getDiminishColor(icon.diminishing))
else
icon.drLevelText:SetTextColor(Gladdy:SetColor(Gladdy.db.drLevelTextColor))
end
icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16) icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16)
icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16) icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16)
@ -205,19 +255,25 @@ function Diminishings:UpdateFrame(unit)
if Gladdy.db.drBorderColorsEnabled then if Gladdy.db.drBorderColorsEnabled then
icon.border:SetVertexColor(getDiminishColor(icon.diminishing)) icon.border:SetVertexColor(getDiminishColor(icon.diminishing))
else else
icon.border:SetVertexColor(Gladdy.db.drBorderColor.r, Gladdy.db.drBorderColor.g, Gladdy.db.drBorderColor.b, Gladdy.db.drBorderColor.a) icon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.drBorderColor))
end
if Gladdy.db.drLevelTextEnabled then
icon.drLevelText:Show()
else
icon.drLevelText:Hide()
end end
icon:ClearAllPoints() icon:ClearAllPoints()
if (Gladdy.db.drCooldownPos == "LEFT") then if (Gladdy.db.drGrowDirection == "LEFT") then
if (i == 1) then if (i == 1) then
icon:SetPoint("TOPRIGHT") icon:SetPoint("TOPRIGHT", drFrame, "TOPRIGHT")
else else
icon:SetPoint("RIGHT", drFrame["icon" .. (i - 1)], "LEFT", -Gladdy.db.drIconPadding, 0) icon:SetPoint("RIGHT", drFrame["icon" .. (i - 1)], "LEFT", -Gladdy.db.drIconPadding, 0)
end end
else else
if (i == 1) then if (i == 1) then
icon:SetPoint("TOPLEFT") icon:SetPoint("TOPLEFT", drFrame, "TOPLEFT")
else else
icon:SetPoint("LEFT", drFrame["icon" .. (i - 1)], "RIGHT", Gladdy.db.drIconPadding, 0) icon:SetPoint("LEFT", drFrame["icon" .. (i - 1)], "RIGHT", Gladdy.db.drIconPadding, 0)
end end
@ -229,9 +285,9 @@ function Diminishings:UpdateFrame(unit)
icon.border:SetTexture(Gladdy.db.drBorderStyle) icon.border:SetTexture(Gladdy.db.drBorderStyle)
end end
icon.texture:SetTexCoord(.1, .9, .1, .9) --icon.texture:SetTexCoord(.1, .9, .1, .9)
icon.texture:SetPoint("TOPLEFT", icon, "TOPLEFT", 2, -2) --icon.texture:SetPoint("TOPLEFT", icon, "TOPLEFT", 2, -2)
icon.texture:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -2, 2) --icon.texture:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -2, 2)
end end
end end
@ -248,7 +304,6 @@ function Diminishings:ResetUnit(unit)
icon.active = false icon.active = false
icon.timeLeft = 0 icon.timeLeft = 0
icon.texture:SetTexture("") icon.texture:SetTexture("")
icon.text:SetText("")
icon.timeText:SetText("") icon.timeText:SetText("")
icon:Hide() icon:Hide()
end end
@ -260,17 +315,32 @@ end
function Diminishings:Test(unit) function Diminishings:Test(unit)
if Gladdy.db.drEnabled then if Gladdy.db.drEnabled then
local spells = { 33786, 118, 8643, 8983 } local enabledCategories = {}
for i = 1, 4 do for cat,val in pairs(Gladdy.db.drCategories) do
if i == 1 then if (val.enabled) then
self:AuraFade(unit, spells[i]) tinsert(enabledCategories, {cat = cat , spellIDs = {}})
elseif i == 2 then enabledCategories[cat] = #enabledCategories
self:AuraFade(unit, spells[i]) end
self:AuraFade(unit, spells[i]) end
else for spellId,cat in pairs(DRData:GetSpells()) do
self:AuraFade(unit, spells[i]) if enabledCategories[cat] then
self:AuraFade(unit, spells[i]) tinsert(enabledCategories[enabledCategories[cat]].spellIDs, spellId)
self:AuraFade(unit, spells[i]) end
end
--shuffle
for i = #enabledCategories, 2, -1 do
local j = rand(i)
enabledCategories[i], enabledCategories[j] = enabledCategories[j], enabledCategories[i]
end
--execute test
local index, amount = 0,0
for i=1, (#enabledCategories < 4 and #enabledCategories) or 4 do
amount = rand(1,3)
index = rand(1, #enabledCategories[i].spellIDs)
for _=1, amount do
self:AuraFade(unit, enabledCategories[i].spellIDs[index])
end end
end end
end end
@ -297,20 +367,35 @@ function Diminishings:AuraFade(unit, spellID)
lastIcon.diminishing = 1.0 lastIcon.diminishing = 1.0
end end
end end
if not lastIcon then return end
lastIcon.dr = drCat lastIcon.dr = drCat
lastIcon.timeLeft = drDuration lastIcon.timeLeft = Gladdy.db.drDuration
lastIcon.diminishing = DRData:NextDR(lastIcon.diminishing) lastIcon.diminishing = DRData:NextDR(lastIcon.diminishing)
if Gladdy.db.drBorderColorsEnabled then if Gladdy.db.drBorderColorsEnabled then
lastIcon.border:SetVertexColor(getDiminishColor(lastIcon.diminishing)) lastIcon.border:SetVertexColor(getDiminishColor(lastIcon.diminishing))
else else
lastIcon.border:SetVertexColor(Gladdy.db.drBorderColor.r, Gladdy.db.drBorderColor.g, Gladdy.db.drBorderColor.b, Gladdy.db.drBorderColor.a) lastIcon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.drBorderColor))
end end
lastIcon.cooldown:SetCooldown(GetTime(), drDuration) lastIcon.cooldown:SetCooldown(GetTime(), Gladdy.db.drDuration)
if Gladdy.db.drCategories[drCat].forceIcon then if Gladdy.db.drCategories[drCat].forceIcon then
lastIcon.texture:SetTexture(Gladdy.db.drCategories[drCat].icon) lastIcon.texture:SetTexture(Gladdy.db.drCategories[drCat].icon)
else else
lastIcon.texture:SetTexture(select(3, GetSpellInfo(spellID))) lastIcon.texture:SetTexture(select(3, GetSpellInfo(spellID)))
end end
if Gladdy.db.drFontColorsEnabled then
lastIcon.timeText:SetTextColor(getDiminishColor(lastIcon.diminishing))
else
lastIcon.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.drFontColor))
end
lastIcon.drLevelText:SetText(getDiminishText(lastIcon.diminishing))
if Gladdy.db.drLevelTextColorsEnabled then
lastIcon.drLevelText:SetTextColor(getDiminishColor(lastIcon.diminishing))
else
lastIcon.drLevelText:SetTextColor(Gladdy:SetColor(Gladdy.db.drLevelTextColor))
end
lastIcon.active = true lastIcon.active = true
self:Positionate(unit) self:Positionate(unit)
lastIcon:Show() lastIcon:Show()
@ -329,13 +414,15 @@ function Diminishings:Positionate(unit)
if (icon.active) then if (icon.active) then
icon:ClearAllPoints() icon:ClearAllPoints()
if (Gladdy.db.drCooldownPos == "LEFT") then if (Gladdy.db.newLayout and Gladdy.db.drGrowDirection == "LEFT"
or not Gladdy.db.newLayout and Gladdy.db.drCooldownPos == "LEFT") then
if (not lastIcon) then if (not lastIcon) then
icon:SetPoint("TOPRIGHT") icon:SetPoint("TOPRIGHT")
else else
icon:SetPoint("RIGHT", lastIcon, "LEFT", -Gladdy.db.drIconPadding, 0) icon:SetPoint("RIGHT", lastIcon, "LEFT", -Gladdy.db.drIconPadding, 0)
end end
else elseif (Gladdy.db.newLayout and Gladdy.db.drGrowDirection == "RIGHT"
or not Gladdy.db.newLayout and Gladdy.db.drCooldownPos == "RIGHT") then
if (not lastIcon) then if (not lastIcon) then
icon:SetPoint("TOPLEFT") icon:SetPoint("TOPLEFT")
else else
@ -357,15 +444,46 @@ function Diminishings:GetOptions()
}, },
drEnabled = Gladdy:option({ drEnabled = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Enable"], name = L["Enabled"],
desc = L["Enabled DR module"], desc = L["Enabled DR module"],
order = 3, order = 3,
}), }),
drDuration = Gladdy:option({
type = "range",
name = L["DR Duration"],
desc = L["Change the DR Duration in seconds (DR is dynamic between 15-20s)"],
order = 4,
disabled = function() return not Gladdy.db.drEnabled end,
min = 15,
max = 20,
step = .1,
}),
drGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Class Icon"],
order = 5,
disabled = function() return not Gladdy.db.drEnabled end,
}),
drGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 6,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.drGroup or not Gladdy.db.drEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 4, order = 5,
disabled = function() return not Gladdy.db.drEnabled end,
args = { args = {
icon = { icon = {
type = "group", type = "group",
@ -383,8 +501,9 @@ function Diminishings:GetOptions()
desc = L["Size of the DR Icons"], desc = L["Size of the DR Icons"],
order = 5, order = 5,
min = 5, min = 5,
max = 50, max = 80,
step = 1, step = 1,
width = "full",
}), }),
drWidthFactor = Gladdy:option({ drWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -394,6 +513,7 @@ function Diminishings:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
width = "full",
}), }),
drIconPadding = Gladdy:option({ drIconPadding = Gladdy:option({
type = "range", type = "range",
@ -403,6 +523,7 @@ function Diminishings:GetOptions()
min = 0, min = 0,
max = 10, max = 10,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -420,6 +541,7 @@ function Diminishings:GetOptions()
type = "toggle", type = "toggle",
name = L["No Cooldown Circle"], name = L["No Cooldown Circle"],
order = 8, order = 8,
width = "full",
}), }),
drCooldownAlpha = Gladdy:option({ drCooldownAlpha = Gladdy:option({
type = "range", type = "range",
@ -428,85 +550,132 @@ function Diminishings:GetOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
order = 9, order = 9,
width = "full",
}), }),
drCooldownNumberAlpha = {
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 10,
width = "full",
set = function(info, value)
Gladdy.db.drFontColor.a = value
Gladdy:UpdateFrame()
end,
get = function(info)
return Gladdy.db.drFontColor.a
end,
},
}, },
}, },
font = { font = {
type = "group", type = "group",
name = L["Font"], name = L["Cooldown Font"],
order = 3, order = 3,
args = { args = {
headerFont = { headerFont = {
type = "header", type = "header",
name = L["Font"], name = L["Cooldown Font"],
order = 10, order = 1,
}, },
drFont = Gladdy:option({ drFontColorsEnabled = Gladdy:option({
type = "select", type = "toggle",
name = L["Font"], name = L["Enable DR Colors as Font Color"],
desc = L["Font of the cooldown"], desc = L["Shows the current DR Level on the DR icon."],
order = 11, order = 2,
dialogControl = "LSM30_Font", width = "full",
values = AceGUIWidgetLSMlists.font,
}), }),
drFontColor = Gladdy:colorOption({ drFontColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Font color"], name = L["Font color"],
desc = L["Color of the text"], desc = L["Color of the text"],
order = 13, order = 3,
hasAlpha = true, hasAlpha = true,
width = "full",
}),
drFont = Gladdy:option({
type = "select",
name = L["Font"],
desc = L["Font of the cooldown"],
order = 4,
dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font,
}), }),
drFontScale = Gladdy:option({ drFontScale = Gladdy:option({
type = "range", type = "range",
name = L["Font scale"], name = L["Font scale"],
desc = L["Scale of the text"], desc = L["Scale of the text"],
order = 12, order = 5,
min = 0.1, min = 0.1,
max = 2, max = 2,
step = 0.1, step = 0.1,
width = "full",
}), }),
} }
}, },
position = { levelText = {
type = "group", type = "group",
name = L["Position"], name = L["DR Font"],
order = 4, order = 4,
args = { args = {
headerPosition = { headerBorder = {
type = "header", type = "header",
name = L["Position"], name = L["DR Font"],
order = 20, order = 1,
}, },
drCooldownPos = Gladdy:option({ drLevelTextEnabled = Gladdy:option({
type = "toggle",
name = L["Enable DR Font"],
desc = L["Shows the current DR Level on the DR icon."],
order = 2,
width = "full",
}),
drLevelTextColorsEnabled = Gladdy:option({
type = "toggle",
name = L["Enable DR Colors as Font Color"],
desc = L["Shows the current DR Level on the DR icon."],
order = 3,
width = "full",
disabled = function()
return not Gladdy.db.drLevelTextEnabled
end,
}),
drLevelTextColor = Gladdy:colorOption({
type = "color",
name = L["DR Font color"],
desc = L["Color of the font"],
order = 4,
hasAlpha = true,
disabled = function()
return not Gladdy.db.drLevelTextEnabled
end,
}),
drLevelTextFont = Gladdy:option({
type = "select", type = "select",
name = L["DR Cooldown position"], name = L["Font"],
desc = L["Position of the cooldown icons"], desc = L["Font of the DR Font"],
order = 21, order = 5,
values = { dialogControl = "LSM30_Font",
["LEFT"] = L["Left"], values = AceGUIWidgetLSMlists.font,
["RIGHT"] = L["Right"], width = "full",
}, disabled = function()
return not Gladdy.db.drLevelTextEnabled
end,
}), }),
headerOffset = { drLevelTextScale = Gladdy:option({
type = "header",
name = L["Offset"],
order = 22,
},
drXOffset = Gladdy:option({
type = "range", type = "range",
name = L["Horizontal offset"], name = L["Font scale"],
order = 23, desc = L["Scale of the text"],
min = -400, order = 6,
max = 400, min = 0.1,
step = 0.1, max = 2,
}),
drYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 24,
min = -400,
max = 400,
step = 0.1, step = 0.1,
width = "full",
disabled = function()
return not Gladdy.db.drLevelTextEnabled
end,
}), }),
}, },
}, },
@ -518,33 +687,43 @@ function Diminishings:GetOptions()
headerBorder = { headerBorder = {
type = "header", type = "header",
name = L["Border"], name = L["Border"],
order = 30, order = 1,
}, },
drBorderStyle = Gladdy:option({ drBorderColorsEnabled = Gladdy:option({
type = "select", type = "toggle",
name = L["Border style"], name = L["Enable DR Colors as Border Color"],
order = 31, desc = L["Colors borders of DRs in respective DR Colors"],
values = Gladdy:GetIconStyles() order = 2,
width = "full",
}), }),
drBorderColor = Gladdy:colorOption({ drBorderColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Border color"], name = L["Border color"],
desc = L["Color of the border"], desc = L["Color of the border"],
order = 32, order = 3,
disabled = function()
return Gladdy.db.drBorderColorsEnabled
end,
hasAlpha = true, hasAlpha = true,
}), }),
headerBorderColors = { drBorderStyle = Gladdy:option({
type = "header", type = "select",
name = L["DR Border Colors"], name = L["Border style"],
order = 40, order = 4,
}, values = Gladdy:GetIconStyles()
drBorderColorsEnabled = Gladdy:option({
type = "toggle",
name = L["Dr Border Colors Enabled"],
desc = L["Colors borders of DRs in respective DR-color below"],
order = 41,
width = "full",
}), }),
}
},
levelColors = {
type = "group",
name = L["DR Colors"],
order = 6,
args = {
headerColors = {
type = "header",
name = L["DR Colors"],
order = 10,
},
drHalfColor = Gladdy:colorOption({ drHalfColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Half"], name = L["Half"],
@ -566,7 +745,76 @@ function Diminishings:GetOptions()
order = 44, order = 44,
hasAlpha = true, hasAlpha = true,
}), }),
} },
},
position = {
type = "group",
name = L["Position"],
order = 7,
args = {
headerPosition = {
type = "header",
name = L["Position"],
order = 20,
},
drGrowDirection = Gladdy:option({
type = "select",
name = L["DR Grow Direction"],
desc = L["Grow Direction of the dr icons"],
order = 21,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
drXOffset = Gladdy:option({
type = "range",
name = L["Horizontal offset"],
order = 23,
min = -400,
max = 400,
step = 0.1,
width = "full",
}),
drYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 24,
min = -400,
max = 400,
step = 0.1,
width = "full",
}),
},
},
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 8,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
drFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
drFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
}, },
}, },
}, },
@ -574,22 +822,46 @@ function Diminishings:GetOptions()
type = "group", type = "group",
name = L["Categories"], name = L["Categories"],
order = 6, order = 6,
disabled = function() return not Gladdy.db.drEnabled end,
args = Diminishings:CategoryOptions(), args = Diminishings:CategoryOptions(),
}, },
} }
end end
function Diminishings:CategoryOptions() function Diminishings:CategoryOptions()
local categories = {} local categories = {
checkAll = {
order = 1,
width = "0.7",
name = L["Check All"],
type = "execute",
func = function()
for k,_ in pairs(defaultCategories()) do
Gladdy.db.drCategories[k].enabled = true
end
end,
},
uncheckAll = {
order = 2,
width = "0.7",
name = L["Uncheck All"],
type = "execute",
func = function()
for k,_ in pairs(defaultCategories()) do
Gladdy.db.drCategories[k].enabled = false
end
end,
},
}
local indexList = {} local indexList = {}
for k,v in pairs(DRData:GetCategories()) do for k,_ in pairs(DRData:GetCategories()) do
tinsert(indexList, k) tinsert(indexList, k)
end end
tbl_sort(indexList) tbl_sort(indexList)
for i, k in ipairs(indexList) do for i,k in ipairs(indexList) do
categories[k] = { categories[k] = {
type = "group", type = "group",
name = DRData:GetCategoryName(k), name = L[DRData:GetCategoryName(k)],
order = i, order = i,
icon = Gladdy.db.drCategories[k].icon, icon = Gladdy.db.drCategories[k].icon,
args = { args = {
@ -597,10 +869,10 @@ function Diminishings:CategoryOptions()
type = "toggle", type = "toggle",
name = L["Enabled"], name = L["Enabled"],
order = 1, order = 1,
get = function(info) get = function()
return Gladdy.db.drCategories[k].enabled return Gladdy.db.drCategories[k].enabled
end, end,
set = function(info, value) set = function(_, value)
Gladdy.db.drCategories[k].enabled = value Gladdy.db.drCategories[k].enabled = value
end, end,
}, },
@ -608,10 +880,10 @@ function Diminishings:CategoryOptions()
type = "toggle", type = "toggle",
name = L["Force Icon"], name = L["Force Icon"],
order = 2, order = 2,
get = function(info) get = function()
return Gladdy.db.drCategories[k].forceIcon return Gladdy.db.drCategories[k].forceIcon
end, end,
set = function(info, value) set = function(_, value)
Gladdy.db.drCategories[k].forceIcon = value Gladdy.db.drCategories[k].forceIcon = value
end, end,
}, },
@ -621,10 +893,10 @@ function Diminishings:CategoryOptions()
desc = L["Icon of the DR"], desc = L["Icon of the DR"],
order = 4, order = 4,
values = Diminishings:GetDRIcons(k), values = Diminishings:GetDRIcons(k),
get = function(info) get = function()
return Gladdy.db.drCategories[k].icon return Gladdy.db.drCategories[k].icon
end, end,
set = function(info, value) set = function(_, value)
Gladdy.db.drCategories[k].icon = value Gladdy.db.drCategories[k].icon = value
Gladdy.options.args.Diminishings.args.categories.args[k].icon = value Gladdy.options.args.Diminishings.args.categories.args[k].icon = value
end, end,
@ -644,3 +916,36 @@ function Diminishings:GetDRIcons(category)
end end
return icons return icons
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Diminishings:LegacySetPosition(drFrame, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
drFrame:ClearAllPoints()
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.drCooldownPos == "LEFT") then
Gladdy.db.drGrowDirection = "LEFT"
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
drFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset)
else
drFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset)
end
end
if (Gladdy.db.drCooldownPos == "RIGHT") then
Gladdy.db.drGrowDirection = "RIGHT"
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
drFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset)
else
drFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset)
end
end
return Gladdy.db.newLayout
end

View File

@ -1,4 +1,4 @@
local type, pairs = type, pairs local type, pairs, str_match = type, pairs, string.match
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local AceSerializer = LibStub("AceSerializer-3.0") local AceSerializer = LibStub("AceSerializer-3.0")
@ -6,23 +6,26 @@ local L = Gladdy.L
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
local LibDeflate = LibStub:GetLibrary("LibDeflate") local LibDeflate = LibStub:GetLibrary("LibDeflate")
local function table_copy(t)
local function table_copy(t, str)
local t2 = {}; local t2 = {};
if str == nil then
str = "Gladdy.db"
end
for k,v in pairs(t) do for k,v in pairs(t) do
if type(v) == "table" then if type(v) == "table" then
t2[k] = table_copy(v); t2[k] = table_copy(v, str .. "." .. k);
else else
t2[k] = v; t2[k] = v;
end end
end end
return t2; return t2;
end end
local ExportImport = Gladdy:NewModule("ExportImport", nil, { local ExportImport = Gladdy:NewModule("Export Import", nil, {
}) })
local export = AceGUI:Create("Frame") local export = AceGUI:Create("Frame")
export:SetWidth(550) export:SetWidth(550)
export.sizer_se:Hide() export.sizer_se:Hide()
@ -69,6 +72,7 @@ importButton:SetCallback("OnClick", function(widget)
Gladdy:Reset() Gladdy:Reset()
Gladdy:HideFrame() Gladdy:HideFrame()
Gladdy:ToggleFrame(3) Gladdy:ToggleFrame(3)
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end) end)
import:AddChild(importButton) import:AddChild(importButton)
import.button = importButton import.button = importButton
@ -85,28 +89,81 @@ end)
import:AddChild(importClearButton) import:AddChild(importClearButton)
import.clearButton = importClearButton import.clearButton = importClearButton
local deletedOptions = { -- backwards compatibility
--deleted DR-categories
repentance = true,
sleep = true,
impconc = true,
dragonsbreath = true,
freezetrap = true,
--deleted db options
castBarPos = true,
buffsCooldownPos = true,
buffsBuffsCooldownPos = true,
classIconPos = true,
ciAnchor = true,
ciPos = true,
cooldownYPos = true,
cooldownXPos = true,
drCooldownPos = true,
racialAnchor = true,
racialPos = true,
trinketPos = true,
padding = true,
growUp = true,
powerBarFontSize = true,
}
local function checkIsDeletedOption(k, str, msg, errorFound, errorMsg)
local isDeleted
for key, _ in pairs(deletedOptions) do
if str_match(k, key) then
isDeleted = true
Gladdy:Debug("WARN", "found deleted option =", str .. "." .. k)
end
end
if errorFound then
return errorFound, errorMsg
end
if not isDeleted then
return true, msg or str .. "." .. k .. " does not exist"
end
end
function ExportImport:CheckDeserializedOptions(tbl, refTbl, str) function ExportImport:CheckDeserializedOptions(tbl, refTbl, str)
if str == nil and not tbl.version_major_num then if str == nil and not tbl.version_major_num then
return false, "Version conflict: version_major_num not seen" return false, "Version conflict: version_major_num not seen"
end end
if str == nil and tbl.version_major_num ~= Gladdy.version_major_num then if str == nil and tbl.version_major_num > Gladdy.version_major_num then
return false, "Version conflict: " .. tbl.version_major_num .. " ~= " .. Gladdy.version_major_num return false, "Version conflict: Major v" .. tbl.version_major_num .. " ~= v" .. Gladdy.version_major_num
end end
if str == nil then if str == nil then
str = "Gladdy.db" str = "Gladdy.db"
tbl.version_major_num = nil tbl.version_major_num = nil
end end
for k,v in pairs(tbl) do local res, msg
if refTbl[k] == nil then local errorFound, errorMsg
return false, str .. "." .. k .. " does not exist" if refTbl == nil then
else return false, str .. "does not exist"
if type(v) ~= type(refTbl[k]) then else
return false, str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) for k,v in pairs(tbl) do
if refTbl[k] == nil then
errorFound, errorMsg = checkIsDeletedOption(k, str, nil, errorFound, errorMsg)
elseif type(v) ~= type(refTbl[k]) then
errorFound = true
errorMsg = str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v)
elseif type(v) == "table" then elseif type(v) == "table" then
ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k) res, msg = ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k)
if not res then
errorFound, errorMsg = checkIsDeletedOption(msg, str, msg, errorFound, errorMsg)
end
end end
end end
end end
if errorFound then
return false, errorMsg
end
return true return true
end end
@ -133,8 +190,8 @@ function ExportImport:GetOptions()
export.eb:HighlightText(0, export.eb.editBox:GetNumLetters()) export.eb:HighlightText(0, export.eb.editBox:GetNumLetters())
export:SetStatusText("Copy this string to share your configuration with others.") export:SetStatusText("Copy this string to share your configuration with others.")
end, end,
name = "Export", name = L["Export"],
desc = "Export your current profile to share with others or your various accounts.", desc = L["Export your current profile to share with others or your various accounts."],
order = 3, order = 3,
}, },
import = { import = {
@ -157,17 +214,28 @@ function ExportImport:GetOptions()
import.deserializedTable = deserialized import.deserializedTable = deserialized
end) end)
end, end,
name = "Import", name = L["Import"],
desc = "This will overwrite your current profile!", desc = L["This will overwrite your current profile!"],
order = 4, order = 4,
}, },
} }
end end
function ExportImport:ApplyImport(t, table) function ExportImport:ApplyImport(t, table, str)
if str == nil then
str = "Gladdy.db"
if (not t.newLayout) then
table.newLayout = false
end
end
for k,v in pairs(t) do for k,v in pairs(t) do
if type(v) == "table" then if type(v) == "table" then
ExportImport:ApplyImport(v, table[k]) if (table[k] ~= nil) then
ExportImport:ApplyImport(v, table[k], str .. "." .. k)
else
Gladdy:Debug("ERROR", "ApplyImport failed for", str .. "." .. k)
end
else else
table[k] = v table[k] = v
end end

View File

@ -1,6 +1,7 @@
local pairs = pairs local pairs, ipairs = pairs, ipairs
local floor = math.floor local floor, abs = math.floor, math.abs
local UnitHealth, UnitHealthMax, UnitName, UnitExists = UnitHealth, UnitHealthMax, UnitName, UnitExists local str_find, str_gsub, str_sub, tinsert = string.find, string.gsub, string.sub, table.insert
local UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost = UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local RAID_CLASS_COLORS = RAID_CLASS_COLORS local RAID_CLASS_COLORS = RAID_CLASS_COLORS
@ -8,7 +9,7 @@ local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists
local Healthbar = Gladdy:NewModule("Healthbar", 100, { local Healthbar = Gladdy:NewModule("Health Bar", 100, {
healthBarFont = "DorisPP", healthBarFont = "DorisPP",
healthBarHeight = 60, healthBarHeight = 60,
healthBarTexture = "Smooth", healthBarTexture = "Smooth",
@ -16,18 +17,40 @@ local Healthbar = Gladdy:NewModule("Healthbar", 100, {
healthBarBorderSize = 9, healthBarBorderSize = 9,
healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
healthBarBgColor = { r = 0, g = 0, b = 0, a = 0.4 }, healthBarBgColor = { r = 0, g = 0, b = 0, a = 0.4 },
healthBarClassColored = true,
healthBarColoredByCurrentHp = false,
healthBarStatusBarColorMax = { r = 0, g = 1, b = 0, a = 1 },
healthBarStatusBarColorMid = { r = 1, g = 1, b = 0, a = 1 },
healthBarStatusBarColorMin = { r = 1, g = 0, b = 0, a = 1 },
healthFrameStrata = "MEDIUM",
healthFrameLevel = 1,
healthBarStealthColor = { r = 0.66, g = 0.66, b = 0.66, a = 1 },
--font
healthBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, healthBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
healthBarNameFontSize = 12, healthBarNameFontSize = 12,
healthBarHealthFontSize = 12, healthBarHealthFontSize = 12,
healthNameToArenaId = false,
healthName = true, healthName = true,
healthActual = false, healthActual = false,
healthMax = true, healthMax = true,
healthPercentage = true, healthPercentage = true,
healthCustomTagsEnabled = false,
healthTextLeft = "[name]",
healthTextRight = "[percent|status]",
healthTextLeftOutline = false,
healthTextRightOutline = false,
healthTextLeftVOffset = 0,
healthTextLeftHOffset = 5,
healthTextRightVOffset = 0,
healthTextRightHOffset = -5,
}) })
function Healthbar:Initialize() function Healthbar:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("ENEMY_STEALTH")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DESTROYED")
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_DEATH")
end end
@ -36,159 +59,238 @@ function Healthbar:CreateFrame(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
local healthBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local healthBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle), healthBar:EnableMouse(false)
healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"),
edgeSize = Gladdy.db.healthBarBorderSize }) edgeSize = Gladdy.db.healthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a) healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.healthBarBorderColor))
healthBar:SetFrameLevel(1) healthBar:SetFrameStrata(Gladdy.db.healthFrameStrata)
healthBar:SetFrameLevel(Gladdy.db.healthFrameLevel)
healthBar.hp = CreateFrame("StatusBar", nil, healthBar) healthBar.hp = CreateFrame("StatusBar", nil, healthBar)
healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture"))
healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetMinMaxValues(0, 100)
healthBar.hp:SetFrameLevel(0) healthBar.hp:SetFrameStrata(Gladdy.db.healthFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.healthFrameLevel - 1)
healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND")
healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture"))
healthBar.bg:ClearAllPoints() healthBar.bg:ClearAllPoints()
healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAllPoints(healthBar.hp)
healthBar.bg:SetAlpha(1) healthBar.bg:SetAlpha(1)
healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a) healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor))
healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall") healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall")
if (Gladdy.db.healthBarNameFontSize < 1) then if (Gladdy.db.healthBarNameFontSize < 1) then
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE")
healthBar.nameText:Show() healthBar.nameText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.nameText:SetShadowOffset(1, -1) healthBar.nameText:SetShadowOffset(1, -1)
healthBar.nameText:SetShadowColor(0, 0, 0, 1) healthBar.nameText:SetShadowColor(0, 0, 0, 1)
healthBar.nameText:SetJustifyH("CENTER") healthBar.nameText:SetJustifyH("CENTER")
healthBar.nameText:SetPoint("LEFT", 5, 0) healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset)
healthBar.healthText = healthBar:CreateFontString(nil, "LOW") healthBar.healthText = healthBar:CreateFontString(nil, "LOW")
if (Gladdy.db.healthBarHealthFontSize < 1) then if (Gladdy.db.healthBarHealthFontSize < 1) then
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE")
healthBar.healthText:Hide() healthBar.healthText:Hide()
end end
healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.healthText:SetShadowOffset(1, -1) healthBar.healthText:SetShadowOffset(1, -1)
healthBar.healthText:SetShadowColor(0, 0, 0, 1) healthBar.healthText:SetShadowColor(0, 0, 0, 1)
healthBar.healthText:SetJustifyH("CENTER") healthBar.healthText:SetJustifyH("CENTER")
healthBar.healthText:SetPoint("RIGHT", -5, 0) healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset)
healthBar.unit = unit healthBar.unit = unit
self.frames[unit] = healthBar self.frames[unit] = healthBar
button.healthBar = healthBar button.healthBar = healthBar
self:ResetUnit(unit) self:ResetUnit(unit)
healthBar:RegisterUnitEvent("UNIT_HEALTH", unit) healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit) healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
healthBar:SetScript("OnEvent", Healthbar.OnEvent) healthBar:SetScript("OnEvent", Healthbar.OnEvent)
end end
function Healthbar.OnEvent(self, event, unit) function Healthbar.OnEvent(self, event, unit)
if event == "UNIT_HEALTH" then local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit)
local health = UnitHealth(unit) if event == "UNIT_HEALTH_FREQUENT" or event == "UNIT_MAXHEALTH" then
local healthMax = UnitHealthMax(unit) if isDead then
Healthbar:SetHealthText(self, health, healthMax) Gladdy:SendMessage("UNIT_DEATH", unit)
self.hp:SetValue(UnitHealth(unit)) return
elseif event == "UNIT_MAXHEALTH" then end
local health = UnitHealth(unit) local health = UnitHealth(unit)
local healthMax = UnitHealthMax(unit) local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax) self.hp:SetMinMaxValues(0, healthMax)
self.hp:SetValue(health) self.hp:SetValue(health)
Healthbar:SetHealthText(self, health, healthMax) self.hp.current = health
self.hp.max = healthMax
Healthbar:SetText(unit, health, healthMax)
Healthbar:SetHealthStatusBarColor(unit, self.hp.current, self.hp.max)
elseif event == "UNIT_NAME_UPDATE" then elseif event == "UNIT_NAME_UPDATE" then
local name = UnitName(unit) local name = UnitName(unit)
Gladdy.buttons[unit].name = name Gladdy.buttons[unit].name = name
self.nameText:SetText(name) Healthbar:SetText(unit, self.hp.current, self.hp.max)
end end
if not Gladdy.buttons[unit].class then if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true) Gladdy:SpotEnemy(unit, true)
end end
end end
function Healthbar:SetHealthText(healthBar, health, healthMax) local function getGradient(start, ending, percentage, factor)
local healthText return start * abs(-2 * percentage + 1) + ending * factor
local healthPercentage = floor(health * 100 / healthMax) end
if health == 0 then -- /run LibStub("Gladdy").modules["Health Bar"]:SetHealthStatusBarColor("arena1", 51, 100)
self:UNIT_DEATH(healthBar.unit) local rMax, gMax, bMax, rMid, gMid, bMid, rMin, gMin, bMin, rNow, gNow, bNow, percentage, factor, stealthAlpha
function Healthbar:SetHealthStatusBarColor(unit, health, healthMax)
local button = Gladdy.buttons[unit]
if not button or not health or not healthMax then
return return
end end
if (Gladdy.db.healthActual) then local healthBar = Gladdy.buttons[unit].healthBar
healthText = healthMax > 999 and ("%.1fk"):format(health / 1000) or health if not healthBar.hp.oorFactor then
healthBar.hp.oorFactor = 1
end end
if (Gladdy.db.healthMax) then healthBar.hp:SetMinMaxValues(0, healthMax)
local text = healthMax > 999 and ("%.1fk"):format(healthMax / 1000) or healthMax healthBar.hp:SetValue(health)
if (healthText) then
healthText = ("%s/%s"):format(healthText, text) if healthBar.hp.stealth then
stealthAlpha = Gladdy.db.healthBarStealthColor.a < Gladdy.db.healthBarBgColor.a and Gladdy.db.healthBarStealthColor.a or Gladdy.db.healthBarBgColor.a
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor, nil, stealthAlpha))
healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.healthBarStealthColor))
return
else
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor))
end
if not Gladdy.db.healthBarClassColored then
if Gladdy.db.healthBarColoredByCurrentHp then
rMax, gMax, bMax = Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMax)
rMid, gMid, bMid = Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMid)
rMin, gMin, bMin = Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMin)
percentage = health / healthMax
if percentage == 0.5 then
rNow, gNow, bNow = Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMid, healthBar.hp.oorFactor)
elseif percentage < 0.5 then
factor = percentage * 2
rNow = getGradient(rMin, rMid, percentage, factor)
gNow = getGradient(gMin, gMid, percentage, factor)
bNow = getGradient(bMin, bMid, percentage, factor)
elseif percentage > 0.5 then
factor = ((healthMax - health) / healthMax) * 2
rNow = getGradient(rMax, rMid, percentage, factor)
gNow = getGradient(gMax, gMid, percentage, factor)
bNow = getGradient(bMax, bMid, percentage, factor)
end
healthBar.hp:SetStatusBarColor(rNow / healthBar.hp.oorFactor, gNow / healthBar.hp.oorFactor, bNow / healthBar.hp.oorFactor, 1)
else else
healthText = text healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMax, healthBar.hp.oorFactor))
end end
end end
if button.class and Gladdy.db.healthBarClassColored then
if (Gladdy.db.healthPercentage) then healthBar.hp:SetStatusBarColor(
if (healthText) then RAID_CLASS_COLORS[button.class].r / healthBar.hp.oorFactor,
healthText = ("%s (%d%%)"):format(healthText, healthPercentage) RAID_CLASS_COLORS[button.class].g / healthBar.hp.oorFactor,
else RAID_CLASS_COLORS[button.class].b / healthBar.hp.oorFactor, 1)
healthText = ("%d%%"):format(healthPercentage)
end
end end
end
function Healthbar:SetHealthText(healthBar, health, healthMax)
local healthText = ""
local healthPercentage = health and healthMax and floor(health * 100 / healthMax)
if health == 0 and UnitExists(healthBar.unit) and UnitIsDeadOrGhost(healthBar.unit) then
self:UNIT_DEATH(healthBar.unit)
return
end
if (Gladdy.db.healthPercentage and healthPercentage) then
healthText = ("%d%%"):format(healthPercentage)
end
healthBar.healthText:SetText(healthText) healthBar.healthText:SetText(healthText)
end end
function Healthbar:SetText(unit, health, healthMax, status)
local button = Gladdy.buttons[unit]
if not Gladdy.buttons[unit] then
return
end
if Gladdy.db.healthCustomTagsEnabled then
button.healthBar.nameText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextLeft, health, healthMax, status))
button.healthBar.healthText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextRight, health, healthMax, status))
else
if Gladdy.db.healthName then
if Gladdy.db.healthNameToArenaId then
button.healthBar.nameText:SetText(str_gsub(unit, "arena", ""))
else
button.healthBar.nameText:SetText(Gladdy.buttons[unit].name)
end
end
if status then
button.healthBar.healthText:SetText(status)
else
Healthbar:SetHealthText(button.healthBar, health, healthMax)
end
end
end
function Healthbar:UpdateFrame(unit) function Healthbar:UpdateFrame(unit)
local healthBar = self.frames[unit] local healthBar = self.frames[unit]
if (not healthBar) then if (not healthBar) then
return return
end end
local iconSize = Gladdy.db.healthBarHeight + Gladdy.db.powerBarHeight healthBar:SetFrameStrata(Gladdy.db.healthFrameStrata)
healthBar:SetFrameLevel(Gladdy.db.healthFrameLevel)
healthBar.hp:SetFrameStrata(Gladdy.db.healthFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.healthFrameLevel - 1)
healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture"))
healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a) healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor))
healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle), healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"),
edgeSize = Gladdy.db.healthBarBorderSize }) edgeSize = Gladdy.db.healthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a) healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.healthBarBorderColor))
healthBar:ClearAllPoints() healthBar:ClearAllPoints()
healthBar:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPLEFT", iconSize, 0) healthBar:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPLEFT", 0, 0)
healthBar:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit], "BOTTOMRIGHT") healthBar:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit], "BOTTOMRIGHT")
healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture"))
healthBar.hp:ClearAllPoints() healthBar.hp:ClearAllPoints()
healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset))
healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset))
if (Gladdy.db.healthBarHealthFontSize < 1) then if (Gladdy.db.healthBarHealthFontSize < 1) then
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE")
healthBar.healthText:Show() healthBar.healthText:Show()
end end
if (Gladdy.db.healthBarNameFontSize < 1) then if (Gladdy.db.healthBarNameFontSize < 1) then
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE")
if Gladdy.db.healthName then if Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled then
healthBar.nameText:Show() healthBar.nameText:Show()
else else
healthBar.nameText:Hide() healthBar.nameText:Hide()
end end
end end
healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset)
healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset)
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end end
function Healthbar:ResetUnit(unit) function Healthbar:ResetUnit(unit)
@ -201,6 +303,8 @@ function Healthbar:ResetUnit(unit)
healthBar.nameText:SetText("") healthBar.nameText:SetText("")
healthBar.healthText:SetText("") healthBar.healthText:SetText("")
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.hp.current = nil
healthBar.hp.max = nil
end end
function Healthbar:Test(unit) function Healthbar:Test(unit)
@ -210,8 +314,31 @@ function Healthbar:Test(unit)
return return
end end
Gladdy:SendMessage("UNIT_HEALTH", unit, button.health, button.healthMax)
healthBar.hp.current = button.health
healthBar.hp.max = button.healthMax
self:ENEMY_SPOTTED(unit) self:ENEMY_SPOTTED(unit)
self:UNIT_HEALTH(unit, button.health, button.healthMax) self:SetText(unit, button.health, button.healthMax)
healthBar.hp:SetValue(button.health)
if unit == "arena1" then
self:UNIT_DEATH(unit)
end
end
function Healthbar:UNIT_SPEC(unit)
local button = Gladdy.buttons[unit]
if not button then
return
end
self:SetText(unit, button.healthBar.hp.current, button.healthBar.hp.max)
--button.healthBar.nameText:SetText(Gladdy:SetTag(unit, Gladdy.db.healthTextLeft, button.health, button.healthMax))
end
function Healthbar:JOINED_ARENA()
for i=1,Gladdy.curBracket do
local unit = "arena" .. i
self:SetText(unit, self.frames[unit].hp.current, self.frames[unit].hp.max)
end
end end
function Healthbar:ENEMY_SPOTTED(unit) function Healthbar:ENEMY_SPOTTED(unit)
@ -226,48 +353,23 @@ function Healthbar:ENEMY_SPOTTED(unit)
local healthMax = UnitHealthMax(unit) local healthMax = UnitHealthMax(unit)
healthBar.hp:SetMinMaxValues(0, healthMax) healthBar.hp:SetMinMaxValues(0, healthMax)
healthBar.hp:SetValue(health) healthBar.hp:SetValue(health)
Healthbar:SetHealthText(healthBar, health, healthMax) healthBar.hp.current = health
healthBar.hp.max = healthMax
end end
healthBar.nameText:SetText(button.name) Healthbar:SetText(unit, healthBar.hp.current, healthBar.hp.max)
healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[button.class].r, RAID_CLASS_COLORS[button.class].g, RAID_CLASS_COLORS[button.class].b, 1) Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end end
function Healthbar:UNIT_HEALTH(unit, health, healthMax) function Healthbar:ENEMY_STEALTH(unit, stealth)
local healthBar = self.frames[unit] local healthBar = self.frames[unit]
if (not healthBar) then local button = Gladdy.buttons[unit]
if (not healthBar or not button) then
return return
end end
if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true)
end
Gladdy:SendMessage("UNIT_HEALTH", unit, health, healthMax)
local healthPercentage = floor(health * 100 / healthMax) healthBar.hp.stealth = stealth
local healthText
if (Gladdy.db.healthActual) then Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
healthText = healthMax > 999 and ("%.1fk"):format(health / 1000) or health
end
if (Gladdy.db.healthMax) then
local text = healthMax > 999 and ("%.1fk"):format(healthMax / 1000) or healthMax
if (healthText) then
healthText = ("%s/%s"):format(healthText, text)
else
healthText = text
end
end
if (Gladdy.db.healthPercentage) then
if (healthText) then
healthText = ("%s (%d%%)"):format(healthText, healthPercentage)
else
healthText = ("%d%%"):format(healthPercentage)
end
end
healthBar.healthText:SetText(healthText)
healthBar.hp:SetValue(healthPercentage)
end end
function Healthbar:UNIT_DEATH(unit) function Healthbar:UNIT_DEATH(unit)
@ -277,7 +379,8 @@ function Healthbar:UNIT_DEATH(unit)
end end
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.healthText:SetText(L["DEAD"]) healthBar.hp.current = 0
Healthbar:SetText(unit, 0, 100, L["DEAD"])
end end
function Healthbar:UNIT_DESTROYED(unit) function Healthbar:UNIT_DESTROYED(unit)
@ -287,8 +390,8 @@ function Healthbar:UNIT_DESTROYED(unit)
end end
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.healthText:SetText(L["LEAVE"]) healthBar.hp.current = 0
healthBar.nameText:SetText("") Healthbar:SetText(unit, 0, 100, L["LEAVE"])
end end
local function option(params) local function option(params)
@ -300,12 +403,14 @@ local function option(params)
set = function(info, value) set = function(info, value)
local key = info.arg or info[#info] local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value Gladdy.dbi.profile[key] = value
Gladdy.options.args.Healthbar.args.group.args.border.args.healthBarBorderSize.max = Gladdy.db.healthBarHeight/2 Gladdy.options.args["Health Bar"].args.group.args.border.args.healthBarBorderSize.max = Gladdy.db.healthBarHeight/2
if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then
Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2 Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2
end end
for i=1,Gladdy.curBracket do if Gladdy.frame.testing then
Healthbar:Test("arena" .. i) for i=1,Gladdy.curBracket do
Healthbar:Test("arena" .. i)
end
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -328,7 +433,7 @@ function Healthbar:GetOptions()
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 3, order = 3,
args = { args = {
general = { general = {
@ -349,6 +454,7 @@ function Healthbar:GetOptions()
min = 10, min = 10,
max = 100, max = 100,
step = 1, step = 1,
width = "full",
}), }),
healthBarTexture = option({ healthBarTexture = option({
type = "select", type = "select",
@ -358,19 +464,76 @@ function Healthbar:GetOptions()
dialogControl = "LSM30_Statusbar", dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar, values = AceGUIWidgetLSMlists.statusbar,
}), }),
},
},
barColor = {
type = "group",
name = L["Bar Color"],
order = 2,
args = {
headerAuras = {
type = "header",
name = L["Color"],
order = 1,
},
healthBarClassColored = Gladdy:option({
type = "toggle",
name = L["Class colored"] .. " " .. L["Health Bar"],
order = 2,
width = "full",
}),
healthBarStealthColor = Gladdy:colorOption({
type = "color",
name = L["Stealth Color"],
order = 3,
hasAlpha = true,
}),
healthBarBgColor = Gladdy:colorOption({ healthBarBgColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Background color"], name = L["Background color"],
desc = L["Color of the status bar background"], desc = L["Color of the status bar background"],
order = 5, order = 4,
hasAlpha = true, hasAlpha = true,
}), }),
headerAuras = {
type = "header",
name = L["Custom Colors"],
order = 10,
},
healthBarColoredByCurrentHp = Gladdy:option({
type = "toggle",
name = L["Enable Custom Colors"],
order = 11,
width = "full",
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMax = Gladdy:colorOption({
type = "color",
name = L["100%"],
order = 12,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMid = Gladdy:colorOption({
type = "color",
name = L["50%"],
order = 13,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMin = Gladdy:colorOption({
type = "color",
name = L["0%"],
order = 14,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
}, },
}, },
font = { font = {
type = "group", type = "group",
name = L["Font"], name = L["Font"],
order = 2, order = 3,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -392,30 +555,90 @@ function Healthbar:GetOptions()
order = 12, order = 12,
hasAlpha = true, hasAlpha = true,
}), }),
healthTextLeftOutline = option({
type = "toggle",
name = L["Left Font Outline"],
order = 13,
width = "full",
}),
healthTextRightOutline = option({
type = "toggle",
name = L["Right Font Outline"],
order = 14,
width = "full",
}),
headerSize = {
type = "header",
name = L["Size"],
order = 20,
},
healthBarNameFontSize = option({ healthBarNameFontSize = option({
type = "range", type = "range",
name = L["Name font size"], name = L["Name font size"],
desc = L["Size of the name text"], desc = L["Size of the name text"],
order = 13, order = 21,
step = 0.1, step = 0.1,
min = 0, min = 0,
max = 20, max = 20,
width = "full",
}), }),
healthBarHealthFontSize = option({ healthBarHealthFontSize = option({
type = "range", type = "range",
name = L["Health font size"], name = L["Health font size"],
desc = L["Size of the health text"], desc = L["Size of the health text"],
order = 14, order = 22,
step = 0.1, step = 0.1,
min = 0, min = 0,
max = 20, max = 20,
width = "full",
}),
headerOffsets = {
type = "header",
name = L["Offsets"],
order = 30,
},
healthTextLeftVOffset = option({
type = "range",
name = L["Left Text Vertical Offset"],
order = 31,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextLeftHOffset = option({
type = "range",
name = L["Left Text Horizontal Offset"],
order = 32,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextRightVOffset = option({
type = "range",
name = L["Right Text Vertical Offset"],
order = 33,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextRightHOffset = option({
type = "range",
name = L["Right Text Horizontal Offset"],
order = 34,
step = 0.1,
min = -200,
max = 200,
width = "full",
}), }),
}, },
}, },
border = { border = {
type = "group", type = "group",
name = L["Border"], name = L["Border"],
order = 3, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -437,6 +660,7 @@ function Healthbar:GetOptions()
min = 0.5, min = 0.5,
max = Gladdy.db.healthBarHeight/2, max = Gladdy.db.healthBarHeight/2,
step = 0.5, step = 0.5,
width = "full",
}), }),
healthBarBorderColor = Gladdy:colorOption({ healthBarBorderColor = Gladdy:colorOption({
type = "color", type = "color",
@ -447,10 +671,39 @@ function Healthbar:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 5,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
healthFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
healthFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
healthValues = { healthValues = {
type = "group", type = "group",
name = L["Health Bar Text"], name = L["Health Bar Text"],
order = 4, order = 6,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -459,28 +712,36 @@ function Healthbar:GetOptions()
}, },
healthName = option({ healthName = option({
type = "toggle", type = "toggle",
name = L["Show the name"], name = L["Show name text"],
desc = L["Show the units name"], desc = L["Show the units name"],
order = 30, order = 2,
width = "full",
disabled = function() return Gladdy.db.healthCustomTagsEnabled end,
}), }),
healthActual = option({ healthNameToArenaId = option({
type = "toggle", type = "toggle",
name = L["Show the actual health"], name = L["Show ArenaX"],
desc = L["Show the actual health on the health bar"], desc = L["Show 1-5 as name instead"],
order = 31, order = 3,
}), width = "full",
healthMax = option({ disabled = function() return not Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled end,
type = "toggle",
name = L["Show max health"],
desc = L["Show max health on the health bar"],
order = 32,
}), }),
healthPercentage = option({ healthPercentage = option({
type = "toggle", type = "toggle",
name = L["Show health percentage"], name = L["Show health percentage"],
desc = L["Show health percentage on the health bar"], desc = L["Show health percentage on the health bar"],
order = 33, order = 6,
width = "full",
disabled = function() return Gladdy.db.healthCustomTagsEnabled end,
}), }),
header = {
type = "header",
name = L["Custom Tags"],
order = 10,
},
healthCustomTagsEnabled = Gladdy:GetTagOption(L["Custom Tags Enabled"], 11, nil, option, true),
healthTextLeft = Gladdy:GetTagOption(L["Left Text"], 12, "healthCustomTagsEnabled", option),
healthTextRight = Gladdy:GetTagOption(L["Right Text"], 13, "healthCustomTagsEnabled", option),
}, },
}, },
}, },

View File

@ -3,14 +3,18 @@ local CreateFrame, UnitIsUnit = CreateFrame, UnitIsUnit
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Highlight = Gladdy:NewModule("Highlight", nil, { local Highlight = Gladdy:NewModule("Highlight", nil, {
highlightBorderSize = 2, highlightBorderSize = 1,
highlightInset = false,
targetBorderColor = { r = 1, g = 0.8, b = 0, a = 1 }, targetBorderColor = { r = 1, g = 0.8, b = 0, a = 1 },
focusBorderColor = { r = 1, g = 0, b = 0, a = 1 }, focusBorderColor = { r = 1, g = 0, b = 0, a = 1 },
leaderBorderColor = { r = 0, g = 1, b = 0, a = 1 }, leaderBorderColor = { r = 0, g = 1, b = 0, a = 1 },
highlightBorderStyle = "Square Full White",
highlight = true, highlight = true,
targetBorder = true, targetBorder = true,
focusBorder = true, focusBorder = true,
leaderBorder = true, leaderBorder = true,
highlightFrameStrata = "MEDIUM",
highlightFrameLevel = 20,
}) })
function Highlight:Initialize() function Highlight:Initialize()
@ -50,21 +54,24 @@ function Highlight:CreateFrame(unit)
return return
end end
local healthBar = Gladdy.modules.Healthbar.frames[unit] local healthBar = Gladdy.modules["Health Bar"].frames[unit]
local targetBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local targetBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
targetBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = Gladdy.db.highlightBorderSize }) targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize })
targetBorder:SetFrameStrata("HIGH") targetBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
targetBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
targetBorder:Hide() targetBorder:Hide()
local focusBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local focusBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
focusBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = Gladdy.db.highlightBorderSize }) focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize })
focusBorder:SetFrameStrata("LOW") focusBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
focusBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
focusBorder:Hide() focusBorder:Hide()
local leaderBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local leaderBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
leaderBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = Gladdy.db.highlightBorderSize }) leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize })
leaderBorder:SetFrameStrata("MEDIUM") leaderBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
leaderBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
leaderBorder:Hide() leaderBorder:Hide()
local highlight = healthBar:CreateTexture(nil, "OVERLAY") local highlight = healthBar:CreateTexture(nil, "OVERLAY")
@ -87,31 +94,58 @@ function Highlight:UpdateFrame(unit)
return return
end end
local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local borderSize = Gladdy.db.highlightBorderSize local borderSize = Gladdy.db.highlightBorderSize
local iconSize = Gladdy.db.healthBarHeight + Gladdy.db.powerBarHeight + 1 local borderOffset = borderSize
local width = Gladdy.db.barWidth + borderSize * 2 local hpAndPowerHeight = Gladdy.db.healthBarHeight + powerBarHeight
local height = iconSize + borderSize * 2 local width = Gladdy.db.barWidth + (Gladdy.db.highlightInset and 0 or borderSize * 2)
local height = hpAndPowerHeight + (Gladdy.db.highlightInset and 0 or borderSize * 2)
button.targetBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.targetBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.focusBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.focusBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.leaderBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.leaderBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.targetBorder:SetWidth(width) button.targetBorder:SetWidth(width)
button.targetBorder:SetHeight(height) button.targetBorder:SetHeight(height)
button.targetBorder:ClearAllPoints() button.targetBorder:ClearAllPoints()
button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, borderSize) if Gladdy.db.highlightInset then
button.targetBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = borderSize }) button.targetBorder:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", -(borderOffset/Gladdy.db.statusbarBorderOffset), (borderOffset/Gladdy.db.statusbarBorderOffset))
button.targetBorder:SetBackdropBorderColor(Gladdy.db.targetBorderColor.r, Gladdy.db.targetBorderColor.g, Gladdy.db.targetBorderColor.b, Gladdy.db.targetBorderColor.a) button.targetBorder:SetPoint("BOTTOMRIGHT", Gladdy.db.powerBarEnabled and button.powerBar or button.healthBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
else
button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end
button.targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize })
button.targetBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.targetBorderColor))
button.focusBorder:SetWidth(width) button.focusBorder:SetWidth(width)
button.focusBorder:SetHeight(height) button.focusBorder:SetHeight(height)
button.focusBorder:ClearAllPoints() button.focusBorder:ClearAllPoints()
button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, borderSize) if Gladdy.db.highlightInset then
button.focusBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = borderSize }) button.focusBorder:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", -(borderOffset/Gladdy.db.statusbarBorderOffset), (borderOffset/Gladdy.db.statusbarBorderOffset))
button.focusBorder:SetBackdropBorderColor(Gladdy.db.focusBorderColor.r, Gladdy.db.focusBorderColor.g, Gladdy.db.focusBorderColor.b, Gladdy.db.focusBorderColor.a) button.focusBorder:SetPoint("BOTTOMRIGHT", Gladdy.db.powerBarEnabled and button.powerBar or button.healthBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
else
button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end
button.focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize })
button.focusBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.focusBorderColor))
button.leaderBorder:SetWidth(width) button.leaderBorder:SetWidth(width)
button.leaderBorder:SetHeight(height) button.leaderBorder:SetHeight(height)
button.leaderBorder:ClearAllPoints() button.leaderBorder:ClearAllPoints()
button.leaderBorder:SetPoint("TOP", button.healthBar, "TOP", 0, borderSize) if Gladdy.db.highlightInset then
button.leaderBorder:SetBackdrop({ edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeSize = borderSize }) button.leaderBorder:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", -(borderOffset/Gladdy.db.statusbarBorderOffset), (borderOffset/Gladdy.db.statusbarBorderOffset))
button.leaderBorder:SetBackdropBorderColor(Gladdy.db.leaderBorderColor.r, Gladdy.db.leaderBorderColor.g, Gladdy.db.leaderBorderColor.b, Gladdy.db.leaderBorderColor.a) button.leaderBorder:SetPoint("BOTTOMRIGHT", button.powerBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
else
button.leaderBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end
button.leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize })
button.leaderBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.leaderBorderColor))
if Gladdy.frame.testing then if Gladdy.frame.testing then
Highlight:Test(unit) Highlight:Test(unit)
end end
@ -135,7 +169,7 @@ function Highlight:Test(unit)
elseif (unit == "arena2") then elseif (unit == "arena2") then
self:Toggle(unit, "target", true) self:Toggle(unit, "target", true)
elseif (unit == "arena3") then elseif (unit == "arena3") then
self:Toggle(unit, "leader", true) --self:Toggle(unit, "leader", true)
end end
end end
@ -179,64 +213,136 @@ function Highlight:GetOptions()
name = L["Highlight"], name = L["Highlight"],
order = 2, order = 2,
}, },
highlightBorderSize = { highlightInset = Gladdy:option({
type = "range", type = "toggle",
name = L["Border size"], name = L["Show Inside"],
desc = L["Border size"], desc = L["Show Highlight border inside of frame"],
order = 3, order = 3,
min = 1, }),
max = 10, group = {
step = 1, type = "group",
childGroups = "tree",
name = L["Frame"],
order = 3,
args = {
enabled = {
type = "group",
name = L["Enabled"],
order = 1,
args = {
headerEnable = {
type = "header",
name = L["Enabled"],
order = 10,
},
highlight = Gladdy:option({
type = "toggle",
name = L["Highlight target"],
desc = L["Toggle if the selected target should be highlighted"],
order = 11,
width = "full",
}),
targetBorder = Gladdy:option({
type = "toggle",
name = L["Show border around target"],
desc = L["Toggle if a border should be shown around the selected target"],
order = 12,
width = "full",
}),
focusBorder = Gladdy:option({
type = "toggle",
name = L["Show border around focus"],
desc = L["Toggle of a border should be shown around the current focus"],
order = 13,
width = "full",
}),
},
},
border = {
type = "group",
name = L["Border"],
order = 2,
args = {
headerHighlight = {
type = "header",
name = L["Border"],
order = 2,
},
highlightBorderSize = Gladdy:option({
type = "range",
name = L["Border size"],
desc = L["Border size"],
order = 4,
min = 1,
max = 20,
step = 1,
width = "full",
}),
highlightBorderStyle = Gladdy:option({
type = "select",
name = L["Border style"],
order = 5,
dialogControl = "LSM30_Border",
values = AceGUIWidgetLSMlists.border,
}),
},
},
color = {
type = "group",
name = L["Color"],
order = 3,
args = {
headerColor = {
type = "header",
name = L["Colors"],
order = 6,
},
targetBorderColor = Gladdy:colorOption({
type = "color",
name = L["Target border color"],
desc = L["Color of the selected targets border"],
order = 7,
hasAlpha = true,
}),
focusBorderColor = Gladdy:colorOption({
type = "color",
name = L["Focus border color"],
desc = L["Color of the focus border"],
order = 8,
hasAlpha = true,
}),
},
},
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
highlightFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
highlightFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
},
}, },
targetBorderColor = Gladdy:colorOption({
type = "color",
name = L["Target border color"],
desc = L["Color of the selected targets border"],
order = 4,
hasAlpha = true,
}),
focusBorderColor = Gladdy:colorOption({
type = "color",
name = L["Focus border color"],
desc = L["Color of the focus border"],
order = 5,
hasAlpha = true,
}),
leaderBorderColor = Gladdy:colorOption({
type = "color",
name = L["Raid leader border color"],
desc = L["Color of the raid leader border"],
order = 6,
hasAlpha = true,
}),
headerEnable = {
type = "header",
name = L["Enable/Disable"],
order = 10,
},
highlight = Gladdy:option({
type = "toggle",
name = L["Highlight target"],
desc = L["Toggle if the selected target should be highlighted"],
order = 11,
}),
targetBorder = Gladdy:option({
type = "toggle",
name = L["Show border around target"],
desc = L["Toggle if a border should be shown around the selected target"],
order = 12,
}),
focusBorder = Gladdy:option({
type = "toggle",
name = L["Show border around focus"],
desc = L["Toggle of a border should be shown around the current focus"],
order = 13,
}),
leaderBorder = Gladdy:option({
type = "toggle",
name = L["Show border around raid leader"],
desc = L["Toggle if a border should be shown around the raid leader"],
order = 14,
}),
} }
end end

View File

@ -1,12 +1,12 @@
local string_gsub, floor, pairs = string.gsub, math.floor, pairs local string_gsub, floor, pairs = string.gsub, math.floor, pairs
local CreateFrame = CreateFrame local CreateFrame, SetPortraitTexture = CreateFrame, SetPortraitTexture
local UnitHealthMax, UnitHealth, UnitGUID = UnitHealthMax, UnitHealth, UnitGUID local UnitHealthMax, UnitHealth, UnitGUID = UnitHealthMax, UnitHealth, UnitGUID
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Pets = Gladdy:NewModule("Pets", nil, { local Pets = Gladdy:NewModule("Pets", nil, {
petEnabled = true, petEnabled = true,
petWidth = 100, petWidth = 128,
petHeight = 20, petHeight = 20,
petPortraitEnabled = true, petPortraitEnabled = true,
petPortraitBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", petPortraitBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
@ -21,26 +21,44 @@ local Pets = Gladdy:NewModule("Pets", nil, {
petHealthBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, petHealthBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
petHealthBarFontSize = 12, petHealthBarFontSize = 12,
petHealthPercentage = true, petHealthPercentage = true,
petXOffset = 50, petXOffset = 1,
petYOffset = 0, petYOffset = -62,
petGroup = false,
petMargin = 1,
petFrameStrata = "MEDIUM",
petFrameLevel = 5,
}) })
function Pets:Initialize() function Pets:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("JOINED_ARENA") if Gladdy.db.petEnabled then
self:RegisterMessage("PET_SPOTTED") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("PET_DESTROYED") self:RegisterMessage("PET_SPOTTED")
self:RegisterMessage("PET_STEALTH") self:RegisterMessage("PET_DESTROYED")
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("PET_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED")
end
end
function Pets:UpdateFrameOnce()
if Gladdy.db.petEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("PET_SPOTTED")
self:RegisterMessage("PET_DESTROYED")
self:RegisterMessage("PET_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED")
else
self:UnregisterAllMessages()
end
end end
function Pets:JOINED_ARENA() function Pets:JOINED_ARENA()
for k,v in pairs(self.frames) do for _,v in pairs(self.frames) do
v.healthBar:SetAlpha(0) v.healthBar:SetAlpha(0)
end end
if Gladdy.db.petEnabled then if Gladdy.db.petEnabled then
self:RegisterEvent("UNIT_PET") self:RegisterEvent("UNIT_PET")
self:SetScript("OnEvent", function(self, event, unitId) self:SetScript("OnEvent", function(_, event, unitId)
if event == "UNIT_PET" then if event == "UNIT_PET" then
local unit = Gladdy.guids[UnitGUID(unitId)] local unit = Gladdy.guids[UnitGUID(unitId)]
if unit then if unit then
@ -63,9 +81,10 @@ function Pets:ResetUnit(unitId)
end end
function Pets:PET_SPOTTED(unit) function Pets:PET_SPOTTED(unit)
Gladdy.guids[UnitGUID(unit)] = unit
if Gladdy.db.petEnabled then if Gladdy.db.petEnabled then
self.frames[unit].healthBar:SetAlpha(1) self.frames[unit].healthBar:SetAlpha(1)
self.frames[unit].healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a) self.frames[unit].healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor))
self.frames[unit].healthBar:SetScript("OnUpdate", function(self) self.frames[unit].healthBar:SetScript("OnUpdate", function(self)
self.hp:SetValue(UnitHealth(self.unit)) self.hp:SetValue(UnitHealth(self.unit))
Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit)) Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit))
@ -124,6 +143,7 @@ function Pets:Test(unitId)
petFrame.healthBar.hp:SetMinMaxValues(0, 6200) petFrame.healthBar.hp:SetMinMaxValues(0, 6200)
petFrame.healthBar.hp:SetValue(2000) petFrame.healthBar.hp:SetValue(2000)
Pets:SetHealthText(petFrame.healthBar, 2000, 6200) Pets:SetHealthText(petFrame.healthBar, 2000, 6200)
SetPortraitTexture(petFrame.healthBar.portrait, "player")
end end
end end
@ -133,12 +153,13 @@ function Pets:CreateFrame(unitId)
return return
end end
local button = CreateFrame("Frame", "GladdyButtonFramePet" .. unit, Gladdy.frame) local button = CreateFrame("Frame", "GladdyButtonFramePet" .. unit, Gladdy.frame)
button:SetMovable(true)
--button:SetAlpha(0) --button:SetAlpha(0)
button:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset) button:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
local secure = CreateFrame("Button", "GladdyButton" .. unit, button, "SecureActionButtonTemplate") local secure = CreateFrame("Button", "GladdyButton" .. unit, button, "SecureActionButtonTemplate, SecureHandlerEnterLeaveTemplate")
secure:RegisterForClicks("AnyUp")
secure:RegisterForClicks("AnyUp") secure:RegisterForClicks("AnyUp")
secure:RegisterForClicks("AnyDown")
secure:SetAttribute("*type1", "target") secure:SetAttribute("*type1", "target")
secure:SetAttribute("*type2", "focus") secure:SetAttribute("*type2", "focus")
secure:SetAttribute("unit", unit) secure:SetAttribute("unit", unit)
@ -148,46 +169,48 @@ function Pets:CreateFrame(unitId)
button.secure = secure button.secure = secure
local healthBar = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local healthBar = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle), healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"),
edgeSize = Gladdy.db.petHealthBarBorderSize }) edgeSize = Gladdy.db.petHealthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor))
healthBar:SetFrameLevel(1) healthBar:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar:SetFrameLevel(Gladdy.db.petFrameLevel)
healthBar:SetAllPoints(button) healthBar:SetAllPoints(button)
healthBar:SetAlpha(0) healthBar:SetAlpha(0)
healthBar.portrait = healthBar:CreateTexture(nil, "OVERLAY") healthBar.portrait = healthBar:CreateTexture(nil, "BACKGROUND")
healthBar.portrait:SetPoint("LEFT", healthBar, "RIGHT") healthBar.portrait:SetPoint("LEFT", healthBar, "RIGHT")
healthBar.portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9) healthBar.portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9)
SetPortraitTexture(healthBar.portrait, "player") SetPortraitTexture(healthBar.portrait, "player")
healthBar.portrait.border = healthBar:CreateTexture(nil, "OVERLAY") healthBar.portrait.border = healthBar:CreateTexture(nil, "OVERLAY")
healthBar.portrait.border:SetAllPoints(healthBar.portrait) healthBar.portrait.border:SetAllPoints(healthBar.portrait)
healthBar.portrait.border:SetTexture(Gladdy.db.classIconBorderStyle) healthBar.portrait.border:SetTexture(Gladdy.db.classIconBorderStyle)
healthBar.portrait.border:SetVertexColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) healthBar.portrait.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor))
healthBar.hp = CreateFrame("StatusBar", nil, healthBar) healthBar.hp = CreateFrame("StatusBar", nil, healthBar)
healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture"))
healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a) healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor))
healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetMinMaxValues(0, 100)
healthBar.hp:SetFrameLevel(0) healthBar.hp:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.petFrameLevel - 1)
healthBar.hp:SetAllPoints(healthBar) healthBar.hp:SetAllPoints(healthBar)
healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND")
healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture"))
healthBar.bg:ClearAllPoints() healthBar.bg:ClearAllPoints()
healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAllPoints(healthBar.hp)
healthBar.bg:SetAlpha(1) healthBar.bg:SetAlpha(1)
healthBar.bg:SetVertexColor(Gladdy.db.petHealthBarBgColor.r, Gladdy.db.petHealthBarBgColor.g, Gladdy.db.petHealthBarBgColor.b, Gladdy.db.petHealthBarBgColor.a) healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBgColor))
healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall") healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall")
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize)
healthBar.nameText:Show() healthBar.nameText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor))
healthBar.nameText:SetShadowOffset(1, -1) healthBar.nameText:SetShadowOffset(1, -1)
healthBar.nameText:SetShadowColor(0, 0, 0, 1) healthBar.nameText:SetShadowColor(0, 0, 0, 1)
healthBar.nameText:SetJustifyH("CENTER") healthBar.nameText:SetJustifyH("CENTER")
@ -195,13 +218,13 @@ function Pets:CreateFrame(unitId)
healthBar.healthText = healthBar:CreateFontString(nil, "LOW") healthBar.healthText = healthBar:CreateFontString(nil, "LOW")
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize)
healthBar.healthText:Hide() healthBar.healthText:Hide()
end end
healthBar.healthText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor))
healthBar.healthText:SetShadowOffset(1, -1) healthBar.healthText:SetShadowOffset(1, -1)
healthBar.healthText:SetShadowColor(0, 0, 0, 1) healthBar.healthText:SetShadowColor(0, 0, 0, 1)
healthBar.healthText:SetJustifyH("CENTER") healthBar.healthText:SetJustifyH("CENTER")
@ -210,7 +233,7 @@ function Pets:CreateFrame(unitId)
healthBar.unit = unit healthBar.unit = unit
button.healthBar = healthBar button.healthBar = healthBar
healthBar:RegisterUnitEvent("UNIT_HEALTH", unit) healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit) healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_PORTRAIT_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_PORTRAIT_UPDATE", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
@ -240,6 +263,11 @@ function Pets:UpdateFrame(unitId)
return return
end end
healthBar:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar:SetFrameLevel(Gladdy.db.petFrameLevel)
healthBar.hp:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.petFrameLevel - 1)
if not Gladdy.db.petEnabled then if not Gladdy.db.petEnabled then
self.frames[unit]:Hide() self.frames[unit]:Hide()
else else
@ -248,7 +276,22 @@ function Pets:UpdateFrame(unitId)
self.frames[unit]:SetWidth(Gladdy.db.petWidth) self.frames[unit]:SetWidth(Gladdy.db.petWidth)
self.frames[unit]:SetHeight(Gladdy.db.petHeight) self.frames[unit]:SetHeight(Gladdy.db.petHeight)
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
Gladdy:SetPosition(self.frames[unit], unitId, "petXOffset", "petYOffset", Pets:LegacySetPosition(unit, unitId), Pets)
if (Gladdy.db.petGroup) then
if (unit == "arenapet1") then
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", Gladdy.buttons[unitId].healthBar, "TOPLEFT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
else
local previousPet = "arenapet" .. string_gsub(unit, "arenapet", "") - 1
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", self.frames[previousPet], "BOTTOMLEFT", 0, - Gladdy.db.petMargin)
end
else
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", Gladdy.buttons[unitId].healthBar, "TOPLEFT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
end
healthBar.portrait:SetHeight(Gladdy.db.petHeight) healthBar.portrait:SetHeight(Gladdy.db.petHeight)
healthBar.portrait:SetWidth(Gladdy.db.petHeight) healthBar.portrait:SetWidth(Gladdy.db.petHeight)
@ -260,34 +303,37 @@ function Pets:UpdateFrame(unitId)
healthBar.portrait.border:Show() healthBar.portrait.border:Show()
end end
healthBar.portrait.border:SetTexture(Gladdy.db.petPortraitBorderStyle) healthBar.portrait.border:SetTexture(Gladdy.db.petPortraitBorderStyle)
healthBar.portrait.border:SetVertexColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) healthBar.portrait.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor))
healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture"))
healthBar.bg:SetVertexColor(Gladdy.db.petHealthBarBgColor.r, Gladdy.db.petHealthBarBgColor.g, Gladdy.db.petHealthBarBgColor.b, Gladdy.db.petHealthBarBgColor.a) healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBgColor))
healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle), healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"),
edgeSize = Gladdy.db.petHealthBarBorderSize }) edgeSize = Gladdy.db.petHealthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor))
healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture"))
healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a) healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor))
healthBar.hp:ClearAllPoints() healthBar.hp:ClearAllPoints()
healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset))
healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset))
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1)
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize)
healthBar.nameText:Show() healthBar.nameText:Show()
healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize)
healthBar.healthText:Show() healthBar.healthText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor))
healthBar.healthText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor))
if (unit == "arenapet1") then
Gladdy:CreateMover(self.frames[unit], "petXOffset", "petYOffset", L["Pets"], {"TOPLEFT", "TOPLEFT"})
end
end end
function Pets:SetHealthText(healthBar, health, healthMax) function Pets:SetHealthText(healthBar, health, healthMax)
@ -332,22 +378,28 @@ end
function Pets:GetOptions() function Pets:GetOptions()
return { return {
headerHealthbar = { header = {
type = "header", type = "header",
name = L["Health Bar"], name = L["Pets"],
order = 2, order = 2,
}, },
petEnabled = Gladdy:option({ petEnabled = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Enable"], name = L["Enabled"],
desc = L["Enabled Pets module"], desc = L["Enables Pets module"],
order = 3, order = 3,
}), }),
petGroup = option({
type = "toggle",
name = L["Group Pets"],
order = 4,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 3, order = 3,
disabled = function() return not Gladdy.db.petEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -367,6 +419,7 @@ function Pets:GetOptions()
min = 10, min = 10,
max = 100, max = 100,
step = 1, step = 1,
width = "full",
}), }),
petWidth = option({ petWidth = option({
type = "range", type = "range",
@ -374,14 +427,27 @@ function Pets:GetOptions()
desc = L["Width of the bar"], desc = L["Width of the bar"],
order = 4, order = 4,
min = 10, min = 10,
max = 100, max = 300,
step = 1, step = 1,
width = "full",
}),
petMargin = option({
type = "range",
name = L["Margin"],
desc = L["Height of the bar"],
order = 6,
disabled = function()
return not Gladdy.db.petGroup
end,
min = 0,
max = 50,
step = .1,
}), }),
petHealthBarTexture = option({ petHealthBarTexture = option({
type = "select", type = "select",
name = L["Bar texture"], name = L["Bar texture"],
desc = L["Texture of the bar"], desc = L["Texture of the bar"],
order = 5, order = 7,
dialogControl = "LSM30_Statusbar", dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar, values = AceGUIWidgetLSMlists.statusbar,
}), }),
@ -389,14 +455,14 @@ function Pets:GetOptions()
type = "color", type = "color",
name = L["Health color"], name = L["Health color"],
desc = L["Color of the status bar"], desc = L["Color of the status bar"],
order = 6, order = 8,
hasAlpha = true, hasAlpha = true,
}), }),
petHealthBarBgColor = Gladdy:colorOption({ petHealthBarBgColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Background color"], name = L["Background color"],
desc = L["Color of the status bar background"], desc = L["Color of the status bar background"],
order = 7, order = 9,
hasAlpha = true, hasAlpha = true,
}), }),
}, },
@ -457,6 +523,7 @@ function Pets:GetOptions()
order = 13, order = 13,
min = 0, min = 0,
max = 20, max = 20,
width = "full",
}), }),
}, },
}, },
@ -485,6 +552,7 @@ function Pets:GetOptions()
min = 0.5, min = 0.5,
max = Gladdy.db.petHeight/2, max = Gladdy.db.petHeight/2,
step = 0.5, step = 0.5,
width = "full",
}), }),
petHealthBarBorderColor = Gladdy:colorOption({ petHealthBarBorderColor = Gladdy:colorOption({
type = "color", type = "color",
@ -512,6 +580,7 @@ function Pets:GetOptions()
min = -600, min = -600,
max = 600, max = 600,
step = 0.1, step = 0.1,
width = "full",
}), }),
petYOffset = Gladdy:option({ petYOffset = Gladdy:option({
type = "range", type = "range",
@ -520,13 +589,43 @@ function Pets:GetOptions()
min = -600, min = -600,
max = 600, max = 600,
step = 0.1, step = 0.1,
width = "full",
}), }),
} }
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
petFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
petFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
healthValues = { healthValues = {
type = "group", type = "group",
name = L["Health Values"], name = L["Health Values"],
order = 6, order = 7,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -544,4 +643,31 @@ function Pets:GetOptions()
}, },
}, },
} }
end
---------------------------
-- LAGACY HANDLER
---------------------------
function Pets:LegacySetPosition(unit, unitId)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
if (Gladdy.db.petGroup) then
if (unit == "arenapet1") then
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
else
local previousPet = "arenapet" .. string_gsub(unit, "arenapet", "") - 1
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", self.frames[previousPet], "BOTTOMLEFT", 0, - Gladdy.db.petMargin)
end
else
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
end
return Gladdy.db.newLayout
end end

View File

@ -6,7 +6,8 @@ local CreateFrame, UnitPower, UnitPowerType, UnitPowerMax, UnitExists = CreateFr
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists
local Powerbar = Gladdy:NewModule("Powerbar", 90, { local Powerbar = Gladdy:NewModule("Power Bar", 90, {
powerBarEnabled = true,
powerBarFont = "DorisPP", powerBarFont = "DorisPP",
powerBarHeight = 20, powerBarHeight = 20,
powerBarTexture = "Smooth", powerBarTexture = "Smooth",
@ -15,127 +16,120 @@ local Powerbar = Gladdy:NewModule("Powerbar", 90, {
powerBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, powerBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 }, powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 },
powerBarFontSize = 10, powerBarRaceFontSize = 10,
powerBarPowerFontSize = 10,
powerShowSpec = true, powerShowSpec = true,
powerShowRace = true, powerShowRace = true,
powerActual = true, powerActual = true,
powerMax = true, powerMax = true,
powerPercentage = false, powerPercentage = false,
powerFrameStrata = "MEDIUM",
powerFrameLevel = 1,
powerCustomTagsEnabled = false,
powerTextLeft = "[spec] [race]",
powerTextRight = "[current]/[max]",
powerTextLeftOutline = false,
powerTextRightOutline = false,
powerTextLeftVOffset = 1,
powerTextLeftHOffset = 5,
powerTextRightVOffset = 1,
powerTextRightHOffset = -5,
}) })
function Powerbar:Initialize() function Powerbar:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("ENEMY_SPOTTED") if Gladdy.db.powerBarEnabled then
self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_DESTROYED")
end
end
function Powerbar:UpdateFrameOnce()
if Gladdy.db.powerBarEnabled then
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_DESTROYED")
else
self:UnregisterAllMessages()
end
end end
function Powerbar:CreateFrame(unit) function Powerbar:CreateFrame(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
local powerBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local powerBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle), powerBar:EnableMouse(false)
powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"),
edgeSize = Gladdy.db.powerBarBorderSize }) edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a) powerBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.powerBarBorderColor))
powerBar:SetFrameLevel(1) powerBar:SetFrameStrata(Gladdy.db.powerFrameStrata)
powerBar:SetFrameLevel(Gladdy.db.powerFrameLevel)
powerBar.energy = CreateFrame("StatusBar", nil, powerBar) powerBar.energy = CreateFrame("StatusBar", nil, powerBar)
powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.energy:SetMinMaxValues(0, 100) powerBar.energy:SetMinMaxValues(0, 100)
powerBar.energy:SetFrameLevel(0) powerBar.energy:SetFrameStrata(Gladdy.db.powerFrameStrata)
powerBar.energy:SetFrameLevel(Gladdy.db.powerFrameLevel - 1)
powerBar.bg = powerBar.energy:CreateTexture(nil, "BACKGROUND") powerBar.bg = powerBar.energy:CreateTexture(nil, "BACKGROUND")
powerBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.bg:ClearAllPoints() powerBar.bg:ClearAllPoints()
powerBar.bg:SetAllPoints(powerBar.energy) powerBar.bg:SetAllPoints(powerBar.energy)
powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a) powerBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.powerBarBgColor))
powerBar.raceText = powerBar:CreateFontString(nil, "LOW") powerBar.raceText = powerBar:CreateFontString(nil, "LOW")
powerBar.raceText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarRaceFontSize, Gladdy.db.powerTextLeftOutline and "OUTLINE")
powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.raceText:SetShadowOffset(1, -1) powerBar.raceText:SetShadowOffset(1, -1)
powerBar.raceText:SetShadowColor(0, 0, 0, 1) powerBar.raceText:SetShadowColor(0, 0, 0, 1)
powerBar.raceText:SetJustifyH("CENTER") powerBar.raceText:SetJustifyH("CENTER")
powerBar.raceText:SetPoint("LEFT", 5, 1) powerBar.raceText:SetPoint("LEFT", Gladdy.db.powerTextLeftHOffset, Gladdy.db.powerTextLeftVOffset)
powerBar.powerText = powerBar:CreateFontString(nil, "LOW") powerBar.powerText = powerBar:CreateFontString(nil, "LOW")
powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarPowerFontSize, Gladdy.db.powerTextRightOutline and "OUTLINE")
powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) powerBar.powerText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.powerText:SetShadowOffset(1, -1) powerBar.powerText:SetShadowOffset(1, -1)
powerBar.powerText:SetShadowColor(0, 0, 0, 1) powerBar.powerText:SetShadowColor(0, 0, 0, 1)
powerBar.powerText:SetJustifyH("CENTER") powerBar.powerText:SetJustifyH("CENTER")
powerBar.powerText:SetPoint("RIGHT", -5, 1) powerBar.powerText:SetPoint("RIGHT", Gladdy.db.powerTextRightHOffset, Gladdy.db.powerTextRightVOffset)
button.powerBar = powerBar button.powerBar = powerBar
self.frames[unit] = powerBar self.frames[unit] = powerBar
self:ResetUnit(unit) self:ResetUnit(unit)
powerBar.unit = unit
powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit) powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit)
powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit) powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit)
powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit) powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit)
powerBar:SetScript("OnEvent", Powerbar.OnEvent) powerBar:SetScript("OnEvent", Powerbar.OnEvent)
end end
function Powerbar.OnEvent(powerBar, event, unit)
if event == "UNIT_POWER_UPDATE" then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
elseif event == "UNIT_MAXPOWER" then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
elseif event == "UNIT_DISPLAYPOWER" then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
end
end
function Powerbar:SetPower(powerBar, power, powerMax, powerType)
local powerPercentage = floor(power * 100 / powerMax)
local powerText
if (Gladdy.db.powerActual) then
powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power
end
if (Gladdy.db.powerMax) then
local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax
if (powerText) then
powerText = ("%s/%s"):format(powerText, text)
else
powerText = text
end
end
if (Gladdy.db.powerPercentage) then
if (powerText) then
powerText = ("%s (%d%%)"):format(powerText, powerPercentage)
else
powerText = ("%d%%"):format(powerPercentage)
end
end
if (powerType == 1) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
elseif (powerType == 3) then
powerBar.energy:SetStatusBarColor(1, 1, 0, 1)
else
powerBar.energy:SetStatusBarColor(.18, .44, .75, 1)
end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetMinMaxValues(0, powerMax)
powerBar.energy:SetValue(power)
end
function Powerbar:UpdateFrame(unit) function Powerbar:UpdateFrame(unit)
local powerBar = self.frames[unit] local powerBar = self.frames[unit]
if (not powerBar) then if (not powerBar) then
return return
end end
local healthBar = Gladdy.modules["Health Bar"].frames[unit]
local healthBar = Gladdy.modules.Healthbar.frames[unit] if not Gladdy.db.powerBarEnabled then
powerBar:Hide()
powerBar:UnregisterEvent("UNIT_POWER_UPDATE")
powerBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) powerBar:UnregisterEvent("UNIT_MAXPOWER")
powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a) powerBar:UnregisterEvent("UNIT_DISPLAYPOWER")
powerBar:SetScript("OnEvent", nil)
return
else
powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit)
powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit)
powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit)
powerBar:SetScript("OnEvent", Powerbar.OnEvent)
powerBar:Show()
end
powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.powerBarBgColor))
powerBar:SetWidth(healthBar:GetWidth()) powerBar:SetWidth(healthBar:GetWidth())
powerBar:SetHeight(Gladdy.db.powerBarHeight) powerBar:SetHeight(Gladdy.db.powerBarHeight)
@ -143,19 +137,100 @@ function Powerbar:UpdateFrame(unit)
powerBar:ClearAllPoints() powerBar:ClearAllPoints()
powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1) powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1)
powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle), powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"),
edgeSize = Gladdy.db.powerBarBorderSize }) edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a) powerBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.powerBarBorderColor))
powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.energy:ClearAllPoints() powerBar.energy:ClearAllPoints()
powerBar.energy:SetPoint("TOPLEFT", powerBar, "TOPLEFT", (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset)) powerBar.energy:SetPoint("TOPLEFT", powerBar, "TOPLEFT", (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset))
powerBar.energy:SetPoint("BOTTOMRIGHT", powerBar, "BOTTOMRIGHT", -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset)) powerBar.energy:SetPoint("BOTTOMRIGHT", powerBar, "BOTTOMRIGHT", -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset))
powerBar.raceText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarRaceFontSize, Gladdy.db.powerTextLeftOutline and "OUTLINE")
powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) powerBar.raceText:SetPoint("LEFT", Gladdy.db.powerTextLeftHOffset, Gladdy.db.powerTextLeftVOffset)
powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarPowerFontSize, Gladdy.db.powerTextRightOutline and "OUTLINE")
powerBar.powerText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.powerText:SetPoint("RIGHT", Gladdy.db.powerTextRightHOffset, Gladdy.db.powerTextRightVOffset)
powerBar:SetFrameStrata(Gladdy.db.powerFrameStrata)
powerBar:SetFrameLevel(Gladdy.db.powerFrameLevel)
powerBar.energy:SetFrameStrata(Gladdy.db.powerFrameStrata)
powerBar.energy:SetFrameLevel(Gladdy.db.powerFrameLevel - 1)
end
function Powerbar.OnEvent(powerBar, event, unit)
powerBar.energy.powerType = select(1, UnitPowerType(unit))
powerBar.energy.current, powerBar.energy.max = UnitPower(unit, powerBar.energy.powerType, true), UnitPowerMax(unit, powerBar.energy.powerType, true)
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType)
end
function Powerbar:SetText(unit, power, powerMax, status)
local button = Gladdy.buttons[unit]
if not Gladdy.buttons[unit] then
return
end
local powerBar = button.powerBar
if Gladdy.db.powerCustomTagsEnabled then
powerBar.powerText:SetText(Gladdy:SetTag(unit, Gladdy.db.powerTextRight, power, powerMax, status))
powerBar.raceText:SetText(Gladdy:SetTag(unit, Gladdy.db.powerTextLeft, power, powerMax, status))
else
if power then
local powerPercentage = floor(power * 100 / powerMax)
local powerText
if (Gladdy.db.powerActual) then
powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power
end
if (Gladdy.db.powerMax) then
local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax
if (powerText) then
powerText = ("%s/%s"):format(powerText, text)
else
powerText = text
end
end
if (Gladdy.db.powerPercentage) then
if (powerText) then
powerText = ("%s (%d%%)"):format(powerText, powerPercentage)
else
powerText = ("%d%%"):format(powerPercentage)
end
end
powerBar.powerText:SetText(powerText)
end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if (button.spec and Gladdy.db.powerShowSpec) then
raceText = button.spec .. " " .. raceText
end
powerBar.raceText:SetText(raceText)
end
end
function Powerbar:SetPower(powerBar, unit, power, powerMax, powerType, status)
Powerbar:SetText(unit, power, powerMax, status)
powerBar.energy.current = power
powerBar.energy.max = powerMax
powerBar.energy.powerType = powerType
if (powerType == 1 and powerBar.powerType ~= powerType) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
powerBar.powerColor = {r = 1, g = 0, b = 0}
powerBar.powerType = powerType
elseif (powerType == 3 and powerBar.powerType ~= powerType) then
powerBar.energy:SetStatusBarColor(1, 1, 0, 1)
powerBar.powerColor = {r = 1, g = 1, b = 0}
powerBar.powerType = powerType
elseif powerBar.powerType ~= powerType then
powerBar.energy:SetStatusBarColor(.18, .44, .75, 1)
powerBar.powerColor = {r = .18, g = .44, b = .75}
powerBar.powerType = powerType
end
powerBar.energy:SetMinMaxValues(0, powerMax)
powerBar.energy:SetValue(power)
end end
function Powerbar:ResetUnit(unit) function Powerbar:ResetUnit(unit)
@ -168,6 +243,8 @@ function Powerbar:ResetUnit(unit)
powerBar.raceText:SetText("") powerBar.raceText:SetText("")
powerBar.powerText:SetText("") powerBar.powerText:SetText("")
powerBar.energy:SetValue(0) powerBar.energy:SetValue(0)
powerBar.powerType = ""
powerBar.powerColor = {r = 1, g = 1, b = 1}
end end
function Powerbar:Test(unit) function Powerbar:Test(unit)
@ -177,8 +254,14 @@ function Powerbar:Test(unit)
return return
end end
powerBar.energy.current = button.power
powerBar.energy.max = button.powerMax
powerBar.energy.powerType = button.powerType
self:ENEMY_SPOTTED(unit) self:ENEMY_SPOTTED(unit)
self:UNIT_POWER(unit, button.power, button.powerMax, button.powerType) self:UNIT_POWER(unit, button.power, button.powerMax, button.powerType)
if unit == "arena1" then
self:UNIT_DEATH(unit)
end
end end
function Powerbar:ENEMY_SPOTTED(unit) function Powerbar:ENEMY_SPOTTED(unit)
@ -188,15 +271,10 @@ function Powerbar:ENEMY_SPOTTED(unit)
return return
end end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if (button.spec and Gladdy.db.powerShowSpec) then
raceText = button.spec .. " " .. raceText
end
powerBar.raceText:SetText(raceText)
if UnitExists(unit) then if UnitExists(unit) then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit)) powerBar.energy.powerType = select(1, UnitPowerType(unit))
powerBar.energy.current, powerBar.energy.max = UnitPower(unit, powerBar.energy.powerType, true), UnitPowerMax(unit, powerBar.energy.powerType, true)
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType)
end end
end end
@ -207,7 +285,9 @@ function Powerbar:UNIT_SPEC(unit, spec)
return return
end end
powerBar.raceText:SetText(spec .. " " .. button.raceLoc) if UnitExists(unit) then
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType)
end
end end
function Powerbar:UNIT_POWER(unit, power, powerMax, powerType) function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
@ -219,41 +299,7 @@ function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
if not Gladdy.buttons[unit].class then if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true) Gladdy:SpotEnemy(unit, true)
end end
Powerbar:SetPower(powerBar, unit, power, powerMax, powerType)
local powerPercentage = floor(power * 100 / powerMax)
local powerText
if (Gladdy.db.powerActual) then
powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power
end
if (Gladdy.db.powerMax) then
local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax
if (powerText) then
powerText = ("%s/%s"):format(powerText, text)
else
powerText = text
end
end
if (Gladdy.db.powerPercentage) then
if (powerText) then
powerText = ("%s (%d%%)"):format(powerText, powerPercentage)
else
powerText = ("%d%%"):format(powerPercentage)
end
end
if (powerType == 1) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
elseif (powerType == 3) then
powerBar.energy:SetStatusBarColor(1, 1, 0, 1)
else
powerBar.energy:SetStatusBarColor(.18, .44, .75, 1)
end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetValue(powerPercentage)
end end
function Powerbar:UNIT_DEATH(unit) function Powerbar:UNIT_DEATH(unit)
@ -261,9 +307,7 @@ function Powerbar:UNIT_DEATH(unit)
if (not powerBar) then if (not powerBar) then
return return
end end
Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["DEAD"])
powerBar.energy:SetValue(0)
powerBar.powerText:SetText("0%")
end end
function Powerbar:UNIT_DESTROYED(unit) function Powerbar:UNIT_DESTROYED(unit)
@ -271,8 +315,7 @@ function Powerbar:UNIT_DESTROYED(unit)
if (not powerBar) then if (not powerBar) then
return return
end end
powerBar.energy:SetValue(0) Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["LEAVE"])
powerBar.powerText:SetText("0%")
end end
local function option(params) local function option(params)
@ -284,12 +327,14 @@ local function option(params)
set = function(info, value) set = function(info, value)
local key = info.arg or info[#info] local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value Gladdy.dbi.profile[key] = value
Gladdy.options.args.Powerbar.args.group.args.border.args.powerBarBorderSize.max = Gladdy.db.powerBarHeight/2 Gladdy.options.args["Power Bar"].args.group.args.border.args.powerBarBorderSize.max = Gladdy.db.powerBarHeight/2
if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then
Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2 Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2
end end
for i=1,Gladdy.curBracket do if Gladdy.frame.testing then
Powerbar:Test("arena" .. i) for i=1,Gladdy.curBracket do
Powerbar:Test("arena" .. i)
end
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -309,11 +354,17 @@ function Powerbar:GetOptions()
name = L["Power Bar"], name = L["Power Bar"],
order = 2, order = 2,
}, },
powerBarEnabled = Gladdy:option({
type = "toggle",
name = L["Enabled"],
order = 3,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 3, order = 4,
disabled = function() return not Gladdy.db.powerBarEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -333,6 +384,7 @@ function Powerbar:GetOptions()
min = 0, min = 0,
max = 50, max = 50,
step = 1, step = 1,
width = "full",
}), }),
powerBarTexture = option({ powerBarTexture = option({
type = "select", type = "select",
@ -376,14 +428,83 @@ function Powerbar:GetOptions()
order = 12, order = 12,
hasAlpha = true, hasAlpha = true,
}), }),
powerBarFontSize = option({ powerTextLeftOutline = option({
type = "range", type = "toggle",
name = L["Font size"], name = L["Left Font Outline"],
desc = L["Size of the text"],
order = 13, order = 13,
width = "full",
}),
powerTextRightOutline = option({
type = "toggle",
name = L["Right Font Outline"],
order = 14,
width = "full",
}),
headerSize = {
type = "header",
name = L["Size"],
order = 20,
},
powerBarRaceFontSize = option({
type = "range",
name = L["Race font size"],
desc = L["Size of the race text"],
order = 21,
step = 0.1, step = 0.1,
min = 1, min = 0,
max = 20, max = 20,
width = "full",
}),
powerBarPowerFontSize = option({
type = "range",
name = L["Power font size"],
desc = L["Size of the power text"],
order = 22,
step = 0.1,
min = 0,
max = 20,
width = "full",
}),
headerOffsets = {
type = "header",
name = L["Offsets"],
order = 30,
},
powerTextLeftVOffset = option({
type = "range",
name = L["Left Text Vertical Offset"],
order = 31,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
powerTextLeftHOffset = option({
type = "range",
name = L["Left Text Horizontal Offset"],
order = 32,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
powerTextRightVOffset = option({
type = "range",
name = L["Right Text Vertical Offset"],
order = 33,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
powerTextRightHOffset = option({
type = "range",
name = L["Right Text Horizontal Offset"],
order = 34,
step = 0.1,
min = -200,
max = 200,
width = "full",
}), }),
}, },
}, },
@ -412,6 +533,7 @@ function Powerbar:GetOptions()
min = 0.5, min = 0.5,
max = Gladdy.db.powerBarHeight/2, max = Gladdy.db.powerBarHeight/2,
step = 0.5, step = 0.5,
width = "full",
}), }),
powerBarBorderColor = Gladdy:colorOption({ powerBarBorderColor = Gladdy:colorOption({
type = "color", type = "color",
@ -422,10 +544,39 @@ function Powerbar:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
powerFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
powerFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
powerValues = { powerValues = {
type = "group", type = "group",
name = L["Power Bar Text"], name = L["Power Bar Text"],
order = 4, order = 5,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -437,31 +588,44 @@ function Powerbar:GetOptions()
name = L["Show race"], name = L["Show race"],
desc = L["Show race"], desc = L["Show race"],
order = 2, order = 2,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerShowSpec= option({ powerShowSpec= option({
type = "toggle", type = "toggle",
name = L["Show spec"], name = L["Show spec"],
desc = L["Show spec"], desc = L["Show spec"],
order = 3, order = 3,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerActual = option({ powerActual = option({
type = "toggle", type = "toggle",
name = L["Show the actual power"], name = L["Show the actual power"],
desc = L["Show the actual power on the power bar"], desc = L["Show the actual power on the power bar"],
order = 31, order = 4,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerMax = option({ powerMax = option({
type = "toggle", type = "toggle",
name = L["Show max power"], name = L["Show max power"],
desc = L["Show max power on the power bar"], desc = L["Show max power on the power bar"],
order = 32, order = 5,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerPercentage = option({ powerPercentage = option({
type = "toggle", type = "toggle",
name = L["Show power percentage"], name = L["Show power percentage"],
desc = L["Show power percentage on the power bar"], desc = L["Show power percentage on the power bar"],
order = 33, order = 6,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
header = {
type = "header",
name = L["Custom Tags"],
order = 10,
},
powerCustomTagsEnabled = Gladdy:GetTagOption(L["Custom Tags Enabled"], 11, nil, option, true),
powerTextLeft = Gladdy:GetTagOption(L["Left Text"], 12, "powerCustomTagsEnabled", option),
powerTextRight = Gladdy:GetTagOption(L["Right Text"], 13, "powerCustomTagsEnabled", option),
}, },
}, },
}, },

View File

@ -1,36 +1,48 @@
local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber local ceil, str_gsub = ceil, string.gsub
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetTime = GetTime local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Racial = Gladdy:NewModule("Racial", nil, { local Racial = Gladdy:NewModule("Racial", 79, {
racialFont = "DorisPP", racialFont = "DorisPP",
racialFontScale = 1, racialFontScale = 1,
racialEnabled = true, racialEnabled = true,
racialSize = 60 + 20 + 1, racialSize = 60 + 20 + 1,
racialWidthFactor = 0.9, racialWidthFactor = 0.9,
racialAnchor = "trinket",
racialPos = "RIGHT",
racialXOffset = 0, racialXOffset = 0,
racialYOffset = 0, racialYOffset = 0,
racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
racialBorderColor = { r = 0, g = 0, b = 0, a = 1 }, racialBorderColor = { r = 0, g = 0, b = 0, a = 1 },
racialDisableCircle = false, racialDisableCircle = false,
racialCooldownAlpha = 1, racialCooldownAlpha = 1,
racialCooldownNumberAlpha = 1,
racialFrameStrata = "MEDIUM",
racialFrameLevel = 5,
racialGroup = false,
racialGroupDirection = "DOWN",
}) })
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
function Racial:Initialize() function Racial:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("JOINED_ARENA") if Gladdy.db.racialEnabled then
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("RACIAL_USED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED")
end
end
function Racial:UpdateFrameOnce()
if Gladdy.db.racialEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED")
else
self:UnregisterAllMessages()
end
end end
local function iconTimer(self,elapsed) local function iconTimer(self,elapsed)
@ -45,59 +57,60 @@ local function iconTimer(self,elapsed)
local timeLeft = ceil(self.timeLeft) local timeLeft = ceil(self.timeLeft)
if timeLeft >= 60 then if timeLeft >= 60 then
-- more than 1 minute self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.racialCooldownNumberAlpha)
self.cooldownFont:SetTextColor(1, 1, 0) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE")
self.cooldownFont:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60))) elseif timeLeft < 60 and timeLeft >= 30 then
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.racialCooldownNumberAlpha)
elseif timeLeft < 60 and timeLeft >= 21 then self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
-- between 60s and 21s (green) elseif timeLeft < 30 and timeLeft >= 11 then
self.cooldownFont:SetTextColor(0.7, 1, 0) self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.racialCooldownNumberAlpha)
self.cooldownFont:SetText(timeLeft) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") elseif timeLeft < 10 and timeLeft >= 5 then
elseif timeLeft < 20.9 and timeLeft >= 11 then self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.racialCooldownNumberAlpha)
-- between 20s and 11s (green) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
self.cooldownFont:SetTextColor(0, 1, 0)
self.cooldownFont:SetText(timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft <= 10 and timeLeft >= 5 then
-- between 10s and 5s (orange)
self.cooldownFont:SetTextColor(1, 0.7, 0)
self.cooldownFont:SetFormattedText("%.1f", timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then elseif timeLeft < 5 and timeLeft > 0 then
-- between 5s and 1s (red) self.cooldownFont:SetTextColor(1, 0, 0, Gladdy.db.racialCooldownNumberAlpha)
self.cooldownFont:SetTextColor(1, 0, 0) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
else
self.cooldownFont:SetText("")
end end
Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true)
end end
end end
function Racial:CreateFrame(unit) function Racial:CreateFrame(unit)
local racial = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit]) local racial = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit])
racial:EnableMouse(false)
racial:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial:SetFrameLevel(Gladdy.db.racialFrameLevel)
racial.texture = racial:CreateTexture(nil, "BACKGROUND") racial.texture = racial:CreateTexture(nil, "BACKGROUND")
racial.texture:SetAllPoints(racial) racial.texture:SetAllPoints(racial)
racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
--racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02") --racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate") racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate")
racial.cooldown.noCooldownCount = true --Gladdy.db.racialDisableOmniCC racial.cooldown.noCooldownCount = true --Gladdy.db.racialDisableOmniCC
racial.cooldown:SetHideCountdownNumbers(true) racial.cooldown:SetHideCountdownNumbers(true)
racial.cooldown:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldown:SetFrameLevel(Gladdy.db.racialFrameLevel + 1)
racial.cooldownFrame = CreateFrame("Frame", nil, racial) racial.cooldownFrame = CreateFrame("Frame", nil, racial)
racial.cooldownFrame:ClearAllPoints() racial.cooldownFrame:ClearAllPoints()
racial.cooldownFrame:SetPoint("TOPLEFT", racial, "TOPLEFT") racial.cooldownFrame:SetPoint("TOPLEFT", racial, "TOPLEFT")
racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT") racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT")
racial.cooldownFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldownFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 2)
racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY") racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY")
racial.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), 20, "OUTLINE") racial.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), 20, "OUTLINE")
--trinket.cooldownFont:SetAllPoints(trinket.cooldown) --trinket.cooldownFont:SetAllPoints(trinket.cooldown)
racial.cooldownFont:SetJustifyH("CENTER") racial.cooldownFont:SetJustifyH("CENTER")
racial.cooldownFont:SetPoint("CENTER") racial.cooldownFont:SetPoint("CENTER")
racial.borderFrame = CreateFrame("Frame", nil, racial) racial.borderFrame = CreateFrame("Frame", nil, racial)
racial.borderFrame:SetAllPoints(racial) racial.borderFrame:SetAllPoints(racial)
racial.borderFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.borderFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 3)
racial.texture.overlay = racial.borderFrame:CreateTexture(nil, "OVERLAY") racial.texture.overlay = racial.borderFrame:CreateTexture(nil, "OVERLAY")
racial.texture.overlay:SetAllPoints(racial) racial.texture.overlay:SetAllPoints(racial)
racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle)
@ -116,6 +129,15 @@ function Racial:UpdateFrame(unit)
local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize
racial:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial:SetFrameLevel(Gladdy.db.racialFrameLevel)
racial.cooldown:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldown:SetFrameLevel(Gladdy.db.racialFrameLevel + 1)
racial.cooldownFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldownFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 2)
racial.borderFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.borderFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 3)
racial:SetWidth(width) racial:SetWidth(width)
racial:SetHeight(height) racial:SetHeight(height)
racial.cooldown:SetWidth(width - width/16) racial.cooldown:SetWidth(width - width/16)
@ -129,19 +151,32 @@ function Racial:UpdateFrame(unit)
racial.texture:SetAllPoints(racial) racial.texture:SetAllPoints(racial)
racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle)
racial.texture.overlay:SetVertexColor(Gladdy.db.racialBorderColor.r, Gladdy.db.racialBorderColor.g, Gladdy.db.racialBorderColor.b, Gladdy.db.racialBorderColor.a) racial.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.racialBorderColor))
racial:ClearAllPoints() Gladdy:SetPosition(racial, unit, "racialXOffset", "racialYOffset", Racial:LegacySetPosition(racial, unit), Racial)
local margin = Gladdy.db.highlightBorderSize + Gladdy.db.padding
local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor] if (Gladdy.db.racialGroup) then
if (Gladdy.db.racialPos == "RIGHT") then if (unit ~= "arena1") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset) local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
elseif (Gladdy.db.racialPos == "LEFT") then self.frames[unit]:ClearAllPoints()
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, -Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset) if Gladdy.db.racialGroupDirection == "RIGHT" then
elseif (Gladdy.db.racialPos == "TOP") then self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, Gladdy.db.padding + Gladdy.db.racialYOffset) elseif Gladdy.db.racialGroupDirection == "LEFT" then
elseif (Gladdy.db.racialPos == "BOTTOM") then self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, -Gladdy.db.padding + Gladdy.db.racialYOffset) elseif Gladdy.db.racialGroupDirection == "UP" then
self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
elseif Gladdy.db.racialGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end
end
if (unit == "arena1") then
Gladdy:CreateMover(racial,"racialXOffset", "racialYOffset", L["Racial"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.racialSize * Gladdy.db.racialWidthFactor,
Gladdy.db.racialSize,
0, 0, "racialEnabled")
end end
if (Gladdy.db.racialEnabled == false) then if (Gladdy.db.racialEnabled == false) then
@ -152,7 +187,6 @@ function Racial:UpdateFrame(unit)
end end
function Racial:JOINED_ARENA() function Racial:JOINED_ARENA()
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE")
self:SetScript("OnEvent", function(self, event, ...) self:SetScript("OnEvent", function(self, event, ...)
if self[event] then if self[event] then
self[event](self, ...) self[event](self, ...)
@ -160,13 +194,17 @@ function Racial:JOINED_ARENA()
end) end)
end end
function Racial:RACIAL_USED(unit) function Racial:RACIAL_USED(unit, expirationTime, spellName)
local racial = self.frames[unit] local racial = self.frames[unit]
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if (not racial or not button or not button.race) then if (not racial or not button or not button.race) then
return return
end end
Racial:Used(unit, GetTime(), Gladdy:Racials()[button.race].duration) if expirationTime and Gladdy:Racials()[button.race].spellName ~= spellName then
return
end
local startTime = expirationTime or GetTime()
Racial:Used(unit, startTime, Gladdy:Racials()[button.race].duration)
end end
function Racial:Used(unit, startTime, duration) function Racial:Used(unit, startTime, duration)
@ -176,14 +214,14 @@ function Racial:Used(unit, startTime, duration)
end end
if not racial.active then if not racial.active then
racial.timeLeft = duration racial.timeLeft = duration
if not Gladdy.db.trinketDisableCircle then racial.cooldown:SetCooldown(startTime, duration) end if not Gladdy.db.racialDisableCircle then racial.cooldown:SetCooldown(startTime, duration) end
racial.active = true racial.active = true
end end
end end
function Racial:ENEMY_SPOTTED(unit) function Racial:ENEMY_SPOTTED(unit)
local racial = self.frames[unit] local racial = self.frames[unit]
if (not racial) then if (not racial or not Gladdy.buttons[unit].race) then
return return
end end
racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture) racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture)
@ -194,7 +232,7 @@ function Racial:ResetUnit(unit)
if (not racial) then if (not racial) then
return return
end end
racial.texture:SetTexture(nil)
racial.timeLeft = nil racial.timeLeft = nil
racial.active = false racial.active = false
racial.cooldown:Clear() racial.cooldown:Clear()
@ -221,11 +259,32 @@ function Racial:GetOptions()
desc = L["Enable racial icon"], desc = L["Enable racial icon"],
order = 3, order = 3,
}), }),
racialGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Racial"],
order = 4,
disabled = function() return not Gladdy.db.racialEnabled end,
}),
racialGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 5,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.racialGroup or not Gladdy.db.racialEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 4, order = 6,
disabled = function() return not Gladdy.db.racialEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -235,7 +294,7 @@ function Racial:GetOptions()
header = { header = {
type = "header", type = "header",
name = L["Size"], name = L["Size"],
order = 4, order = 1,
}, },
racialSize = Gladdy:option({ racialSize = Gladdy:option({
type = "range", type = "range",
@ -243,7 +302,8 @@ function Racial:GetOptions()
min = 5, min = 5,
max = 100, max = 100,
step = 1, step = 1,
order = 4, order = 2,
width = "full",
}), }),
racialWidthFactor = Gladdy:option({ racialWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -251,7 +311,8 @@ function Racial:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
order = 6, order = 3,
width = "full",
}), }),
}, },
}, },
@ -269,6 +330,7 @@ function Racial:GetOptions()
type = "toggle", type = "toggle",
name = L["No Cooldown Circle"], name = L["No Cooldown Circle"],
order = 7, order = 7,
width = "full",
}), }),
racialCooldownAlpha = Gladdy:option({ racialCooldownAlpha = Gladdy:option({
type = "range", type = "range",
@ -277,6 +339,16 @@ function Racial:GetOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
order = 8, order = 8,
width = "full",
}),
racialCooldownNumberAlpha = Gladdy:option({
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 9,
width = "full",
}), }),
}, },
}, },
@ -306,43 +378,20 @@ function Racial:GetOptions()
min = 0.1, min = 0.1,
max = 2, max = 2,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 4, order = 5,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Position"], name = L["Icon position"],
order = 4, order = 4,
}, },
racialAnchor = Gladdy:option({
type = "select",
name = L["Anchor"],
desc = L["This changes the anchor of the racial icon"],
order = 20,
values = {
["trinket"] = L["Trinket"],
["classIcon"] = L["Class Icon"],
["healthBar"] = L["Health Bar"],
["powerBar"] = L["Power Bar"],
},
}),
racialPos = Gladdy:option({
type = "select",
name = L["Position"],
desc = L["This changes position relative to its anchor of the racial icon"],
order = 21,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
},
}),
racialXOffset = Gladdy:option({ racialXOffset = Gladdy:option({
type = "range", type = "range",
name = L["Horizontal offset"], name = L["Horizontal offset"],
@ -350,6 +399,7 @@ function Racial:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
racialYOffset = Gladdy:option({ racialYOffset = Gladdy:option({
type = "range", type = "range",
@ -358,6 +408,7 @@ function Racial:GetOptions()
min = -400, min = -400,
max = 400, max = 400,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -386,7 +437,62 @@ function Racial:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
racialFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
racialFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end
---------------------------
-- LAGACY HANDLER
---------------------------
function Racial:LegacySetPosition(racial, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
racial:ClearAllPoints()
local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor]
if (Gladdy.db.racialPos == "RIGHT") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "LEFT") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, -Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "TOP") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, Gladdy.db.padding + Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "BOTTOM") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, -Gladdy.db.padding + Gladdy.db.racialYOffset)
end
return Gladdy.db.newLayout
end end

395
Modules/RangeCheck.lua Normal file
View File

@ -0,0 +1,395 @@
local UnitIsConnected = UnitIsConnected
local UnitInPhase = UnitInPhase
local UnitInRaid = UnitInRaid
local UnitInParty = UnitInParty
local UnitInRange = UnitInRange
local CheckInteractDistance = CheckInteractDistance
local C_Timer = C_Timer
local UnitIsUnit = UnitIsUnit
local UnitClass = UnitClass
local GetSpellInfo = GetSpellInfo
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
local select, ipairs, type, tonumber, tostring, format = select, ipairs, type, tonumber, tostring, format
local LibStub = LibStub
local Gladdy = LibStub("Gladdy")
local LSR = LibStub("SpellRange-1.0")
local L = Gladdy.L
local HealthBar = Gladdy.modules["Health Bar"]
local classSpells = {
["MAGE"] = 118,
["PRIEST"] = 32379,
["DRUID"] = 33786,
["SHAMAN"] = 10414,
["PALADIN"] = 10308,
["WARLOCK"] = 5782,
["WARRIOR"] = 25275,
["HUNTER"] = 27018,
["ROGUE"] = 36554,
}
local function defaultSpells()
local defaults = {}
for _,class in ipairs(Gladdy.CLASSES) do
defaults[class] = { min = classSpells[class] }
end
return defaults
end
local RangeCheck = Gladdy:NewModule("Range Check", nil, {
rangeCheckEnabled = true,
rangeCheckDefaultSpells = defaultSpells(),
rangeCheckOorFactor = 1.5,
rangeCheckHealthBar = true,
rangeCheckHealthBarText = true,
rangeCheckPowerBar = true,
rangeCheckPowerBarText = true,
rangeCheckClassIcon = false,
rangeCheckTrinket = false,
rangeCheckRacial = false,
})
function RangeCheck:Initialize()
if Gladdy.db.rangeCheckEnabled then
self:RegisterMessage("JOINED_ARENA")
end
self.playerClass = select(2, UnitClass("player"))
end
function RangeCheck:UpdateFrameOnce()
if Gladdy.db.rangeCheckEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function RangeCheck:Reset()
self.test = nil
end
function RangeCheck:ResetUnit(unit)
local button = Gladdy.buttons[unit]
self:CancelTimer(button)
self:SetColor(button, 1)
end
function RangeCheck:Test(unit)
local button = Gladdy.buttons[unit]
if not button then
return
end
self.test = true
button.lastState = 0
if Gladdy.db.rangeCheckEnabled then
if unit == "arena2" or unit == "arena4" then
--button.unit = "target"
--self:CreateTimer(button)
self:SetRangeAlpha(button, nil)
else
self:SetRangeAlpha(button, true)
end
else
self:SetRangeAlpha(button, true)
end
end
function RangeCheck:UpdateFrame(unit)
if self.test then
self:Test(unit)
end
end
function RangeCheck:SetColor(button, oorFac)
if button.lastState == oorFac then
return
end
if Gladdy.db.rangeCheckHealthBar then
button.healthBar.hp.oorFactor = oorFac
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max)
else
button.healthBar.hp.oorFactor = 1
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max)
end
if Gladdy.db.rangeCheckHealthBarText then
button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
else
button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
end
if Gladdy.db.rangeCheckPowerBar then
button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r/oorFac, button.powerBar.powerColor.g/oorFac, button.powerBar.powerColor.b/oorFac, 1)
else
button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r, button.powerBar.powerColor.g, button.powerBar.powerColor.b, 1)
end
if Gladdy.db.rangeCheckPowerBarText then
button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
else
button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
end
if Gladdy.db.rangeCheckTrinket then
button.trinket.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
else
button.trinket.texture:SetVertexColor(1, 1, 1)
end
if Gladdy.db.rangeCheckClassIcon then
button.classIcon.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
button.aura.icon:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
else
button.classIcon.texture:SetVertexColor(1, 1, 1)
button.aura.icon:SetVertexColor(1, 1, 1)
end
if Gladdy.db.rangeCheckRacial then
button.racial.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
else
button.racial.texture:SetVertexColor(1, 1, 1)
end
button.lastState = oorFac
end
function RangeCheck:SetRangeAlpha(button, inRange)
local oorFac = Gladdy.db.rangeCheckOorFactor
if inRange then
RangeCheck:SetColor(button, 1)
else
RangeCheck:SetColor(button, oorFac)
end
end
function RangeCheck:JOINED_ARENA()
self.test = nil
if Gladdy.db.rangeCheckEnabled then
for i = 1, Gladdy.curBracket do
local button = Gladdy.buttons["arena"..i]
--if i == 1 then button.unit = "focus" end
self:CreateTimer(button)
end
end
end
function RangeCheck.CheckRange(self)
local button = self.parent
local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min
if (not UnitIsConnected(button.unit) or not UnitInPhase(button.unit)) then
RangeCheck:SetRangeAlpha(button, false)
elseif (spell) then
RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1)
-- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally
elseif (UnitInRaid(button.unit) or UnitInParty(button.unit)) then
RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player"))
-- Nope, fall back to interaction :(
else
RangeCheck:SetRangeAlpha(button, CheckInteractDistance(button.unit, 4))
end
end
function RangeCheck:CreateTimer(frame)
if not frame.range then
frame.range = C_Timer.NewTicker(0.05, RangeCheck.CheckRange)
frame.range.parent = frame
end
end
function RangeCheck:CancelTimer(frame)
if frame.range then
frame.range:Cancel()
frame.range = nil
end
end
function RangeCheck:ForceUpdate(frame)
if( UnitIsUnit(frame.unit, "player") ) then
frame.healthBar:SetAlpha(1)
frame.powerBar:SetAlpha(1)
self:CancelTimer(frame)
else
self:CreateTimer(frame)
self.CheckRange(frame.parent)
end
end
function RangeCheck:GetOptions()
return {
header = {
type = "header",
name = L["Range Check"],
order = 2,
},
rangeCheckEnabled = Gladdy:option({
type = "toggle",
name = L["Enabled"],
desc = L["Enable racial icon"],
order = 3,
}),
group = {
type = "group",
childGroups = "tree",
name = L["General"],
order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = {
general = {
type = "group",
name = L["General"],
order = 1,
args = {
header = {
type = "header",
name = L["General"],
order = 1,
},
rangeCheckOorFactor = Gladdy:option({
type = "range",
name = L["Out of Range Darkening Level"],
desc = L["Higher is darker"],
min = 1.1,
max = 5,
step = 0.1,
width = "full",
order = 2,
}),
rangeCheckHealthBar = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Health Bar"],
width = "full",
order = 3,
}),
rangeCheckHealthBarText = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Health Bar Text"],
width = "full",
order = 4,
}),
rangeCheckPowerBar = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Power Bar"],
width = "full",
order = 5,
}),
rangeCheckPowerBarText = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Power Bar Text"],
width = "full",
order = 6,
}),
rangeCheckClassIcon = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Class Icon"],
width = "full",
order = 7,
}),
rangeCheckTrinket = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Trinket"],
width = "full",
order = 8,
}),
rangeCheckRacial = Gladdy:option({
type = "toggle",
name = L["Fade"] .. " " .. L["Racial"],
width = "full",
order = 9,
}),
},
},
},
},
oorSpells = {
type = "group",
childGroups = "tree",
name = L["Spells"],
order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = RangeCheck:GetSpells(),
},
}
end
function RangeCheck:GetSpells()
local group = {
description = {
type = "description",
name = L["Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066."],
order = 1,
},
}
for i,class in ipairs(Gladdy.CLASSES) do
group[class] = {
type = "group",
name = LOCALIZED_CLASS_NAMES_MALE[class],
order = i + 1,
icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes",
iconCoords = CLASS_ICON_TCOORDS[class],
args = {
headerMin = {
type = "header",
name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
or "nil",
order = 1,
},
min = {
type = "input",
name = "Spell ID", --format("|T%s:20|t %s", select(3, GetSpellInfo(k)), select(1, GetSpellInfo(k)))
order = 2,
width = "full",
pattern = "%d+",
validate = function(_, value)
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
return type(tonumber(value)) == "number"
end,
--image = select(3, GetSpellInfo(defaultSpells()[class].min)),
get = function(_)
return tostring(Gladdy.db.rangeCheckDefaultSpells[class].min)
end,
set = function(_, value)
Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value)
--Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.min.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
-- or "nil"
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
or "nil"
end
},
--[[headerMax = {
type = "header",
name = L["Max"],
order = 3,
},
max = {
type = "input",
name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
or "nil",
order = 4,
width = "full",
pattern = "%d+",
validate = function(_, value)
return type(tonumber(value)) == "number"
end,
--image = select(3, GetSpellInfo(defaultSpells()[class].max)),
get = function(_)
return tostring(Gladdy.db.rangeCheckDefaultSpells[class].max)
end,
set = function(_, value)
Gladdy.db.rangeCheckDefaultSpells[class].max = tonumber(value)
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.max.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
or "nil"
end
}--]]
}
}
end
return group
end

View File

@ -0,0 +1,447 @@
local floor, str_find, pairs = math.floor, string.find, pairs
local CreateFrame = CreateFrame
---------------------------
-- CORE
---------------------------
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local ShadowsightTimer = Gladdy:NewModule("Shadowsight Timer", nil, {
shadowsightTimerEnabled = true,
shadowsightTimerLocked = false,
shadowsightTimerScale = 1,
shadowsightTimerRelPoint1 = "CENTER",
shadowsightTimerRelPoint2 = "CENTER",
shadowsightTimerX = 0,
shadowsightTimerY = 0,
shadowsightAnnounce = true,
shadowsightTimerStartTime = 91,
shadowsightTimerResetTime = 120,
shadowsightTimerShowTwoTimer = false,
shadowsightTimerFrameStrata = "HIGH",
shadowsightTimerFrameLevel = 20,
})
-- /run LibStub("Gladdy").modules["Shadowsight Timer"]:AURA_GAIN(nil, nil, 34709)
-- /run LibStub("Gladdy").modules["Shadowsight Timer"].timerFrame1:SetAlpha(0)
function ShadowsightTimer:OnEvent(event, ...)
self[event](self, ...)
end
function ShadowsightTimer:Initialize()
self.locale = Gladdy:GetArenaTimer()
self:CreateAnchor()
if Gladdy.db.shadowsightTimerEnabled then
self:RegisterMessage("JOINED_ARENA")
end
end
function ShadowsightTimer:Reset()
self.anchor:Hide()
for i=1,2 do
self["timerFrame" .. i].active = false
self["timerFrame" .. i]:SetScript("OnUpdate", nil)
self["timerFrame" .. i].font:SetTextColor(1, 0.8, 0)
end
self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnEvent", nil)
end
---------------------------
-- FRAME SETUP
---------------------------
function ShadowsightTimer:CreateTimerFrame(anchor, name, points)
local backdrop = {
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "",
tile = true, tileSize = 16, edgeSize = 10,
insets = {left = 0, right = 0, top = 0, bottom = 0}
}
self[name] = CreateFrame("Frame", nil, anchor, BackdropTemplateMixin and "BackdropTemplate")
self[name]:SetPoint(points[1], anchor, points[2])
self[name]:SetBackdrop(backdrop)
self[name]:SetBackdropColor(0,0,0,0.8)
self[name]:SetHeight(17)
self[name]:SetWidth(35)
self[name].texture = self[name]:CreateTexture(nil,"OVERLAY")
self[name].texture:SetWidth(16)
self[name].texture:SetHeight(16)
self[name].texture:SetTexture("Interface\\Icons\\Spell_Shadow_EvilEye")
self[name].texture:SetTexCoord(0.125,0.875,0.125,0.875)
self[name].texture:SetPoint("RIGHT", self[name], "LEFT")
self[name].font = self[name]:CreateFontString(nil,"OVERLAY","GameFontNormal")
self[name].font:SetPoint("LEFT", 5, 0)
self[name].font:SetJustifyH("LEFT")
self[name].font:SetTextColor(1, 0.8, 0)
self[name]:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self[name]:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
end
function ShadowsightTimer:CreateAnchor()
self.anchor = CreateFrame("Frame")
self.anchor:SetMovable(true)
self.anchor:EnableMouse(true)
self.anchor:SetWidth(35)
self.anchor:SetHeight(17)
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
self.anchor:SetScript("OnMouseDown",function(self) self:StartMoving() end)
self.anchor:SetScript("OnMouseUp",function(self)
self:StopMovingOrSizing()
Gladdy.db.shadowsightTimerRelPoint1,_,Gladdy.db.shadowsightTimerRelPoint2,Gladdy.db.shadowsightTimerX,Gladdy.db.shadowsightTimerY = self:GetPoint()
end)
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:Hide()
self:CreateTimerFrame(self.anchor, "timerFrame1", {"TOP", "TOP"})
local show = Gladdy.db.shadowsightTimerShowTwoTimer
self:CreateTimerFrame(show and self.timerFrame1 or self.anchor, "timerFrame2", show and {"TOP", "BOTTOM"} or {"TOP", "TOP"})
end
function ShadowsightTimer:UpdateFrameOnce()
if Gladdy.db.shadowsightTimerEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
self.anchor:EnableMouse(not Gladdy.db.shadowsightTimerLocked)
self.anchor:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.anchor:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
self.timerFrame1:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.timerFrame1:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
self.timerFrame2:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.timerFrame2:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
if Gladdy.db.shadowsightTimerEnabled then
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:ClearAllPoints()
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint2, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
if Gladdy.frame.testing or Gladdy.curBracket then
self.anchor:Show()
end
if Gladdy.db.shadowsightTimerShowTwoTimer then
self.anchor:SetHeight(34)
self.timerFrame2:ClearAllPoints()
self.timerFrame2:SetPoint("TOP", self.timerFrame1, "BOTTOM")
ShadowsightTimer:NotifyStart()
else
self.anchor:SetHeight(17)
self.timerFrame2:ClearAllPoints()
self.timerFrame2:SetPoint("TOP", self.anchor, "TOP")
ShadowsightTimer:NotifyStart()
end
else
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:ClearAllPoints()
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint2, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
self.anchor:Hide()
end
end
---------------------------
-- EVENT HANDLING
---------------------------
function ShadowsightTimer:JOINED_ARENA()
if Gladdy.db.shadowsightTimerEnabled then
self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnEvent", ShadowsightTimer.OnEvent)
for i=1,2 do
self["timerFrame" .. i].font:SetText("1:30")
self["timerFrame" .. i].font:SetTextColor(1, 0.8, 0)
end
self.anchor:Show()
end
end
function ShadowsightTimer:AURA_GAIN(unit, auraType, spellID)
if (spellID == 34709 and Gladdy.db.shadowsightTimerEnabled) then
self:Start(Gladdy.db.shadowsightTimerResetTime, self:GetHiddenTimer())
end
end
function ShadowsightTimer:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
for k,v in pairs(self.locale) do
if str_find(msg, v) then
if k == 0 then
self:Start(nil, self.timerFrame1)
self:Start(nil, self.timerFrame2)
end
end
end
end
---------------------------
-- TEST
---------------------------
function ShadowsightTimer:Test()
if Gladdy.db.shadowsightTimerEnabled then
self.anchor:Show()
ShadowsightTimer:JOINED_ARENA()
self:Start(20, self.timerFrame1)
self:Start(25, self.timerFrame2)
end
end
---------------------------
-- TIMER
---------------------------
function ShadowsightTimer:Start(time, frame)
frame.endTime = time or Gladdy.db.shadowsightTimerStartTime
frame.active = true
ShadowsightTimer:NotifyStart()
frame.announced = nil
frame.timeSinceLastUpdate = 0
frame.font:SetTextColor(1, 0.8, 0)
frame:SetScript("OnUpdate", ShadowsightTimer.OnUpdate)
end
function ShadowsightTimer.OnUpdate(self, elapsed)
self.timeSinceLastUpdate = self.timeSinceLastUpdate + elapsed;
self.endTime = self.endTime - elapsed
if (self.timeSinceLastUpdate > 0.01) then
self.font:SetFormattedText(floor(self.endTime / 60) .. ":" .. "%02d", self.endTime - floor(self.endTime / 60) * 60)
self.timeSinceLastUpdate = 0;
if floor(self.endTime) == 15 and Gladdy.db.shadowsightAnnounce and not self.announced then
self.announced = true
Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up in %ds"]:format(15))
end
end
if self.endTime <= 0 then
if Gladdy.db.shadowsightAnnounce then
Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up!"])
end
self:SetScript("OnUpdate", nil)
self.font:SetText("0:00")
self.font:SetTextColor(0, 1, 0)
self.active = false
ShadowsightTimer:NotifyEnd()
end
end
function ShadowsightTimer:NotifyStart()
local show = Gladdy.db.shadowsightTimerShowTwoTimer
if self.timerFrame1.active and self.timerFrame2.active then
if self.timerFrame1.endTime < self.timerFrame2.endTime then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
else
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
end
else
if self.timerFrame1.active then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
elseif self.timerFrame2.active then
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
else
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
end
end
end
function ShadowsightTimer:NotifyEnd()
local show = Gladdy.db.shadowsightTimerShowTwoTimer
if self.timerFrame1.active then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
elseif self.timerFrame2.active then
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
else
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
end
end
function ShadowsightTimer:GetHiddenTimer()
if self.timerFrame1.active and self.timerFrame2.active then
return self.timerFrame1.endTime < self.timerFrame2.endTime and self.timerFrame1 or self.timerFrame2
else
return self.timerFrame1.active and self.timerFrame2 or self.timerFrame1
end
end
---------------------------
-- OPTIONS
---------------------------
function ShadowsightTimer:GetOptions()
return {
headerShadowsight = {
type = "header",
name = L["Shadowsight Timer"],
order = 2,
},
shadowsightTimerEnabled = Gladdy:option({
type = "toggle",
name = L["Enabled"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 3,
}),
shadowsightTimerLocked = Gladdy:option({
type = "toggle",
name = L["Locked"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 4,
disabled = function() return not Gladdy.db.shadowsightTimerEnabled end,
}),
shadowsightTimerShowTwoTimer = Gladdy:option({
type = "toggle",
name = L["Show two timers"],
order = 5,
disabled = function() return not Gladdy.db.shadowsightTimerEnabled end,
}),
shadowsightAnnounce = Gladdy:option({
type = "toggle",
name = L["Announce"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 6,
disabled = function() return not Gladdy.db.shadowsightTimerEnabled end,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 7,
disabled = function() return not Gladdy.db.shadowsightTimerEnabled end,
args = {
general = {
type = "group",
name = L["Scale"],
order = 1,
args = {
header = {
type = "header",
name = L["Scale"],
order = 1,
},
shadowsightTimerScale = Gladdy:option({
type = "range",
name = L["Scale"],
order = 2,
min = 0.1,
max = 5,
step = 0.1,
width = "full",
}),
},
},
cooldown = {
type = "group",
name = L["Cooldown"],
order = 2,
args = {
header = {
type = "header",
name = L["Shadowsight CDs"],
order = 1,
},
shadowsightTimerStartTime = Gladdy:option({
type = "range",
name = L["Start Time"],
desc = L["Start time in seconds"],
min = 80,
max = 100,
order = 2,
step = 0.1,
width = "full",
}),
shadowsightTimerResetTime = Gladdy:option({
type = "range",
name = L["Reset Time"],
desc = L["Reset time in seconds"],
min = 110,
max = 130,
order = 3,
step = 0.1,
width = "full",
}),
},
},
--[[font = {
type = "group",
name = L["Font"],
order = 3,
args = {
header = {
type = "header",
name = L["Font"],
order = 4,
},
racialFont = Gladdy:option({
type = "select",
name = L["Font"],
desc = L["Font of the cooldown"],
order = 11,
dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font,
}),
racialFontScale = Gladdy:option({
type = "range",
name = L["Font scale"],
desc = L["Scale of the font"],
order = 12,
min = 0.1,
max = 2,
step = 0.1,
width = "full",
}),
},
},--]]
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
shadowsightTimerFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
shadowsightTimerFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
},
},
}
end

View File

@ -1,128 +1,41 @@
local select, pairs, string_lower, tremove, tinsert, format, string_gsub, ipairs = select, pairs, string.lower, tremove, tinsert, format, string.gsub, ipairs local select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs = select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs
local UnitExists, UnitIsUnit, UnitName, UnitIsEnemy = UnitExists, UnitIsUnit, UnitName, UnitIsEnemy local UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID = UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID
local C_NamePlate = C_NamePlate local C_NamePlate = C_NamePlate
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local GetSpellInfo, CreateFrame, GetCVar = GetSpellInfo, CreateFrame, GetCVar local GetSpellInfo, CreateFrame = GetSpellInfo, CreateFrame
local totemData, npcIdToTotemData = Gladdy:GetTotemData()
--------------------------------------------------- ---------------------------------------------------
-- Constants -- Option Helpers
--------------------------------------------------- ---------------------------------------------------
local totemData = {
-- Fire
[string_lower("Searing Totem")] = {id = 3599,texture = select(3, GetSpellInfo(3599)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Searing Totem
[string_lower("Flametongue Totem")] = {id = 8227,texture = select(3, GetSpellInfo(8227)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Flametongue Totem
[string_lower("Magma Totem")] = {id = 8190,texture = select(3, GetSpellInfo(8190)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Magma Totem
[string_lower("Fire Nova Totem")] = {id = 1535,texture = select(3, GetSpellInfo(1535)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Fire Nova Totem
[string_lower("Totem of Wrath")] = {id = 30706,texture = select(3, GetSpellInfo(30706)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 1}, -- Totem of Wrath
[string_lower("Fire Elemental Totem")] = {id = 32982,texture = select(3, GetSpellInfo(32982)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Fire Elemental Totem
[string_lower("Frost Resistance Totem")] = {id = 8181,texture = select(3, GetSpellInfo(8181)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Frost Resistance Totem
-- Water
[string_lower("Fire Resistance Totem")] = {id = 8184,texture = select(3, GetSpellInfo(8184)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Fire Resistance Totem
[string_lower("Poison Cleansing Totem")] = {id = 8166,texture = select(3, GetSpellInfo(8166)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Poison Cleansing Totem
[string_lower("Disease Cleansing Totem")] = {id = 8170,texture = select(3, GetSpellInfo(8170)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Disease Cleansing Totem
[string_lower("Healing Stream Totem")] = {id = 5394,texture = select(3, GetSpellInfo(5394)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Healing Stream Totem
[string_lower("Mana Tide Totem")] = {id = 16190,texture = select(3, GetSpellInfo(16190)), color = {r = 0.078, g = 0.9, b = 0.16, a = 1}, enabled = true, priority = 3}, -- Mana Tide Totem
[string_lower("Mana Spring Totem")] = {id = 5675,texture = "Interface\\AddOns\\Gladdy\\Images\\Totems\\Spell_Nature_ManaRegenTotem_edit", color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 1}, -- Mana Spring Totem
-- Earth
[string_lower("Earthbind Totem")] = {id = 2484,texture = select(3, GetSpellInfo(2484)), color = {r = 0.5, g = 0.5, b = 0.5, a = 1}, enabled = true, priority = 1}, -- Earthbind Totem
[string_lower("Stoneclaw Totem")] = {id = 5730,texture = select(3, GetSpellInfo(5730)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Stoneclaw Totem
[string_lower("Stoneskin Totem")] = {id = 8071,texture = select(3, GetSpellInfo(8071)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Stoneskin Totem
[string_lower("Strength of Earth Totem")] = {id = 8075,texture = select(3, GetSpellInfo(8075)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Strength of Earth Totem
[string_lower("Earth Elemental Totem")] = {id = 33663,texture = select(3, GetSpellInfo(33663)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Earth Elemental Totem
[string_lower("Tremor Totem")] = {id = 8143,texture = select(3, GetSpellInfo(8143)), color = {r = 1, g = 0.9, b = 0.1, a = 1}, enabled = true, priority = 3}, -- Tremor Totem
-- Air
[string_lower("Grounding Totem")] = {id = 8177,texture = select(3, GetSpellInfo(8177)), color = {r = 0, g = 0.53, b = 0.92, a = 1}, enabled = true, priority = 3}, -- Grounding Totem
[string_lower("Grace of Air Totem")] = {id = 8835,texture = "Interface\\AddOns\\Gladdy\\Images\\Totems\\Spell_Nature_InvisibilityTotem_edit", color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Grace of Air Totem
[string_lower("Nature Resistance Totem")] = {id = 10595,texture = select(3, GetSpellInfo(10595)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Nature Resistance Totem
[string_lower("Windfury Totem")] = {id = 8512,texture = "Interface\\AddOns\\Gladdy\\Images\\Totems\\Spell_Nature_Windfury_edit", color = {r = 0.96, g = 0, b = 0.07, a = 1}, enabled = true, priority = 2}, -- Windfury Totem
[string_lower("Sentry Totem")] = {id = 6495, texture = "Interface\\AddOns\\Gladdy\\Images\\Totems\\Spell_Nature_RemoveCurse_edit", color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Sentry Totem
[string_lower("Windwall Totem")] = {id = 15107,texture = select(3, GetSpellInfo(15107)), color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Windwall Totem
[string_lower("Wrath of Air Totem")] = {id = 3738,texture = "Interface\\AddOns\\Gladdy\\Images\\Totems\\Spell_Nature_SlowingTotem_edit", color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Wrath of Air Totem
[string_lower("Tranquil Air Totem")] = {id = 25908,texture = "Interface\\Icons\\INV_Staff_07", color = {r = 0, g = 0, b = 0, a = 1}, enabled = true, priority = 0}, -- Tranquil Air Totem
}
local localizedTotemData = {
["default"] = {
[string_lower(select(1, GetSpellInfo(3599)))] = totemData[string_lower("Searing Totem")], -- Searing Totem
[string_lower(select(1, GetSpellInfo(8227)))] = totemData[string_lower("Flametongue Totem")], -- Flametongue Totem
[string_lower(select(1, GetSpellInfo(8190)))] = totemData[string_lower("Magma Totem")], -- Magma Totem
[string_lower(select(1, GetSpellInfo(1535)))] = totemData[string_lower("Fire Nova Totem")], -- Fire Nova Totem
[string_lower(select(1, GetSpellInfo(30706)))] = totemData[string_lower("Totem of Wrath")], -- Totem of Wrath
[string_lower(select(1, GetSpellInfo(32982)))] = totemData[string_lower("Fire Elemental Totem")], -- Fire Elemental Totem
[string_lower(select(1, GetSpellInfo(8181)))] = totemData[string_lower("Frost Resistance Totem")], -- Frost Resistance Totem
-- Water
[string_lower(select(1, GetSpellInfo(8184)))] = totemData[string_lower("Fire Resistance Totem")], -- Fire Resistance Totem
[string_lower(select(1, GetSpellInfo(8166)))] = totemData[string_lower("Poison Cleansing Totem")], -- Poison Cleansing Totem
[string_lower(select(1, GetSpellInfo(8170)))] = totemData[string_lower("Disease Cleansing Totem")], -- Disease Cleansing Totem
[string_lower(select(1, GetSpellInfo(5394)))] = totemData[string_lower("Healing Stream Totem")], -- Healing Stream Totem
[string_lower(select(1, GetSpellInfo(16190)))] = totemData[string_lower("Mana Tide Totem")], -- Mana Tide Totem
[string_lower(select(1, GetSpellInfo(5675)))] = totemData[string_lower("Mana Spring Totem")], -- Mana Spring Totem
-- Earth
[string_lower(select(1, GetSpellInfo(2484)))] = totemData[string_lower("Earthbind Totem")], -- Earthbind Totem
[string_lower(select(1, GetSpellInfo(5730)))] = totemData[string_lower("Stoneclaw Totem")], -- Stoneclaw Totem
[string_lower(select(1, GetSpellInfo(8071)))] = totemData[string_lower("Stoneskin Totem")], -- Stoneskin Totem
[string_lower(select(1, GetSpellInfo(8075)))] = totemData[string_lower("Strength of Earth Totem")], -- Strength of Earth Totem
[string_lower(select(1, GetSpellInfo(33663)))] = totemData[string_lower("Earth Elemental Totem")], -- Earth Elemental Totem
[string_lower(select(1, GetSpellInfo(8143)))] = totemData[string_lower("Tremor Totem")], -- Tremor Totem
-- Air
[string_lower(select(1, GetSpellInfo(8177)))] = totemData[string_lower("Grounding Totem")], -- Grounding Totem
[string_lower(select(1, GetSpellInfo(8835)))] = totemData[string_lower("Grace of Air Totem")], -- Grace of Air Totem
[string_lower(select(1, GetSpellInfo(10595)))] = totemData[string_lower("Nature Resistance Totem")], -- Nature Resistance Totem
[string_lower(select(1, GetSpellInfo(8512)))] = totemData[string_lower("Windfury Totem")], -- Windfury Totem
[string_lower(select(1, GetSpellInfo(6495)))] = totemData[string_lower("Sentry Totem")], -- Sentry Totem
[string_lower(select(1, GetSpellInfo(15107)))] = totemData[string_lower("Windwall Totem")], -- Windwall Totem
[string_lower(select(1, GetSpellInfo(3738)))] = totemData[string_lower("Wrath of Air Totem")], -- Wrath of Air Totem
[string_lower(select(1, GetSpellInfo(25908)))] = totemData[string_lower("Tranquil Air Totem")], -- Tranquil Air Totem
},
["frFR"] = {
[string_lower("Totem incendiaire")] = totemData[string_lower("Searing Totem")],
[string_lower("Totem Langue de feu")] = totemData[string_lower("Flametongue Totem")],
[string_lower("Totem de lien terrestre")] = totemData[string_lower("Earthbind Totem")],
[string_lower("Totem de Griffes de pierre")] = totemData[string_lower("Stoneclaw Totem")],
[string_lower("Totem Nova de feu")] = totemData[string_lower("Fire Nova Totem")],
[string_lower("Totem de Magma")] = totemData[string_lower("Magma Totem")],
[string_lower("Totem de courroux")] = totemData[string_lower("Totem of Wrath")],
[string_lower("Totem d'\195\169lementaire de feu")] = totemData[string_lower("Fire Elemental Totem")],
[string_lower("Totem d'\195\169l\195\169mentaire de feu")] = totemData[string_lower("Fire Elemental Totem")],
[string_lower("Totem de Peau de pierre")] = totemData[string_lower("Stoneskin Totem")],
[string_lower("Totem d'\195\169lementaire de terre")] = totemData[string_lower("Earth Elemental Totem")],
[string_lower("Totem d'\195\169l\195\169mentaire de terre")] = totemData[string_lower("Earth Elemental Totem")],
[string_lower("Totem de Force de la Terre")] = totemData[string_lower("Strength of Earth Totem")],
[string_lower("Totem de r\195\169sistance au Givre")] = totemData[string_lower("Frost Resistance Totem")],
[string_lower("Totem de r\195\169sistance au Feu")] = totemData[string_lower("Fire Resistance Totem")],
[string_lower("Totem de Gl\195\168be")] = totemData[string_lower("Grounding Totem")],
[string_lower("Totem de Gr\195\162ce a\195\169rienne")] = totemData[string_lower("Grace of Air Totem")],
[string_lower("Totem de R\195\169sistance \195\160 la Nature")] = totemData[string_lower("Nature Resistance Totem")],
[string_lower("Totem Furie-des-vents")] = totemData[string_lower("Windfury Totem")],
[string_lower("Totem Sentinelle")] = totemData[string_lower("Sentry Totem")],
[string_lower("Totem de Mur des vents")] = totemData[string_lower("Windwall Totem")],
[string_lower("Totem de courroux de l'air")] = totemData[string_lower("Wrath of Air Totem")],
[string_lower("Totem de S\195\169isme")] = totemData[string_lower("Tremor Totem")],
[string_lower("Totem gu\195\169risseur")] = totemData[string_lower("Healing Stream Totem")],
[string_lower("Totem de Purification du poison")] = totemData[string_lower("Poison Cleansing Totem")],
[string_lower("Totem Fontaine de mana")] = totemData[string_lower("Mana Spring Totem")],
[string_lower("Totem de Purification des maladies")] = totemData[string_lower("Disease Cleansing Totem")],
[string_lower("Totem de purification")] = totemData[string_lower("Disease Cleansing Totem")],
[string_lower("Totem de Vague de mana")] = totemData[string_lower("Mana Tide Totem")],
[string_lower("Totem de Tranquillit\195\169 de l'air")] = totemData[string_lower("Tranquil Air Totem")],
}
}
local function GetTotemColorDefaultOptions() local function GetTotemColorDefaultOptions()
local defaultDB = {} local defaultDB = {}
local options = {} local options = {}
local indexedList = {} local indexedList = {}
for k,v in pairs(totemData) do for k,v in pairs(totemData) do
tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture, enabled = v.enabled}) tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture})
end end
table.sort(indexedList, function (a, b) table.sort(indexedList, function (a, b)
return a.name < b.name return a.name < b.name
end) end)
for i=1,#indexedList do for i=1,#indexedList do
defaultDB["totem" .. indexedList[i].id] = {color = indexedList[i].color, enabled = indexedList[i].enabled, alpha = 0.6} defaultDB["totem" .. indexedList[i].id] = {color = indexedList[i].color, enabled = true, alpha = 0.6, customText = ""}
options["npTotemsHideDisabledTotems"] = {
order = 1,
name = L["Hide Disabled Totem Plates"],
desc = L["Hide Disabled Totem Plates"],
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.npTotemsHideDisabledTotems end,
set = function(_, value)
Gladdy.dbi.profile.npTotemsHideDisabledTotems = value
Gladdy:UpdateFrame()
end
}
options["totem" .. indexedList[i].id] = { options["totem" .. indexedList[i].id] = {
order = i+1, order = i+1,
name = select(1, GetSpellInfo(indexedList[i].id)), name = select(1, GetSpellInfo(indexedList[i].id)),
@ -138,12 +51,12 @@ local function GetTotemColorDefaultOptions()
}, },
enabled = { enabled = {
order = 2, order = 2,
name = "Enabled", name = L["Enabled"],
desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))), desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
type = "toggle", type = "toggle",
width = "full", width = "full",
get = function(info) return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end, get = function() return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end,
set = function(info, value) set = function(_, value)
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled = value Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end end
@ -155,15 +68,13 @@ local function GetTotemColorDefaultOptions()
order = 3, order = 3,
hasAlpha = true, hasAlpha = true,
width = "full", width = "full",
get = function(info) get = function()
local key = info.arg or info[#info]
return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.a Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.a
end, end,
set = function(info, r, g, b, a) set = function(_, r, g, b, a)
local key = info.arg or info[#info]
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b,
@ -179,21 +90,21 @@ local function GetTotemColorDefaultOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
width = "full", width = "full",
get = function(info) get = function()
return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha
end, end,
set = function(info, value) set = function(_, value)
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha = value Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end end
}, },
customText = { customText = {
type = "input", type = "input",
name = L["Custom totem name"], name = L["Custom totem name"],
order = 5, order = 5,
width = "full", width = "full",
get = function(info) return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].customText end, get = function() return Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText end,
set = function(info, value) Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end set = function(_, value) Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end
}, },
} }
} }
@ -201,26 +112,13 @@ local function GetTotemColorDefaultOptions()
return defaultDB, options, indexedList return defaultDB, options, indexedList
end end
local function GetTotemOptions()
local indexedList = select(3, GetTotemColorDefaultOptions())
local colorList = {}
for i=1, #indexedList do
tinsert(colorList, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id])
end
return colorList
end
function Gladdy:GetTotemColors()
return GetTotemColorDefaultOptions()
end
--------------------------------------------------- ---------------------------------------------------
-- Core -- Core
--------------------------------------------------- ---------------------------------------------------
local TotemPlates = Gladdy:NewModule("TotemPlates", nil, { local TotemPlates = Gladdy:NewModule("Totem Plates", 2, {
npTotems = true, npTotems = true,
npTotemsShowFriendly = true, npTotemsShowFriendly = true,
npTotemsShowEnemy = true, npTotemsShowEnemy = true,
@ -234,12 +132,10 @@ local TotemPlates = Gladdy:NewModule("TotemPlates", nil, {
npTotemPlatesAlpha = 0.6, npTotemPlatesAlpha = 0.6,
npTotemPlatesAlphaAlways = false, npTotemPlatesAlphaAlways = false,
npTotemPlatesAlphaAlwaysTargeted = false, npTotemPlatesAlphaAlwaysTargeted = false,
npTotemColors = select(1, GetTotemColorDefaultOptions()) npTotemColors = select(1, GetTotemColorDefaultOptions()),
npTotemsHideDisabledTotems = false,
}) })
LibStub("AceHook-3.0"):Embed(TotemPlates)
LibStub("AceTimer-3.0"):Embed(TotemPlates)
function TotemPlates.OnEvent(self, event, ...) function TotemPlates.OnEvent(self, event, ...)
TotemPlates[event](self, ...) TotemPlates[event](self, ...)
end end
@ -248,24 +144,102 @@ function TotemPlates:Initialize()
self.numChildren = 0 self.numChildren = 0
self.activeTotemNameplates = {} self.activeTotemNameplates = {}
self.totemPlateCache = {} self.totemPlateCache = {}
self:RegisterEvent("PLAYER_ENTERING_WORLD") if Gladdy.db.npTotems then
self:RegisterEvent("NAME_PLATE_UNIT_ADDED") self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED") self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("PLAYER_TARGET_CHANGED") self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:SetScript("OnEvent", TotemPlates.OnEvent) self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:SetScript("OnEvent", TotemPlates.OnEvent)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then
SetCVar("nameplateShowEnemyTotems", true);
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then
SetCVar("nameplateShowFriendlyTotems", true);
end
self.addon = "Blizzard"
if (IsAddOnLoaded("Plater")) then
self.addon = "Plater"
elseif (IsAddOnLoaded("Kui_Nameplates")) then
self.addon = "Kui_Nameplates"
elseif (IsAddOnLoaded("NeatPlates")) then
self.addon = "NeatPlates"
elseif (IsAddOnLoaded("TidyPlates_ThreatPlates")) then
self.addon = "TidyPlates_ThreatPlates"
elseif (IsAddOnLoaded("Tukui")) then
local _, C, _ = Tukui:unpack()
if C.NamePlates.Enable then
self.addon = "Tukui"
end
elseif (IsAddOnLoaded("ElvUI")) then
local E = unpack(ElvUI)
if E.private.nameplates.enable then
self.addon = "ElvUI"
end
end
end end
---------------------------------------------------
-- Events
---------------------------------------------------
function TotemPlates:PLAYER_ENTERING_WORLD() function TotemPlates:PLAYER_ENTERING_WORLD()
self.numChildren = 0 self.numChildren = 0
self.activeTotemNameplates = {} self.activeTotemNameplates = {}
end end
function TotemPlates:Reset() function TotemPlates:PLAYER_TARGET_CHANGED()
--self:CancelAllTimers() for k,nameplate in pairs(self.activeTotemNameplates) do
--self:UnhookAll() TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
end
end end
function TotemPlates:NAME_PLATE_UNIT_ADDED(unitID)
self:OnUnitEvent(unitID)
end
function TotemPlates:NAME_PLATE_UNIT_REMOVED(unitID)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID)
self.activeTotemNameplates[unitID] = nil
--self:ToggleAddon(nameplate, true)
if nameplate.gladdyTotemFrame then
nameplate.gladdyTotemFrame:Hide()
nameplate.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
nameplate.gladdyTotemFrame = nil
end
end
---------------------------------------------------
-- Gladdy Call
---------------------------------------------------
function TotemPlates:UpdateFrameOnce() function TotemPlates:UpdateFrameOnce()
if Gladdy.db.npTotems then
self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:SetScript("OnEvent", TotemPlates.OnEvent)
else
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
self:UnregisterEvent("NAME_PLATE_UNIT_ADDED")
self:UnregisterEvent("NAME_PLATE_UNIT_REMOVED")
self:UnregisterEvent("PLAYER_TARGET_CHANGED")
self:SetScript("OnEvent", nil)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then
SetCVar("nameplateShowEnemyTotems", true);
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then
SetCVar("nameplateShowFriendlyTotems", true);
end
for k,nameplate in pairs(self.activeTotemNameplates) do for k,nameplate in pairs(self.activeTotemNameplates) do
local totemDataEntry = nameplate.gladdyTotemFrame.totemDataEntry local totemDataEntry = nameplate.gladdyTotemFrame.totemDataEntry
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
@ -276,71 +250,184 @@ function TotemPlates:UpdateFrameOnce()
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b, Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a) Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE") nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE")
nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "") nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
self:SetTotemAlpha(nameplate.gladdyTotemFrame, k) self:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
nameplate.UnitFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
nameplate.UnitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16) if not Gladdy.db.npTotems then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true)
else
nameplate.gladdyTotemFrame:Show()
self:ToggleAddon(nameplate)
end
local isEnemy = UnitIsEnemy("player", nameplate.gladdyTotemFrame.unitID)
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy and isEnemy then
nameplate.gladdyTotemFrame:Show()
self:ToggleAddon(nameplate)
elseif Gladdy.db.npTotems and not Gladdy.db.npTotemsShowEnemy and isEnemy then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly and not isEnemy then
nameplate.gladdyTotemFrame:Show()
self:ToggleAddon(nameplate)
elseif not Gladdy.db.npTotemsShowFriendly and not isEnemy then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then
nameplate.gladdyTotemFrame:Show()
self:ToggleAddon(nameplate)
end
if Gladdy.db.npTotems and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true)
end
if Gladdy.db.npTotems and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled and Gladdy.db.npTotemsHideDisabledTotems then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate)
end
end end
for i,gladdyTotemFrame in ipairs(self.totemPlateCache) do for _,gladdyTotemFrame in ipairs(self.totemPlateCache) do
gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize) gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle) gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE") gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE")
gladdyTotemFrame.totemName:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) gladdyTotemFrame.totemName:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
end end
end end
--------------------------------------------------- ---------------------------------------------------
-- TotemPlates Frame
---------------------------------------------------
function TotemPlates:CreateTotemFrame(nameplate)
nameplate.gladdyTotemFrame = CreateFrame("Frame")
nameplate.gladdyTotemFrame:SetFrameLevel(1)
nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true)
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
nameplate.gladdyTotemFrame.totemIcon = nameplate.gladdyTotemFrame:CreateTexture(nil, "BACKGROUND")
nameplate.gladdyTotemFrame.totemIcon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
nameplate.gladdyTotemFrame.totemIcon:ClearAllPoints()
nameplate.gladdyTotemFrame.totemIcon:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
nameplate.gladdyTotemFrame.totemIcon:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
nameplate.gladdyTotemFrame.totemBorder = nameplate.gladdyTotemFrame:CreateTexture(nil, "BORDER")
nameplate.gladdyTotemFrame.totemBorder:ClearAllPoints()
nameplate.gladdyTotemFrame.totemBorder:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY")
nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE")
nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
nameplate.gladdyTotemFrame.selectionHighlight = nameplate.gladdyTotemFrame:CreateTexture(nil, "OVERLAY")
nameplate.gladdyTotemFrame.selectionHighlight:SetTexture("Interface/TargetingFrame/UI-TargetingFrame-BarFill")
nameplate.gladdyTotemFrame.selectionHighlight:SetAlpha(0)
nameplate.gladdyTotemFrame.selectionHighlight:SetBlendMode("ADD")
nameplate.gladdyTotemFrame.selectionHighlight:SetIgnoreParentAlpha(true)
nameplate.gladdyTotemFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
nameplate.gladdyTotemFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
nameplate.gladdyTotemFrame:SetScript('OnUpdate', TotemPlates.OnUpdate)
nameplate.gladdyTotemFrame:SetScript("OnHide", function(self)
self.parent = nil
self:SetParent(nil)
end)
end
---------------------------------------------------
-- Nameplate functions -- Nameplate functions
--------------------------------------------------- ---------------------------------------------------
function TotemPlates:PLAYER_TARGET_CHANGED() function TotemPlates:GetAddonFrame(nameplate)
for k,nameplate in pairs(self.activeTotemNameplates) do if self.addon == "Blizzard" then
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, k) if nameplate.UnitFrame then
return nameplate.UnitFrame
end
elseif self.addon == "Plater" or self.addon == "Tukui" or self.addon == "ElvUI" then
if nameplate.unitFrame then
return nameplate.unitFrame
end
elseif self.addon == "Kui_Nameplates" then
if nameplate.kui then
return nameplate.kui
end
elseif self.addon == "NeatPlates" then
if nameplate.extended or nameplate.carrier then
return nameplate.extended , nameplate.carrier
end
elseif self.addon == "TidyPlates_ThreatPlates" then
if nameplate.TPFrame then
return nameplate.TPFrame
end
end end
end end
function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
local unitID = ...
function TotemPlates:ToggleAddon(nameplate, show)
local addonFrames = { self:GetAddonFrame(nameplate) }
if addonFrames and #addonFrames > 0 then
if show then
for _,v in ipairs(addonFrames) do
v:Show()
end
else
for _,v in ipairs(addonFrames) do
v:Hide()
end
end
end
end
function TotemPlates.OnUpdate(self)
if (UnitIsUnit("mouseover", self.unitID) or UnitIsUnit("target", self.unitID)) and Gladdy.db.npTotemColors["totem" .. self.totemDataEntry.id].alpha > 0 then
self.selectionHighlight:SetAlpha(.25)
else
self.selectionHighlight:SetAlpha(0)
end
if (TotemPlates.addon == "Plater" or TotemPlates.addon == "Tukui" or TotemPlates.addon == "ElvUI") and self.parent and self.parent.unitFrame then
self.parent.unitFrame:Hide()
end
end
function TotemPlates:OnUnitEvent(unitID)
local isEnemy = UnitIsEnemy("player", unitID) local isEnemy = UnitIsEnemy("player", unitID)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID)
if not nameplate then
return
end
if not Gladdy.db.npTotems then
self:ToggleAddon(nameplate, true)
return
end
if not Gladdy.db.npTotemsShowEnemy and isEnemy then if not Gladdy.db.npTotemsShowEnemy and isEnemy then
self:ToggleAddon(nameplate, true)
return return
end end
if not Gladdy.db.npTotemsShowFriendly and not isEnemy then if not Gladdy.db.npTotemsShowFriendly and not isEnemy then
self:ToggleAddon(nameplate, true)
return
end
local npcType, _, _, _, _, npcId = strsplit("-", UnitGUID(unitID))
if npcType ~= "Creature" then
return
end
local totemDataEntry = npcIdToTotemData[tonumber(npcId)]
if not totemDataEntry then
return return
end end
local nameplateName = UnitName(unitID)
local totemName = string_gsub(nameplateName, "^%s+", "") --trim
totemName = string_gsub(totemName, "%s+$", "") --trim
totemName = string_gsub(totemName, "%s+[I,V,X]+$", "") --trim rank
totemName = string_lower(totemName)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID)
local totemDataEntry = localizedTotemData["default"][totemName]
if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates
if #self.totemPlateCache > 0 then if #self.totemPlateCache > 0 then
nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache) nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
else else
nameplate.gladdyTotemFrame = CreateFrame("Frame", nil) self:CreateTotemFrame(nameplate)
nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true)
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
nameplate.gladdyTotemFrame.totemIcon = nameplate.gladdyTotemFrame:CreateTexture(nil, "BACKGROUND")
nameplate.gladdyTotemFrame.totemIcon:ClearAllPoints()
nameplate.gladdyTotemFrame.totemIcon:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
nameplate.gladdyTotemFrame.totemIcon:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
nameplate.gladdyTotemFrame.totemBorder = nameplate.gladdyTotemFrame:CreateTexture(nil, "BORDER")
nameplate.gladdyTotemFrame.totemBorder:ClearAllPoints()
nameplate.gladdyTotemFrame.totemBorder:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY")
nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE")
nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
end end
nameplate.gladdyTotemFrame.unitID = unitID
nameplate.gladdyTotemFrame.totemDataEntry = totemDataEntry nameplate.gladdyTotemFrame.totemDataEntry = totemDataEntry
nameplate.gladdyTotemFrame.parent = nameplate nameplate.gladdyTotemFrame.parent = nameplate
nameplate.gladdyTotemFrame:SetParent(nameplate) nameplate.gladdyTotemFrame:SetParent(nameplate)
@ -352,34 +439,21 @@ function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b, Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a) Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "") nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
nameplate.gladdyTotemFrame.parent = nameplate
nameplate.gladdyTotemFrame:Show() nameplate.gladdyTotemFrame:Show()
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID) TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID)
self:ToggleAddon(nameplate)
nameplate.UnitFrame:SetAlpha(0)
nameplate.UnitFrame.point = select(2, nameplate.UnitFrame.selectionHighlight:GetPoint())
nameplate.UnitFrame.selectionHighlight:ClearAllPoints()
nameplate.UnitFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
nameplate.UnitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
nameplate.UnitFrame:SetScript("OnHide", function(unitFrame)
unitFrame:SetAlpha(1)
unitFrame.selectionHighlight:ClearAllPoints()
unitFrame.selectionHighlight:SetPoint("TOPLEFT", unitFrame.point, "TOPLEFT")
unitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", unitFrame.point, "BOTTOMRIGHT")
unitFrame:SetScript("OnHide", nil)
end)
self.activeTotemNameplates[unitID] = nameplate self.activeTotemNameplates[unitID] = nameplate
end elseif totemDataEntry and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled and Gladdy.db.npTotemsHideDisabledTotems then
end if nameplate.gladdyTotemFrame then
nameplate.gladdyTotemFrame:Hide()
function TotemPlates:NAME_PLATE_UNIT_REMOVED(...) nameplate.gladdyTotemFrame:SetParent(nil)
local unitID = ... tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID) nameplate.gladdyTotemFrame = nil
self.activeTotemNameplates[unitID] = nil end
if nameplate.gladdyTotemFrame then self:ToggleAddon(nameplate)
nameplate.gladdyTotemFrame:Hide() else
nameplate.gladdyTotemFrame:SetParent(nil) self:ToggleAddon(nameplate, true)
tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
nameplate.gladdyTotemFrame = nil
end end
end end
@ -407,6 +481,65 @@ end
--------------------------------------------------- ---------------------------------------------------
-- Test
---------------------------------------------------
function TotemPlates:TestOnce()
if not self.testFrame then
self.testFrame = CreateFrame("Frame", nil, UIParent)
self.testFrame:SetWidth(1)
self.testFrame:SetHeight(32)
self.testFrame:SetPoint("CENTER", UIParent, "CENTER", 0, -140)
self.testFrame:SetIgnoreParentScale(true)
end
local totemDataEntry = npcIdToTotemData[5913]
self.testFrame:Show()
if not self.testFrame.gladdyTotemFrame then
if #self.totemPlateCache > 0 then
self.testFrame.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
else
self:CreateTotemFrame(self.testFrame)
self.testFrame.gladdyTotemFrame:SetScript("OnHide", nil)
self.testFrame.gladdyTotemFrame:SetScript("OnUpdate", nil)
end
end
if Gladdy.db.npTotems then
self.testFrame.gladdyTotemFrame.unitID = "player"
self.testFrame.gladdyTotemFrame.totemDataEntry = totemDataEntry
self.testFrame.gladdyTotemFrame.parent = self.testFrame
self.testFrame.gladdyTotemFrame:SetParent(self.testFrame)
self.testFrame.gladdyTotemFrame:ClearAllPoints()
self.testFrame.gladdyTotemFrame:SetPoint("CENTER", self.testFrame, "CENTER", 0, 0)
self.testFrame.gladdyTotemFrame.totemIcon:SetTexture(totemDataEntry.texture)
self.testFrame.gladdyTotemFrame.totemBorder:SetVertexColor(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.r,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.g,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
self.testFrame.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
self.testFrame.gladdyTotemFrame.parent = self.testFrame
self.testFrame.gladdyTotemFrame:Show()
self.activeTotemNameplates["player"] = self.testFrame
else
self.testFrame.gladdyTotemFrame:Hide()
end
end
function TotemPlates:Reset()
if self.testFrame then
if self.testFrame.gladdyTotemFrame then
self.testFrame.gladdyTotemFrame:Hide()
self.testFrame.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, self.testFrame.gladdyTotemFrame)
self.testFrame.gladdyTotemFrame = nil
end
self.testFrame:Hide()
self.activeTotemNameplates["player"] = nil
end
end
---------------------------------------------------
-- Interface options -- Interface options
--------------------------------------------------- ---------------------------------------------------
@ -415,34 +548,37 @@ function TotemPlates:GetOptions()
return { return {
headerTotems = { headerTotems = {
type = "header", type = "header",
name = L["Totem General"], name = L["Totem Plates"],
order = 2, order = 2,
}, },
npTotems = Gladdy:option({ npTotems = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Totem icons on/off"], name = L["Enabled"],
desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], desc = L["Turns totem icons instead of nameplates on or off."],
order = 3, order = 3,
width = 0.9, width = 0.9,
}), }),
npTotemsShowFriendly = Gladdy:option({ npTotemsShowFriendly = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Show friendly"], name = L["Show friendly"],
desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], desc = L["Turns totem icons instead of nameplates on or off."],
disabled = function() return not Gladdy.db.npTotems end,
order = 4, order = 4,
width = 0.65, width = 0.65,
}), }),
npTotemsShowEnemy = Gladdy:option({ npTotemsShowEnemy = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Show enemy"], name = L["Show enemy"],
desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], desc = L["Turns totem icons instead of nameplates on or off."],
disabled = function() return not Gladdy.db.npTotems end,
order = 5, order = 5,
width = 0.6, width = 0.6,
}), }),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
disabled = function() return not Gladdy.db.npTotems end,
order = 4, order = 4,
args = { args = {
icon = { icon = {
@ -463,6 +599,7 @@ function TotemPlates:GetOptions()
min = 20, min = 20,
max = 100, max = 100,
step = 1, step = 1,
width = "full",
}), }),
npTotemPlatesWidthFactor = Gladdy:option({ npTotemPlatesWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -472,6 +609,7 @@ function TotemPlates:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
width = "full",
}), }),
}, },
}, },
@ -482,7 +620,7 @@ function TotemPlates:GetOptions()
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Font"],
order = 1, order = 1,
}, },
npTremorFont = Gladdy:option({ npTremorFont = Gladdy:option({
@ -501,6 +639,7 @@ function TotemPlates:GetOptions()
min = 1, min = 1,
max = 50, max = 50,
step = 0.1, step = 0.1,
width = "full",
}), }),
npTremorFontXOffset = Gladdy:option({ npTremorFontXOffset = Gladdy:option({
type = "range", type = "range",
@ -510,6 +649,7 @@ function TotemPlates:GetOptions()
min = -300, min = -300,
max = 300, max = 300,
step = 1, step = 1,
width = "full",
}), }),
npTremorFontYOffset = Gladdy:option({ npTremorFontYOffset = Gladdy:option({
type = "range", type = "range",
@ -519,6 +659,7 @@ function TotemPlates:GetOptions()
min = -300, min = -300,
max = 300, max = 300,
step = 1, step = 1,
width = "full",
}), }),
}, },
}, },
@ -552,21 +693,25 @@ function TotemPlates:GetOptions()
min = 0, min = 0,
max = 1, max = 1,
step = 0.1, step = 0.1,
width = "double", width = "full",
order = 23, order = 23,
get = function(info) get = function()
local alphas = GetTotemOptions() local alpha, i = nil, 1
for i=2, #alphas do for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do
if alphas[i].alpha ~= alphas[1].alpha then if i == 1 then
return "" alpha = v.alpha
i = i + 1
else
if v.alpha ~= alpha then
return ""
end
end end
end end
return alphas[1].alpha return alpha
end, end,
set = function(info, value) set = function(_, value)
local alphas = GetTotemOptions() for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do
for i=1, #alphas do v.alpha = value
alphas[i].alpha = value
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -594,23 +739,27 @@ function TotemPlates:GetOptions()
name = L["All totem border color"], name = L["All totem border color"],
order = 42, order = 42,
hasAlpha = true, hasAlpha = true,
get = function(info) get = function()
local colors = GetTotemOptions() local color
local color = colors[1].color local i = 1
for i=2, #colors do for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do
if colors[i].r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r then if i == 1 then
return 0, 0, 0, 0 color = v.color
i = i + 1
else
if v.color.r ~= color.r or v.color.g ~= color.g or v.color.b ~= color.b or v.color.a ~= color.a then
return 0, 0, 0, 0
end
end end
end end
return color.r, color.g, color.b, color.a return color.r, color.g, color.b, color.a
end, end,
set = function(info, r, g, b, a) set = function(_, r, g, b, a)
local colors = GetTotemOptions() for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do
for i=1, #colors do v.color.r = r
colors[i].color.r = r v.color.g = g
colors[i].color.g = g v.color.b = b
colors[i].color.b = b v.color.a = a
colors[i].color.a = a
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -621,10 +770,11 @@ function TotemPlates:GetOptions()
}, },
npTotemColors = { npTotemColors = {
order = 50, order = 50,
name = "Customize Totems", name = L["Customize Totems"],
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
args = select(2, Gladdy:GetTotemColors()) disabled = function() return not Gladdy.db.npTotems end,
args = select(2, GetTotemColorDefaultOptions())
}, },
} }
end end

782
Modules/TotemPulse.lua Normal file
View File

@ -0,0 +1,782 @@
local select, pairs, tremove, tinsert, format, strsplit, tonumber = select, pairs, tremove, tinsert, format, strsplit, tonumber
local type = type
local C_NamePlate = C_NamePlate
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local GetSpellInfo, CreateFrame = GetSpellInfo, CreateFrame
local GetTime, UnitIsEnemy, UnitGUID = GetTime, UnitIsEnemy, UnitGUID
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local UIParent = UIParent
---------------------------------------------------
-- Helper
---------------------------------------------------
local totemData, npcIdToTotemData, cooldowns = Gladdy:GetTotemData()
local ninetyDegreeInRad = 90 * math.pi / 180
local function TotemOptions()
local defaultDB = {}
local options = {}
local indexedList = {}
for k,v in pairs(totemData) do
if v.pulse then
tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture})
end
end
table.sort(indexedList, function (a, b)
return a.name < b.name
end)
for i=1,#indexedList do
defaultDB["totem" .. indexedList[i].id] = {enabled = true, attachToGladdyTotemFrame = true, style = "COOLDOWN", reverse = false}
options["totem" .. indexedList[i].id] = {
order = i+1,
name = select(1, GetSpellInfo(indexedList[i].id)),
--inline = true,
width = "3.0",
type = "group",
icon = indexedList[i].texture,
args = {
headerTotemConfig = {
type = "header",
name = format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
order = 1,
},
enabled = {
order = 2,
name = L["Enabled"],
desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled = value
Gladdy:UpdateFrame()
end
},
attachToGladdyTotemFrame = {
order = 3,
disabled = function() return not Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
name = L["Attach To TotemPlate"],
desc = "Attach " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))) .. " To TotemPlate",
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].attachToGladdyTotemFrame end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].attachToGladdyTotemFrame = value
Gladdy:UpdateFrame()
end
},
style = {
type = "select",
name = L["Style"],
order = 4,
values = {
COOLDOWN = L["Cooldown"],
Vertical = L["Bar vertical"],
Horizontal = L["Bar horizontal"]
},
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].style end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].style = value
Gladdy:UpdateFrame()
end
},
reverse = {
order = 5,
disabled = function() return not Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
name = L["Reverse"],
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].reverse end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].reverse = value
Gladdy:UpdateFrame()
end
},
}
}
end
return options,defaultDB
end
---------------------------------------------------
-- Core
---------------------------------------------------
local TotemPulse = Gladdy:NewModule("Totem Pulse", 1, {
totemPulseEnabled = true,
totemPulseEnabledShowFriendly = true,
totemPulseEnabledShowEnemy = true,
totemPulseStyle = "", -- "COOLDOWN", "COOLDOWNREVERSE", "BARVERTICAL", "BARHORIZONTAL"
--text
totemPulseTextColor = { r = 1, g = 1, b = 1, a = 1 },
totemPulseTextSize = 14,
totemPulseTextFont = "DorisPP",
--bar
totemPulseBarWidth = 40,
totemPulseBarHeight = 20,
totemPulseBarColor = { r = 1, g = 0, b = 0, a = .5 },
totemPulseBarBgColor = { r = 0, g = 1, b = 0, a = .5 },
totemPulseBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
totemPulseBarBorderSize = 4,
totemPulseBarBorderStyle = "Gladdy Tooltip squared",
totemPulseBarTexture = "Flat",
totemPulseBarReverse = false,
--cooldown
totemPulseCooldownWidth = 40,
totemPulseCooldownHeight = 20,
totemPulseCooldownAlpha = 1,
totemPulseCooldownReverse = true,
--totems
totemPulseTotems = select(2, TotemOptions())
})
function TotemPulse.OnEvent(self, event, ...)
TotemPulse[event](self, ...)
end
function TotemPulse:Initialize()
self.timeStamps = {}
self.cooldownCache = {}
self.barCache = {}
self.activeFrames = { bars = {}, cooldowns = {} }
if Gladdy.db.totemPulseEnabled then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", self.OnEvent)
end
self:RegisterEvent("PLAYER_ENTERING_WORLD")
end
---------------------------------------------------
-- EVENTS
---------------------------------------------------
function TotemPulse:PLAYER_ENTERING_WORLD()
self.timeStamps = {}
end
function TotemPulse:COMBAT_LOG_EVENT_UNFILTERED()
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName = CombatLogGetCurrentEventInfo()
local pulse = cooldowns[spellID] or cooldowns[spellName]
local npcId = tonumber(select(6, strsplit("-", destGUID)), 10)
if eventType == "UNIT_DESTROYED" and self.timeStamps[destGUID] then
self.timeStamps[destGUID] = nil
end
if (eventType == "SWING_DAMAGE" or eventType == "SPELL_DAMAGE") and self.timeStamps[destGUID] and npcIdToTotemData[npcId] then
self.timeStamps[destGUID] = nil
end
if not pulse then
return
end
if eventType == "SPELL_CAST_SUCCESS" then
self.timeStamps[sourceGUID] = { timeStamp = GetTime(), pulse = pulse }
end
if eventType == "SPELL_SUMMON" then
if not npcIdToTotemData[npcId] then
return
end
if not Gladdy.dbi.profile.totemPulseTotems["totem" .. npcIdToTotemData[npcId].id].enabled then
return
end
if self.timeStamps[sourceGUID] then
self.timeStamps[destGUID] = self.timeStamps[sourceGUID]
self.timeStamps[destGUID].id = npcIdToTotemData[npcId].id
self.timeStamps[sourceGUID] = nil
else
self.timeStamps[destGUID] = { timeStamp = GetTime(), pulse = pulse, id = npcIdToTotemData[npcId].id }
end
end
end
function TotemPulse:NAME_PLATE_UNIT_REMOVED(unitId)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitId)
if nameplate.totemTick then
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
nameplate.totemTick:SetParent(nil)
tinsert(nameplate.totemTick.bar and self.barCache or self.cooldownCache, nameplate.totemTick)
self.activeFrames.bars[nameplate.totemTick] = nil
self.activeFrames.cooldowns[nameplate.totemTick] = nil
nameplate.totemTick = nil
end
end
function TotemPulse:NAME_PLATE_UNIT_ADDED(unitId)
self:OnUnitAdded(unitId, "NAME_PLATE_UNIT_ADDED")
end
function TotemPulse:UNIT_NAME_UPDATE(unitId)
self:OnUnitAdded(unitId, "UNIT_NAME_UPDATE")
end
function TotemPulse:OnUnitAdded(unitId)
local isEnemy = UnitIsEnemy("player", unitId)
local guid = UnitGUID(unitId)
if strsplit("-", guid) ~= "Creature" then
return
end
local nameplate = C_NamePlate.GetNamePlateForUnit(unitId)
if nameplate and (isEnemy and Gladdy.db.totemPulseEnabledShowEnemy or not isEnemy and Gladdy.db.totemPulseEnabledShowFriendly) then
if self.timeStamps[guid] and strsplit("-", guid) then
self:AddTimerFrame(nameplate, self.timeStamps[guid])
else
if nameplate.totemTick then
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
nameplate.totemTick:SetParent(nil)
tinsert(nameplate.totemTick.bar and self.barCache or self.cooldownCache, nameplate.totemTick)
self.activeFrames.bars[nameplate.totemTick] = nil
self.activeFrames.cooldowns[nameplate.totemTick] = nil
nameplate.totemTick = nil
end
end
end
end
---------------------------------------------------
-- FRAMES
---------------------------------------------------
function TotemPulse:CreateCooldownFrame(style)
local totemTick
if style == "COOLDOWN" then
if #self.cooldownCache > 0 then
totemTick = tremove(self.cooldownCache, #self.cooldownCache)
else
totemTick = CreateFrame("Frame")
totemTick:SetWidth(Gladdy.db.totemPulseCooldownWidth)
totemTick:SetHeight(Gladdy.db.totemPulseCooldownHeight)
totemTick.cd = CreateFrame("Cooldown", nil, totemTick, "CooldownFrameTemplate")
totemTick.cd:SetAllPoints(totemTick)
totemTick.cd.noCooldownCount = true
totemTick:SetFrameStrata("MEDIUM")
totemTick:SetFrameLevel(4)
totemTick.cd:SetReverse(Gladdy.db.totemPulseCooldownReverse)
totemTick.cd:SetHideCountdownNumbers(true)
totemTick.cd:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
totemTick.textFrame = CreateFrame("Frame", nil, totemTick)
totemTick.textFrame:SetAllPoints(totemTick)
totemTick.text = totemTick.textFrame:CreateFontString(nil, "OVERLAY")
totemTick.text:SetPoint("CENTER", totemTick.textFrame, "CENTER")
totemTick.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
totemTick.text:SetJustifyH("CENTER")
totemTick.text:SetShadowOffset(1, -1)
totemTick.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
else
if #self.barCache > 0 then
totemTick = tremove(self.barCache, #self.barCache)
totemTick.bar:SetOrientation(style)
totemTick.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
totemTick.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
else
totemTick = CreateFrame("Frame", nil)
totemTick:SetWidth(Gladdy.db.totemPulseBarWidth)
totemTick:SetHeight(Gladdy.db.totemPulseBarHeight)
totemTick.backdrop = CreateFrame("Frame", nil, totemTick, BackdropTemplateMixin and "BackdropTemplate")
totemTick.backdrop:SetAllPoints(totemTick)
totemTick.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "totemPulseBarBorderStyle"),
edgeSize = Gladdy.db.totemPulseBarBorderSize })
totemTick.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBorderColor))
totemTick.backdrop:SetFrameLevel(1)
totemTick.bar = CreateFrame("StatusBar", nil, totemTick)
totemTick.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
totemTick.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.totemPulseBarColor))
totemTick.bar:SetOrientation(style)
totemTick.bar:SetFrameLevel(0)
totemTick.bar:SetAllPoints(totemTick)
totemTick.spark = totemTick.bar:CreateTexture(nil, "OVERLAY")
totemTick.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
totemTick.spark:SetBlendMode("ADD")
totemTick.spark:SetWidth(8)
totemTick.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
totemTick.spark.position = 0
totemTick.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
totemTick.bg = totemTick:CreateTexture(nil, "ARTWORK")
totemTick.bg:SetTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
totemTick.bg:SetAllPoints(totemTick.bar)
totemTick.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBgColor))
totemTick.text = totemTick.bar:CreateFontString(nil, "OVERLAY")
totemTick.text:SetPoint("CENTER", totemTick, "CENTER", 0, 0)
totemTick.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
totemTick.text:SetJustifyH("CENTER")
totemTick.text:SetShadowOffset(1, -1)
totemTick.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
end
return totemTick
end
function TotemPulse:AddTimerFrame(nameplate, timestamp, test)
if (nameplate:IsShown() or test) and timestamp then
if not nameplate.totemTick then
nameplate.totemTick = TotemPulse:CreateCooldownFrame(Gladdy.db.totemPulseTotems["totem" .. timestamp.id].style)
end
nameplate.totemTick:SetParent(nameplate)
local cd = type(timestamp.pulse) == "table" and timestamp.pulse.cd or timestamp.pulse
local once = type(timestamp.pulse) == "table"
local cooldown = (timestamp.timeStamp - GetTime()) % cd
nameplate.totemTick.timestamp = timestamp.timeStamp
nameplate.totemTick.maxValue = cd
nameplate.totemTick.value = cooldown
nameplate.totemTick.once = once
nameplate.totemTick.id = timestamp.id
if nameplate.totemTick.bar then
self:UpdateBarPartial(nameplate.totemTick)
nameplate.totemTick.bar:SetMinMaxValues(0, cd)
nameplate.totemTick.bar:SetValue(cooldown)
self.activeFrames.bars[nameplate.totemTick] = nameplate.totemTick
else
self:UpdateCooldown(nameplate.totemTick)
self.activeFrames.cooldowns[nameplate.totemTick] = nameplate.totemTick
end
if once and GetTime() - timestamp.timeStamp > cd then
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
else
nameplate.totemTick:SetScript("OnUpdate", TotemPulse.TotemPulseOnUpdate)
nameplate.totemTick:Show()
end
else
if nameplate.totemTick then
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
nameplate.totemTick:SetParent(nil)
tinsert(nameplate.totemTick.bar and self.barCache or self.cooldownCache, nameplate.totemTick)
self.activeFrames.bars[nameplate.totemTick] = nil
self.activeFrames.cooldowns[nameplate.totemTick] = nil
nameplate.totemTick = nil
end
end
end
function TotemPulse:SetSparkPosition(totemTick, referenceSize, vertical)
if not Gladdy.db.totemPulseTotems["totem" .. totemTick.id].reverse then
totemTick.bar:SetValue(totemTick.maxValue - totemTick.value)
totemTick.spark.position = referenceSize / 2 - (totemTick.value / totemTick.maxValue) * referenceSize
if ( totemTick.spark.position < -referenceSize / 2 ) then
totemTick.spark.position = -referenceSize / 2
end
else
totemTick.bar:SetValue(totemTick.value)
totemTick.spark.position = referenceSize / 2 - ((totemTick.maxValue - totemTick.value) / totemTick.maxValue) * referenceSize
if ( totemTick.spark.position > referenceSize / 2 ) then
totemTick.spark.position = referenceSize / 2
end
end
totemTick.spark:SetPoint("CENTER", totemTick.bar, "CENTER", vertical and 0 or totemTick.spark.position, vertical and totemTick.spark.position or 0)
end
function TotemPulse.TotemPulseOnUpdate(totemTick)
totemTick.now = GetTime()
totemTick.value = (totemTick.timestamp - totemTick.now) % totemTick.maxValue
if totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue then
totemTick:SetScript("OnUpdate", nil)
totemTick:Hide()
end
if not totemTick.bar and not (totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue) then
if Gladdy.db.totemPulseTotems["totem" .. totemTick.id].reverse then
totemTick.cd:SetCooldown(totemTick.now - totemTick.value, totemTick.maxValue)
else
totemTick.cd:SetCooldown(totemTick.now - (totemTick.maxValue - totemTick.value), totemTick.maxValue)
end
elseif totemTick.bar then
if Gladdy.db.totemPulseTotems["totem" .. totemTick.id].style == "Vertical" then
TotemPulse:SetSparkPosition(totemTick, totemTick.bar:GetHeight(), true)
else
TotemPulse:SetSparkPosition(totemTick, totemTick.bar:GetWidth(), false)
end
end
totemTick.text:SetFormattedText("%.1f", totemTick.value)
end
---------------------------------------------------
-- Update Styles
---------------------------------------------------
function TotemPulse:UpdateBarPartial(bar)
local style = bar.id and Gladdy.db.totemPulseTotems["totem" .. bar.id].style
bar:SetWidth(Gladdy.db.totemPulseBarWidth)
bar:SetHeight(Gladdy.db.totemPulseBarHeight)
bar.spark:SetWidth(8)
bar.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
bar.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
if bar:GetParent() and bar:GetParent() ~= UIParent then
local gladdyTotemFrame = bar:GetParent().gladdyTotemFrame and bar:GetParent().gladdyTotemFrame
local nameplate = bar:GetParent()
bar:ClearAllPoints()
if bar.id and gladdyTotemFrame and gladdyTotemFrame:IsShown() and Gladdy.db.totemPulseTotems["totem" .. bar.id].attachToGladdyTotemFrame then
bar:SetPoint("TOPLEFT", gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
bar:SetPoint("BOTTOMRIGHT", gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
if style then
bar.spark:SetHeight(style == "Vertical" and gladdyTotemFrame:GetWidth() or gladdyTotemFrame:GetHeight())
end
elseif bar.id and gladdyTotemFrame and gladdyTotemFrame:IsShown() and not Gladdy.db.totemPulseTotems["totem" .. bar.id].attachToGladdyTotemFrame then
bar:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", 0, -0.5)
else
bar:SetPoint("TOP", nameplate, "BOTTOM", 0, -0.5)
end
end
bar.bar:SetOrientation(style ~= "COOLDOWN" and style or bar.bar:GetOrientation())
end
function TotemPulse:UpdateBar(bar)
self:UpdateBarPartial(bar)
bar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "totemPulseBarBorderStyle"),
edgeSize = Gladdy.db.totemPulseBarBorderSize })
bar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBorderColor))
bar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
bar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.totemPulseBarColor))
bar.bg:SetTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
bar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBgColor))
bar.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
bar.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
function TotemPulse:UpdateCooldown(cooldown)
cooldown:SetWidth(Gladdy.db.totemPulseCooldownWidth)
cooldown:SetHeight(Gladdy.db.totemPulseCooldownHeight)
cooldown.cd:SetCooldown(0,0)
cooldown.cd:SetReverse(Gladdy.db.totemPulseCooldownReverse)
cooldown.cd:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
cooldown.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
cooldown.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
if cooldown:GetParent() and cooldown:GetParent() ~= UIParent then
local gladdyTotemFrame = cooldown:GetParent().gladdyTotemFrame and cooldown:GetParent().gladdyTotemFrame
local nameplate = cooldown:GetParent()
cooldown:ClearAllPoints()
if cooldown.id and gladdyTotemFrame and gladdyTotemFrame:IsShown() and Gladdy.db.totemPulseTotems["totem" .. cooldown.id].attachToGladdyTotemFrame then
cooldown:SetPoint("TOPLEFT", gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
cooldown:SetPoint("BOTTOMRIGHT", gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
elseif cooldown.id and gladdyTotemFrame and gladdyTotemFrame:IsShown() and not Gladdy.db.totemPulseTotems["totem" .. cooldown.id].attachToGladdyTotemFrame then
cooldown:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", 0, -0.5)
else
cooldown:SetPoint("TOP", nameplate, "BOTTOM", 0, -0.5)
end
end
end
function TotemPulse:UpdateFrameOnce()
if Gladdy.frame.testing then
TotemPulse:TestOnce()
end
if Gladdy.db.totemPulseEnabled then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", self.OnEvent)
else
for _,bar in pairs(self.activeFrames.bars) do
bar:SetScript("OnUpdate", nil)
bar:Hide()
bar:SetParent(nil)
tinsert(self.barCache, bar)
self.activeFrames.bars[bar] = nil
end
for _,cooldown in pairs(self.activeFrames.cooldowns) do
cooldown:SetScript("OnUpdate", nil)
cooldown:Hide()
cooldown:SetParent(nil)
tinsert(self.cooldownCache, cooldown)
self.activeFrames.cooldowns[cooldown] = nil
end
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:UnregisterEvent("NAME_PLATE_UNIT_REMOVED")
self:UnregisterEvent("NAME_PLATE_UNIT_ADDED")
self:UnregisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", nil)
end
for _,bar in pairs(self.activeFrames.bars) do
self:UpdateBar(bar)
end
for _,cooldown in pairs(self.activeFrames.cooldowns) do
self:UpdateCooldown(cooldown)
end
for _,bar in pairs(self.barCache) do
self:UpdateBar(bar)
end
for _,cooldown in pairs(self.cooldownCache) do
self:UpdateCooldown(cooldown)
end
end
---------------------------------------------------
-- TEST
---------------------------------------------------
function TotemPulse:TestOnce()
local totemPlatesTestFrame = Gladdy.modules["Totem Plates"].testFrame
if totemPlatesTestFrame then
if totemPlatesTestFrame.totemTick
and (Gladdy.db.totemPulseTotems["totem" .. npcIdToTotemData[5913].id].style == "COOLDOWN" and totemPlatesTestFrame.totemTick.bar
or Gladdy.db.totemPulseTotems["totem" .. npcIdToTotemData[5913].id].style ~= "COOLDOWN" and not totemPlatesTestFrame.totemTick.bar) then
totemPlatesTestFrame.totemTick:SetScript("OnUpdate", nil)
totemPlatesTestFrame.totemTick:Hide()
totemPlatesTestFrame.totemTick:SetParent(nil)
totemPlatesTestFrame.totemTick.id = nil
tinsert(totemPlatesTestFrame.totemTick.bar and self.barCache or self.cooldownCache, totemPlatesTestFrame.totemTick)
self.activeFrames.bars[totemPlatesTestFrame.totemTick] = nil
self.activeFrames.cooldowns[totemPlatesTestFrame.totemTick] = nil
totemPlatesTestFrame.totemTick = nil
end
local timestamp = { timeStamp = GetTime(), pulse = npcIdToTotemData[5913].pulse, id = npcIdToTotemData[5913].id }
TotemPulse:AddTimerFrame(totemPlatesTestFrame, timestamp, true)
self.testFrame = totemPlatesTestFrame.totemTick
end
end
function TotemPulse:Reset()
if self.testFrame then
self.testFrame:SetScript("OnUpdate", nil)
self.testFrame:Hide()
self.testFrame:SetParent(nil)
tinsert(self.testFrame.bar and self.barCache or self.cooldownCache, self.testFrame)
self.activeFrames.bars[self.testFrame] = nil
self.activeFrames.cooldowns[self.testFrame] = nil
self.testFrame = nil
Gladdy.modules["Totem Plates"].testFrame.totemTick = nil
end
end
---------------------------------------------------
-- OPTIONS
---------------------------------------------------
function TotemPulse:GetOptions()
return {
headerClassicon = {
type = "header",
name = L["Totem Pulse"],
order = 2,
},
totemPulseEnabled = Gladdy:option({
type = "toggle",
name = L["Totem Pulse Enabled"],
order = 3,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.totemPulseEnabled end,
args = {
barFrame = {
type = "group",
name = L["Bar"],
order = 2,
args = {
headerSize = {
type = "header",
name = L["Size"],
order = 10,
},
totemPulseBarHeight = Gladdy:option({
type = "range",
name = L["Bar height"],
desc = L["Height of the bar"],
order = 11,
min = 0.1,
max = 200,
step = .1,
width = "full",
}),
totemPulseBarWidth = Gladdy:option({
type = "range",
name = L["Bar width"],
desc = L["Width of the bar"],
order = 12,
min = 0.1,
max = 600,
step = .1,
width = "full",
}),
headerTexture = {
type = "header",
name = L["Texture"],
order = 20,
},
totemPulseBarTexture = Gladdy:option({
type = "select",
name = L["Bar texture"],
desc = L["Texture of the bar"],
order = 21,
dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar,
}),
totemPulseBarColor = Gladdy:colorOption({
type = "color",
name = L["Bar color"],
desc = L["Color of the cast bar"],
order = 22,
hasAlpha = true,
}),
totemPulseBarBgColor = Gladdy:colorOption({
type = "color",
name = L["Background color"],
desc = L["Color of the cast bar background"],
order = 23,
hasAlpha = true,
}),
headerBorder = {
type = "header",
name = L["Border"],
order = 30,
},
totemPulseBarBorderSize = Gladdy:option({
type = "range",
name = L["Border size"],
order = 31,
min = 0.5,
max = Gladdy.db.castBarHeight/2,
step = 0.5,
width = "full",
}),
totemPulseBarBorderStyle = Gladdy:option({
type = "select",
name = L["Status Bar border"],
order = 32,
dialogControl = "LSM30_Border",
values = AceGUIWidgetLSMlists.border,
}),
totemPulseBarBorderColor = Gladdy:colorOption({
type = "color",
name = L["Status Bar border color"],
order = 33,
hasAlpha = true,
}),
},
},
cooldownFrame = {
type = "group",
name = L["Cooldown"],
order = 3,
args = {
headerSize = {
type = "header",
name = L["Frame"],
order = 10,
},
totemPulseCooldownHeight = Gladdy:option({
type = "range",
name = L["Height"],
order = 11,
min = 0.1,
max = 200,
step = .1,
width = "full",
}),
totemPulseCooldownWidth = Gladdy:option({
type = "range",
name = L["Width"],
order = 12,
min = 0.1,
max = 600,
step = .1,
width = "full",
}),
totemPulseCooldownAlpha = Gladdy:option({
type = "range",
name = L["Alpha"],
order = 21,
min = 0.1,
max = 1,
step = .1,
width = "full",
}),
},
},
text = {
type = "group",
name = L["Text"],
order = 4,
args = {
headerSize = {
type = "header",
name = L["Text"],
order = 10,
},
totemPulseTextSize = Gladdy:option({
type = "range",
name = L["Size"],
order = 11,
min = 0.5,
max = 30,
step = 0.5,
width = "full",
}),
totemPulseTextFont = Gladdy:option({
type = "select",
name = L["Font"],
desc = L["Font of the bar"],
order = 12,
dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font,
}),
totemPulseTextColor = Gladdy:colorOption({
type = "color",
name = L["Font color"],
desc = L["Color of the text"],
order = 13,
hasAlpha = true,
}),
},
},
},
},
customizeTotems = {
order = 50,
name = L["Customize Totems"],
type = "group",
childGroups = "tree",
disabled = function() return not Gladdy.db.totemPulseEnabled end,
args = select(1, TotemOptions())
},
}
end

View File

@ -1,4 +1,4 @@
local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber local ceil, str_gsub = ceil, string.gsub
local C_PvP = C_PvP local C_PvP = C_PvP
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
@ -6,24 +6,42 @@ local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Trinket = Gladdy:NewModule("Trinket", nil, { local Trinket = Gladdy:NewModule("Trinket", 80, {
trinketFont = "DorisPP", trinketFont = "DorisPP",
trinketFontScale = 1, trinketFontScale = 1,
trinketFontEnabled = true,
trinketEnabled = true, trinketEnabled = true,
trinketSize = 60 + 20 + 1, trinketSize = 60 + 20 + 1,
trinketWidthFactor = 0.9, trinketWidthFactor = 0.9,
trinketPos = "RIGHT",
trinketBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", trinketBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
trinketBorderColor = { r = 0, g = 0, b = 0, a = 1 }, trinketBorderColor = { r = 0, g = 0, b = 0, a = 1 },
trinketDisableCircle = false, trinketDisableCircle = false,
trinketCooldownAlpha = 1, trinketCooldownAlpha = 1,
trinketCooldownNumberAlpha = 1,
trinketXOffset = 0,
trinketYOffset = 0,
trinketFrameStrata = "MEDIUM",
trinketFrameLevel = 5,
trinketColored = false,
trinketColoredCd = { r = 1, g = 0, b = 0, a = 1 },
trinketColoredNoCd = { r = 0, g = 1, b = 0, a = 1 },
trinketGroup = false,
trinketGroupDirection = "DOWN",
}) })
LibStub("AceComm-3.0"):Embed(Trinket)
function Trinket:Initialize() function Trinket:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA")
end
end
self:RegisterMessage("JOINED_ARENA") function Trinket:UpdateFrameOnce()
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end end
local function iconTimer(self, elapsed) local function iconTimer(self, elapsed)
@ -32,6 +50,9 @@ local function iconTimer(self, elapsed)
self.active = false self.active = false
self.cooldown:Clear() self.cooldown:Clear()
Gladdy:SendMessage("TRINKET_READY", self.unit) Gladdy:SendMessage("TRINKET_READY", self.unit)
if Gladdy.db.trinketColored then
self:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredNoCd))
end
else else
self.timeLeft = self.timeLeft - elapsed self.timeLeft = self.timeLeft - elapsed
end end
@ -39,30 +60,23 @@ local function iconTimer(self, elapsed)
local timeLeft = ceil(self.timeLeft) local timeLeft = ceil(self.timeLeft)
if timeLeft >= 60 then if timeLeft >= 60 then
-- more than 1 minute self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.trinketCooldownNumberAlpha)
self.cooldownFont:SetTextColor(1, 1, 0) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE")
self.cooldownFont:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60))) elseif timeLeft < 60 and timeLeft >= 30 then
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.trinketCooldownNumberAlpha)
elseif timeLeft < 60 and timeLeft >= 21 then self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
-- between 60s and 21s (green) elseif timeLeft < 30 and timeLeft >= 11 then
self.cooldownFont:SetTextColor(0.7, 1, 0) self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.trinketCooldownNumberAlpha)
self.cooldownFont:SetText(timeLeft) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 20.9 and timeLeft >= 11 then
-- between 20s and 11s (green)
self.cooldownFont:SetTextColor(0, 1, 0)
self.cooldownFont:SetText(timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft <= 10 and timeLeft >= 5 then elseif timeLeft <= 10 and timeLeft >= 5 then
-- between 10s and 5s (orange) self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.trinketCooldownNumberAlpha)
self.cooldownFont:SetTextColor(1, 0.7, 0) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
self.cooldownFont:SetFormattedText("%.1f", timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then elseif timeLeft < 5 and timeLeft > 0 then
-- between 5s and 1s (red) self.cooldownFont:SetTextColor(1, 0, 0, Gladdy.db.trinketCooldownNumberAlpha)
self.cooldownFont:SetTextColor(1, 0, 0) self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0) end
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") if Gladdy.db.trinketFontEnabled then
Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true)
else else
self.cooldownFont:SetText("") self.cooldownFont:SetText("")
end end
@ -70,28 +84,41 @@ local function iconTimer(self, elapsed)
end end
function Trinket:CreateFrame(unit) function Trinket:CreateFrame(unit)
local trinket = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit]) local trinket = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
trinket:SetBackdrop({bgFile = "Interface\\AddOns\\Gladdy\\Images\\trinket" })
trinket:EnableMouse(false)
trinket:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket:SetFrameLevel(Gladdy.db.trinketFrameLevel)
trinket.texture = trinket:CreateTexture(nil, "BACKGROUND") trinket.texture = trinket:CreateTexture(nil, "BACKGROUND")
trinket.texture:SetAllPoints(trinket) trinket.texture:SetAllPoints(trinket)
trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02") trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
trinket.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
trinket.cooldown = CreateFrame("Cooldown", nil, trinket, "CooldownFrameTemplate") trinket.cooldown = CreateFrame("Cooldown", nil, trinket, "CooldownFrameTemplate")
trinket.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC trinket.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC
trinket.cooldown:SetHideCountdownNumbers(true) trinket.cooldown:SetHideCountdownNumbers(true)
trinket.cooldown:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldown:SetFrameLevel(Gladdy.db.trinketFrameLevel + 1)
trinket.cooldownFrame = CreateFrame("Frame", nil, trinket) trinket.cooldownFrame = CreateFrame("Frame", nil, trinket)
trinket.cooldownFrame:ClearAllPoints() trinket.cooldownFrame:ClearAllPoints()
trinket.cooldownFrame:SetPoint("TOPLEFT", trinket, "TOPLEFT") trinket.cooldownFrame:SetPoint("TOPLEFT", trinket, "TOPLEFT")
trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", trinket, "BOTTOMRIGHT") trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", trinket, "BOTTOMRIGHT")
trinket.cooldownFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldownFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 2)
trinket.cooldownFont = trinket.cooldownFrame:CreateFontString(nil, "OVERLAY") trinket.cooldownFont = trinket.cooldownFrame:CreateFontString(nil, "OVERLAY")
trinket.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), 20, "OUTLINE") trinket.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), 20, "OUTLINE")
--trinket.cooldownFont:SetAllPoints(trinket.cooldown) --trinket.cooldownFont:SetAllPoints(trinket.cooldown)
trinket.cooldownFont:SetJustifyH("CENTER") trinket.cooldownFont:SetJustifyH("CENTER")
trinket.cooldownFont:SetPoint("CENTER") trinket.cooldownFont:SetPoint("CENTER")
trinket.borderFrame = CreateFrame("Frame", nil, trinket) trinket.borderFrame = CreateFrame("Frame", nil, trinket)
trinket.borderFrame:SetAllPoints(trinket) trinket.borderFrame:SetAllPoints(trinket)
trinket.borderFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.borderFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 3)
trinket.texture.overlay = trinket.borderFrame:CreateTexture(nil, "OVERLAY") trinket.texture.overlay = trinket.borderFrame:CreateTexture(nil, "OVERLAY")
trinket.texture.overlay:SetAllPoints(trinket) trinket.texture.overlay:SetAllPoints(trinket)
trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle) trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle)
@ -110,8 +137,29 @@ function Trinket:UpdateFrame(unit)
return return
end end
if Gladdy.db.trinketColored then
if trinket.active then
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredCd))
else
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredNoCd))
end
trinket.texture:SetTexture()
else
trinket:SetBackdropColor(0,0,0,0)
trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
end
local width, height = Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor, Gladdy.db.trinketSize local width, height = Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor, Gladdy.db.trinketSize
trinket:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket:SetFrameLevel(Gladdy.db.trinketFrameLevel)
trinket.cooldown:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldown:SetFrameLevel(Gladdy.db.trinketFrameLevel + 1)
trinket.cooldownFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldownFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 2)
trinket.borderFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.borderFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 3)
trinket:SetWidth(width) trinket:SetWidth(width)
trinket:SetHeight(height) trinket:SetHeight(height)
trinket.cooldown:SetWidth(width - width/16) trinket.cooldown:SetWidth(width - width/16)
@ -125,25 +173,44 @@ function Trinket:UpdateFrame(unit)
trinket.texture:SetAllPoints(trinket) trinket.texture:SetAllPoints(trinket)
trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle) trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle)
trinket.texture.overlay:SetVertexColor(Gladdy.db.trinketBorderColor.r, Gladdy.db.trinketBorderColor.g, Gladdy.db.trinketBorderColor.b, Gladdy.db.trinketBorderColor.a) trinket.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.trinketBorderColor))
trinket:ClearAllPoints() Gladdy:SetPosition(trinket, unit, "trinketXOffset", "trinketYOffset", Trinket:LegacySetPosition(trinket, unit), Trinket)
local margin = Gladdy.db.highlightBorderSize + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then if (Gladdy.db.trinketGroup) then
if (Gladdy.db.trinketPos == "RIGHT") then if (unit ~= "arena1") then
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", margin, 0) local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
else self.frames[unit]:ClearAllPoints()
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].classIcon, "TOPLEFT", -Gladdy.db.padding, 0) if Gladdy.db.trinketGroupDirection == "RIGHT" then
end self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
else elseif Gladdy.db.trinketGroupDirection == "LEFT" then
if (Gladdy.db.trinketPos == "RIGHT") then self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].classIcon, "TOPRIGHT", Gladdy.db.padding, 0) elseif Gladdy.db.trinketGroupDirection == "UP" then
else self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0) elseif Gladdy.db.trinketGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end end
end end
if (Gladdy.db.trinketEnabled == false) then if (unit == "arena1") then
Gladdy:CreateMover(trinket,"trinketXOffset", "trinketYOffset", L["Trinket"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor,
Gladdy.db.trinketSize,
0,
0, "trinketEnabled")
end
trinket.cooldown:SetAlpha(Gladdy.db.trinketCooldownAlpha)
if Gladdy.db.trinketDisableCircle then
trinket.cooldown:Hide()
else
trinket.cooldown:Show()
end
if (not Gladdy.db.trinketEnabled) then
trinket:Hide() trinket:Hide()
else else
trinket:Show() trinket:Show()
@ -207,6 +274,9 @@ function Trinket:Used(unit, startTime, duration)
trinket.timeLeft = (startTime/1000.0 + duration/1000.0) - GetTime() trinket.timeLeft = (startTime/1000.0 + duration/1000.0) - GetTime()
if not Gladdy.db.trinketDisableCircle then trinket.cooldown:SetCooldown(startTime/1000.0, duration/1000.0) end if not Gladdy.db.trinketDisableCircle then trinket.cooldown:SetCooldown(startTime/1000.0, duration/1000.0) end
trinket.active = true trinket.active = true
if Gladdy.db.trinketColored then
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredCd))
end
Gladdy:SendMessage("TRINKET_USED", unit) Gladdy:SendMessage("TRINKET_USED", unit)
end end
end end
@ -224,11 +294,55 @@ function Trinket:GetOptions()
desc = L["Enable trinket icon"], desc = L["Enable trinket icon"],
order = 3, order = 3,
}), }),
trinketColored = Gladdy:option({
type = "toggle",
name = L["Colored trinket"],
desc = L["Shows a solid colored icon when off/off CD."],
order = 4,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketColoredCd = Gladdy:colorOption({
type = "color",
name = L["Colored trinket CD"],
desc = L["Color of the border"],
order = 5,
hasAlpha = true,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketColoredNoCd = Gladdy:colorOption({
type = "color",
name = L["Colored trinket No CD"],
desc = L["Color of the border"],
order = 6,
hasAlpha = true,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketGroup = Gladdy:option({
type = "toggle",
name = L["Group Class Icons"],
order = 7,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 8,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.trinketGroup or not Gladdy.db.trinketEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = "Frame", name = L["Frame"],
order = 4, order = 5,
disabled = function() return not Gladdy.db.trinketEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -238,15 +352,16 @@ function Trinket:GetOptions()
header = { header = {
type = "header", type = "header",
name = L["Size"], name = L["Size"],
order = 4, order = 1,
}, },
trinketSize = Gladdy:option({ trinketSize = Gladdy:option({
type = "range", type = "range",
name = L["Trinket size"], name = L["Size"],
min = 5, min = 5,
max = 100, max = 100,
step = 1, step = 1,
order = 4, order = 4,
width = "full",
}), }),
trinketWidthFactor = Gladdy:option({ trinketWidthFactor = Gladdy:option({
type = "range", type = "range",
@ -255,6 +370,7 @@ function Trinket:GetOptions()
max = 2, max = 2,
step = 0.05, step = 0.05,
order = 6, order = 6,
width = "full",
}), }),
}, },
}, },
@ -272,6 +388,7 @@ function Trinket:GetOptions()
type = "toggle", type = "toggle",
name = L["No Cooldown Circle"], name = L["No Cooldown Circle"],
order = 7, order = 7,
width = "full",
}), }),
trinketCooldownAlpha = Gladdy:option({ trinketCooldownAlpha = Gladdy:option({
type = "range", type = "range",
@ -280,6 +397,16 @@ function Trinket:GetOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
order = 8, order = 8,
width = "full",
}),
trinketCooldownNumberAlpha = Gladdy:option({
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 9,
width = "full",
}), }),
}, },
}, },
@ -291,13 +418,19 @@ function Trinket:GetOptions()
header = { header = {
type = "header", type = "header",
name = L["Font"], name = L["Font"],
order = 4, order = 1,
}, },
trinketFontEnabled = Gladdy:option({
type = "toggle",
name = L["Font Enabled"],
order = 2,
width = "full",
}),
trinketFont = Gladdy:option({ trinketFont = Gladdy:option({
type = "select", type = "select",
name = L["Font"], name = L["Font"],
desc = L["Font of the cooldown"], desc = L["Font of the cooldown"],
order = 11, order = 3,
dialogControl = "LSM30_Font", dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font, values = AceGUIWidgetLSMlists.font,
}), }),
@ -305,32 +438,41 @@ function Trinket:GetOptions()
type = "range", type = "range",
name = L["Font scale"], name = L["Font scale"],
desc = L["Scale of the font"], desc = L["Scale of the font"],
order = 12, order = 4,
min = 0.1, min = 0.1,
max = 2, max = 2,
step = 0.1, step = 0.1,
width = "full",
}), }),
}, },
}, },
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 4, order = 5,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Position"], name = L["Icon position"],
order = 4, order = 4,
}, },
trinketPos = Gladdy:option({ trinketXOffset = Gladdy:option({
type = "select", type = "range",
name = L["Trinket position"], name = L["Horizontal offset"],
desc = L["This changes positions of the trinket"], order = 23,
order = 21, min = -800,
values = { max = 800,
["LEFT"] = L["Left"], step = 0.1,
["RIGHT"] = L["Right"], width = "full",
}, }),
trinketYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 24,
min = -800,
max = 800,
step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -359,7 +501,63 @@ function Trinket:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
trinketFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
trinketFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end
---------------------------
-- LAGACY HANDLER
---------------------------
function Trinket:LegacySetPosition(trinket, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
trinket:ClearAllPoints()
local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
if (Gladdy.db.trinketPos == "RIGHT") then
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", margin, 0)
else
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].classIcon, "TOPLEFT", -Gladdy.db.padding, 0)
end
else
if (Gladdy.db.trinketPos == "RIGHT") then
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].classIcon, "TOPRIGHT", Gladdy.db.padding, 0)
else
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
end
end
end end

View File

@ -1,9 +1,11 @@
local str_match, tonumber, tostring = string.match, tonumber, tostring local tonumber, tostring, str_format = tonumber, tostring, string.format
local UnitName = UnitName local UnitName = UnitName
local IsInGroup, IsInRaid = IsInGroup, IsInRaid
local LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local VersionCheck = Gladdy:NewModule("VersionCheck", 1, { local VersionCheck = Gladdy:NewModule("VersionCheck", 1, {
}) })
LibStub("AceComm-3.0"):Embed(VersionCheck) LibStub("AceComm-3.0"):Embed(VersionCheck)
@ -21,6 +23,13 @@ end
function VersionCheck:JOINED_ARENA() function VersionCheck:JOINED_ARENA()
self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived) self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived)
if IsInRaid(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "RAID", self.playerName)
elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) or IsInRaid(LE_PARTY_CATEGORY_INSTANCE) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "INSTANCE_CHAT", self.playerName)
elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "PARTY", self.playerName)
end
end end
function VersionCheck:Test(unit) function VersionCheck:Test(unit)
@ -32,14 +41,14 @@ end
function VersionCheck.OnCommReceived(prefix, message, distribution, sender) function VersionCheck.OnCommReceived(prefix, message, distribution, sender)
if sender ~= VersionCheck.playerName then if sender ~= VersionCheck.playerName then
local addonVersion = Gladdy.version_num local addonVersion = str_format("%.2f", Gladdy.version_num)
message = tonumber(message) local message_num = tonumber(message) or 0
if message and message <= Gladdy.version_num then if message and message_num <= Gladdy.version_num then
--Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date") --Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date")
else else
Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"") Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"")
Gladdy:Warn("Please download the latest Gladdy version at:") Gladdy:Warn("Please download the latest Gladdy version at:")
Gladdy:Warn("https://github.com/XiconQoo/Gladdy-TBC") Gladdy:Warn("https://www.curseforge.com/wow/addons/gladdy-tbc or https://github.com/XiconQoo/Gladdy-TBC")
end end
end end
end end

View File

@ -4,94 +4,172 @@ local L = Gladdy.L
local XiconProfiles = Gladdy:NewModule("XiconProfiles", nil, { local XiconProfiles = Gladdy:NewModule("XiconProfiles", nil, {
}) })
function XiconProfiles:ApplyKlimp() local function applyProfile(profileString)
local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetKlimpProfile()) local deserialized = Gladdy.modules["Export Import"]:Decode(profileString)
if deserialized then if deserialized then
Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db) Gladdy.modules["Export Import"]:ApplyImport(deserialized, Gladdy.db)
end
Gladdy:Reset()
Gladdy:HideFrame()
Gladdy:ToggleFrame(3)
end
function XiconProfiles:ApplyKnall()
local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetKnallProfile())
if deserialized then
Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db)
end
Gladdy:Reset()
Gladdy:HideFrame()
Gladdy:ToggleFrame(3)
end
function XiconProfiles:ApplyClassic()
local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetClassicProfile())
if deserialized then
Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db)
end end
Gladdy:Reset() Gladdy:Reset()
Gladdy:HideFrame() Gladdy:HideFrame()
Gladdy:ToggleFrame(3) Gladdy:ToggleFrame(3)
Gladdy.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
Gladdy.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end end
function XiconProfiles:GetOptions() function XiconProfiles:GetOptions()
return { return {
headerProfileBlizzard = {
type = "header",
name = "Blizzard " .. L["Profile"],
order = 2,
},
blizzardProfile = {
type = "execute",
func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
applyProfile(Gladdy:GetBlizzardProfile())
end,
name = " ",
desc = "Blizzard " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Blizz1.blp",
imageWidth = 350,
imageHeight = 175,
width = "full",
order = 3,
},
headerProfileClassic = { headerProfileClassic = {
type = "header", type = "header",
name = L["Classic Profile"], name = "Classic " .. L["Profile"],
order = 2, order = 4,
}, },
classicProfile = { classicProfile = {
type = "execute", type = "execute",
func = function() func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile()) Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
XiconProfiles:ApplyClassic() applyProfile(Gladdy:GetClassicProfile())
end, end,
name = " ", name = " ",
desc = "Classic Profile", desc = "Classic " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Classic1.blp", image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Classic1.blp",
imageWidth = 256, imageWidth = 350,
imageHeight = 128, imageHeight = 175,
width = "full", width = "full",
order = 3, order = 5,
},
headerProfileClassicNoPet = {
type = "header",
name = "Classic " .. L["Profile"] .. L[" No Pet"],
order = 6,
},
classicProfileNoPet = {
type = "execute",
func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
applyProfile(Gladdy:GetClassicProfileNoPet())
end,
name = " ",
desc = "Classic " .. L["Profile"] .. L[" No Pet"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Classic2.blp",
imageWidth = 350,
imageHeight = 175,
width = "full",
order = 7,
}, },
headerProfileKnall = { headerProfileKnall = {
type = "header", type = "header",
name = L["Knall's Profile"], name = "Knall's " .. L["Profile"],
order = 4, order = 8,
}, },
knallProfile = { knallProfile = {
type = "execute", type = "execute",
func = function() func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile()) Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
XiconProfiles:ApplyKnall() applyProfile(Gladdy:GetKnallProfile())
end, end,
name = " ", name = " ",
desc = "Knall's Profile", desc = "Knall's " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Knall1.blp", image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Knall1.blp",
imageWidth = 256, imageWidth = 350,
imageHeight = 128, imageHeight = 175,
width = "full", width = "full",
order = 5, order = 9,
}, },
headerProfileKlimp = { headerProfileKlimp = {
type = "header", type = "header",
name = L["Klimp's Profile"], name = "Klimp's " .. L["Profile"],
order = 6, order = 10,
}, },
klimpProfiles = { klimpProfiles = {
type = "execute", type = "execute",
func = function() func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile()) Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
XiconProfiles:ApplyKlimp() applyProfile(Gladdy:GetKlimpProfile())
end, end,
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Klimp1.blp", image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Klimp1.blp",
imageWidth = 256, imageWidth = 350,
imageHeight = 128, imageHeight = 175,
name = " ", name = " ",
desc = "Klimp's Profile", desc = "Klimp's " .. L["Profile"],
width = "full", width = "full",
order = 7, order = 11,
},
headerProfileRukk = {
type = "header",
name = "Rukk1's " .. L["Profile"],
order = 12,
},
rukkProfile = {
type = "execute",
func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
applyProfile(Gladdy:GetRukkProfile())
end,
name = " ",
desc = "Rukk1's " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Rukk1.blp",
imageWidth = 350,
imageHeight = 175,
width = "full",
order = 13,
},
headerProfileMir = {
type = "header",
name = "Mir's " .. L["Profile"],
order = 14,
},
mirProfile = {
type = "execute",
func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
applyProfile(Gladdy:GetMirProfile())
end,
name = " ",
desc = "Mir's " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Mir1.blp",
imageWidth = 350,
imageHeight = 175,
width = "full",
order = 15,
},
headerProfileMirEdited = {
type = "header",
name = "Mir's " .. L["Profile"] .. " edited",
order = 16,
},
mirProfileEdited = {
type = "execute",
func = function()
Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
applyProfile(Gladdy:GetMirEditedProfile())
end,
name = " ",
desc = "Mir's " .. L["Profile"],
image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Mir1_edited.blp",
imageWidth = 350,
imageHeight = 175,
width = "full",
order = 17,
}, },
} }
end end

View File

@ -1,39 +1,75 @@
local type, pairs, tinsert, tsort, tostring = type, pairs, table.insert, table.sort, tostring local type, pairs, tinsert, tsort = type, pairs, table.insert, table.sort
local tostring, str_match, tonumber, str_format = tostring, string.match, tonumber, string.format
local ceil, floor = ceil, floor
local ReloadUI = ReloadUI
local InterfaceOptionsFrame_OpenToFrame = InterfaceOptionsFrame_OpenToFrame local InterfaceOptionsFrame_OpenToFrame = InterfaceOptionsFrame_OpenToFrame
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local LibClassAuras = LibStub("LibClassAuras-1.0") local LibClassAuras = LibStub("LibClassAuras-1.0")
local L = Gladdy.L local L = Gladdy.L
Gladdy.TIMER_FORMAT = { tenths = "tenths", seconds = "seconds",
values = {
["tenths"] = "xx:xx Miliseconds",
["seconds"] = "xx Seconds"
}}
function Gladdy:FormatTimer(fontString, timeLeft, milibreakpoint, showSeconds)
if timeLeft < 0 then
fontString:SetText("")
return
end
local time = timeLeft >= 0.0 and timeLeft or 0.0
if Gladdy.db.timerFormat == Gladdy.TIMER_FORMAT.tenths and milibreakpoint then
fontString:SetFormattedText("%.1f", time)
else
if time >= 60 then
if showSeconds then
fontString:SetText(floor(timeLeft / 60) .. ":" .. str_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60)))
else
fontString:SetText(ceil(ceil(time / 60)) .. "m")
end
else
fontString:SetFormattedText("%d", ceil(time))
end
end
end
Gladdy.defaults = { Gladdy.defaults = {
profile = { profile = {
locked = false, locked = false,
hideBlizzard = "arena",
x = 0, x = 0,
y = 0, y = 0,
growUp = false, growDirection = "BOTTOM",
growMiddle = false,
frameScale = 1, frameScale = 1,
padding = 3, pixelPerfect = false,
barWidth = 180, barWidth = 180,
bottomMargin = 10, bottomMargin = 2,
statusbarBorderOffset = 7, statusbarBorderOffset = 6,
timerFormat = Gladdy.TIMER_FORMAT.tenths,
backgroundColor = {r = 0, g = 0, b = 0, a = 0},
newLayout = false,
showMover = true,
}, },
} }
SLASH_GLADDY1 = "/gladdy" SLASH_GLADDY1 = "/gladdy"
SlashCmdList["GLADDY"] = function(msg) SlashCmdList["GLADDY"] = function(msg)
if (msg == "test2") then if (str_match(msg, "test[1-5]")) then
Gladdy:ToggleFrame(2) local _, num = str_match(msg, "(test)([1-5])")
elseif (msg == "test5") then Gladdy:ToggleFrame(tonumber(num))
Gladdy:ToggleFrame(5) elseif (msg == "test") then
elseif (msg:find("test")) then
Gladdy:ToggleFrame(3) Gladdy:ToggleFrame(3)
elseif (msg == "ui" or msg == "options" or msg == "config") then elseif (msg == "ui" or msg == "options" or msg == "config") then
LibStub("AceConfigDialog-3.0"):Open("Gladdy") LibStub("AceConfigDialog-3.0"):Open("Gladdy")
--Gladdy:ShowOptions()
elseif (msg == "reset") then elseif (msg == "reset") then
Gladdy.dbi:ResetProfile() Gladdy.dbi:ResetProfile()
elseif (msg == "hide") then elseif (msg == "hide") then
@ -42,7 +78,8 @@ SlashCmdList["GLADDY"] = function(msg)
else else
Gladdy:Print(L["Valid slash commands are:"]) Gladdy:Print(L["Valid slash commands are:"])
Gladdy:Print("/gladdy ui") Gladdy:Print("/gladdy ui")
Gladdy:Print("/gladdy test2-5") Gladdy:Print("/gladdy test")
Gladdy:Print("/gladdy test1-5")
Gladdy:Print("/gladdy hide") Gladdy:Print("/gladdy hide")
Gladdy:Print("/gladdy reset") Gladdy:Print("/gladdy reset")
end end
@ -68,6 +105,13 @@ function Gladdy:option(params)
return defaults return defaults
end end
function Gladdy:SetColor(option, factor, altAlpha)
if not factor then
factor = 1
end
return option.r / factor, option.g / factor, option.b / factor, altAlpha or option.a
end
function Gladdy:colorOption(params) function Gladdy:colorOption(params)
local defaults = { local defaults = {
get = function(info) get = function(info)
@ -96,6 +140,11 @@ local function setOpt(info, value)
local key = info.arg or info[#info] local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value Gladdy.dbi.profile[key] = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
if Gladdy.db.hideBlizzard == "always" then
SetCVar("showArenaEnemyFrames", 0)
elseif Gladdy.db.hideBlizzard == "never" then
SetCVar("showArenaEnemyFrames", 1)
end
end end
local function getColorOpt(info) local function getColorOpt(info)
local key = info.arg or info[#info] local key = info.arg or info[#info]
@ -113,7 +162,7 @@ function Gladdy:SetupModule(name, module, order)
self.options.args[name] = { self.options.args[name] = {
type = "group", type = "group",
name = L[name], name = L[name],
desc = L[name .. " settings"], desc = L[name] .. " " .. L["settings"],
childGroups = "tab", childGroups = "tab",
order = order, order = order,
args = {}, args = {},
@ -151,7 +200,7 @@ local function pairsByKeys(t)
for k in pairs(t) do for k in pairs(t) do
tinsert(a, k) tinsert(a, k)
end end
tsort(a) tsort(a, function(a, b) return L[a] < L[b] end)
local i = 0 local i = 0
return function() return function()
@ -168,35 +217,105 @@ end
function Gladdy:SetupOptions() function Gladdy:SetupOptions()
self.options = { self.options = {
type = "group", type = "group",
name = "Gladdy", name = L["Gladdy"],
plugins = {}, plugins = {},
childGroups = "tree", childGroups = "tree",
get = getOpt, get = getOpt,
set = setOpt, set = setOpt,
args = { args = {
lock = {
order = 1,
width = 0.7,
name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"],
desc = L["Toggle if frame can be moved"],
type = "execute",
func = function()
Gladdy.db.locked = not Gladdy.db.locked
Gladdy:UpdateFrame()
self.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
end,
},
showMover = {
order = 2,
width = 0.7,
name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"],
desc = L["Toggle to show Mover Frames"],
type = "execute",
func = function()
Gladdy.db.showMover = not Gladdy.db.showMover
Gladdy:UpdateFrame()
self.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
end,
},
test = {
order = 2,
width = 0.7,
name = L["Test"],
desc = L["Show Test frames"],
type = "execute",
func = function()
Gladdy:ToggleFrame(3)
end,
},
hide = {
order = 3,
width = 0.7,
name = L["Hide"],
desc = L["Hide frames"],
type = "execute",
func = function()
Gladdy:Reset()
Gladdy:HideFrame()
end,
},
reload = {
order = 4,
width = 0.7,
name = L["ReloadUI"],
desc = L["Reloads the UI"],
type = "execute",
func = function()
ReloadUI()
end,
},
version = {
order = 5,
width = 1,
type = "description",
name = " " .. Gladdy.version
},
general = { general = {
type = "group", type = "group",
name = L["General"], name = L["General"],
desc = L["General settings"], desc = L["General settings"],
childGroups = "tab", childGroups = "tab",
order = 1, order = 5,
args = { args = {
locked = { growDirection = {
type = "toggle", type = "select",
name = L["Lock frame"], name = L["Grow Direction"],
desc = L["Toggle if frame can be moved"], order = 3,
order = 1, values = {
["BOTTOM"] = L["Down"],
["TOP"] = L["Up"],
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
}
}, },
growUp = { hideBlizzard = {
type = "toggle", type = "select",
name = L["Grow frame upwards"], name = L["Hide Blizzard"],
desc = L["If enabled the frame will grow upwards instead of downwards"], values = {
order = 2, ["arena"] = L["Arena only"],
["never"] = L["Never"],
["always"] = L["Always"],
},
order = 4,
}, },
group = { group = {
type = "group", type = "group",
name = "General", name = L["General"],
order = 3, order = 6,
childGroups = "tree", childGroups = "tree",
args = { args = {
frameGeneral = { frameGeneral = {
@ -207,44 +326,57 @@ function Gladdy:SetupOptions()
headerFrame = { headerFrame = {
type = "header", type = "header",
name = L["Frame General"], name = L["Frame General"],
order = 2,
},
growMiddle = {
type = "toggle",
name = L["Grow Middle"],
desc = L["Frames expand along a centric anchor"],
order = 3, order = 3,
}, },
pixelPerfect = {
type = "toggle",
name = L["Pixel Perfect Scale"],
desc = L["Enables Pixel Perfect Scale - disables manual "].. L["Frame scale"],
order = 4,
},
frameScale = { frameScale = {
type = "range", type = "range",
name = L["Frame scale"], name = L["Frame scale"],
desc = L["Scale of the frame"], desc = L["Scale of the frame"],
order = 4, disabled = function() return Gladdy.db.pixelPerfect end,
order = 5,
min = .1, min = .1,
max = 2, max = 2,
step = .1, step = .01,
},
padding = {
type = "range",
name = L["Frame padding"],
desc = L["Padding of the frame"],
order = 5,
min = 0,
max = 20,
step = 1,
}, },
barWidth = { barWidth = {
type = "range", type = "range",
name = L["Frame width"], name = L["Frame width"],
desc = L["Width of the bars"], desc = L["Width of the bars"],
order = 6, order = 7,
min = 10, min = 10,
max = 500, max = 500,
step = 5, step = 5,
}, },
bottomMargin = { bottomMargin = {
type = "range", type = "range",
name = L["Bottom margin"], name = L["Margin"],
desc = L["Margin between each button"], desc = L["Margin between each button"],
order = 7, order = 8,
min = -100, min = -200,
max = 100, max = 200,
step = 1, step = 1,
}, },
backgroundColor = {
type = "color",
name = L["Background color"],
desc = L["Background Color of the frame"],
order = 9,
hasAlpha = true,
get = getColorOpt,
set = setColorOpt,
},
} }
}, },
cooldownGeneral = { cooldownGeneral = {
@ -267,7 +399,8 @@ function Gladdy:SetupOptions()
local c = Gladdy.db.trinketDisableCircle local c = Gladdy.db.trinketDisableCircle
local d = Gladdy.db.drDisableCircle local d = Gladdy.db.drDisableCircle
local e = Gladdy.db.buffsDisableCircle local e = Gladdy.db.buffsDisableCircle
if (a == b and a == c and a == d and a == e) then local f = Gladdy.db.racialDisableCircle
if (a == b and a == c and a == d and a == e and a == f) then
return a return a
else else
return "" return ""
@ -279,6 +412,7 @@ function Gladdy:SetupOptions()
Gladdy.db.trinketDisableCircle = value Gladdy.db.trinketDisableCircle = value
Gladdy.db.drDisableCircle = value Gladdy.db.drDisableCircle = value
Gladdy.db.buffsDisableCircle = value Gladdy.db.buffsDisableCircle = value
Gladdy.db.racialDisableCircle = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
width= "full", width= "full",
@ -296,7 +430,8 @@ function Gladdy:SetupOptions()
local c = Gladdy.db.auraCooldownAlpha local c = Gladdy.db.auraCooldownAlpha
local d = Gladdy.db.trinketCooldownAlpha local d = Gladdy.db.trinketCooldownAlpha
local e = Gladdy.db.buffsCooldownAlpha local e = Gladdy.db.buffsCooldownAlpha
if (a == b and a == c and a == d and a == e) then local f = Gladdy.db.racialCooldownAlpha
if (a == b and a == c and a == d and a == e and a == f) then
return a return a
else else
return "" return ""
@ -308,9 +443,16 @@ function Gladdy:SetupOptions()
Gladdy.db.auraCooldownAlpha = value Gladdy.db.auraCooldownAlpha = value
Gladdy.db.trinketCooldownAlpha = value Gladdy.db.trinketCooldownAlpha = value
Gladdy.db.buffsCooldownAlpha = value Gladdy.db.buffsCooldownAlpha = value
Gladdy.db.racialCooldownAlpha = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end end
}, },
timerFormat = Gladdy:option({
type = "select",
name = L["Timer Format"],
order = 11,
values = Gladdy.TIMER_FORMAT.values
})
}, },
}, },
fontGeneral = { fontGeneral = {
@ -331,33 +473,42 @@ function Gladdy:SetupOptions()
dialogControl = "LSM30_Font", dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font, values = AceGUIWidgetLSMlists.font,
get = function(info) get = function(info)
local a = Gladdy.db.castBarFont local a = Gladdy.db.auraFont
local b = Gladdy.db.healthBarFont local b = Gladdy.db.buffsFont
local c = Gladdy.db.powerBarFont local c = Gladdy.db.castBarFont
local d = Gladdy.db.cooldownFont local d = Gladdy.db.cooldownFont
local e = Gladdy.db.drFont local e = Gladdy.db.drFont
local f = Gladdy.db.auraFont local f = Gladdy.db.healthBarFont
local g = Gladdy.db.buffsFont local g = Gladdy.db.petHealthBarFont
if (a == b and a == c and a == d and a == e and a == f and a == g) then local h = Gladdy.db.powerBarFont
local i = Gladdy.db.racialFont
local j = Gladdy.db.npTremorFont
local k = Gladdy.db.trinketFont
if (a == b and a == c and a == d and a == e and a == f
and a == g and a == h and a == i and a == j and a == k) then
return a return a
else else
return "" return ""
end end
end, end,
set = function(info, value) set = function(info, value)
Gladdy.db.castBarFont = value
Gladdy.db.healthBarFont = value
Gladdy.db.powerBarFont = value
Gladdy.db.cooldownFont = value
Gladdy.db.drFont = value
Gladdy.db.auraFont = value Gladdy.db.auraFont = value
Gladdy.db.buffsFont = value Gladdy.db.buffsFont = value
Gladdy.db.castBarFont = value
Gladdy.db.cooldownFont = value
Gladdy.db.drFont = value
Gladdy.db.healthBarFont = value
Gladdy.db.petHealthBarFont = value
Gladdy.db.powerBarFont = value
Gladdy.db.racialFont = value
Gladdy.db.npTremorFont = value
Gladdy.db.trinketFont = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
fontColor = { fontColor = {
type = "color", type = "color",
name = L["Font color"], name = L["Font color text"],
desc = L["Color of the text"], desc = L["Color of the text"],
order = 12, order = 12,
hasAlpha = true, hasAlpha = true,
@ -365,8 +516,10 @@ function Gladdy:SetupOptions()
local a = Gladdy.db.healthBarFontColor local a = Gladdy.db.healthBarFontColor
local b = Gladdy.db.powerBarFontColor local b = Gladdy.db.powerBarFontColor
local c = Gladdy.db.castBarFontColor local c = Gladdy.db.castBarFontColor
local d = Gladdy.db.petHealthBarFontColor
if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a) then and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a
and a.r == d.r and a.g == d.g and a.b == d.b and a.a == d.a) then
return a.r, a.g, a.b, a.a return a.r, a.g, a.b, a.a
else else
return { r = 0, g = 0, b = 0, a = 0 } return { r = 0, g = 0, b = 0, a = 0 }
@ -377,6 +530,35 @@ function Gladdy:SetupOptions()
Gladdy.db.healthBarFontColor = rgb Gladdy.db.healthBarFontColor = rgb
Gladdy.db.powerBarFontColor = rgb Gladdy.db.powerBarFontColor = rgb
Gladdy.db.castBarFontColor = rgb Gladdy.db.castBarFontColor = rgb
Gladdy.db.petHealthBarFontColor = rgb
Gladdy:UpdateFrame()
end,
},
fontColorCD = {
type = "color",
name = L["Font color timer"],
desc = L["Color of the timers"],
order = 12,
hasAlpha = true,
get = function(info)
local a = Gladdy.db.auraFontColor
local b = Gladdy.db.buffsFontColor
local c = Gladdy.db.cooldownFontColor
local d = Gladdy.db.drFontColor
if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a
and a.r == d.r and a.g == d.g and a.b == d.b and a.a == d.a) then
return a.r, a.g, a.b, a.a
else
return { r = 0, g = 0, b = 0, a = 0 }
end
end,
set = function(info, r, g, b, a)
local rgb = {r = r, g = g, b = b, a = a}
Gladdy.db.auraFontColor = rgb
Gladdy.db.buffsFontColor = rgb
Gladdy.db.cooldownFontColor = rgb
Gladdy.db.drFontColor = rgb
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
@ -399,27 +581,34 @@ function Gladdy:SetupOptions()
order = 14, order = 14,
values = Gladdy:GetIconStyles(), values = Gladdy:GetIconStyles(),
get = function(info) get = function(info)
if (Gladdy.db.classIconBorderStyle == Gladdy.db.trinketBorderStyle if (Gladdy.db.auraBorderStyle == Gladdy.db.buffsBorderStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.castBarIconStyle and Gladdy.db.auraBorderStyle == Gladdy.db.castBarIconStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.auraBorderStyle and Gladdy.db.auraBorderStyle == Gladdy.db.classIconBorderStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.cooldownBorderStyle and Gladdy.db.auraBorderStyle == Gladdy.db.cooldownBorderStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.buffsBorderStyle and Gladdy.db.auraBorderStyle == Gladdy.db.ciBorderStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.drBorderStyle and Gladdy.db.auraBorderStyle == Gladdy.db.cooldownBorderStyle
and Gladdy.db.classIconBorderStyle == Gladdy.db.npTotemPlatesBorderStyle) then and Gladdy.db.auraBorderStyle == Gladdy.db.drBorderStyle
return Gladdy.db.classIconBorderStyle and Gladdy.db.auraBorderStyle == Gladdy.db.racialBorderStyle
and Gladdy.db.auraBorderStyle == Gladdy.db.npTotemPlatesBorderStyle
and Gladdy.db.auraBorderStyle == Gladdy.db.petPortraitBorderStyle
and Gladdy.db.auraBorderStyle == Gladdy.db.trinketBorderStyle) then
return Gladdy.db.auraBorderStyle
else else
return "" return ""
end end
end, end,
set = function(info, value) set = function(info, value)
Gladdy.db.classIconBorderStyle = value
Gladdy.db.trinketBorderStyle = value
Gladdy.db.castBarIconStyle = value
Gladdy.db.auraBorderStyle = value Gladdy.db.auraBorderStyle = value
Gladdy.db.npTotemPlatesBorderStyle = value
Gladdy.db.cooldownBorderStyle = value
Gladdy.db.buffsBorderStyle = value Gladdy.db.buffsBorderStyle = value
Gladdy.db.castBarIconStyle = value
Gladdy.db.classIconBorderStyle = value
Gladdy.db.ciBorderStyle = value
Gladdy.db.cooldownBorderStyle = value
Gladdy.db.drBorderStyle = value Gladdy.db.drBorderStyle = value
Gladdy.db.racialBorderStyle = value
Gladdy.db.npTotemPlatesBorderStyle = value
Gladdy.db.petPortraitBorderStyle = value
Gladdy.db.trinketBorderStyle = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
@ -430,11 +619,25 @@ function Gladdy:SetupOptions()
order = 15, order = 15,
hasAlpha = true, hasAlpha = true,
get = function(info) get = function(info)
local a = Gladdy.db.classIconBorderColor local a = Gladdy.db.auraBuffBorderColor
local b = Gladdy.db.trinketBorderColor local b = Gladdy.db.auraDebuffBorderColor
local c = Gladdy.db.castBarIconColor local c = Gladdy.db.buffsBorderColor
local d = Gladdy.db.castBarIconColor
local e = Gladdy.db.classIconBorderColor
local f = Gladdy.db.ciBorderColor
local g = Gladdy.db.cooldownBorderColor
local h = Gladdy.db.drBorderColor
local i = Gladdy.db.trinketBorderColor
local j = Gladdy.db.racialBorderColor
if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a) then and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a
and a.r == d.r and a.g == d.g and a.b == d.b and a.a == d.a
and a.r == e.r and a.g == e.g and a.b == e.b and a.a == e.a
and a.r == f.r and a.g == f.g and a.b == f.b and a.a == f.a
and a.r == g.r and a.g == g.g and a.b == g.b and a.a == g.a
and a.r == h.r and a.g == h.g and a.b == h.b and a.a == h.a
and a.r == i.r and a.g == i.g and a.b == i.b and a.a == i.a
and a.r == j.r and a.g == j.g and a.b == j.b and a.a == j.a) then
return a.r, a.g, a.b, a.a return a.r, a.g, a.b, a.a
else else
return { r = 0, g = 0, b = 0, a = 0 } return { r = 0, g = 0, b = 0, a = 0 }
@ -442,13 +645,16 @@ function Gladdy:SetupOptions()
end, end,
set = function(info, r, g, b, a) set = function(info, r, g, b, a)
local rgb = {r = r, g = g, b = b, a = a} local rgb = {r = r, g = g, b = b, a = a}
Gladdy.db.classIconBorderColor = rgb Gladdy.db.auraBuffBorderColor = rgb
Gladdy.db.trinketBorderColor = rgb Gladdy.db.auraDebuffBorderColor = rgb
Gladdy.db.castBarIconColor = rgb
Gladdy.db.npTotemPlatesBorderColor = rgb
Gladdy.db.drBorderColor = rgb
Gladdy.db.cooldownBorderColor = rgb
Gladdy.db.buffsBorderColor = rgb Gladdy.db.buffsBorderColor = rgb
Gladdy.db.castBarIconColor = rgb
Gladdy.db.classIconBorderColor = rgb
Gladdy.db.ciBorderColor = rgb
Gladdy.db.cooldownBorderColor = rgb
Gladdy.db.drBorderColor = rgb
Gladdy.db.trinketBorderColor = rgb
Gladdy.db.racialBorderColor = rgb
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
@ -475,7 +681,8 @@ function Gladdy:SetupOptions()
local a = Gladdy.db.healthBarTexture local a = Gladdy.db.healthBarTexture
local b = Gladdy.db.powerBarTexture local b = Gladdy.db.powerBarTexture
local c = Gladdy.db.castBarTexture local c = Gladdy.db.castBarTexture
if (a == b and a == c) then local d = Gladdy.db.petHealthBarTexture
if (a == b and a == c and a == d) then
return a return a
else else
return "" return ""
@ -485,6 +692,7 @@ function Gladdy:SetupOptions()
Gladdy.db.healthBarTexture = value Gladdy.db.healthBarTexture = value
Gladdy.db.powerBarTexture = value Gladdy.db.powerBarTexture = value
Gladdy.db.castBarTexture = value Gladdy.db.castBarTexture = value
Gladdy.db.petHealthBarTexture = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
width= "full", width= "full",
@ -500,7 +708,8 @@ function Gladdy:SetupOptions()
local a = Gladdy.db.healthBarBorderStyle local a = Gladdy.db.healthBarBorderStyle
local b = Gladdy.db.powerBarBorderStyle local b = Gladdy.db.powerBarBorderStyle
local c = Gladdy.db.castBarBorderStyle local c = Gladdy.db.castBarBorderStyle
if (a == b and a == c) then local d = Gladdy.db.petHealthBarBorderStyle
if (a == b and a == c and a == d) then
return a return a
else else
return "" return ""
@ -510,6 +719,7 @@ function Gladdy:SetupOptions()
Gladdy.db.healthBarBorderStyle = value Gladdy.db.healthBarBorderStyle = value
Gladdy.db.powerBarBorderStyle = value Gladdy.db.powerBarBorderStyle = value
Gladdy.db.castBarBorderStyle = value Gladdy.db.castBarBorderStyle = value
Gladdy.db.petHealthBarBorderStyle = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
@ -531,8 +741,10 @@ function Gladdy:SetupOptions()
local a = Gladdy.db.castBarBorderColor local a = Gladdy.db.castBarBorderColor
local b = Gladdy.db.healthBarBorderColor local b = Gladdy.db.healthBarBorderColor
local c = Gladdy.db.powerBarBorderColor local c = Gladdy.db.powerBarBorderColor
local d = Gladdy.db.petHealthBarBorderColor
if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a if (a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a) then and a.r == c.r and a.g == c.g and a.b == c.b and a.a == c.a
and a.r == d.r and a.g == d.g and a.b == d.b and a.a == d.a) then
return a.r, a.g, a.b, a.a return a.r, a.g, a.b, a.a
else else
return { r = 0, g = 0, b = 0, a = 0 } return { r = 0, g = 0, b = 0, a = 0 }
@ -543,6 +755,7 @@ function Gladdy:SetupOptions()
Gladdy.db.castBarBorderColor = rgb Gladdy.db.castBarBorderColor = rgb
Gladdy.db.healthBarBorderColor = rgb Gladdy.db.healthBarBorderColor = rgb
Gladdy.db.powerBarBorderColor = rgb Gladdy.db.powerBarBorderColor = rgb
Gladdy.db.petHealthBarBorderColor = rgb
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
}, },
@ -555,19 +768,19 @@ function Gladdy:SetupOptions()
}, },
} }
local order = 2 local order = 6
for k, v in pairsByKeys(self.modules) do for k, v in pairsByKeys(self.modules) do
self:SetupModule(k, v, order) self:SetupModule(k, v, order)
order = order + 1 order = order + 1
end end
local options = { local options = {
name = "Gladdy", name = L["Gladdy"],
type = "group", type = "group",
args = { args = {
load = { load = {
name = "Load configuration", name = L["Load configuration"],
desc = "Load configuration options", desc = L["Load configuration options"],
type = "execute", type = "execute",
func = function() func = function()
HideUIPanel(InterfaceOptionsFrame) HideUIPanel(InterfaceOptionsFrame)
@ -594,22 +807,34 @@ function Gladdy:GetAuras(auraType)
ckeckAll = { ckeckAll = {
order = 1, order = 1,
width = "0.7", width = "0.7",
name = "Check All", name = L["Check All"],
type = "execute", type = "execute",
func = function(info) func = function(info)
for k,v in pairs(Gladdy.dbi.profile.trackedDebuffs) do if auraType == AURA_TYPE_DEBUFF then
Gladdy.dbi.profile.trackedDebuffs[k] = true for k,v in pairs(Gladdy.defaults.profile.trackedDebuffs) do
Gladdy.dbi.profile.trackedDebuffs[k] = true
end
else
for k,v in pairs(Gladdy.defaults.profile.trackedBuffs) do
Gladdy.dbi.profile.trackedBuffs[k] = true
end
end end
end, end,
}, },
uncheckAll = { uncheckAll = {
order = 2, order = 2,
width = "0.7", width = "0.7",
name = "Uncheck All", name = L["Uncheck All"],
type = "execute", type = "execute",
func = function(info) func = function(info)
for k,v in pairs(Gladdy.dbi.profile.trackedDebuffs) do if auraType == AURA_TYPE_DEBUFF then
Gladdy.dbi.profile.trackedDebuffs[k] = false for k,v in pairs(Gladdy.defaults.profile.trackedDebuffs) do
Gladdy.dbi.profile.trackedDebuffs[k] = false
end
else
for k,v in pairs(Gladdy.defaults.profile.trackedBuffs) do
Gladdy.dbi.profile.trackedBuffs[k] = false
end
end end
end, end,
}, },
@ -689,13 +914,12 @@ function Gladdy:GetAuras(auraType)
local defaultDebuffs = {} local defaultDebuffs = {}
local assignForClass = function(class) local assignForClass = function(class)
local args = {} local args = {}
local classSpells = auraType == "debuff" and LibClassAuras.GetClassDebuffs(class) or LibClassAuras.GetClassBuffs(class) local classSpells = auraType == AURA_TYPE_DEBUFF and LibClassAuras.GetClassDebuffs(class) or LibClassAuras.GetClassBuffs(class)
table.sort(classSpells, function(a, b) table.sort(classSpells, function(a, b)
return a.name:upper() < b.name:upper() return a.name:upper() < b.name:upper()
end) end)
for i=1, #classSpells do for i=1, #classSpells do
local spellName, _, texture = GetSpellInfo(classSpells[i].id[#classSpells[i].id]) local _, _, texture = GetSpellInfo(classSpells[i].id[#classSpells[i].id])
--spellName = (classSpells[i].id[#classSpells[i].id] == 31117 or classSpells[i].id[#classSpells[i].id] == 43523) and "Unstable Affliction Silence" or spellName
if classSpells[i].texture then if classSpells[i].texture then
texture = classSpells[i].texture texture = classSpells[i].texture
end end
@ -704,8 +928,8 @@ function Gladdy:GetAuras(auraType)
name = classSpells[i].name, name = classSpells[i].name,
type = "toggle", type = "toggle",
image = texture, image = texture,
width = "2", width = "full",
arg = classSpells[i].name arg = tostring(classSpells[i].id[1])
} }
defaultDebuffs[tostring(classSpells[i].id[1])] = true defaultDebuffs[tostring(classSpells[i].id[1])] = true
end end

309
README.md
View File

@ -1,31 +1,51 @@
# Gladdy - TBC # Gladdy - TBC
### The most powerful arena addon for WoW TBC 2.5.1 ### The most powerful arena addon for WoW TBC 2.5.4
## [v1.0.5-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.0.5-Beta/Gladdy_TBC-Classic_v1.0.5-Beta.zip)
---
## [v2.11-Release Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v2.11-Release/Gladdy_TBC-Classic_v2.11-Release.zip)
###### <a target="_blank" rel="noopener noreferrer" href="https://www.paypal.me/xiconqoo/10"><img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/Paypal-Donate.png" height="30" style="margin-top:-30px;position:relative;top:20px;"></a> Please consider donating if you like my work ###### <a target="_blank" rel="noopener noreferrer" href="https://www.paypal.me/xiconqoo/10"><img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/Paypal-Donate.png" height="30" style="margin-top:-30px;position:relative;top:20px;"></a> Please consider donating if you like my work
### Origin ### Origin
Based on https://github.com/Schaka/gladdy Based on https://github.com/miraage/gladdy
### Motivation for this edit ### Motivation for this edit
The goal is to make Gladdy highly configurable in it's appearance. Everything can be arranged left or right independently. Also I gave Gladdy a new look with black borders. A lot can be configured. The goal is to make Gladdy highly configurable in it's appearance. Everything can be arranged left or right independently. Also I gave Gladdy a new look with black borders. A lot can be configured.
### Modules: ### Modules:
- Announcement (drink, trinket usage, spec detection ...) - **Announcement** (drink, trinket usage, spec detection ...)
- ArenaCountDown - **ArenaCountDown**
- Auras (show important (de)buffs in the class icon) - **Auras** (show important (de)buffs as well as interrupts on the class icon)
- Cooldown (tracks important cooldowns) - **BuffsDebuffs** (show buffs and debuffs on arena frames - can be filtered)
- Diminishing (tracks DRs) - **CastBar** (shows a castbar, can be disabled)
- ExportImport (share your profile with your friends in the form of a string, which can be imported) - **ClassIcon** (or specicon, once detected)
- Highlight (highlights focus and target) - **Clicks** (bind spells or macros to click actions)
- Pets (show arena pets) - **CombatIndicator** (shows a sword icon if unit is in combat)
- TotemPlates (show totem icons instead of normal nameplates) - **Cooldown** (tracks important cooldowns)
- Trinket (tracks trinket usage) - **Diminishing** (tracks DRs)
- VersionCheck (checks if you use an older version that your teammate) - **ExportImport** (share your profile with your friends in the form of a string, which can be imported)
- XiconProfiles (predefined profiles to start your configuration from) - **Highlight** (highlights focus and target)
- **Pets** (show arena pets)
- **Racial** (show arena racial cooldowns)
- **Range Check** (checks the range to a unit by a configurable spell)
- **Shadowsight Timer** (shows a little movable frame with time left until Shadow Eyes spawn)
- **TotemPlates** (show totem icons instead of normal nameplates, compatible with **Plater, NeatPlates, KUI, ThreatPlates, ElvUI, TukUI**)
- **TotemPulse** (shows pulse on TotemPlate icon or beneath nameplate)
- **Trinket** (tracks trinket usage)
- **VersionCheck** (checks if you use an older version that your teammate)
- **XiconProfiles** (predefined profiles to start your configuration from)
### Valid Slash commands
- **/gladdy ui** (shows config)
- **/gladdy test** (standard 3v3 test mode)
- **/gladdy test1** to **/gladdy test5** (test mode with 1-5 frames active)
- **/gladdy hide** (hides the frames)
- **/gladdy reset** (resets current profile to default settings)
## Screenshots ## Screenshots
@ -33,8 +53,267 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca
<img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/sample2.jpg" align="right" width="48.5%"> <img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/sample2.jpg" align="right" width="48.5%">
<img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/sample3.png" width="48.5%"> <img src="https://raw.githubusercontent.com/XiconQoo/Gladdy/readme-media/sample3.png" width="48.5%">
## Contributors
- [ManneN1](https://github.com/ManneN1)
- [AlexFolland](https://github.com/AlexFolland)
- [dfherr](https://github.com/dfherr)
- [miraage](https://github.com/miraage)
- [veiz](https://github.com/veiz)
Thank you!
## Special Thanks
- **miraage** - the origininal author of Gladdy! Your work set the foundation for this edit. Thanks!
- **Schaka** - the maintainer of Gladdy! (thanks for letting me continue Gladdy and all the work you put into the TBC community)
- **Macumba** (thanks for all the support, your feedback and your dedication for the TBC community)
- **RMO** (without you I would not have modified Gladdy at all and thanks for all the suggestions and active feedback)
- **Ur0b0r0s aka DrainTheLock** (thanks for testing, giving feedback and correcting/adding wrong CDs)
- **Klimp** (thanks for all the suggestions and active feedback)
- **the whole TBC addons 2.4.3 discord** (thanks for the support and great community, especially the MVPs)
- **Hydra** (thanks for constructive feedback and suggestions)
- **Xyz** (thanks for suggestions)
---
### Changes ### Changes
### v2.11-Release
- **Cooldowns**
- fixed cooldowns not showing properly for detected spec
- Nature's Swiftness (Druid/Shaman) now properly tracked
- improved cd out of stealth detection
- **HealthBar**
- added options class colored or custom colors
- custom colors for 100%, 50% 0% hp values added
- custom stealth color added
- add group option for DRs
- intercept cd adjusted (-5s for 4pc set bonus)
- totempulse minor adjustments
### v2.10-Release
- **Totems**:
- added new module **TotemPulse** (sorry Shamans)
- displays pulse ticks on all totems that have a pulse mechanic (e.g. tremor totem)
- either cooldown or bar style
- attaches to TotemPlates if enabled (con be configured individually by totem)
- completely hide totem nameplate option added
- added a dummy totemplate in config mode
- totem detection is completely localization independent now
- **Cooldowns**:
- completely refactored to fix general bugs
- can now be ordered individually
- some cooldown tracking improved for units coming out of stealth (e.g. perception, sprint, shadowstep)
- **Custom Text Tags**
- PowerBar and HealthBar can now have custom tags. Check it out
- also the texts can be moved to achieve a Blizzlike style with names above HealthBar
- general improvements to spec detection
- no more restoration warlocks :D
- tree of life spec detection should work now
- fix Announcements
- added grouping option for Auras (+ Interrupts) in detached mode, ClassIcon, Cooldowns, Trinket, Racial
- added a "Grow Middle" option, which aligns the gladdy frames on a centric point
- added frFR localization by Macumba
- added Flat statusbar texture
- added some auras (e.g. disarm)
- added disarm DRs
- improved some class icons
- added font OUTLINE option for Health-/Power-/CastBar texts
- fixed health bug since 2.5.4
- updated Mir Profile
### v2.00-Release
This is a packed release with new features and bugfixes. Most importantly, positioning of all elements has been redone with movable frames.
Thank you for the great feedback and active contribution.
***Attention: Once you install this version it will drastically change your current profile! You can't go back to an earlier version. Either back up your WTF or export your Profile before updating!***
**Here is a list of all changes:**
- **major release version set to v2**
- this will mean, that export strings will still be backwards compatible, but not forward (Gladdy v2.x String can't be imported into Gladdy v1.x but vice versa)
- **big overhaul of positioning elements added! All elements besides HP and PowerBar can be moved separately**
- added Mover Frames for Auras, Interrupts, (De)Buffs, CastBar, ClassIcon, CombatIndicator, Cooldowns, DRs, Pets, Racial, Trinket
- this will hopefully make configuration a lot easier
- all visible elements' FrameStrata and FrameLevel can be configured (overlap frames how you want it)
- **SpecDetection:**
- fixed spec detection for Paladins
- added following spells for better spec detection:
- Expose Weakness (Survival Hunter)
- Slow (Arcane Mage)
- Improved Blink (Arcane Mage)
- Vindication (Retribution Paladin)
- Holy Shield (Protection Paladin)
- Vampiric Embrace (Shadow Priest)
- Blade Flurry (Combat Rogue)
- Unleashed Rage (Enhancement Shaman)
- Flurry (Enhancement Shaman)
- Shamanistic Rage (Enhancement Shaman)
- Healing Way (Restoration Shaman)
- Totem of Wrath (Elemental Shaman)
- Dark Pact (Affliction Warlock)
- Conflagrate (Destruction Warlock)
- Shield Slam (Protection Warrior)
- **Cooldowns:**
- added Fear Ward and Fear Ward Cooldown Detection in case it was used before arena
- added following cooldowns:
- Scare Beast (Hunter)
- Feign Death (Hunter)
- Viper Sting (Hunter)
- Flare (Hunter)
- Fear Ward (Priest)
- Shadow Word: Death (Priest)
- Evocation (Mage)
- Grounding Totem (Shaman)
- Spell Lock (Warlock)
- Devour Magic (Warlock)
- Intercept (Warrior)
- **Auras/Interrupts:**
- can now be detached from ClassIcon and positioned/scaled anywhere separately
- added Auras:
- Scare Beast (Hunter)
- Fear Ward (Priest)
- **Shadowsight:**
- reset timer when buff was taken
- add a configurable 2nd timer or show one timer with the closest CD
- **CastBar Icon can be enabled/disabled**
- **Trinket solid color option added**
- color for Trinket on/off CD can be configured (red/green by default)
- **fixed some DR-categories** (Hibernate / Chastice / Dragonsbreath / ImpConcussiveShot / Counterattack)
- **Pixel Perfect option added** (makes your Gladdy Frames pixel perfect - no more weird scaling interferences)
- **Pets can be grouped** (not perfect yet, but a first step)
- **added DR-Level Text** (thanks https://github.com/ManneN1)
- **added zhCN Locale** (thanks https://github.com/veiz)
- **ClassIcon can be disabled**
- **add interrupt announcement**
- **detect SpellLock and Devour Magic cooldowns properly**
- **minor fixes:**
- fixed reloading during arena to properly show all frames
- fix grow up positioning
### v1.22-Release
- fixed import for some localizations not working
- added cooldown number alpha configurations for Auras, BuffsDebuffs, Cooldowns, Diminishings, Racial & Trinket
- grounding totem effect fix
- fixed some buffs/debuffs not being present in BuffsDebuffs
### v1.21-Release
- fixed error when hiding blizzard frames ArenaEnemyFrames related to ElvUI
- added Pummel cooldown
### v1.20-Release
- configurable DR duration
- scale in 0.01 percent steps
- added Net-o-Matic, Nigh Invulnerablility Shield, Nigh Invulnerablility Backfire & Flee (Skull of Impending Doom) to Auras
- added Mangle, Chastise, Avenging Wrath, Rapid Fire to BuffsDebuffs
- improved testmode to only activate Auras/Buffs/Debuffs/Dr's that are actually enabled
- added Mir's profile to XiconProfiles
- added zhTW localization
- added buttons for Test, Hide & Reload in the config
- added version in config
- ArenaCountdown upgrade
- Repentance, Freezing Trap & Wyvern Sting are now disorients
- import string now ignores errors on deleted options
- added (un)checkAll button in DR-Categories in Diminishing Module
- totemplates fix option to alter all colors/alphas
- hide blizzard arena pets as well
- fix shadowsight timer showing when not in arena or testmode
- some minor refactoring / optimization
### v1.19-Beta
- fix gladdy frames not showing v2
- minor bug fixes
### v1.18-Beta
- castbar font now working properly
### v1.17-Beta
- option TimerFormat added (seconds or seconds + milliseconds) (General > Cooldown General > Timer Format)
- hide blizzard arena frames without cvars
- fix Gladdy bugging out on arena join when in combat
- fix some TotemPlates issues
- fix Feign Death causing to reset DR and Aura tracking
- ArenaX option in Healthbar module now only shows the number
- add background for all frames (General > Frame General > Background Color)
- add evasion and banish to Aura
- add MSBT to Announcement module
- Shadowsight timer can be locked now
- add "All" modifier to Clicks module
- updated testmode for BuffsDebuffs (show only from enabled set)
- updated Klimp's profile
- added a new Profile in XiconProfiles -> Rukk1
### v1.16-Beta
- unit gray in stealth when rangecheck module disabled
### v1.15-Beta
- hotfix added entangling roots nature's grasp
### v1.14-Beta
- hotfix for secure button grow direction up
### v1.13-Beta
- frames behave now to mouseover macros
- added Range Check module (configurable which spell is used for range check)
- added Shadowsight Timer module (with announce)
- added Clicks module
- added Interrupt Tracker in Aura module (border color by spell school locked)
- TotemPlates compatible with Plater, NeatPlates, KUI, ThreatPlates, ElvUI, TukUI
- added a new Classic Profile in XiconProfiles
- hide blizzard arena frames option added in General
- castbar enable/disable
- powerbar enable/disable
- added some auras (Blackout, Improved Hamstring, Mace Stun, Stormherald Stun, Shadowsight Buff)
- added Swiftmend and Berserker Rage cooldowns
- changed textures for Mace Stun, Charge Stun and Intercept Stun
- reduced BLP size by 80%
- show XiconProfiles on first login
- DR bigger icons possible
- minor fixes
### v1.12-Beta
- fix classic profile
### v1.11-Beta
- TotemPlates fix after blizzard update
### v1.10-Beta
- fix german and russian client not working
- ArenaCountdown loacalization now working for all languages (except itIT...beta has no option to select italian)
- Race and Class localization working for all languages
- Localization finished for German
#### v1.09-Beta
- fix Blizzard profile not having all modules preconfigured
#### v1.08-Beta
- fix Buffs not showing on class icon
- added option highlight to be inside
- added option to grow frames vertically
- added new profile to XiconProfile (Blizzard raid style)
- minor bugfixes
#### v1.07-Beta
- CombatIndicator module added
- spec icon option added to Classicon module
- arena1-5 for name option added
- add a couple buffs to LibClassAuras
- add blessing of sacrifice and intervene to auras
- general options updated to apply font/borders/etc for all frames
- XiconProfiles updated
- /gladdy test1-5 now possible
- fix PowerBar text updates
- click through frames exept health/power bar
- add mask texture for icons
#### v1.06-Beta
- fixed BuffsDebuff module
- fix racial texture reset
- minor bugfixes
#### v1.0.5-Beta #### v1.0.5-Beta
- fixed Aura-Module - fixed Aura-Module
- Racial module added to EventListener and Version check updated - Racial module added to EventListener and Version check updated

144
Util.lua Normal file
View File

@ -0,0 +1,144 @@
local pairs, ipairs = pairs, ipairs
local floor = math.floor
local str_find, str_gsub, str_sub, tinsert = string.find, string.gsub, string.sub, table.insert
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
---------------------------
-- TAGS
---------------------------
local tags = {
["current"] = true,
["max"] = true,
["percent"] = true,
["race"] = "race",
["class"] = "class",
["arena"] = true,
["name"] = "name",
["status"] = true,
["spec"] = "spec",
}
local function str_extract(s, pattern)
local t = {} -- table to store the indices
local i, j = 0,0
while true do
i, j = str_find(s, pattern, i+1) -- find 'next' occurrence
if i == nil then break end
tinsert(t, str_sub(s, i, j))
end
return t
end
--TODO optimize this function as it's being called often!
local function getTagText(unit, tag, current, max, status)
local button = Gladdy.buttons[unit]
if not button then
return
end
if str_find(tag, "percent") then
return current and max and floor(current * 100 / max) .. "%%" or ""
elseif str_find(tag, "current") then
return current and max > 999 and ("%.1fk"):format(current / 1000) or current or ""
elseif str_find(tag, "max") then
return max and max > 999 and ("%.1fk"):format(max / 1000) or max or ""
elseif str_find(tag, "status") then
if str_find(tag, "%|") and status == nil then
return nil
else
return status or ""
end
elseif str_find(tag, "name") then
return button.name or ""
elseif str_find(tag, "class") then
return button.classLoc or ""
elseif str_find(tag, "race") then
return button.raceLoc or ""
elseif str_find(tag, "arena") then
local str,found = str_gsub(unit, "arena", "")
return found == 1 and str or ""
elseif str_find(tag, "spec") then
if str_find(tag, "%|") and button.spec == nil then
return nil
else
return button.spec or ""
end
end
end
function Gladdy:SetTag(unit, tagOption, current, max, status)
local button = self.buttons[unit]
if not button then
return
end
local returnStr = tagOption
local t = str_extract(returnStr, "%[[^%[].-%]")
for _, tag in ipairs(t) do
local replace
if str_find(tag, "|") then -- or operator
local indicators = str_extract(tag, "[%[|%|]%a+[%||%]]")
local replaces = {}
for _, indicator in ipairs(indicators) do
tinsert(replaces, getTagText(unit, indicator, current, max, status))
end
replace = replaces[#replaces]
else
replace = getTagText(unit, tag, current, max, status)
end
if replace then
local find = str_gsub(tag, "%[", "%%[")
find = str_gsub(find, "%]", "%%]")
find = str_gsub(find, "%|", "%%|")
returnStr = str_gsub(returnStr, find, replace)
end
end
return returnStr
end
function Gladdy:GetTagOption(name, order, enabledOption, func, toggle)
if toggle then
return func({
type = "toggle",
name = name,
order = order,
width = "full",
desc = L["Custom Tags:\n"..
"\n|cff1ac742[current]|r - Shows current\n" ..
"\n|cff1ac742[max]|r - Shows max\n" ..
"\n|cff1ac742[percent]|r - Shows percent\n" ..
"\n|cff1ac742[name]|r - Shows name\n" ..
"\n|cff1ac742[arena]|r - Shows arena number\n" ..
"\n|cff1ac742[status]|r - Shows status (eg DEATH)\n" ..
"\n|cff1ac742[race]|r - Shows race\n" ..
"\n|cff1ac742[class]|r - Shows class\n" ..
"\n|cff1ac742[spec]|r - Shows spec\n\n" ..
"Can be combined with OR operator like |cff1ac742[percent|status]|r. The last valid option will be used.\n"],
})
else
return func({
type = "input",
name = name,
order = order,
width = "full",
disabled = function() return not Gladdy.db[enabledOption] end,
desc = L["Custom Tags:\n"..
"\n|cff1ac742[current]|r - Shows current\n" ..
"\n|cff1ac742[max]|r - Shows max\n" ..
"\n|cff1ac742[percent]|r - Shows percent\n" ..
"\n|cff1ac742[name]|r - Shows name\n" ..
"\n|cff1ac742[arena]|r - Shows arena number\n" ..
"\n|cff1ac742[status]|r - Shows status (eg DEATH)\n" ..
"\n|cff1ac742[race]|r - Shows race\n" ..
"\n|cff1ac742[class]|r - Shows class\n" ..
"\n|cff1ac742[spec]|r - Shows spec\n\n" ..
"Can be combined with OR operator like |cff1ac742[percent|status]|r. The last valid option will be used.\n"],
})
end
end

View File

@ -14,4 +14,5 @@
<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/> <Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
<Include file="libs\DRData-1.0\DRData-1.0.xml"/> <Include file="libs\DRData-1.0\DRData-1.0.xml"/>
<Include file="libs\LibClassAuras-1.0\lib.xml"/> <Include file="libs\LibClassAuras-1.0\lib.xml"/>
<Include file="libs\LibSpellRange-1.0\lib.xml"/>
</Ui> </Ui>