Compare commits

...

114 Commits
v2.00 ... v2.20

Author SHA1 Message Date
9be1195f88 Merge branch 'release/v2.20' into main 2022-08-01 20:33:19 +02:00
9f6c3bd180 readme 2022-08-01 20:33:05 +02:00
ed291376aa curse & wow-interface IDs added 2022-08-01 20:31:10 +02:00
fea116a72e readme 2022-08-01 20:26:17 +02:00
bbe272bb48 Announcements throttle some messages, as they might be firing too often with unified ArenaUnit detection 2022-08-01 20:25:24 +02:00
b2b4848ff4 zoomed icons auras, buffs, castbar, classicon, cooldowns, diminishing, racial, trinket 2022-08-01 19:50:42 +02:00
aa66a9a10c remove DRData from embeds.xml 2022-08-01 19:22:54 +02:00
cf64424080 Gladdy version + enhanced debug messages 2022-08-01 18:31:41 +02:00
db66226209 delete DRData 2022-08-01 18:30:41 +02:00
f2df08feac add empty Gladdy.toc 2022-08-01 18:29:25 +02:00
02de969fa4 delete DRData-1.0 2022-08-01 18:29:02 +02:00
b413d4ee49 Wrath: spec detection hunter/druid 2022-08-01 18:28:46 +02:00
8e477b96e3 LibClassAuras-1.0 update for Wrath 2022-08-01 18:28:16 +02:00
5642cf686d BCC: Hypothermia to Auras 2022-08-01 18:17:38 +02:00
330e207761 Wrath: add Improved Wingclip, Berserk, Hypothermia, Recklessness to Auras 2022-08-01 18:17:18 +02:00
7f17ebc442 add psychic horror to Auras 2022-08-01 12:49:27 +02:00
a9247e1f76 fix trinket racial tracking 2022-07-31 21:48:09 +02:00
e86acf0cb2 debug messages Eventlistener 2022-07-31 21:47:40 +02:00
c9fab2d8c2 glow test 20s 2022-07-31 21:47:08 +02:00
32d4ae6a5c castbar shield uniterruptable 2022-07-31 21:46:38 +02:00
8cec363d5e adjust cloak of shadows cooldown 2022-07-31 21:43:37 +02:00
c49fff4bd1 DR-List 2022-07-31 21:43:17 +02:00
5f1e1da895 fix racial/trinket usage tracking 2022-07-31 18:17:49 +02:00
14dc227c86 GetArenaUnit add unify parameter 2022-07-31 18:14:38 +02:00
7d86078c8c warrior cd fix 2022-07-31 18:13:56 +02:00
6b7b3ce3c9 warrior auras and cooldowns 2022-07-31 06:26:59 +02:00
8727482b96 fix rightclick on mover frame 2022-07-31 06:14:15 +02:00
6e6673c4fd ArneaCountdown use C_Timer.NewTicker instead OnUpdate 2022-07-31 06:10:19 +02:00
fccc31b6f5 auras only track if same auratype (fix mindcontrol bug) 2022-07-31 06:06:10 +02:00
7c2cd5092e diminish track on SPELL_AURA_APPLIED 2022-07-31 06:05:33 +02:00
b9f696675b cooldown glow 2022-07-31 06:04:50 +02:00
7c3906533b cooldowns glow + diminish eventhandler update 2022-07-31 06:03:51 +02:00
cacf464818 add shattered barrier and adjust cds for warlocks 2022-07-31 05:56:24 +02:00
a089172201 fix unknown dispel type fallback 2022-07-31 05:55:38 +02:00
c00710f110 fix Classes for BCC 2022-07-30 00:45:36 +02:00
e507d70eca UnitAura rename spellSchool to dispelType 2022-07-30 00:45:11 +02:00
379040426c add enrage and rename auraType to dispelType 2022-07-30 00:43:52 +02:00
86bf851c64 feign death detection 2022-07-29 15:06:39 +02:00
f1652e2b42 add DRList-1.0 as lib 2022-07-29 07:45:46 +02:00
23097951e3 .gitignore 2022-07-29 07:44:58 +02:00
be1d4475d1 detect spec minor fix + add deathknight to spec detection 2022-07-29 07:44:40 +02:00
674eabd489 totempulse minor fix 2022-07-29 07:43:39 +02:00
e68dea3f22 Wrath make export import possible with BCC profiles and vice versa 2022-07-29 07:42:36 +02:00
a87455e7bd Wrath:
- separate TOC + Constants for BCC and Wrath
- cooldowns, auras, spec detection, trinket/racial tracking
2022-07-29 07:41:55 +02:00
2a12f35e58 Merge tag 'v2.11-Release' into develop
v2.11-Release
2022-03-27 21:05:16 +02:00
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
57 changed files with 8687 additions and 2038 deletions

1
.gitignore vendored
View File

@ -6,4 +6,5 @@ BuffLib
Ace-Libs
Images_Raw
Gladdy_old
untracked
Gladdy_TW

View File

@ -1,17 +1,15 @@
local tbl_sort, select = table.sort, select
local tbl_sort, select, string_lower = table.sort, select, string.lower
local GetSpellInfo = GetSpellInfo
local GetItemInfo = GetItemInfo
local GetLocale = GetLocale
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
Gladdy.expansion = "BCC"
Gladdy.CLASSES = {"MAGE", "PRIEST", "DRUID", "SHAMAN", "PALADIN", "WARLOCK", "WARRIOR", "HUNTER", "ROGUE"}
tbl_sort(Gladdy.CLASSES)
Gladdy.RACES = {"Scourge", "BloodElf", "Tauren", "Orc", "Troll", "NightElf", "Draenei", "Human", "Gnome", "Dwarf"}
tbl_sort(Gladdy.RACES)
local specBuffs = {
-- DRUID
@ -20,9 +18,10 @@ local specBuffs = {
[GetSpellInfo(24858)] = L["Restoration"], -- Moonkin Form; Dreamstate spec in TBC equals Restoration
[GetSpellInfo(17007)] = L["Feral"], -- Leader of the Pack
[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(33891)] = L["Restoration"], -- Tree of Life
-- HUNTER
[GetSpellInfo(34692)] = L["Beast Mastery"], -- The Beast Within
[GetSpellInfo(34471)] = L["Beast Mastery"], -- The Beast Within
[GetSpellInfo(20895)] = L["Beast Mastery"], -- Spirit Bond
[GetSpellInfo(34455)] = L["Beast Mastery"], -- Ferocious Inspiration
[GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
@ -78,8 +77,9 @@ local specBuffs = {
-- WARLOCK
[GetSpellInfo(19028)] = L["Demonology"], -- Soul Link
[GetSpellInfo(23759)] = L["Demonology"], -- Master Demonologist
[GetSpellInfo(30302)] = L["Destruction"], -- Nether Protection
[GetSpellInfo(34935)] = L["Destruction"], -- Backlash
[GetSpellInfo(35696)] = L["Demonology"], -- Demonic Knowledge
[GetSpellInfo(30300)] = L["Destruction"], -- Nether Protection
[GetSpellInfo(34936)] = L["Destruction"], -- Backlash
-- WARRIOR
[GetSpellInfo(29838)] = L["Arms"], -- Second Wind
@ -96,7 +96,8 @@ local specSpells = {
[GetSpellInfo(33983)] = L["Feral"], -- Mangle (Cat)
[GetSpellInfo(33987)] = L["Feral"], -- Mangle (Bear)
[GetSpellInfo(18562)] = L["Restoration"], -- Swiftmend
[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(17116)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(33891)] = L["Restoration"], -- Tree of Life
-- HUNTER
[GetSpellInfo(19577)] = L["Beast Mastery"], -- Intimidation
@ -152,7 +153,7 @@ local specSpells = {
[GetSpellInfo(17364)] = L["Enhancement"], -- Stormstrike
[GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
[GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
--[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
-- WARLOCK
[GetSpellInfo(30405)] = L["Affliction"], -- Unstable Affliction
@ -160,6 +161,7 @@ local specSpells = {
--[GetSpellInfo(30911)] = L["Affliction"], -- Siphon Life
[GetSpellInfo(30414)] = L["Destruction"], -- Shadowfury
[GetSpellInfo(30912)] = L["Destruction"], -- Conflagrate
[GetSpellInfo(18708)] = L["Demonology"], -- Fel Domination
-- WARRIOR
[GetSpellInfo(30330)] = L["Arms"], -- Mortal Strike
@ -306,11 +308,11 @@ local importantAuras = {
spellID = 19577,
},
-- The Beast Within
[GetSpellInfo(34692)] = {
[GetSpellInfo(34471)] = {
track = AURA_TYPE_BUFF,
duration = 18,
priority = 20,
spellID = 34692,
spellID = 34471,
},
@ -367,6 +369,11 @@ local importantAuras = {
priority = 20,
spellID = 45438,
},
[GetSpellInfo(41425)] = { -- Hypothermia (Ice Block Immune
track = AURA_TYPE_DEBUFF,
priority = 8,
spellID = 41425,
},
-- Impact
[GetSpellInfo(12355)] = {
track = AURA_TYPE_DEBUFF,
@ -549,7 +556,13 @@ local importantAuras = {
priority = 10,
spellID = 26669,
},
-- Riposte
[GetSpellInfo(14251)] = {
track = AURA_TYPE_DEBUFF,
duration = 6,
priority = 20,
spellID = 14251,
},
-- Fear
[GetSpellInfo(5782)] = {
@ -678,6 +691,13 @@ local importantAuras = {
spellSchool = "magic",
spellID = 12292,
},
--Disarm
[GetSpellInfo(676)] = {
track = AURA_TYPE_DEBUFF,
duration = 10,
priority = 20,
spellID = 676,
},
-- Grounding Totem Effect
[GetSpellInfo(8178)] = {
@ -775,6 +795,13 @@ local importantAuras = {
spellID = 5024,
altName = select(1, GetSpellInfo(5024)) .. " - " .. (select(1, GetItemInfo(4984)) or "Skull of Impending Doom"),
},
-- Will of the Forsaken
[GetSpellInfo(7744)] = {
track = AURA_TYPE_BUFF,
duration = 5,
priority = 15,
spellID = 7744,
},
}
function Gladdy:GetImportantAuras()
return importantAuras
@ -794,35 +821,6 @@ function Gladdy:GetInterrupts()
return interrupts
end
local auraTypeColor = {}
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"]
function Gladdy:GetAuraTypeColor()
return auraTypeColor
end
local spellSchoolColors = {}
spellSchoolColors[1] = {r = 1, g = 1, b = 0, a = 1, type = "Physical"} --- "physical" 255, 255, 0
spellSchoolColors[2] = {r = 1, g = 0.901, b = 0.501, a = 1, type = "Holy"} ---"holy" -- 255, 230, 128
spellSchoolColors[4] = {r = 1, g = 0.501, b = 0, a = 1, type = "Fire"} ---"fire" -- 255, 128, 0
spellSchoolColors[8] = {r = 0.302, g = 1, b = 0.302, a = 1, type = "Nature"} ---"nature" -- 77, 255, 77
spellSchoolColors[16] = {r = 0.501, g = 1, b = 1, a = 1, type = "Frost"} ---"frost" -- 128, 255, 255
spellSchoolColors[32] = {r = 0.501, g = 0.501, b = 1, a = 1, type = "Shadow"} ---"shadow" --128, 128, 255
spellSchoolColors[64] = {r = 1, g = 0.501, b = 1, a = 1, type = "Arcane"} ---"arcane" -- 255, 128, 255
spellSchoolColors["unknown"] = {r = 0, g = 0, b = 0, a = 1, type = "Unknown"} ---"unknown spell school"
function Gladdy:GetSpellSchoolColors()
return spellSchoolColors
end
local cooldownList = {
-- Spell Name Cooldown[, Spec]
-- Mage
@ -922,6 +920,7 @@ local cooldownList = {
[27277] = 8, -- Devour Magic
[30414] = { cd = 20, spec = L["Destruction"], }, -- Shadowfury
[17877] = { cd = 15, spec = L["Destruction"], }, -- Shadowburn
[30912] = { cd = 10, spec = L["Destruction"], }, -- Conflagrate
[18708] = { cd = 900, spec = L["Demonology"], }, -- Feldom
},
@ -944,7 +943,7 @@ local cooldownList = {
[18499] = 30, -- Berserker Rage
--[2565] = 60, -- Shield Block
[12292] = { cd = 180, spec = L["Arms"], }, -- Death Wish
[20252] = { cd = 30, [L["Arms"]] = 20 }, -- Intercept
[20252] = { cd = 25, [L["Arms"]] = 15 }, -- Intercept
[12975] = { cd = 180, spec = L["Protection"], }, -- Last Stand
[12809] = { cd = 30, spec = L["Protection"], }, -- Concussion Blow
@ -955,28 +954,33 @@ local cooldownList = {
[19503] = 30, -- Scatter Shot
[14327] = 30, -- Scare Beast
[19263] = 300, -- Deterrence; not on BM but can't do 2 specs
[14311] = { cd = 30, -- Freezing Trap
sharedCD = {
[13809] = true, -- Frost Trap
[34600] = true, -- Snake Trap
},
},
[13809] = { cd = 30, -- Frost Trap
sharedCD = {
[14311] = true, -- Freezing Trap
[34600] = true, -- Snake Trap
},
icon = select(3, GetSpellInfo(14311)),
},
[14311] = { cd = 30, -- Freezing Trap
sharedCD = {
[13809] = true, -- Frost Trap
[34600] = true, -- Snake Trap
},
icon = select(3, GetSpellInfo(14311)),
},
[34600] = { cd = 30, -- Snake Trap
sharedCD = {
[14311] = true, -- Freezing Trap
[13809] = true, -- Frost Trap
},
icon = select(3, GetSpellInfo(14311)),
},
[34490] = { cd = 20, spec = L["Marksmanship"], }, -- Silencing Shot
[19386] = { cd = 60, spec = L["Survival"], }, -- Wyvern Sting
[19577] = { cd = 60, spec = L["Beast Mastery"], }, -- Intimidation
[38373] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within
[34471] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within
[5384] = 30, -- Feign Death
[3034] = 15, -- Viper Sting
[1543] = 20, -- Flare
@ -1021,19 +1025,19 @@ local cooldownList = {
},
["NightElf"] = {
[2651] = { cd = 180, spec = L["Discipline"], }, -- Elune's Grace
[10797] = { cd = 30, spec = L["Discipline"], }, -- Star Shards
[2651] = { cd = 180, spec = L["Discipline"], class = "PRIEST"}, -- Elune's Grace
[10797] = { cd = 30, spec = L["Discipline"], class = "PRIEST"}, -- Star Shards
},
["Draenei"] = {
[32548] = { cd = 300, spec = L["Discipline"], }, -- Hymn of Hope
[32548] = { cd = 300, spec = L["Discipline"], class = "PRIEST"}, -- Hymn of Hope
},
["Human"] = {
[13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
[13908] = { cd = 600, spec = L["Discipline"], class = "PRIEST"}, -- Desperate Prayer
},
["Gnome"] = {
},
["Dwarf"] = {
[13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
[13908] = { cd = 600, spec = L["Discipline"], class = "PRIEST"}, -- Desperate Prayer
},
}
function Gladdy:GetCooldownList()
@ -1110,150 +1114,340 @@ function Gladdy:Racials()
return racials
end
local arenaTimer = {
["default"] = {
[61] = "One minute until the Arena battle begins!",
[31] = "Thirty seconds until the Arena battle begins!",
[16] = "Fifteen seconds until the Arena battle begins!",
[0] = "The Arena battle has begun!",
},
["esES"] = {
[61] = "¡Un minuto hasta que dé comienzo la batalla en arena!",
[31] = "¡Treinta segundos hasta que comience la batalla en arena!",
[16] = "¡Quince segundos hasta que comience la batalla en arena!",
[0] = "¡La batalla en arena ha comenzado!",
},
["ptBR"] = {
[61] = "Um minuto até a batalha na Arena começar!",
[31] = "Trinta segundos até a batalha na Arena começar!",
[16] = "Quinze segundos até a batalha na Arena começar!",
[0] = "A batalha na Arena começou!",
},
["deDE"] = {
[61] = "Noch eine Minute bis der Arenakampf beginnt!",
[31] = "Noch dreißig Sekunden bis der Arenakampf beginnt!",
[16] = "Noch fünfzehn Sekunden bis der Arenakampf beginnt!",
[0] = "Der Arenakampf hat begonnen!",
},
["frFR"] = {
[61] = "Le combat d'arène commence dans une minute\194\160!",
[31] = "Le combat d'arène commence dans trente secondes\194\160!",
[16] = "Le combat d'arène commence dans quinze secondes\194\160!",
[0] = "Le combat d'arène commence\194\160!",
},
["ruRU"] = {
[61] = "Одна минута до начала боя на арене!",
[31] = "Тридцать секунд до начала боя на арене!",
[16] = "До начала боя на арене осталось 15 секунд.",
[0] = "Бой начался!",
},
["itIT"] = { -- TODO
-- Beta has no itIT version available?
},
["koKR"] = {
[61] = "투기장 전투 시작 1분 전입니다!",
[31] = "투기장 전투 시작 30초 전입니다!",
[16] = "투기장 전투 시작 15초 전입니다!",
[0] = "투기장 전투가 시작되었습니다!",
},
["zhCN"] = {
[61] = "竞技场战斗将在一分钟后开始!",
[31] = "竞技场战斗将在三十秒后开始!",
[16] = "竞技场战斗将在十五秒后开始!",
[0] = "竞技场的战斗开始了!",
},
["zhTW"] = {
[61] = "1分鐘後競技場戰鬥開始!",
[31] = "30秒後競技場戰鬥開始!",
[16] = "15秒後競技場戰鬥開始!",
[0] = "競技場戰鬥開始了!",
},
}
arenaTimer["esMX"] = arenaTimer["esES"]
arenaTimer["ptPT"] = arenaTimer["ptBR"]
function Gladdy:GetArenaTimer()
if arenaTimer[GetLocale()] then
return arenaTimer[GetLocale()]
else
return arenaTimer["default"]
end
---------------------
-- TOTEM STUFF
---------------------
local totemData = {
-- Fire
[string_lower("Searing Totem")] = {id = 3599,texture = select(3, GetSpellInfo(3599)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Flametongue Totem")] = {id = 8227,texture = select(3, GetSpellInfo(8227)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Magma Totem")] = {id = 8190,texture = select(3, GetSpellInfo(8190)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 2},
[string_lower("Fire Nova Totem")] = {id = 1535,texture = select(3, GetSpellInfo(1535)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = { cd = 4, once = true }},
[string_lower("Totem of Wrath")] = {id = 30706,texture = select(3, GetSpellInfo(30706)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Fire Elemental Totem")] = {id = 32982,texture = select(3, GetSpellInfo(32982)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Frost Resistance Totem")] = {id = 8181,texture = select(3, GetSpellInfo(8181)), color = {r = 0, g = 0, b = 0, a = 1}},
-- Water
[string_lower("Fire Resistance Totem")] = {id = 8184,texture = select(3, GetSpellInfo(8184)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Poison Cleansing Totem")] = {id = 8166,texture = select(3, GetSpellInfo(8166)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 5},
[string_lower("Disease Cleansing Totem")] = {id = 8170,texture = select(3, GetSpellInfo(8170)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 5},
[string_lower("Healing Stream Totem")] = {id = 5394,texture = select(3, GetSpellInfo(5394)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 2},
[string_lower("Mana Tide Totem")] = {id = 16190,texture = select(3, GetSpellInfo(16190)), color = {r = 0.078, g = 0.9, b = 0.16, a = 1}},
[string_lower("Mana Spring Totem")] = {id = 5675,texture = select(3, GetSpellInfo(5675)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 2},
-- Earth
[string_lower("Earthbind Totem")] = {id = 2484,texture = select(3, GetSpellInfo(2484)), color = {r = 0.5, g = 0.5, b = 0.5, a = 1}, pulse = 3},
[string_lower("Stoneclaw Totem")] = {id = 5730,texture = select(3, GetSpellInfo(5730)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 2},
[string_lower("Stoneskin Totem")] = {id = 8071,texture = select(3, GetSpellInfo(8071)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Strength of Earth Totem")] = {id = 8075,texture = select(3, GetSpellInfo(8075)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Earth Elemental Totem")] = {id = 33663,texture = select(3, GetSpellInfo(33663)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Tremor Totem")] = {id = 8143,texture = select(3, GetSpellInfo(8143)), color = {r = 1, g = 0.9, b = 0.1, a = 1}, pulse = 3},
-- Air
[string_lower("Grounding Totem")] = {id = 8177,texture = select(3, GetSpellInfo(8177)), color = {r = 0, g = 0.53, b = 0.92, a = 1}},
[string_lower("Grace of Air Totem")] = {id = 8835,texture = select(3, GetSpellInfo(8835)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Nature Resistance Totem")] = {id = 10595,texture = select(3, GetSpellInfo(10595)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Windfury Totem")] = {id = 8512,texture = select(3, GetSpellInfo(8512)), color = {r = 0.96, g = 0, b = 0.07, a = 1}},
[string_lower("Sentry Totem")] = {id = 6495, texture = select(3, GetSpellInfo(6495)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Windwall Totem")] = {id = 15107,texture = select(3, GetSpellInfo(15107)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Wrath of Air Totem")] = {id = 3738,texture = select(3, GetSpellInfo(3738)), color = {r = 0, g = 0, b = 0, a = 1}},
[string_lower("Tranquil Air Totem")] = {id = 25908,texture = select(3, GetSpellInfo(25908)), color = {r = 0, g = 0, b = 0, a = 1}},
}
local totemSpellIdToPulse = {
[GetSpellInfo(totemData[string_lower("Earthbind Totem")].id)] = totemData[string_lower("Earthbind Totem")].pulse,
[2484] = totemData[string_lower("Earthbind Totem")].pulse,
[GetSpellInfo(totemData[string_lower("Tremor Totem")].id)] = totemData[string_lower("Tremor Totem")].pulse,
[8143] = totemData[string_lower("Tremor Totem")].pulse,
[GetSpellInfo(totemData[string_lower("Poison Cleansing Totem")].id)] = totemData[string_lower("Poison Cleansing Totem")].pulse,
[8166] = totemData[string_lower("Poison Cleansing Totem")].pulse,
[GetSpellInfo(totemData[string_lower("Disease Cleansing Totem")].id)] = totemData[string_lower("Disease Cleansing Totem")].pulse,
[8170] = totemData[string_lower("Disease Cleansing Totem")].pulse,
[GetSpellInfo(totemData[string_lower("Fire Nova Totem")].id)] = totemData[string_lower("Fire Nova Totem")].pulse,
[1535] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 1
[8498] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 2
[8499] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 3
[11314] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 4
[11315] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 5
[25546] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 6
[25547] = totemData[string_lower("Fire Nova Totem")].pulse, -- Rank 7
[GetSpellInfo(totemData[string_lower("Magma Totem")].id)] = totemData[string_lower("Magma Totem")].pulse,
[8190] = totemData[string_lower("Magma Totem")].pulse, -- Rank 1
[10585] = totemData[string_lower("Magma Totem")].pulse, -- Rank 2
[10586] = totemData[string_lower("Magma Totem")].pulse, -- Rank 3
[10587] = totemData[string_lower("Magma Totem")].pulse, -- Rank 4
[25552] = totemData[string_lower("Magma Totem")].pulse, -- Rank 5
[GetSpellInfo(totemData[string_lower("Healing Stream Totem")].id)] = totemData[string_lower("Healing Stream Totem")].pulse,
[5394] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 1
[6375] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 2
[6377] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 3
[10462] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 4
[10463] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 5
[25567] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 6
[GetSpellInfo(totemData[string_lower("Mana Spring Totem")].id)] = totemData[string_lower("Mana Spring Totem")].pulse,
[5675] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 1
[10495] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 2
[10496] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 3
[10497] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 4
[25570] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 5
[GetSpellInfo(totemData[string_lower("Stoneclaw Totem")].id)] = totemData[string_lower("Stoneclaw Totem")].pulse,
[5730] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 1
[6390] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 2
[6391] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 3
[6392] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 4
[10427] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 5
[10428] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 6
[25525] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 7
}
local totemNpcIdsToTotemData = {
--fire
[2523] = totemData[string_lower("Searing Totem")],
[3902] = totemData[string_lower("Searing Totem")],
[3903] = totemData[string_lower("Searing Totem")],
[3904] = totemData[string_lower("Searing Totem")],
[7400] = totemData[string_lower("Searing Totem")],
[7402] = totemData[string_lower("Searing Totem")],
[15480] = totemData[string_lower("Searing Totem")],
[31162] = totemData[string_lower("Searing Totem")],
[31164] = totemData[string_lower("Searing Totem")],
[31165] = totemData[string_lower("Searing Totem")],
[21995] = totemData[string_lower("Searing Totem")],
[22209] = totemData[string_lower("Searing Totem")],
[22895] = totemData[string_lower("Searing Totem")],
[22896] = totemData[string_lower("Searing Totem")],
[34687] = totemData[string_lower("Searing Totem")],
[36532] = totemData[string_lower("Searing Totem")],
[43423] = totemData[string_lower("Searing Totem")],
[67380] = totemData[string_lower("Searing Totem")],
[73477] = totemData[string_lower("Searing Totem")],
[79238] = totemData[string_lower("Searing Totem")],
[22896] = totemData[string_lower("Searing Totem")],
[84519] = totemData[string_lower("Searing Totem")],
[110730] = totemData[string_lower("Searing Totem")],
[132178] = totemData[string_lower("Searing Totem")],
[9637] = totemData[string_lower("Searing Totem")],
[5950] = totemData[string_lower("Flametongue Totem")],
[6012] = totemData[string_lower("Flametongue Totem")],
[7423] = totemData[string_lower("Flametongue Totem")],
[10557] = totemData[string_lower("Flametongue Totem")],
[15485] = totemData[string_lower("Flametongue Totem")],
[31132] = totemData[string_lower("Flametongue Totem")],
[31133] = totemData[string_lower("Flametongue Totem")],
[31158] = totemData[string_lower("Flametongue Totem")],
[42605] = totemData[string_lower("Flametongue Totem")],
[5929] = totemData[string_lower("Magma Totem")],
[7464] = totemData[string_lower("Magma Totem")],
[7465] = totemData[string_lower("Magma Totem")],
[7466] = totemData[string_lower("Magma Totem")],
[15484] = totemData[string_lower("Magma Totem")],
[31166] = totemData[string_lower("Magma Totem")],
[31167] = totemData[string_lower("Magma Totem")],
[32887] = totemData[string_lower("Magma Totem")],
[42211] = totemData[string_lower("Magma Totem")],
[71335] = totemData[string_lower("Magma Totem")],
[71925] = totemData[string_lower("Magma Totem")],
[73085] = totemData[string_lower("Magma Totem")],
[73093] = totemData[string_lower("Magma Totem")],
[73268] = totemData[string_lower("Magma Totem")],
[88971] = totemData[string_lower("Magma Totem")],
[97369] = totemData[string_lower("Magma Totem")],
[98676] = totemData[string_lower("Magma Totem")],
[5879] = totemData[string_lower("Fire Nova Totem")],
[6110] = totemData[string_lower("Fire Nova Totem")],
[6111] = totemData[string_lower("Fire Nova Totem")],
[7844] = totemData[string_lower("Fire Nova Totem")],
[7845] = totemData[string_lower("Fire Nova Totem")],
[14662] = totemData[string_lower("Fire Nova Totem")],
[15482] = totemData[string_lower("Fire Nova Totem")],
[15483] = totemData[string_lower("Fire Nova Totem")],
[24320] = totemData[string_lower("Fire Nova Totem")],
[32775] = totemData[string_lower("Fire Nova Totem")],
[32776] = totemData[string_lower("Fire Nova Totem")],
[17539] = totemData[string_lower("Totem of Wrath")],
[22970] = totemData[string_lower("Totem of Wrath")],
[22971] = totemData[string_lower("Totem of Wrath")],
[30652] = totemData[string_lower("Totem of Wrath")],
[30653] = totemData[string_lower("Totem of Wrath")],
[30654] = totemData[string_lower("Totem of Wrath")],
[15439] = totemData[string_lower("Fire Elemental Totem")],
[40830] = totemData[string_lower("Fire Elemental Totem")],
[41337] = totemData[string_lower("Fire Elemental Totem")],
[41346] = totemData[string_lower("Fire Elemental Totem")],
[72301] = totemData[string_lower("Fire Elemental Totem")],
[5926] = totemData[string_lower("Frost Resistance Totem")],
[7412] = totemData[string_lower("Frost Resistance Totem")],
[7413] = totemData[string_lower("Frost Resistance Totem")],
[15486] = totemData[string_lower("Frost Resistance Totem")],
[31171] = totemData[string_lower("Frost Resistance Totem")],
[31172] = totemData[string_lower("Frost Resistance Totem")],
-- Water
[5927] = totemData[string_lower("Fire Resistance Totem")],
[7424] = totemData[string_lower("Fire Resistance Totem")],
[7425] = totemData[string_lower("Fire Resistance Totem")],
[15487] = totemData[string_lower("Fire Resistance Totem")],
[31169] = totemData[string_lower("Fire Resistance Totem")],
[31170] = totemData[string_lower("Fire Resistance Totem")],
[5923] = totemData[string_lower("Poison Cleansing Totem")],
[22487] = totemData[string_lower("Poison Cleansing Totem")],
[5924] = totemData[string_lower("Disease Cleansing Totem")],
[3527] = totemData[string_lower("Healing Stream Totem")],
[3906] = totemData[string_lower("Healing Stream Totem")],
[3907] = totemData[string_lower("Healing Stream Totem")],
[3908] = totemData[string_lower("Healing Stream Totem")],
[3909] = totemData[string_lower("Healing Stream Totem")],
[14664] = totemData[string_lower("Healing Stream Totem")],
[15488] = totemData[string_lower("Healing Stream Totem")],
[18235] = totemData[string_lower("Healing Stream Totem")],
[31181] = totemData[string_lower("Healing Stream Totem")],
[31182] = totemData[string_lower("Healing Stream Totem")],
[31185] = totemData[string_lower("Healing Stream Totem")],
[34686] = totemData[string_lower("Healing Stream Totem")],
[36542] = totemData[string_lower("Healing Stream Totem")],
[37810] = totemData[string_lower("Healing Stream Totem")],
[38428] = totemData[string_lower("Healing Stream Totem")],
[47077] = totemData[string_lower("Healing Stream Totem")],
[72309] = totemData[string_lower("Healing Stream Totem")],
[72457] = totemData[string_lower("Healing Stream Totem")],
[73890] = totemData[string_lower("Healing Stream Totem")],
[74433] = totemData[string_lower("Healing Stream Totem")],
[97508] = totemData[string_lower("Healing Stream Totem")],
[112567] = totemData[string_lower("Healing Stream Totem")],
[120357] = totemData[string_lower("Healing Stream Totem")],
[128539] = totemData[string_lower("Healing Stream Totem")],
[132049] = totemData[string_lower("Healing Stream Totem")],
[10467] = totemData[string_lower("Mana Tide Totem")],
[11100] = totemData[string_lower("Mana Tide Totem")],
[11101] = totemData[string_lower("Mana Tide Totem")],
[17061] = totemData[string_lower("Mana Tide Totem")],
[3573] = totemData[string_lower("Mana Spring Totem")],
[7414] = totemData[string_lower("Mana Spring Totem")],
[7415] = totemData[string_lower("Mana Spring Totem")],
[7416] = totemData[string_lower("Mana Spring Totem")],
[15304] = totemData[string_lower("Mana Spring Totem")],
[15489] = totemData[string_lower("Mana Spring Totem")],
[31186] = totemData[string_lower("Mana Spring Totem")],
[31189] = totemData[string_lower("Mana Spring Totem")],
[31190] = totemData[string_lower("Mana Spring Totem")],
-- Earth
[2630] = totemData[string_lower("Earthbind Totem")],
[22486] = totemData[string_lower("Earthbind Totem")],
[40233] = totemData[string_lower("Earthbind Totem")],
[74737] = totemData[string_lower("Earthbind Totem")],
[79155] = totemData[string_lower("Earthbind Totem")],
[3579] = totemData[string_lower("Stoneclaw Totem")],
[3911] = totemData[string_lower("Stoneclaw Totem")],
[3912] = totemData[string_lower("Stoneclaw Totem")],
[3913] = totemData[string_lower("Stoneclaw Totem")],
[7398] = totemData[string_lower("Stoneclaw Totem")],
[7399] = totemData[string_lower("Stoneclaw Totem")],
[14870] = totemData[string_lower("Stoneclaw Totem")],
[15478] = totemData[string_lower("Stoneclaw Totem")],
[31120] = totemData[string_lower("Stoneclaw Totem")],
[31121] = totemData[string_lower("Stoneclaw Totem")],
[31122] = totemData[string_lower("Stoneclaw Totem")],
[40258] = totemData[string_lower("Stoneclaw Totem")],
[102402] = totemData[string_lower("Stoneclaw Totem")],
[5873] = totemData[string_lower("Stoneskin Totem")],
[5919] = totemData[string_lower("Stoneskin Totem")],
[5920] = totemData[string_lower("Stoneskin Totem")],
[7366] = totemData[string_lower("Stoneskin Totem")],
[7367] = totemData[string_lower("Stoneskin Totem")],
[7368] = totemData[string_lower("Stoneskin Totem")],
[14663] = totemData[string_lower("Stoneskin Totem")],
[15470] = totemData[string_lower("Stoneskin Totem")],
[15474] = totemData[string_lower("Stoneskin Totem")],
[18177] = totemData[string_lower("Stoneskin Totem")],
[21994] = totemData[string_lower("Stoneskin Totem")],
[31175] = totemData[string_lower("Stoneskin Totem")],
[31176] = totemData[string_lower("Stoneskin Totem")],
[36550] = totemData[string_lower("Stoneskin Totem")],
[40267] = totemData[string_lower("Stoneskin Totem")],
[41967] = totemData[string_lower("Stoneskin Totem")],
[5874] = totemData[string_lower("Strength of Earth Totem")],
[5921] = totemData[string_lower("Strength of Earth Totem")],
[5922] = totemData[string_lower("Strength of Earth Totem")],
[7403] = totemData[string_lower("Strength of Earth Totem")],
[15464] = totemData[string_lower("Strength of Earth Totem")],
[15479] = totemData[string_lower("Strength of Earth Totem")],
[21992] = totemData[string_lower("Strength of Earth Totem")],
[30647] = totemData[string_lower("Strength of Earth Totem")],
[31129] = totemData[string_lower("Strength of Earth Totem")],
[40266] = totemData[string_lower("Strength of Earth Totem")],
[15430] = totemData[string_lower("Earth Elemental Totem")],
[24649] = totemData[string_lower("Earth Elemental Totem")],
[39387] = totemData[string_lower("Earth Elemental Totem")],
[40247] = totemData[string_lower("Earth Elemental Totem")],
[72307] = totemData[string_lower("Earth Elemental Totem")],
[5913] = totemData[string_lower("Tremor Totem")],
[41938] = totemData[string_lower("Tremor Totem")],
[41939] = totemData[string_lower("Tremor Totem")],
-- Air
[5925] = totemData[string_lower("Grounding Totem")],
[128537] = totemData[string_lower("Grounding Totem")],
[136251] = totemData[string_lower("Grounding Totem")],
[7486] = totemData[string_lower("Grace of Air Totem")],
[7487] = totemData[string_lower("Grace of Air Totem")],
[15463] = totemData[string_lower("Grace of Air Totem")],
[7467] = totemData[string_lower("Nature Resistance Totem")],
[7468] = totemData[string_lower("Nature Resistance Totem")],
[7469] = totemData[string_lower("Nature Resistance Totem")],
[15490] = totemData[string_lower("Nature Resistance Totem")],
[31173] = totemData[string_lower("Nature Resistance Totem")],
[31174] = totemData[string_lower("Nature Resistance Totem")],
[6112] = totemData[string_lower("Windfury Totem")],
[7483] = totemData[string_lower("Windfury Totem")],
[7484] = totemData[string_lower("Windfury Totem")],
[14666] = totemData[string_lower("Windfury Totem")],
[15496] = totemData[string_lower("Windfury Totem")],
[15497] = totemData[string_lower("Windfury Totem")],
[22897] = totemData[string_lower("Windfury Totem")],
[41940] = totemData[string_lower("Windfury Totem")],
[41941] = totemData[string_lower("Windfury Totem")],
[80703] = totemData[string_lower("Windfury Totem")],
[105690] = totemData[string_lower("Windfury Totem")],
[133684] = totemData[string_lower("Windfury Totem")],
[3968] = totemData[string_lower("Sentry Totem")],
[28938] = totemData[string_lower("Sentry Totem")],
[40187] = totemData[string_lower("Sentry Totem")],
[69505] = totemData[string_lower("Sentry Totem")],
[70413] = totemData[string_lower("Sentry Totem")],
[71145] = totemData[string_lower("Sentry Totem")],
[147410] = totemData[string_lower("Sentry Totem")],
[9687] = totemData[string_lower("Windwall Totem")],
[9688] = totemData[string_lower("Windwall Totem")],
[9689] = totemData[string_lower("Windwall Totem")],
[15492] = totemData[string_lower("Windwall Totem")],
[15447] = totemData[string_lower("Wrath of Air Totem")],
[36556] = totemData[string_lower("Wrath of Air Totem")],
[15803] = totemData[string_lower("Tranquil Air Totem")],
}
function Gladdy:GetTotemData()
return totemData, totemNpcIdsToTotemData, totemSpellIdToPulse
end
Gladdy.legacy = {
castBarPos = "LEFT",
buffsCooldownPos = "TOP",
buffsBuffsCooldownPos = "BOTTOM",
classIconPos = "LEFT",
ciAnchor = "healthBar",
ciPos = "TOP",
cooldownYPos = "TOP",
cooldownXPos = "LEFT",
drCooldownPos = "RIGHT",
racialAnchor = "trinket",
racialPos = "RIGHT",
trinketPos = "RIGHT",
padding = 1,
growUp = false,
}
Gladdy.newDefaults = {
["bottomMargin"] = 94.99996948242188,
["newLayout"] = true,
Pets = {
["petYOffset"] = -81.99993896484375,
["petXOffset"] = 181,
},
ClassIcon = {
["classIconXOffset"] = -74.90008544921875,
},
Racial = {
["racialXOffset"] = 255.9000244140625,
},
Trinket = {
["trinketXOffset"] = 182,
},
["Combat Indicator"] = {
["ciXOffset"] = 79.99993896484375,
["ciYOffset"] = -10.99993896484375,
},
Cooldowns = {
["cooldownYOffset"] = 31,
},
["Buffs and Debuffs"] = {
["buffsBuffsXOffset"] = 29,
["buffsBuffsYOffset"] = -82.99993896484375,
["buffsXOffset"] = 29,
["buffsYOffset"] = 62.00006103515625,
},
Diminishings = {
["drXOffset"] = 329.7999877929688,
["drYOffset"] = -22.5,
},
["Cast Bar"] = {
["castBarXOffset"] = -235.900146484375,
["castBarYOffset"] = -30.5,
},
}
Gladdy.frameStrata = {
BACKGROUND = L["Background"] .. "(0)",
LOW = L["Low"] .. "(1)",
MEDIUM = L["Medium"] .. "(2)",
HIGH = L["High"] .. "(3)",
DIALOG = L["Dialog"] .. "(4)",
FULLSCREEN = L["Fullscreen"] .. "(5)",
FULLSCREEN_DIALOG = L["Fullscreen Dialog"] .. "(6)",
TOOLTIP = L["Tooltip"] .. "(7)",
}
Gladdy.frameStrataSorting = {
[1] = "BACKGROUND",
[2] = "LOW",
[3] = "MEDIUM",
[4] = "HIGH",
[5] = "DIALOG",
[6] = "FULLSCREEN",
[7] = "FULLSCREEN_DIALOG",
[8] = "TOOLTIP",
}

1383
Constants_Wrath.lua Normal file

File diff suppressed because it is too large Load Diff

295
Constants_shared.lua Normal file
View File

@ -0,0 +1,295 @@
local tbl_sort, select, string_lower = table.sort, select, string.lower
local GetLocale = GetLocale
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
Gladdy.RACES = {"Scourge", "BloodElf", "Tauren", "Orc", "Troll", "NightElf", "Draenei", "Human", "Gnome", "Dwarf"}
tbl_sort(Gladdy.RACES)
local RACE_ICON_TCOORDS = {
["HUMAN_MALE"] = { 0, 0.125, 0, 0.25 },
["DWARF_MALE"] = { 0.125, 0.25, 0, 0.25 },
["GNOME_MALE"] = { 0.25, 0.375, 0, 0.25 },
["NIGHTELF_MALE"] = { 0.375, 0.5, 0, 0.25 },
["TAUREN_MALE"] = { 0, 0.125, 0.25, 0.5 },
["SCOURGE_MALE"] = { 0.125, 0.25, 0.25, 0.5 },
["TROLL_MALE"] = { 0.25, 0.375, 0.25, 0.5 },
["ORC_MALE"] = { 0.375, 0.5, 0.25, 0.5 },
["HUMAN_FEMALE"] = { 0, 0.125, 0.5, 0.75 },
["DWARF_FEMALE"] = { 0.125, 0.25, 0.5, 0.75 },
["GNOME_FEMALE"] = { 0.25, 0.375, 0.5, 0.75 },
["NIGHTELF_FEMALE"] = { 0.375, 0.5, 0.5, 0.75 },
["TAUREN_FEMALE"] = { 0, 0.125, 0.75, 1.0 },
["SCOURGE_FEMALE"] = { 0.125, 0.25, 0.75, 1.0 },
["TROLL_FEMALE"] = { 0.25, 0.375, 0.75, 1.0 },
["ORC_FEMALE"] = { 0.375, 0.5, 0.75, 1.0 },
["BLOODELF_MALE"] = { 0.5, 0.625, 0.25, 0.5 },
["BLOODELF_FEMALE"] = { 0.5, 0.625, 0.75, 1.0 },
["DRAENEI_MALE"] = { 0.5, 0.625, 0, 0.25 },
["DRAENEI_FEMALE"] = { 0.5, 0.625, 0.5, 0.75 },
}
local arenaTimer = {
["default"] = {
[60] = "One minute until the Arena battle begins!",
[30] = "Thirty seconds until the Arena battle begins!",
[15] = "Fifteen seconds until the Arena battle begins!",
[0] = "The Arena battle has begun!",
},
["esES"] = {
[60] = "¡Un minuto hasta que dé comienzo la batalla en arena!",
[30] = "¡Treinta segundos hasta que comience la batalla en arena!",
[15] = "¡Quince segundos hasta que comience la batalla en arena!",
[0] = "¡La batalla en arena ha comenzado!",
},
["ptBR"] = {
[60] = "Um minuto até a batalha na Arena começar!",
[30] = "Trinta segundos até a batalha na Arena começar!",
[15] = "Quinze segundos até a batalha na Arena começar!",
[0] = "A batalha na Arena começou!",
},
["deDE"] = {
[60] = "Noch eine Minute bis der Arenakampf beginnt!",
[30] = "Noch dreißig Sekunden bis der Arenakampf beginnt!",
[15] = "Noch fünfzehn Sekunden bis der Arenakampf beginnt!",
[0] = "Der Arenakampf hat begonnen!",
},
["frFR"] = {
[60] = "Le combat d'arène commence dans une minute\194\160!",
[30] = "Le combat d'arène commence dans trente secondes\194\160!",
[15] = "Le combat d'arène commence dans quinze secondes\194\160!",
[0] = "Le combat d'arène commence\194\160!",
},
["ruRU"] = {
[60] = "Одна минута до начала боя на арене!",
[30] = "Тридцать секунд до начала боя на арене!",
[15] = "До начала боя на арене осталось 15 секунд.",
[0] = "Бой начался!",
},
["itIT"] = { -- TODO
-- Beta has no itIT version available?
},
["koKR"] = {
[60] = "투기장 전투 시작 1분 전입니다!",
[30] = "투기장 전투 시작 30초 전입니다!",
[15] = "투기장 전투 시작 15초 전입니다!",
[0] = "투기장 전투가 시작되었습니다!",
},
["zhCN"] = {
[60] = "竞技场战斗将在一分钟后开始!",
[30] = "竞技场战斗将在三十秒后开始!",
[15] = "竞技场战斗将在十五秒后开始!",
[0] = "竞技场的战斗开始了!",
},
["zhTW"] = {
[60] = "1分鐘後競技場戰鬥開始!",
[30] = "30秒後競技場戰鬥開始!",
[15] = "15秒後競技場戰鬥開始!",
[0] = "競技場戰鬥開始了!",
},
}
arenaTimer["esMX"] = arenaTimer["esES"]
arenaTimer["ptPT"] = arenaTimer["ptBR"]
function Gladdy:GetArenaTimer()
if arenaTimer[GetLocale()] then
return arenaTimer[GetLocale()]
else
return arenaTimer["default"]
end
end
Gladdy.legacy = {
castBarPos = "LEFT",
buffsCooldownPos = "TOP",
buffsBuffsCooldownPos = "BOTTOM",
classIconPos = "LEFT",
ciAnchor = "healthBar",
ciPos = "TOP",
cooldownYPos = "TOP",
cooldownXPos = "LEFT",
drCooldownPos = "RIGHT",
racialAnchor = "trinket",
racialPos = "RIGHT",
trinketPos = "RIGHT",
padding = 1,
growUp = false,
}
Gladdy.newDefaults = {
["bottomMargin"] = 94.99996948242188,
["newLayout"] = true,
Pets = {
["petYOffset"] = -81.99993896484375,
["petXOffset"] = 181,
},
ClassIcon = {
["classIconXOffset"] = -74.90008544921875,
},
Racial = {
["racialXOffset"] = 255.9000244140625,
},
Trinket = {
["trinketXOffset"] = 182,
},
["Combat Indicator"] = {
["ciXOffset"] = 79.99993896484375,
["ciYOffset"] = -10.99993896484375,
},
Cooldowns = {
["cooldownYOffset"] = 31,
},
["Buffs and Debuffs"] = {
["buffsBuffsXOffset"] = 29,
["buffsBuffsYOffset"] = -82.99993896484375,
["buffsXOffset"] = 29,
["buffsYOffset"] = 62.00006103515625,
},
Diminishings = {
["drXOffset"] = 329.7999877929688,
["drYOffset"] = -22.5,
},
["Cast Bar"] = {
["castBarXOffset"] = -235.900146484375,
["castBarYOffset"] = -30.5,
},
}
Gladdy.frameStrata = {
BACKGROUND = L["Background"] .. "(0)",
LOW = L["Low"] .. "(1)",
MEDIUM = L["Medium"] .. "(2)",
HIGH = L["High"] .. "(3)",
DIALOG = L["Dialog"] .. "(4)",
FULLSCREEN = L["Fullscreen"] .. "(5)",
FULLSCREEN_DIALOG = L["Fullscreen Dialog"] .. "(6)",
TOOLTIP = L["Tooltip"] .. "(7)",
}
Gladdy.frameStrataSorting = {
[1] = "BACKGROUND",
[2] = "LOW",
[3] = "MEDIUM",
[4] = "HIGH",
[5] = "DIALOG",
[6] = "FULLSCREEN",
[7] = "FULLSCREEN_DIALOG",
[8] = "TOOLTIP",
}
local dispelTypeColors = {}
dispelTypeColors["none"] = { r = 0.80, g = 0, b = 0, a = 1 }
dispelTypeColors["magic"] = { r = 0.20, g = 0.60, b = 1.00, a = 1 }
dispelTypeColors["curse"] = { r = 0.60, g = 0.00, b = 1.00, a = 1 }
dispelTypeColors["disease"] = { r = 0.60, g = 0.40, b = 0, a = 1 }
dispelTypeColors["poison"] = { r = 0.00, g = 0.60, b = 0, a = 1 }
dispelTypeColors["immune"] = { r = 1.00, g = 0.02, b = 0.99, a = 1 }
dispelTypeColors["enrage"] = dispelTypeColors["none"]
dispelTypeColors["form"] = dispelTypeColors["none"]
dispelTypeColors["aura"] = dispelTypeColors["none"]
dispelTypeColors[""] = dispelTypeColors["none"]
function Gladdy:GetDispelTypeColors()
return dispelTypeColors
end
--[[schoolColoring = {
[SCHOOL_MASK_NONE] = {a=1.0,r=1.00,g=1.00,b=1.00};
[SCHOOL_MASK_PHYSICAL] = {a=1.0,r=1.00,g=1.00,b=0.00};
[SCHOOL_MASK_HOLY] = {a=1.0,r=1.00,g=0.90,b=0.50};
[SCHOOL_MASK_FIRE] = {a=1.0,r=1.00,g=0.50,b=0.00};
[SCHOOL_MASK_NATURE] = {a=1.0,r=0.30,g=1.00,b=0.30};
[SCHOOL_MASK_FROST] = {a=1.0,r=0.50,g=1.00,b=1.00};
[SCHOOL_MASK_SHADOW] = {a=1.0,r=0.50,g=0.50,b=1.00};
[SCHOOL_MASK_ARCANE] = {a=1.0,r=1.00,g=0.50,b=1.00};
SCHOOL_MASK_NONE = 0x00;
SCHOOL_MASK_PHYSICAL = 0x01;
SCHOOL_MASK_HOLY = 0x02;
SCHOOL_MASK_FIRE = 0x04;
SCHOOL_MASK_NATURE = 0x08;
SCHOOL_MASK_FROST = 0x10;
SCHOOL_MASK_SHADOW = 0x20;
SCHOOL_MASK_ARCANE = 0x40;
--]]
local spellSchoolColors = {}
spellSchoolColors[1] = { r = 1, g = 1, b = 0, a = 1, type = "Physical" } -- "physical" 255, 255, 0
spellSchoolColors[2] = { r = 1, g = 0.901, b = 0.501, a = 1, type = "Holy" } --"holy" -- 255, 230, 128
spellSchoolColors[4] = { r = 1, g = 0.501, b = 0, a = 1, type = "Fire" } --"fire" -- 255, 128, 0
spellSchoolColors[8] = { r = 0.302, g = 1, b = 0.302, a = 1, type = "Nature" } --"nature" -- 77, 255, 77
spellSchoolColors[16] = { r = 0.501, g = 1, b = 1, a = 1, type = "Frost" } --"frost" -- 128, 255, 255
spellSchoolColors[32] = { r = 0.501, g = 0.501, b = 1, a = 1, type = "Shadow" } --"shadow" --128, 128, 255
spellSchoolColors[64] = { r = 1, g = 0.501, b = 1, a = 1, type = "Arcane" } --"arcane" -- 255, 128, 255
spellSchoolColors["unknown"] = { r = 0, g = 0, b = 0, a = 1, type = "Unknown" } --"unknown spell school"
function Gladdy:GetSpellSchoolColors()
return spellSchoolColors
end
---------------------
-- TRINKET STUFF
---------------------
local pvpTrinkets = { -- [itemID] = cd in ms
--wotlk
[59752] = 120000,
[51377] = 120000,
[51378] = 120000,
[46083] = 120000,
[46085] = 120000,
[46081] = 120000,
[46084] = 120000,
[46082] = 120000,
[42122] = 120000,
[42123] = 120000,
--tbc
[37864] = 120000,
[37865] = 120000,
[28235] = 120000,
[30348] = 120000,
[28238] = 120000,
[30351] = 120000,
[28236] = 120000,
[30349] = 120000,
[28234] = 120000,
[28237] = 120000,
[30350] = 120000,
[28240] = 120000,
[28243] = 120000,
[30345] = 120000,
[28241] = 120000,
[30343] = 120000,
[28239] = 120000,
[30346] = 120000,
[28242] = 120000,
[30344] = 120000,
[29593] = 120000,
[29593] = 300000,
[18859] = 300000,
[18857] = 300000,
[18864] = 300000,
[18854] = 300000,
[18862] = 300000,
[18858] = 300000,
[18856] = 300000,
[18863] = 300000,
[18834] = 300000,
[18851] = 300000,
[18845] = 300000,
[18852] = 300000,
[29592] = 300000,
[18850] = 300000,
[18846] = 300000,
[18853] = 300000,
}
function Gladdy:GetPvpTrinkets()
return pvpTrinkets
end

View File

@ -1,4 +1,4 @@
local select, string_gsub, tostring, pairs = select, string.gsub, tostring, pairs
local select, string_gsub, tostring, pairs, ipairs = select, string.gsub, tostring, pairs, ipairs
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
@ -11,10 +11,11 @@ local FindAuraByName = AuraUtil.FindAuraByName
local GetTime = GetTime
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local Cooldowns = Gladdy.modules["Cooldowns"]
local Diminishings = Gladdy.modules["Diminishings"]
local EventListener = Gladdy:NewModule("EventListener", nil, {
local EventListener = Gladdy:NewModule("EventListener", 101, {
test = true,
})
@ -51,47 +52,49 @@ function EventListener:Reset()
self:SetScript("OnEvent", nil)
end
function Gladdy:DetectSpec(unit, spec)
if spec then
self.modules["Cooldowns"]:DetectSpec(unit, spec)
end
end
function Gladdy:SpotEnemy(unit, auraScan)
local button = self.buttons[unit]
if not unit or not button then
return
end
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)
button.stealthed = false
Gladdy.guids[UnitGUID(unit)] = unit
if UnitExists(unit) then
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
Gladdy:SendMessage("AURA_FADE", unit, "HELPFUL")
for n = 1, 30 do
local spellName,_,_,_,_,expirationTime,unitCaster = UnitAura(unit, n, "HELPFUL")
local spellName, texture, count, dispelType, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, n, "HELPFUL")
if ( not spellName ) then
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, AURA_TYPE_BUFF, n - 1)
break
end
if Gladdy.cooldownBuffs[spellName] then -- Check for auras that detect used CDs (like Fear Ward)
if Gladdy.specBuffs[spellName] and unitCaster then -- Check for auras that detect a spec
local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
EventListener:DetectSpec(unit, Gladdy.specBuffs[spellName])
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, expirationTime - GetTime())
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.specBuffs[spellName] then -- Check for auras that detect a spec
local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
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
Gladdy:SendMessage("AURA_GAIN", unit, AURA_TYPE_BUFF, spellID, spellName, texture, duration, expirationTime, count, dispelType, n, unitCaster)
end
end
end
@ -106,13 +109,32 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
end
if destUnit then
-- cooldown
if (Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName]) then
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
Cooldowns:AURA_FADE(destUnit, spellID)
end
-- diminish tracker
if Gladdy.buttons[destUnit] and (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then
Diminishings:AuraFade(destUnit, spellID)
if Gladdy.buttons[destUnit] and Gladdy.db.drEnabled and extraSpellId == AURA_TYPE_DEBUFF then
if (eventType == "SPELL_AURA_REMOVED") then
Diminishings:AuraFade(destUnit, spellID)
end
if (eventType == "SPELL_AURA_REFRESH") then
Diminishings:AuraGain(destUnit, spellID)
--Diminishings:AuraFade(destUnit, spellID)
end
if (eventType == "SPELL_AURA_APPLIED") then
Diminishings:AuraGain(destUnit, spellID)
end
end
-- death detection
if (Gladdy.buttons[destUnit] and eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
Gladdy:SendMessage("UNIT_DEATH", destUnit)
if not Gladdy:isFeignDeath(destUnit) then
Gladdy:SendMessage("UNIT_DEATH", destUnit)
end
end
-- spec detection
if Gladdy.buttons[destUnit] and (not Gladdy.buttons[destUnit].class or not Gladdy.buttons[destUnit].race) then
@ -128,33 +150,37 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
if (not UnitExists(srcUnit)) then
return
end
if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED") then
local unitRace = Gladdy.buttons[srcUnit].race
if not Gladdy.buttons[srcUnit].class or not Gladdy.buttons[srcUnit].race then
Gladdy:SpotEnemy(srcUnit, true)
end
if not Gladdy.buttons[srcUnit].spec then
self:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED" or eventType == "SPELL_MISSED") then
self:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
-- 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
Cooldowns:CooldownUsed(srcUnit, unitClass, spellId)
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
if spellID ~= 16188 and spellID ~= 17116 then -- Nature's Swiftness CD starts when buff fades
Gladdy:Debug("INFO", "SPELL_CAST_SUCCESS - CooldownUsed", srcUnit, "spellID:", spellID)
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 not Gladdy.buttons[srcUnit].class or not Gladdy.buttons[srcUnit].race then
Gladdy:SpotEnemy(srcUnit, true)
end
if not Gladdy.buttons[srcUnit].spec then
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
if (eventType == "SPELL_AURA_REMOVED" and (spellID == 16188 or spellID == 17116) and Gladdy.buttons[srcUnit].class) then
Gladdy:Debug("INFO", "SPELL_AURA_REMOVED - CooldownUsed", srcUnit, "spellID:", spellID)
Cooldowns:CooldownUsed(srcUnit, Gladdy.buttons[srcUnit].class, spellID)
end
end
end
@ -162,8 +188,10 @@ end
function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
--[[ updateReason: seen, unseen, destroyed, cleared ]]
unit = Gladdy:GetArenaUnit(unit)
local button = Gladdy.buttons[unit]
local pet = Gladdy.modules["Pets"].frames[unit]
Gladdy:Debug("INFO", "ARENA_OPPONENT_UPDATE", unit, updateReason)
if button or pet then
if updateReason == "seen" then
-- ENEMY_SPOTTED
@ -205,6 +233,8 @@ Gladdy.exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB
[24134] = select(1, GetSpellInfo(19386)) .. " Dot",
[24135] = select(1, GetSpellInfo(19386)) .. " Dot",
[27069] = select(1, GetSpellInfo(19386)) .. " Dot",
[49009] = select(1, GetSpellInfo(19386)) .. " Dot",
[49010] = select(1, GetSpellInfo(19386)) .. " Dot",
[19975] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)), -- Entangling Roots Nature's Grasp
[19974] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19973] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
@ -212,13 +242,35 @@ Gladdy.exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB
[19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[27010] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[53312] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
}
Gladdy.cooldownBuffs = {
[GetSpellInfo(6346)] = { cd = 180, spellId = 6346 }, -- Fear Ward
[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)
--[[
/run local f,sn,dt for i=1,2 do f=(i==1 and "HELPFUL"or"HARMFUL")for n=1,30 do sn,_,_,dt=UnitAura("player",n,f) if(not sn)then break end print(sn,dt,dt and dt:len())end end
--]]
function EventListener:UNIT_AURA(unit, isFullUpdate, updatedAuras)
local button = Gladdy.buttons[unit]
if not button then
return
@ -231,29 +283,32 @@ function EventListener:UNIT_AURA(unit)
local auraType = i == 1 and AURA_TYPE_BUFF or AURA_TYPE_DEBUFF
Gladdy:SendMessage("AURA_FADE", unit, auraType)
for n = 1, 30 do
local spellName, texture, count, debuffType, duration, expirationTime, unitCaster, _, shouldConsolidate, spellID = UnitAura(unit, n, filter)
local spellName, texture, count, dispelType, duration, expirationTime, unitCaster, _, shouldConsolidate, spellID = UnitAura(unit, n, filter)
if ( not spellID ) then
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1)
break
end
if Gladdy.cooldownBuffs[spellName] then -- Check for auras that hint used CDs (like Fear Ward)
if not button.spec and Gladdy.specBuffs[spellName] and unitCaster then
local unitPet = string_gsub(unit, "%d$", "pet%1")
if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
self:DetectSpec(unit, Gladdy.specBuffs[spellName])
end
end
if (Gladdy.cooldownBuffs[spellName] or Gladdy.cooldownBuffs[spellID]) and unitCaster then -- Check for auras that hint used CDs (like Fear Ward)
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, Gladdy.cooldownBuffs[spellName].spellId, expirationTime - GetTime())
Cooldowns:CooldownUsed(arenaUnit, v.class, cooldownBuff.spellId, cooldownBuff.cd(expirationTime - GetTime()))
end
end
end
if not button.spec and Gladdy.specBuffs[spellName] then
local unitPet = string_gsub(unit, "%d$", "pet%1")
if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end
if 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
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i)
Gladdy:Call("Announcements", "CheckDrink", unit, spellName)
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, dispelType, i, unitCaster)
end
end
end
@ -262,7 +317,7 @@ function EventListener:UNIT_SPELLCAST_START(unit)
if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit)
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
@ -271,16 +326,65 @@ function EventListener:UNIT_SPELLCAST_CHANNEL_START(unit)
if Gladdy.buttons[unit] then
local spellName = UnitChannelInfo(unit)
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
function EventListener:UNIT_SPELLCAST_SUCCEEDED(unit)
function EventListener:UNIT_SPELLCAST_SUCCEEDED(...)
local unit, castGUID, spellID = ...
unit = Gladdy:GetArenaUnit(unit, true)
if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit)
local unitRace = Gladdy.buttons[unit].race
local spellName = GetSpellInfo(spellID)
-- spec detection
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
self:DetectSpec(unit, Gladdy.specSpells[spellName])
end
-- trinket
if spellID == 42292 or spellID == 59752 then
Gladdy:Debug("INFO", "UNIT_SPELLCAST_SUCCEEDED - TRINKET_USED", unit, spellID)
Gladdy:SendMessage("TRINKET_USED", unit)
end
-- racial
if Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
Gladdy:Debug("INFO", "UNIT_SPELLCAST_SUCCEEDED - RACIAL_USED", unit, spellID)
Gladdy:SendMessage("RACIAL_USED", unit)
end
end
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 Gladdy:contains(spec, {L["Holy"], L["Retribution"], L["Protection"]})
or button.class == "SHAMAN" and not Gladdy:contains(spec, {L["Restoration"], L["Enhancement"], L["Elemental"]})
or button.class == "ROGUE" and not Gladdy:contains(spec, {L["Subtlety"], L["Assassination"], L["Combat"]})
or button.class == "WARLOCK" and not Gladdy:contains(spec, {L["Demonology"], L["Destruction"], L["Affliction"]})
or button.class == "PRIEST" and not Gladdy:contains(spec, {L["Shadow"], L["Discipline"], L["Holy"]})
or button.class == "MAGE" and not Gladdy:contains(spec, {L["Frost"], L["Fire"], L["Arcane"]})
or button.class == "DRUID" and not Gladdy:contains(spec, {L["Restoration"], L["Feral"], L["Balance"]})
or button.class == "HUNTER" and not Gladdy:contains(spec, {L["Beast Mastery"], L["Marksmanship"], L["Survival"]})
or button.class == "WARRIOR" and not Gladdy:contains(spec, {L["Arms"], L["Protection"], L["Fury"]})
or button.class == "DEATHKNIGHT" and not Gladdy:contains(spec, {L["Unholy"], L["Blood"], L["Frost"]}) 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

View File

@ -134,6 +134,8 @@ function Gladdy:UpdateFrame()
local height = (self.db.healthBarHeight + powerBarHeight) * teamSize
+ (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2 * teamSize)
+ self.db.bottomMargin * (teamSize - 1)
local singleFrameHeight = self.db.healthBarHeight + powerBarHeight +
(self.db.highlightInset and 0 or self.db.highlightBorderSize * 2) + self.db.bottomMargin
-- Highlight
margin = margin + highlightBorderSize
@ -155,10 +157,13 @@ function Gladdy:UpdateFrame()
self.frame:SetPoint("CENTER")
else
local scale = self.frame:GetEffectiveScale()
local growMiddle = self.db.growMiddle and teamSize > 0 and teamSize / 2 >= 1 and (teamSize - 1) * (singleFrameHeight / 2) or 0
if (self.db.growDirection == "TOP") then
self.frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, self.db.y / scale)
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
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
@ -368,6 +373,10 @@ function Gladdy:SetPosition(frame, unit, xOffsetDB, yOffsetDB, newLayout, module
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)

View File

@ -17,7 +17,7 @@ local IsActiveBattlefieldArena = IsActiveBattlefieldArena
local IsInInstance = IsInInstance
local GetNumArenaOpponents = GetNumArenaOpponents
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 LibStub = LibStub
@ -27,14 +27,14 @@ local LibStub = LibStub
---------------------------
local MAJOR, MINOR = "Gladdy", 5
local MAJOR, MINOR = "Gladdy", 8
local Gladdy = LibStub:NewLibrary(MAJOR, MINOR)
local L
Gladdy.version_major_num = 2
Gladdy.version_minor_num = 0.00
Gladdy.version_minor_num = 0.20
Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num
Gladdy.version_releaseType = RELEASE_TYPES.release
Gladdy.version = PREFIX .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType
Gladdy.version_releaseType = RELEASE_TYPES.beta
Gladdy.version = PREFIX .. string.format("%.2f", Gladdy.version_num) .. "-" .. Gladdy.version_releaseType
Gladdy.VERSION_REGEX = VERSION_REGEX
Gladdy.debug = false
@ -84,11 +84,11 @@ end
function Gladdy:Debug(lvl, ...)
if Gladdy.debug then
if lvl == "INFO" then
Gladdy:Print(...)
Gladdy:Print("[INFO]", ...)
elseif lvl == "WARN" then
Gladdy:Warn(...)
Gladdy:Warn("[WARN]", ...)
elseif lvl == "ERROR" then
Gladdy:Error(...)
Gladdy:Error("[ERROR]", ...)
end
end
end
@ -187,6 +187,12 @@ function Gladdy:NewModule(name, priority, defaults)
module.defaults = defaults or {}
module.messages = {}
module.RegisterMessages = function(self, ...)
for _,message in pairs({...}) do
self.messages[message] = message
end
end
module.RegisterMessage = function(self, message, func)
self.messages[message] = func or message
end
@ -195,6 +201,12 @@ function Gladdy:NewModule(name, priority, defaults)
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
@ -268,6 +280,7 @@ function Gladdy:OnInitialize()
self.LSM:Register("statusbar", "Smooth", "Interface\\AddOns\\Gladdy\\Images\\Smooth")
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", "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 squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade")
self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF")
@ -276,11 +289,11 @@ function Gladdy:OnInitialize()
L = self.L
self.testData = {
["arena1"] = { name = "Swift", raceLoc = L["NightElf"], classLoc = L["Warrior"], class = "WARRIOR", health = 9635, healthMax = 14207, power = 76, powerMax = 100, powerType = 1, testSpec = L["Arms"], 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" },
["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" },
["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" },
["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" },
["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 = 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 = 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 = 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 = 70, healthMax = 100, power = 2515, powerMax = 10240, powerType = 0, testSpec = L["Discipline"], race = "Human" },
}
self.cooldownSpellIds = {}
@ -394,6 +407,9 @@ function Gladdy:Test()
button:SetAlpha(1)
end
for _, module in self:IterModules() do
self:Call(module, "TestOnce")
end
end
end

View File

@ -1,41 +1,8 @@
## Interface: 20503
## Title: Gladdy - TBC
## Version: 2.00-Release
## Notes: The most powerful arena AddOn for WoW 2.5.3
## Title: Gladdy |cFFFF0000 game client not supported|r
## Version: 2.2-Beta
## Notes: The most powerful arena AddOn for WoW Classic TBC/WotLK
## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751
## SavedVariables: GladdyXZ
## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText
embeds.xml
Gladdy.lua
Lang.lua
Frame.lua
Options.lua
Constants.lua
ImportStrings.lua
Modules\Announcements.lua
Modules\Healthbar.lua
Modules\Powerbar.lua
Modules\Auras.lua
Modules\Castbar.lua
Modules\Classicon.lua
Modules\Clicks.lua
Modules\Diminishings.lua
Modules\Highlight.lua
Modules\TotemPlates.lua
Modules\Trinket.lua
Modules\Racial.lua
Modules\Cooldowns.lua
Modules\ArenaCountDown.lua
Modules\BuffsDebuffs.lua
Modules\VersionCheck.lua
Modules\XiconProfiles.lua
Modules\Pets.lua
Modules\ExportImport.lua
Modules\CombatIndicator.lua
Modules\RangeCheck.lua
Modules\ShadowsightTimer.lua
EventListener.lua
## X-Curse-Project-ID: 482332
## X-WoWI-ID: 26350
## Notes: Gladdy only supports Classic TBC and Classic WotLK.

46
Gladdy_BCC.toc Normal file
View File

@ -0,0 +1,46 @@
## Interface: 20504
## Title: Gladdy - TBC
## Version: 2.2-Beta
## Notes: The most powerful arena AddOn for WoW 2.5.4
## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751
## X-Curse-Project-ID: 482332
## X-WoWI-ID: 26350
## SavedVariables: GladdyXZ
## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText, Plater, Kui_Nameplates, NeatPlates, TidyPlates_ThreatPlates, Tukui, ElvUI
embeds.xml
Gladdy.lua
Lang.lua
Frame.lua
Options.lua
Constants_shared.lua
Constants_BCC.lua
ImportStrings.lua
Util.lua
Modules\Announcements.lua
Modules\Healthbar.lua
Modules\Powerbar.lua
Modules\Auras.lua
Modules\Castbar.lua
Modules\Classicon.lua
Modules\Clicks.lua
Modules\Diminishings.lua
Modules\Highlight.lua
Modules\TotemPlates.lua
Modules\TotemPulse.lua
Modules\Trinket.lua
Modules\Racial.lua
Modules\Cooldowns.lua
Modules\ArenaCountDown.lua
Modules\BuffsDebuffs.lua
Modules\VersionCheck.lua
Modules\XiconProfiles.lua
Modules\Pets.lua
Modules\ExportImport.lua
Modules\CombatIndicator.lua
Modules\RangeCheck.lua
Modules\ShadowsightTimer.lua
EventListener.lua

46
Gladdy_Wrath.toc Normal file
View File

@ -0,0 +1,46 @@
## Interface: 30400
## Title: Gladdy - WotLK
## Version: 2.2-Beta
## Notes: The most powerful arena AddOn for WoW 3.4.0
## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751
## X-Curse-Project-ID: 482332
## X-WoWI-ID: 26350
## SavedVariables: GladdyXZ
## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText, Plater, Kui_Nameplates, NeatPlates, TidyPlates_ThreatPlates, Tukui, ElvUI
embeds.xml
Gladdy.lua
Lang.lua
Frame.lua
Options.lua
Constants_shared.lua
Constants_Wrath.lua
ImportStrings.lua
Util.lua
Modules\Announcements.lua
Modules\Healthbar.lua
Modules\Powerbar.lua
Modules\Auras.lua
Modules\Castbar.lua
Modules\Classicon.lua
Modules\Clicks.lua
Modules\Diminishings.lua
Modules\Highlight.lua
Modules\TotemPlates.lua
Modules\TotemPulse.lua
Modules\Trinket.lua
Modules\Racial.lua
Modules\Cooldowns.lua
Modules\ArenaCountDown.lua
Modules\BuffsDebuffs.lua
Modules\VersionCheck.lua
Modules\XiconProfiles.lua
Modules\Pets.lua
Modules\ExportImport.lua
Modules\CombatIndicator.lua
Modules\RangeCheck.lua
Modules\ShadowsightTimer.lua
EventListener.lua

Binary file not shown.

Binary file not shown.

BIN
Images/UI-StatusBar.blp Normal file

Binary file not shown.

BIN
Images/castbar-shield.blp Normal file

Binary file not shown.

BIN
Images/downarrow.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

382
Lang.lua
View File

@ -7,6 +7,7 @@ local L = {}
-- Classes
L["Druid"] = C_CreatureInfo.GetClassInfo(11).className
L["Deathknight"] = C_CreatureInfo.GetClassInfo(6) and C_CreatureInfo.GetClassInfo(6).className
L["Hunter"] = C_CreatureInfo.GetClassInfo(3).className
L["Mage"] = C_CreatureInfo.GetClassInfo(8).className
L["Paladin"] = C_CreatureInfo.GetClassInfo(2).className
@ -28,6 +29,34 @@ L["Troll"] = C_CreatureInfo.GetRaceInfo(8).raceName
L["Blood Elf"] = C_CreatureInfo.GetRaceInfo(10).raceName
L["Draenei"] = C_CreatureInfo.GetRaceInfo(11).raceName
--Specs
--[[
L["Balance"] = BALANCE
L["Combat"] = COMBAT_LABEL
L["Fire"] = STRING_SCHOOL_FIRE
L["Arcane"] = STRING_SCHOOL_ARCANE
L["Shadow"] = STRING_SCHOOL_SHADOW
L["Holy"] = STRING_SCHOOL_HOLY
L["Elemental"] = STRING_SCHOOL_ELEMENTAL
--Modules
--L["Announcements"] = CHAT_ANNOUNCE
L["Auras"] = COMBAT_TEXT_SHOW_AURAS_TEXT
L["Cast Bar"] = SHOW_ENEMY_CAST
L["Buffs and Debuffs"] = BUFFOPTIONS_LABEL
--L["Class Icon"] = CLASS .. " " .. EMBLEM_SYMBOL
--L["Clicks"] =
L["Cooldowns"] = CAPACITANCE_SHIPMENT_COOLDOWN:gsub(": %%s", "")
--L["Export Import"] =
--L["Healthbar"]
L["Highlight"] = HIGHLIGHTING:gsub(":", "")
L["Pet"] = PET_TYPE_PET
--L["Racial"] = RACE .. " " .. ABILITIES
--L["Range Check"] =
L["Trinket"] = TRINKET0SLOT
--]]
if (GetLocale() == "ruRU") then
-- Specs
L["Balance"] = "Баланс"
@ -1413,6 +1442,359 @@ elseif GetLocale() == "zhCN" then
L["Background Color of the frame"] = "框架的背景顏色"
L["Gladdy"] = "Gladdy框架" --Line 210, 709, 727
elseif GetLocale() == "frFR" then
-- Announcements.lua
L["Announcements"] = "ANNONCE"
L["RESURRECTING: %s (%s)"] = "EN TRAIN DE RESSUSCITER: %s (%s)"
L["SPEC DETECTED: %s - %s (%s)"] = "SPEC DETECTÉ: %s - %s (%s)"
L["LOW HEALTH: %s (%s)"] = "VIE BASSE: %s (%s)"
L["TRINKET USED: %s (%s)"] = "TRINKET UTILISÉ: %s (%s)"
L["TRINKET READY: %s (%s)"] = "TRINKET PRÊT: %s (%s)"
L["DRINKING: %s (%s)"] = "EN TRAIN DE BOIRE: %s (%s)"
L["Self"] = "Soi"
L["Party"] = "Groupe"
L["Raid Warning"] = "Avertissement de raid"
L["Blizzard's Floating Combat Text"] = "Texte de combat flottant de Blizzard"
L["Trinket used"] = "Trinket utilisé"
L["Announce when an enemy's trinket is used"] = "Annonce quand un trinket ennemie est utilisé"
L["Trinket ready"] = "Trinket prêt"
L["Announce when an enemy's trinket is ready again"] = "Annonce quand un trinket ennemie est prêt de nouveau"
L["Drinking"] = "En train de boire"
L["Announces when enemies sit down to drink"] = "Annonce quand les ennemies s'assoient pour boire"
L["Resurrection"] = "Resurrection"
L["Announces when an enemy tries to resurrect a teammate"] = "Annonce quand un ennemie essaie de ressusciter un membre de son groupe"
L["New enemies"] = "Nouveaux ennemis"
L["Announces when new enemies are discovered"] = "Annonce quand les ennemies sont découverts"
L["Spec Detection"] = "Détection des SPEC"
L["Announces when the spec of an enemy was detected"] = "Annonce quand une spec d'un ennemie est détecté"
L["Low health"] = "Vie Basse"
L["Announces when an enemy drops below a certain health threshold"] = "Annonce quand un ennemie tombe en dessous d'un certain seuil de points de vie"
L["Low health threshold"] = "Seuil de points de vie bas"
L["Choose how low an enemy must be before low health is announced"] = "Choisissez à quel point un ennemi doit être bas avant d'annoncer une santé faible"
L["Destination"] = "Destination"
L["Choose how your announcements are displayed"] = "Choisissez comment vos annonces sont affichées"
-- ArenaCountDown.lua
L["Arena Countdown"] = "Compte à rebours de l'arène"
L["Turn on/off"] = "Activer / désactiver"
L["Turns countdown before the start of an arena match on/off."] = "Active / désactive le compte à rebours avant le début d'un match d'arène"
L["Size"] = "Taille"
-- Auras.lua
L["Auras"] = "Auras"
L["Frame"] = "Cadre"
L["Cooldown"] = "Temps de recharge"
L["No Cooldown Circle"] = "Pas de Balayage du temps de recharge"
L["Cooldown circle alpha"] = "Alpha du Balayage du temps de recharge"
L["Font"] = "Police de caractère"
L["Font of the cooldown"] = "Police du temps de recharge"
L["Font scale"] = "Échelle de police"
L["Scale of the text"] = "Échelle du texte"
L["Font color"] = "Couleur de la police"
L["Color of the text"] = "Couleur du texte"
L["Border"] = "Bordure"
L["Border style"] = "Style de bordure"
L["Buff color"] = "Couleur des buff"
L["Debuff color"] = "Couleur des Debuff"
L["Check All"] = "Vérifie tout"
L["Uncheck All"] = "Décocher tout"
L["Enabled"] = "Activé"
L["Priority"] = "Priorité"
-- BuffsDebuffs.lua
L["Buffs and Debuffs"] = "Buffs et Debuffs"
L["Enable"] = "Activé"
L["Enabled Buffs and Debuffs module"] = "Module de buffs et debuffs activés"
L["Show CC"] = "Montrer les CC"
L["Shows all debuffs, which are displayed on the ClassIcon as well"] = "Montrer tout les debuffs, qui sont affichés sur l'icone de classe aussi"
L["Buffs"] = "Buffs"
L["Size & Padding"] = "Taille et remplissage"
L["Icon Size"] = "Taille de l'icône"
L["Size of the DR Icons"] = "Taille des icones de DR"
L["Icon Width Factor"] = "Facteur de largeur d'icône"
L["Stretches the icon"] = "Étire l'icône"
L["Icon Padding"] = "Remplissage d'icônes"
L["Space between Icons"] = "Espace entre les icônes"
L["Position"] = "Position"
L["Aura Position"] = "Position de l'aura"
L["Position of the aura icons"] = "Position de l'icône de l'aura"
L["Top"] = "Haut"
L["Bottom"] = "Bas"
L["Left"] = "Gauche"
L["Right"] = "Droite"
L["Grow Direction"] = "Direction de croissance"
L["Grow Direction of the aura icons"] = "Direction de croissance de l'icônr de l'aura"
L["Horizontal offset"] = "Décalage horizontal"
L["Vertical offset"] = "Décalage verticale"
L["Alpha"] = "Alpha"
L["Debuffs"] = "Debuffs"
L["Dynamic Timer Color"] = "Couleur de la minuterie dynamique"
L["Show dynamic color on cooldown numbers"] = "Afficher la couleur dynamique sur les numéros de recharge"
L["Color of the cooldown timer and stacks"] = "Couleur du temps de recharge et des piles"
L["Spell School Colors"] = "Couleurs de l'école de sorts"
L["Spell School Colors Enabled"] = "Couleurs de l'école de sorts"
L["Show border colors by spell school"] = "Afficher les couleurs des bordures par école de sorts"
L["Curse"] = "Malédiction"
L["Color of the border"] = "Couleur de la bordure"
L["Magic"] = "Magique"
L["Poison"] = "Poison"
L["Physical"] = "Physique"
L["Immune"] = "Immunisé"
L["Disease"] = "Maladie"
L["Aura"] = "Aura"
L["Form"] = "Forme"
-- Castbar.lua
L["Cast Bar"] = "Barre d'incantation"
L["Bar"] = "Barre"
L["Bar Size"] = "Taille de la barre"
L["Bar height"] = "Hauteur de la barre"
L["Height of the bar"] = "Hauteur de la barre"
L["Bar width"] = "Largeur de la barre"
L["Width of the bars"] = "Largeur de la barre"
L["Texture"] = "Texture"
L["Bar texture"] = "Texture de la barre"
L["Texture of the bar"] = "Texture de la barre"
L["Bar color"] = "Couleur de la barre"
L["Color of the cast bar"] = "Couleur de la barre d'incantation"
L["Background color"] = "Couleur de l'Arrière plan"
L["Color of the cast bar background"] = "Couleur de l'Arrière plan de la barre d'incantation"
L["Border size"] = "taille de la bordure"
L["Status Bar border"] = "Bordure de la barre de statut"
L["Status Bar border color"] = "Couleur de la bordure de la barre de statut"
L["Icon"] = "Icone"
L["Icon size"] = "Taille de l'icone"
L["Icon border"] = "Bordure de l'icone"
L["Icon border color"] = "Couleur de la bordure de l'icone"
L["Spark"] = "Etincelle"
L["Spark enabled"] = "Etincelle activé"
L["Spark color"] = "Couleur de l'étincelle"
L["Color of the cast bar spark"] = "Couleur de l'étincelle de la barre d'incantation"
L["Font of the castbar"] = "Police de la barre d'incantation"
L["Font size"] = "Taille de la police"
L["Size of the text"] = "Taille du texte"
L["Format"] = "Format"
L["Timer Format"] = "Format du timer"
L["Remaining"] = "Restant"
L["Total"] = "Total"
L["Both"] = "Les deux"
L["Castbar position"] = "Position de la barre d'incantation"
L["Icon position"] = "Position de l'icone"
L["Offsets"] = "Décalage"
-- Classicon.lua
L["Class Icon"] = "Icone de la classe"
L["Balance"] = "Equilibre"
L["Feral"] = "Combat farouche"
L["Restoration"] = "Restauration"
L["Beast Mastery"] = "Maîtrise des bêtes"
L["Marksmanship"] = "Précision"
L["Survival"] = "Survie"
L["Arcane"] = "Arcane"
L["Fire"] = "Feu"
L["Frost"] = "Givre"
L["Holy"] = "Sacré"
L["Retribution"] = "Vindicte"
L["Protection"] = "Protection"
L["Discipline"] = "Discipline"
L["Shadow"] = "Ombre"
L["Assassination"] = "Assassinat"
L["Combat"] = "Combat"
L["Subtlety"] = "Finesse"
L["Elemental"] = "Elementaire"
L["Enhancement"] = "Amélioration"
L["Affliction"] = "Affliction"
L["Demonology"] = "Démonologie"
L["Destruction"] = "Destruction"
L["Arms"] = "Armes"
L["Fury"] = "Fureur"
L["Show Spec Icon"] = "Afficher l'icone des spécialisations"
L["Shows Spec Icon once spec is detected"] = "Afficher l'icone des spécialisations une fois que les spé sont détectés"
L["Icon width factor"] = "Facteur de largeur d'icône"
L["This changes positions with trinket"] = "Cela change de position avec le trinket"
L["Border color"] = "Couleur de la bordure"
--CombatIndicator.lua
L["Combat Indicator"] = "Indicateur de combat"
L["Enable Combat Indicator icon"] = "Activer l'icone de l'indicateur de combat"
L["Anchor"] = "Ancre"
L["This changes the anchor of the ci icon"] = "Cela change l'ancre de l'icône de l'indicateur de combat"
L["This changes position relative to its anchor of the ci icon"] = "Cela change la position par rapport à son ancre de l'icône de l'indicateur de combat"
-- Cooldowns.lua
L["Cooldowns"] = "Temps de recharge (CD)"
L["COOLDOWN USED: %s (%s) used %s - %s sec. cooldown"] = "CD utilisé : %s (%s) utilisé %s - %s sec. cd"
L["Enabled cooldown module"] = "Module du temps de recharge activé"
L["Cooldown size"] = "Taille du temps de recharge"
L["Size of each cd icon"] = "Taille de chaque icone de CD"
L["Max Icons per row"] = "Nombre maximal d'icônes par ligne"
L["Scale of the font"] = "Échelle de la police"
L["Anchor of the cooldown icons"] = "Ancre de l'icone du temps de recharge"
L["Grow Direction of the cooldown icons"] = "Direction de croissance des icônes de temps de recharge"
L["Offset"] = "Décalage"
-- Diminishings.lua
L["Diminishings"] = "Rendements décroissants (DR)"
L["Enabled DR module"] = "Activer le module DR"
L["DR Cooldown position"] = "Position du temps de recharge des DR"
L["Position of the cooldown icons"] = "Position des icones de temps de recharge"
L["DR Border Colors"] = "Couleur de la bordure des DR"
L["Dr Border Colors Enabled"] = "Couleur de la bordure des DR activé"
L["Colors borders of DRs in respective DR-color below"] = "Couleurs des bordures des DR dans la couleur DR respective ci-dessous"
L["Half"] = "Demi"
L["Quarter"] = "Quart"
L["Categories"] = "Catégories"
L["Force Icon"] = "Forcer les icones"
L["Icon of the DR"] = "Icones des DR"
-- ExportImport.lua
L["Export Import"] = "Exporter Importer"
L["Profile Export Import"] = "Profile de l'Exporter Importer"
-- Healthbar.lua
L["Health Bar"] = "Barre de vie"
L["DEAD"] = "MORT"
L["LEAVE"] = "QUITTER"
L["General"] = "Général"
L["Color of the status bar background"] = "Couleur de l'arrière-plan de la barre d'état"
L["Font of the bar"] = "Police de la barre"
L["Name font size"] = "Taille de la police du nom"
L["Size of the name text"] = "Taille du texte du nom"
L["Health font size"] = "Taille de la police de la santé"
L["Size of the health text"] = "Taille du texte de la santé"
L["Size of the border"] = "Taille de la bordure"
L["Health Bar Text"] = "Texte de la barre de santé"
L["Show name text"] = "Afficher le texte du nom"
L["Show the units name"] = "Afficher le nom des unités"
L["Show ArenaX"] = "Afficher ArenaX"
L["Show Arena1-5 as name instead"] = "Afficher Arena1-5 comme nom à la place"
L["Show the actual health"] = "Afficher la santé réelle"
L["Show the actual health on the health bar"] = "Afficher la santé réelle sur la barre de santé"
L["Show max health"] = "Afficher la santé maximale"
L["Show max health on the health bar"] = "Afficher la santé maximale sur la barre de santé"
L["Show health percentage"] = "Afficher le pourcentage de santé"
L["Show health percentage on the health bar"] = "Afficher le pourcentage de santé sur la barre de santé"
-- Highlight.lua
L["Highlight"] = "Surbrillance"
L["Show Inside"] = "Afficher dedans"
L["Show Highlight border inside of frame"] = "Afficher la bordure de surbrillance à l'intérieur du cadre"
L["Colors"] = "Couleurs"
L["Target border color"] = "Couleur de la bordure cible"
L["Color of the selected targets border"] = "Couleur de la bordure des cibles sélectionnées"
L["Focus border color"] = "Couleur de la bordure du Focus"
L["Color of the focus border"] = "Couleur de la bordure du Focus"
L["Highlight target"] = "Mettre la cible en surbrillance"
L["Toggle if the selected target should be highlighted"] = "Basculer si la cible sélectionnée doit être mise en surbrillance"
L["Show border around target"] = "Afficher la bordure autour de la cible"
L["Toggle if a border should be shown around the selected target"] = "Basculer si une bordure doit être affichée autour de la cible sélectionnée"
L["Show border around focus"] = "Afficher la bordure autour du focus"
L["Toggle of a border should be shown around the current focus"] = "La bascule d'une bordure doit être affichée autour du focus actuel"
-- Pets.lua
L["Pets"] = "Familier"
L["Enables Pets module"] = "Activer le module familier (pet)"
L["Width of the bar"] = "Largeur de la barre"
L["Health color"] = "Couleur de la santé"
L["Color of the status bar"] = "Couleur de la barre d'état"
L["Portrait"] = "Portrait"
L["Health Values"] = "Valeurs de santé"
-- Powerbar.lua
L["Power Bar"] = "Barre de puissance"
L["Power Bar Text"] = "Texte de la barre de puissance"
L["Power Texts"] = "Textes de puissance"
L["Show race"] = "Afficher la race"
L["Show spec"] = "Afficher la spé"
L["Show the actual power"] = "Afficher la puissance actuelle"
L["Show the actual power on the power bar"] = "Afficher la puissance actuelle sur la barre de puissance"
L["Show max power"] = "Afficher la puissance maximale"
L["Show max power on the power bar"] = "Afficher la puissance maximale sur la barre de puissance"
L["Show power percentage"] = "Afficher le pourcentage de puissance"
L["Show power percentage on the power bar"] = "Afficher le pourcentage de puissance sur la barre de puissance"
-- Racial.lua
L["Racial"] = "Raciale"
L["Enable racial icon"] = "Activer l'icone du raciale"
L["This changes the anchor of the racial icon"] = "Cela change l'ancre de l'icône du raciale"
L["This changes position relative to its anchor of the racial icon"] = "Cela change de position par rapport à son ancre de l'icône du raciale"
-- TotemPlates.lua
L["Totem Plates"] = "Totem Plates"
L["Customize Totems"] = "Personnaliser les totems"
L["Custom totem name"] = "Personnaliser le nom des totems"
L["Totem General"] = "Totem Général"
L["Turns totem icons instead of nameplates on or off. (Requires reload)"] = "Active ou désactive les icônes totem au lieu des nameplates. (Nécessite un rechargement)"
L["Show friendly"] = "Montrer les amis"
L["Show enemy"] = "Montrer les ennemies"
L["Totem size"] = "Taille du totem"
L["Size of totem icons"] = "Taille de l'icone du totem"
L["Font of the custom totem name"] = "Police du nom du totem personnalisé"
L["Apply alpha when no target"] = "Appliquer l'alpha en l'absence de cible"
L["Always applies alpha, even when you don't have a target. Else it is 1."] = "Applique toujours l'alpha, même lorsque vous n'avez pas de cible. Sinon c'est 1."
L["Apply alpha when targeted"] = "Appliquer l'alpha lorsque ciblé"
L["Always applies alpha, even when you target the totem. Else it is 1."] = "Applique toujours l'alpha, même lorsque vous ciblez le totem. Sinon c'est 1."
L["All totem border alphas (configurable per totem)"] = "Tous les alphas de bordure de totem (configurables par totem)"
L["Totem icon border style"] = "Style de bordure d'icône totem"
L["All totem border color"] = "Toutes les couleurs de bordure de totem"
-- Trinket.lua
L["Trinket"] = "Trinket (Bijoux PvP)"
L["Enable trinket icon"] = "Activer l'icone du trinket"
L["This changes positions of the trinket"] = "Cela change les positions du trinket"
-- XiconProfiles.lua
L["Profile"] = "Profile"
-- Frame.lua
L["Gladdy - drag to move"] = "Gladdy - faites glisser pour déplacer"
-- Gladdy.lua
L["Welcome to Gladdy!"] = "Bienvenue chez Gladdy !"
L["First run has been detected, displaying test frame."] = "La première exécution a été détectée, affichant la trame de test."
L["Valid slash commands are:"] = "Les commandes de slash valides sont :"
L["If this is not your first run please lock or move the frame to prevent this from happening."] = "S'il ne s'agit pas de votre première utilisation, veuillez verrouiller ou déplacer le cadre pour éviter que cela ne se produise."
-- Options.lua
L["settings"] = "paramètres"
L["Reset module"] = "Réinitialiser le module"
L["Reset module to defaults"] = "Réinitialiser le module"
L["No settings"] = "Pas de paramètres"
L["Module has no settings"] = "Le module n'a pas de paramètres"
L["General settings"] = "Paramètres général"
L["Lock frame"] = "Verouiller le cadre"
L["Toggle if frame can be moved"] = "Cliquez si le cadre peut être bougé"
L["Grow frame upwards"] = "Agrandir le cadre vers le haut"
L["If enabled the frame will grow upwards instead of downwards"] = "Si activé, le cadre grandira vers le haut au lieu de vers le bas"
L["Down"] = "Vers la bas"
L["Up"] = "Vers le haut"
L["Frame General"] = "Cadre général"
L["Frame scale"] = "Taille du cadre"
L["Scale of the frame"] = "Taille du cadre"
L["Frame padding"] = "Remplissage du cadre"
L["Padding of the frame"] = "Remplissage du cadre"
L["Frame width"] = "Largeur du cadre"
L["Margin"] = "Marge"
L["Margin between each button"] = "Marge entre chaque bouton"
L["Cooldown General"] = "Temps de recharge Général"
L["Font General"] = "Police Général"
L["General Font"] = "Police Général"
L["Font color text"] = "Texte de la couleur de la police"
L["Font color timer"] = "Texte de la couleur de la police"
L["Color of the timers"] = "Couleur des minuteurs"
L["Icons General"] = "Icônes Général"
L["Icon border style"] = "Style de bordure d'icône"
L["This changes the border style of all icons"] = "Cela change le style de bordure de toutes les icônes"
L["This changes the border color of all icons"] = "Cela change la couleur de bordure de toutes les icônes"
L["Statusbar General"] = "Barre d'état Général"
L["Statusbar texture"] = "Texture de la Barre d'état"
L["This changes the texture of all statusbar frames"] = "Cela change la texture de tous les cadres de la barre d'état"
L["Statusbar border style"] = "Style de bordure de la barre d'état"
L["This changes the border style of all statusbar frames"] = "Cela modifie le style de bordure de tous les cadres de la barre d'état"
L["Statusbar border offset divider (smaller is higher offset)"] = "Diviseur de décalage de bordure de barre d'état (le plus petit est le décalage le plus élevé)"
L["Offset of border to statusbar (in case statusbar shows beyond the border)"] = "Décalage de la bordure par rapport à la barre d'état (au cas où la barre d'état s'afficherait au-delà de la bordure)"
L["Statusbar border color"] = "Couleur de la bordure de la barre d'état"
L["This changes the border color of all statusbar frames"] = "Cela change la couleur de la bordure de tous les cadres de la barre d'état"
end

View File

@ -1,405 +0,0 @@
local major = "DRData-1.0-BCC"
local minor = tonumber(string.match("$Revision: 793$", "(%d+)") or 1)
assert(LibStub, string.format("%s requires LibStub.", major))
local Data = LibStub:NewLibrary(major, minor)
if( not Data ) then return end
-- How long before DR resets
Data.RESET_TIME = 18
-- List of spellID -> DR category
Data.spells = {
--[[ DISORIENTS ]]--
-- Maim
[22570] = "disorient",
-- Sap
[6770] = "disorient",
[2070] = "disorient",
[11297] = "disorient",
-- Gouge (Remove all except 1776 come WoTLK)
[1776] = "disorient",
[1777] = "disorient",
[8629] = "disorient",
[11285] = "disorient",
[11286] = "disorient",
[38764] = "disorient",
-- Polymorph
[118] = "disorient",
[12824] = "disorient",
[12825] = "disorient",
[28272] = "disorient",
[28271] = "disorient",
[12826] = "disorient",
--[[ FEARS ]]--
-- Fear (Warlock)
[5782] = "fear",
[6213] = "fear",
[6215] = "fear",
-- Seduction (Pet)
[6358] = "fear",
-- Howl of Terror
[5484] = "fear",
[17928] = "fear",
-- Psychic scream
[8122] = "fear",
[8124] = "fear",
[10888] = "fear",
[10890] = "fear",
-- Scare Beast
[1513] = "fear",
[14326] = "fear",
[14327] = "fear",
-- Turn Evil
[10326] = "fear",
-- Intimidating Shout
[5246] = "fear",
--[[ CONTROL STUNS ]]--
-- Hammer of Justice
[853] = "ctrlstun",
[5588] = "ctrlstun",
[5589] = "ctrlstun",
[10308] = "ctrlstun",
-- Bash
[5211] = "ctrlstun",
[6798] = "ctrlstun",
[8983] = "ctrlstun",
-- Pounce
[9005] = "ctrlstun",
[9823] = "ctrlstun",
[9827] = "ctrlstun",
[27006] = "ctrlstun",
-- Intimidation
[19577] = "ctrlstun",
-- Charge
[7922] = "ctrlstun",
-- Cheap Shot
[1833] = "ctrlstun",
-- War Stomp
[20549] = "ctrlstun",
-- Intercept
[20253] = "ctrlstun",
[20614] = "ctrlstun",
[20615] = "ctrlstun",
[25273] = "ctrlstun",
[25274] = "ctrlstun",
-- Concussion Blow
[12809] = "ctrlstun",
-- Shadowfury
[30283] = "ctrlstun",
[30413] = "ctrlstun",
[30414] = "ctrlstun",
-- Unstable Affliction (Silence)
[43523] = "ua",
[31117] = "ua",
-- Impact
[12355] = "rndstun",
--[[ RANDOM STUNS ]]--
-- Stoneclaw Stun
[39796] = "rndstun",
-- Starfire Stun
[16922] = "rndstun",
-- Mace Stun
[5530] = "rndstun",
-- Stormherald/Deep Thunder
[34510] = "rndstun",
-- Seal of Justice
[20170] = "rndstun",
-- Blackout
[15269] = "rndstun",
-- Revenge Stun
[12798] = "rndstun",
-- Pyroclasm
[18093] = "rndstun",
--[[ CYCLONE ]]--
-- Blind
[2094] = "cyclone",
-- Cyclone
[33786] = "cyclone",
--[[ ROOTS ]]--
-- Freeze (Water Elemental)
[33395] = "root",
-- Frost Nova
[122] = "root",
[865] = "root",
[6131] = "root",
[10230] = "root",
[27088] = "root",
-- Entangling Roots
[339] = "root",
[1062] = "root",
[5195] = "root",
[5196] = "root",
[9852] = "root",
[9853] = "root",
[26989] = "root",
-- Nature's Grasp
[19975] = "root",
[19974] = "root",
[19973] = "root",
[19972] = "root",
[19971] = "root",
[19970] = "root",
[27010] = "root",
--[[ RANDOM ROOTS ]]--
-- Improved Hamstring
[23694] = "rndroot",
-- Frostbite
[12494] = "rndroot",
--[[ SLEEPS ]]--
-- Hibernate
[2637] = "disorient",
[18657] = "disorient",
[18658] = "disorient",
-- Wyvern Sting
[19386] = "disorient",
[24132] = "disorient",
[24133] = "disorient",
[27068] = "disorient",
--[[ MISC ]]--
-- Chastise
[44041] = "chastise",
[44043] = "chastise",
[44044] = "chastise",
[44045] = "chastise",
[44046] = "chastise",
[44047] = "chastise",
-- Dragon's Breath
[31661] = "scatters", -- Dragon's Breath
[33041] = "scatters", -- Dragon's Breath
[33042] = "scatters", -- Dragon's Breath
[33043] = "scatters", -- Dragon's Breath
-- Repentance
[20066] = "disorient",
-- Scatter Shot
[19503] = "scatters",
-- Freezing Trap
[3355] = "disorient",
[14308] = "disorient",
[14309] = "disorient",
-- Improved Conc Shot
[19410] = "rndstun",
[22915] = "rndstun",
[28445] = "rndstun",
-- Death Coil
[6789] = "dc",
[17925] = "dc",
[17926] = "dc",
[27223] = "dc",
-- Kidney Shot
[408] = "ks",
[8643] = "ks",
-- Mind Control
[605] = "charm",
[10911] = "charm",
[10912] = "charm",
-- Counterattack
[19306] = "counterattack"
}
-- DR Category names
Data.typeNames = {
["disorient"] = "Disorients",
["fear"] = "Fears",
["ctrlstun"] = "Controlled Stuns",
["rndstun"] = "Random Stuns",
["cyclone"] = "Cyclone/Blind",
["ks"] = "Kidney Shot",
["chastise"] = "Chastise",
["scatters"] = "Scatter Shot",
["freezetrap"] = "Freeze Trap",
["rndroot"] = "Random Roots",
["dc"] = "Death Coil",
["sleep"] = "Sleep",
["root"] = "Controlled Roots",
["impconc"] = "Imp Concussive Shot",
["charm"] = "Charms",
["repentance"] = "Repentance",
["dragonsbreath"] = "Dragon's Breath",
["ua"] = "Unstable Affliction Silence",
["counterattack"] = "Counterattack Immobilize"
}
-- Categories that have DR in PvE as well as PvP
Data.pveDRs = {
["ks"] = true,
["ctrlstun"] = true,
["rndstun"] = true,
["cyclone"] = true,
}
-- List of DRs
Data.categories = {}
for _, cat in pairs(Data.spells) do
Data.categories[cat] = true
end
-- Public APIs
-- Category name in something usable
function Data:GetCategoryName(cat)
return cat and Data.typeNames[cat] or nil
end
-- Spell list
function Data:GetSpells()
return Data.spells
end
-- Seconds before DR resets
function Data:GetResetTime()
return Data.RESET_TIME
end
-- Get the category of the spellID
function Data:GetSpellCategory(spellID)
return spellID and Data.spells[spellID] or nil
end
-- Does this category DR in PvE?
function Data:IsPVE(cat)
return cat and Data.pveDRs[cat] or nil
end
-- List of categories
function Data:GetCategories()
return Data.categories
end
-- Next DR, if it's 1.0, next is 0.50, if it's 0.50 next is 0.25 and such
function Data:NextDR(diminished)
if( diminished == 1.0 ) then
return 0.50
elseif( diminished == 0.50 ) then
return 0.25
end
return 0
end
--[[ EXAMPLES ]]--
--[[
This is how you would track DR easily, you're welcome to do whatever you want with the below 4 functions.
Does not include tracking for PvE, you'd need to hack that in yourself but it's not (too) hard.
]]
--[[
local trackedPlayers = {}
local function debuffGained(spellID, destName, destGUID, isEnemy)
if( not trackedPlayers[destGUID] ) then
trackedPlayers[destGUID] = {}
end
-- See if we should reset it back to undiminished
local drCat = DRData:GetSpellCae
local tracked = trackedPlayers[destGUID][drCat]
if( tracked and tracked.reset <= GetTime() ) then
tracked.diminished = 1.0
end
end
local function debuffFaded(spellID, destName, destGUID, isEnemy)
local drCat = DRData:GetSpellCategory(spellID)
if( not trackedPlayers[destGUID] ) then
trackedPlayers[destGUID] = {}
end
if( not trackedPlayers[destGUID][drCat] ) then
trackedPlayers[destGUID][drCat] = { reset = 0, diminished = 1.0 }
end
local time = GetTime()
local tracked = trackedPlayers[destGUID][drCat]
tracked.reset = time + DRData:GetResetTime()
tracked.diminished = nextDR(tracked.diminished)
end
local function resetDR(destGUID)
-- Reset the tracked DRs for this person
if( trackedPlayers[destGUID] ) then
for cat in pairs(trackedPlayers[destGUID]) do
trackedPlayers[destGUID][cat].reset = 0
trackedPlayers[destGUID][cat].diminished = 1.0
end
end
end
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
local COMBATLOG_OBJECT_REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE
local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER
local eventRegistered = {["SPELL_AURA_APPLIED"] = true, ["SPELL_AURA_REMOVED"] = true, ["PARTY_KILL"] = true, ["UNIT_DIED"] = true}
local function COMBAT_LOG_EVENT_UNFILTERED(self, event, timestamp, eventType, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, spellID, spellName, spellSchool, auraType)
if( not eventRegistered[eventType] or ( bit.band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) ~= COMBATLOG_OBJECT_TYPE_PLAYER and bit.band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) ~= COMBATLOG_OBJECT_CONTROL_PLAYER ) ) then
return
end
-- Enemy gained a debuff
if( eventType == "SPELL_AURA_APPLIED" ) then
if( auraType == "DEBUFF" and Data.Spells[spellID] ) then
debuffGained(spellID, destName, destGUID, (bit.band(destFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE))
end
-- Buff or debuff faded from an enemy
elseif( eventType == "SPELL_AURA_REMOVED" ) then
if( auraType == "DEBUFF" and Data.Spells[spellID] ) then
debuffFaded(spellID, destName, destGUID, (bit.band(destFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE))
end
-- Don't use UNIT_DIED inside arenas due to accuracy issues, outside of arenas we don't care too much
elseif( ( eventType == "UNIT_DIED" and select(2, IsInInstance()) ~= "arena" ) or eventType == "PARTY_KILL" ) then
resetDR(destGUID)
end
end
]]

View File

@ -1,8 +0,0 @@
## Interface: 20400
## Title: Lib: Diminishing Returns Data-1.0
## Notes: DB of spellIDs -> DR category
## Author: Mayen
LibStub-1.0\LibStub-1.0.xml
DRData-1.0.xml

View File

@ -0,0 +1,400 @@
--[[
Name: DRList-1.0
Description: Diminishing returns categorization. Fork of outdated DRData-1.0.
Website: https://github.com/wardz/DRList-1.0/
Documentation: https://wardz.github.io/DRList-1.0/
Dependencies: LibStub
License: MIT
]]
--- DRList-1.0
-- @module DRList-1.0
local MAJOR, MINOR = "DRList-1.0", 40 -- Don't forget to change this in Spells.lua aswell!
local Lib = assert(LibStub, MAJOR .. " requires LibStub."):NewLibrary(MAJOR, MINOR)
if not Lib then return end -- already loaded
-------------------------------------------------------------------------------
-- *** LOCALIZATIONS ARE AUTOMATICALLY GENERATED ***
-- Please see Curseforge localization page if you'd like to help translate.
-- https://www.curseforge.com/wow/addons/drlist-1-0/localization
local L = {}
Lib.L = L
L["DISARMS"] = "Disarms"
L["DISORIENTS"] = "Disorients"
L["INCAPACITATES"] = "Incapacitates"
L["KNOCKBACKS"] = "Knockbacks"
L["ROOTS"] = "Roots"
L["SILENCES"] = "Silences"
L["STUNS"] = "Stuns"
L["TAUNTS"] = "Taunts"
L["FEARS"] = "Fears"
L["RANDOM_ROOTS"] = "Random roots"
L["RANDOM_STUNS"] = "Random stuns"
L["OPENER_STUN"] = "Opener Stuns"
L["HORROR"] = "Horrors"
L["SCATTERS"] = "Scatters"
L["SLEEPS"] = GetSpellInfo(1090) or "Sleep"
L["MIND_CONTROL"] = GetSpellInfo(605) or "Mind Control"
L["FROST_SHOCK"] = GetSpellInfo(15089) or "Frost Shock"
L["KIDNEY_SHOT"] = GetSpellInfo(408) or "Kidney Shot"
L["DEATH_COIL"] = GetSpellInfo(28412) or "Death Coil"
L["UNSTABLE_AFFLICTION"] = GetSpellInfo(31117) or "Unstable Affliction"
L["CHASTISE"] = GetSpellInfo(44041) or "Chastise"
L["COUNTERATTACK"] = GetSpellInfo(19306) or "Counterattack"
L["CYCLONE"] = GetSpellInfo(33786) or "Cyclone"
L["BANISH"] = GetSpellInfo(710) or "Banish"
L["CHARGE"] = GetSpellInfo(100) or "Charge"
-- luacheck: push ignore 542
local locale = GetLocale()
if locale == "deDE" then
L["FEARS"] = "Furchteffekte"
L["KNOCKBACKS"] = "Rückstoßeffekte"
L["ROOTS"] = "Bewegungsunfähigkeitseffekte"
L["SILENCES"] = "Stilleeffekte"
L["STUNS"] = "Betäubungseffekte"
L["TAUNTS"] = "Spotteffekte"
elseif locale == "frFR" then
L["FEARS"] = "Peurs"
L["KNOCKBACKS"] = "Projections"
L["ROOTS"] = "Immobilisations"
L["SILENCES"] = "Silences"
L["STUNS"] = "Etourdissements"
L["TAUNTS"] = "Provocations"
elseif locale == "itIT" then
--@localization(locale="itIT", namespace="Categories", format="lua_additive_table", handle-unlocalized="ignore")@
elseif locale == "koKR" then
L["DISORIENTS"] = "방향 감각 상실"
L["INCAPACITATES"] = "행동 불가"
L["KNOCKBACKS"] = "밀쳐내기"
L["ROOTS"] = "이동 불가"
L["SILENCES"] = "침묵"
L["STUNS"] = "기절"
elseif locale == "ptBR" then
--@localization(locale="ptBR", namespace="Categories", format="lua_additive_table", handle-unlocalized="ignore")@
elseif locale == "ruRU" then
L["DISARMS"] = "Разоружение"
L["DISORIENTS"] = "Дезориентация"
L["FEARS"] = "Опасения"
L["INCAPACITATES"] = "Паралич"
L["KNOCKBACKS"] = "Отбрасывание"
L["RANDOM_ROOTS"] = "Случайные корни"
L["RANDOM_STUNS"] = "Случайные оглушения"
L["ROOTS"] = "Сковывание"
L["SILENCES"] = "Немота"
L["STUNS"] = "Оглушение"
L["TAUNTS"] = "Насмешки"
elseif locale == "esES" or locale == "esMX" then
L["DISARMS"] = "Desarmar"
L["DISORIENTS"] = "Desorientar"
L["FEARS"] = "Miedos"
L["INCAPACITATES"] = "Incapacitar"
L["KNOCKBACKS"] = "Derribos"
L["RANDOM_ROOTS"] = "Raíces aleatorias"
L["RANDOM_STUNS"] = "Aturdir aleatorio"
L["ROOTS"] = "Raíces"
L["SILENCES"] = "Silencios"
L["STUNS"] = "Aturdimientos"
L["TAUNTS"] = "Provocaciones"
elseif locale == "zhCN" then
L["DISARMS"] = "缴械"
L["DISORIENTS"] = "迷惑"
L["FEARS"] = "恐惧"
L["INCAPACITATES"] = "瘫痪"
L["KNOCKBACKS"] = "击退"
L["RANDOM_ROOTS"] = "随机定身"
L["RANDOM_STUNS"] = "随机眩晕"
L["ROOTS"] = "定身"
L["SILENCES"] = "沉默"
L["STUNS"] = "昏迷"
L["TAUNTS"] = "嘲讽"
elseif locale == "zhTW" then
L["DISARMS"] = "繳械"
L["DISORIENTS"] = "迷惑"
L["FEARS"] = "恐懼"
L["INCAPACITATES"] = "癱瘓"
L["KNOCKBACKS"] = "擊退"
L["RANDOM_ROOTS"] = "隨機定身"
L["RANDOM_STUNS"] = "隨機昏迷"
L["ROOTS"] = "定身"
L["SILENCES"] = "沉默"
L["STUNS"] = "昏迷"
L["TAUNTS"] = "嘲諷"
end
-- luacheck: pop
-------------------------------------------------------------------------------
-- Check what game version we're running
Lib.gameExpansion = ({
[WOW_PROJECT_MAINLINE] = "retail",
[WOW_PROJECT_CLASSIC] = "classic",
[WOW_PROJECT_BURNING_CRUSADE_CLASSIC or 5] = "tbc",
})[WOW_PROJECT_ID]
local tocVersion = select(4, GetBuildInfo())
if tocVersion >= 30400 and tocVersion < 40000 then
Lib.gameExpansion = "wotlk" -- temporary check for wotlk build until new constant is added
end
-- How long it takes for a DR to expire, in seconds.
Lib.resetTimes = {
retail = {
["default"] = 18.5, -- 18 sec + 0.5 latency
["npc"] = 23, -- Against mobs it seems to last slightly longer, depending on server load
["knockback"] = 10, -- Knockbacks are immediately immune and only DRs for 10s
},
classic = {
["default"] = 19, -- dynamic between 15 and 20s
["npc"] = 23,
},
tbc = {
["default"] = 19, -- dynamic between 15 and 20s
["npc"] = 23,
},
wotlk = {
["default"] = 19, -- dynamic between 15 and 20s
["npc"] = 23,
},
}
-- List of all DR categories, english -> localized.
Lib.categoryNames = {
retail = {
["disorient"] = L.DISORIENTS,
["incapacitate"] = L.INCAPACITATES,
["silence"] = L.SILENCES,
["stun"] = L.STUNS,
["root"] = L.ROOTS,
["disarm"] = L.DISARMS,
["taunt"] = L.TAUNTS,
["knockback"] = L.KNOCKBACKS,
},
classic = {
["incapacitate"] = L.INCAPACITATES,
["stun"] = L.STUNS, -- controlled stun
["root"] = L.ROOTS, -- controlled root
["random_stun"] = L.RANDOM_STUNS, -- random proc stun, usually short (<3s)
["random_root"] = L.RANDOM_ROOTS,
["fear"] = L.FEARS,
["mind_control"] = L.MIND_CONTROL,
["frost_shock"] = L.FROST_SHOCK,
["kidney_shot"] = L.KIDNEY_SHOT,
},
tbc = {
["disorient"] = L.DISORIENTS,
["incapacitate"] = L.INCAPACITATES,
["stun"] = L.STUNS,
["random_stun"] = L.RANDOM_STUNS,
["random_root"] = L.RANDOM_ROOTS,
["root"] = L.ROOTS,
["disarm"] = L.DISARMS,
["fear"] = L.FEARS,
["scatter"] = L.SCATTERS,
["mind_control"] = L.MIND_CONTROL,
["kidney_shot"] = L.KIDNEY_SHOT,
["death_coil"] = L.DEATH_COIL,
["unstable_affliction"] = L.UNSTABLE_AFFLICTION,
["chastise"] = L.CHASTISE,
["counterattack"] = L.COUNTERATTACK,
},
wotlk = { -- WORK IN PROGRESS
["incapacitate"] = L.INCAPACITATES,
["stun"] = L.STUNS,
["random_stun"] = L.RANDOM_STUNS,
["random_root"] = L.RANDOM_ROOTS,
["root"] = L.ROOTS,
["disarm"] = L.DISARMS,
["fear"] = L.FEARS,
["scatter"] = L.SCATTERS,
["silence"] = L.SILENCES,
["horror"] = L.HORROR,
["mind_control"] = L.MIND_CONTROL,
["cyclone"] = L.CYCLONE,
["charge"] = L.CHARGE,
["opener_stun"] = L.OPENER_STUN,
["counterattack"] = L.COUNTERATTACK,
},
}
-- Categories that have DR against normal mobs.
-- Note that this is only for normal mobs on retail. Special mobs or pets have DR on all categories,
-- see UnitClassification() and UnitIsQuestBoss().
Lib.categoriesPvE = {
retail = {
["taunt"] = L.TAUNTS, -- Lib.categoryNames.retail.taunt
["stun"] = L.STUNS,
["root"] = L.ROOTS,
},
classic = {
["stun"] = L.STUNS,
["kidney_shot"] = L.KIDNEY_SHOT,
},
tbc = {
["stun"] = L.STUNS,
["random_stun"] = L.RANDOM_STUNS,
["kidney_shot"] = L.KIDNEY_SHOT,
},
wotlk = {
--["taunt"] = L.TAUNTS,
["stun"] = L.STUNS,
["random_stun"] = L.RANDOM_STUNS,
["opener_stun"] = L.OPENER_STUN,
},
}
-- Successives diminished durations
Lib.diminishedDurations = {
retail = {
-- Decreases by 50%, immune at the 4th application
["default"] = { 0.50, 0.25 },
-- Decreases by 35%, immune at the 5th application
["taunt"] = { 0.65, 0.42, 0.27 },
-- Immediately immune
["knockback"] = {},
},
classic = {
["default"] = { 0.50, 0.25 },
},
tbc = {
["default"] = { 0.50, 0.25 },
},
wotlk = {
["default"] = { 0.50, 0.25 },
},
}
-------------------------------------------------------------------------------
-- Public API
-------------------------------------------------------------------------------
--- Get table of all spells that DRs.
-- Key is the spellID, and value is the unlocalized DR category.
-- For Classic the key is the localized spell name instead, and value
-- is a table containing both the DR category and spell ID. (Classic has no spellID payload in the combat log)
-- @see IterateSpellsByCategory
-- @treturn ?table {number=string}|table {string=table}
function Lib:GetSpells()
return Lib.spellList
end
--- Get table of all DR categories.
-- Key is unlocalized name used for API functions, value is localized name used for UI.
-- @treturn table {string=string}
function Lib:GetCategories()
return Lib.categoryNames[Lib.gameExpansion]
end
--- Get table of all categories that DRs in PvE only.
-- Key is unlocalized name used for API functions, value is localized name used for UI.
-- Note that this is only for normal mobs on retail. Special mobs or pets have DR on all categories,
-- see UnitClassification() and UnitIsQuestBoss().
-- Tip: you can combine :GetPvECategories() and :IterateSpellsByCategory() to get spellIDs only for PvE aswell.
-- @treturn table {string=string}
function Lib:GetPvECategories()
return Lib.categoriesPvE[Lib.gameExpansion]
end
--- Get constant for how long a DR lasts for a given category.
-- @tparam[opt="default"] string category Unlocalized category name, or "npc" for PvE timer.
-- @treturn number
function Lib:GetResetTime(category)
return Lib.resetTimes[Lib.gameExpansion][category or "default"] or Lib.resetTimes[Lib.gameExpansion].default
end
--- Get unlocalized DR category by spell ID.
-- For Classic (vanilla) you should pass in the spell name instead of ID.
-- For Classic you also get an optional second return value
-- which is the hardcoded spell ID of the spell name you passed in.
-- You should use this ID to query additional info from Blizzard API if needed, as
-- spell names only works for the player if they have the spell in their current spellbook.
-- @tparam number spellID
-- @treturn[1] string|nil The category name.
-- @treturn[2] number|nil The spell ID. (Classic only)
function Lib:GetCategoryBySpellID(spellID)
if Lib.gameExpansion == "classic" then
-- special case for classic as CLEU doesn't provide spellIDs
local data = Lib.spellList[spellID]
if not data then return end
return data.category, data.spellID
end
return Lib.spellList[spellID]
end
--- Get localized category from unlocalized category name, case sensitive.
-- @tparam string category Unlocalized category name
-- @treturn ?string|nil The localized category name.
function Lib:GetCategoryLocalization(category)
return Lib.categoryNames[Lib.gameExpansion][category]
end
--- Check if a category has DR against mobs.
-- Note that this is only for normal mobs on retail. Special mobs or pets have DR on all categories,
-- see UnitClassification() and UnitIsQuestBoss().
-- @tparam string category Unlocalized category name
-- @treturn bool
function Lib:IsPvECategory(category)
return Lib.categoriesPvE[Lib.gameExpansion][category] and true or false -- make sure bool is always returned here
end
--- Get next successive diminished duration
-- @tparam number diminished How many times the DR has been applied so far
-- @tparam[opt="default"] string category Unlocalized category name
-- @usage local reduction = DRList:GetNextDR(1) -- returns 0.50, half duration on debuff
-- @treturn number DR percentage in decimals. Returns 0 if max DR is reached or arguments are invalid.
function Lib:GetNextDR(diminished, category)
local durations = Lib.diminishedDurations[Lib.gameExpansion][category or "default"]
if not durations and Lib.categoryNames[Lib.gameExpansion][category] then
-- Redirect to default when "stun", "root" etc is passed
durations = Lib.diminishedDurations[Lib.gameExpansion]["default"]
end
return durations and durations[diminished] or 0
end
do
local next = _G.next
local function CategoryIterator(category, index)
local spellList, newCat = Lib.spellList
repeat
index, newCat = next(spellList, index)
if index then
if newCat == category or newCat.category == category then
return index, category
end
end
until not index
end
--- Iterate through the spells of a given category.
-- @tparam string category Unlocalized category name
-- @usage for spellID in DRList:IterateSpellsByCategory("root") do print(spellID) end
-- @warning Slow function, do not use for frequent combat related stuff unless you cache results.
-- @return Iterator function
function Lib:IterateSpellsByCategory(category)
assert(Lib.categoryNames[Lib.gameExpansion][category], "invalid category")
return CategoryIterator, category
end
end
-- keep same API as DRData-1.0 for easier transitions
Lib.GetCategoryName = Lib.GetCategoryLocalization
Lib.IsPVE = Lib.IsPvECategory
Lib.NextDR = Lib.GetNextDR
Lib.GetSpellCategory = Lib.GetCategoryBySpellID
Lib.IterateSpells = Lib.IterateSpellsByCategory
Lib.RESET_TIME = Lib.resetTimes[Lib.gameExpansion].default
Lib.pveDR = Lib.categoriesPvE

View File

@ -0,0 +1,23 @@
## Interface: 90205
## Interface-Classic: 11402
## Interface-BCC: 20504
## Interface-Wrath: 30400
## Title: Lib: DRList-1.0
## Version: @project-version@
## X-Category: Library
## X-License: MIT
## X-Curse-Project-ID: 315757
## X-Wago-ID: 9rN4BxKD
#@no-lib-strip@
libs\LibStub\LibStub.lua
#@end-no-lib-strip@
DRList-1.0.xml
#@do-not-package@
tests\engine.lua
tests\test-retail.lua
tests\test-classic.lua
tests\test-tbc.lua
tests\test-wotlk.lua
#@end-do-not-package@

View File

@ -0,0 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
<Script file="DRList-1.0.lua"/>
<Script file="Spells.lua"/>
</Ui>

695
Libs/DRList-1.0/Spells.lua Normal file
View File

@ -0,0 +1,695 @@
local Lib, version = LibStub("DRList-1.0")
if Lib.spellList and version >= 40 then return end
if Lib.gameExpansion == "retail" then
-- SpellID list for mainline aka retail WoW
Lib.spellList = {
[207167] = "disorient", -- Blinding Sleet
[207685] = "disorient", -- Sigil of Misery
[33786] = "disorient", -- Cyclone
[1513] = "disorient", -- Scare Beast
[31661] = "disorient", -- Dragon's Breath
[198909] = "disorient", -- Song of Chi-ji
[202274] = "disorient", -- Incendiary Brew
[105421] = "disorient", -- Blinding Light
[10326] = "disorient", -- Turn Evil
[605] = "disorient", -- Mind Control
[8122] = "disorient", -- Psychic Scream
[226943] = "disorient", -- Mind Bomb
[2094] = "disorient", -- Blind
[118699] = "disorient", -- Fear
[5484] = "disorient", -- Howl of Terror
[261589] = "disorient", -- Seduction (Grimoire of Sacrifice)
[6358] = "disorient", -- Seduction (Succubus)
[5246] = "disorient", -- Intimidating Shout 1
[316593] = "disorient", -- Intimidating Shout 2 (TODO: not sure which one is correct in 9.0.1)
[316595] = "disorient", -- Intimidating Shout 3
[331866] = "disorient", -- Agent of Chaos (Venthyr Covenant)
[217832] = "incapacitate", -- Imprison
[221527] = "incapacitate", -- Imprison (Honor talent)
[2637] = "incapacitate", -- Hibernate
[99] = "incapacitate", -- Incapacitating Roar
[3355] = "incapacitate", -- Freezing Trap
[203337] = "incapacitate", -- Freezing Trap (Honor talent)
[213691] = "incapacitate", -- Scatter Shot
[118] = "incapacitate", -- Polymorph
[28271] = "incapacitate", -- Polymorph (Turtle)
[28272] = "incapacitate", -- Polymorph (Pig)
[61025] = "incapacitate", -- Polymorph (Snake)
[61305] = "incapacitate", -- Polymorph (Black Cat)
[61780] = "incapacitate", -- Polymorph (Turkey)
[61721] = "incapacitate", -- Polymorph (Rabbit)
[126819] = "incapacitate", -- Polymorph (Porcupine)
[161353] = "incapacitate", -- Polymorph (Polar Bear Cub)
[161354] = "incapacitate", -- Polymorph (Monkey)
[161355] = "incapacitate", -- Polymorph (Penguin)
[161372] = "incapacitate", -- Polymorph (Peacock)
[277787] = "incapacitate", -- Polymorph (Baby Direhorn)
[277792] = "incapacitate", -- Polymorph (Bumblebee)
[82691] = "incapacitate", -- Ring of Frost
[115078] = "incapacitate", -- Paralysis
[20066] = "incapacitate", -- Repentance
[9484] = "incapacitate", -- Shackle Undead
[200196] = "incapacitate", -- Holy Word: Chastise
[1776] = "incapacitate", -- Gouge
[6770] = "incapacitate", -- Sap
[51514] = "incapacitate", -- Hex
[196942] = "incapacitate", -- Hex (Voodoo Totem)
[210873] = "incapacitate", -- Hex (Raptor)
[211004] = "incapacitate", -- Hex (Spider)
[211010] = "incapacitate", -- Hex (Snake)
[211015] = "incapacitate", -- Hex (Cockroach)
[269352] = "incapacitate", -- Hex (Skeletal Hatchling)
[309328] = "incapacitate", -- Hex (Living Honey)
[277778] = "incapacitate", -- Hex (Zandalari Tendonripper)
[277784] = "incapacitate", -- Hex (Wicker Mongrel)
[197214] = "incapacitate", -- Sundering
[710] = "incapacitate", -- Banish
[6789] = "incapacitate", -- Mortal Coil
[107079] = "incapacitate", -- Quaking Palm (Pandaren racial)
[47476] = "silence", -- Strangulate
[204490] = "silence", -- Sigil of Silence
-- [78675] = "silence", -- Solar Beam (doesn't seem to DR)
[202933] = "silence", -- Spider Sting
[356727] = "silence", -- Spider Venom
[217824] = "silence", -- Shield of Virtue
[15487] = "silence", -- Silence
[1330] = "silence", -- Garrote
[196364] = "silence", -- Unstable Affliction Silence Effect
[210141] = "stun", -- Zombie Explosion
[334693] = "stun", -- Absolute Zero (Breath of Sindragosa)
[108194] = "stun", -- Asphyxiate (Unholy)
[221562] = "stun", -- Asphyxiate (Blood)
[91800] = "stun", -- Gnaw (Ghoul)
[91797] = "stun", -- Monstrous Blow (Mutated Ghoul)
[287254] = "stun", -- Dead of Winter
[179057] = "stun", -- Chaos Nova
[205630] = "stun", -- Illidan's Grasp (Primary effect)
[208618] = "stun", -- Illidan's Grasp (Secondary effect)
[211881] = "stun", -- Fel Eruption
[200166] = "stun", -- Metamorphosis (PvE stun effect)
[203123] = "stun", -- Maim
[163505] = "stun", -- Rake (Prowl)
[5211] = "stun", -- Mighty Bash
[202244] = "stun", -- Overrun
[325321] = "stun", -- Wild Hunt's Charge
[357021] = "stun", -- Consecutive Concussion
[24394] = "stun", -- Intimidation
[119381] = "stun", -- Leg Sweep
[202346] = "stun", -- Double Barrel
[853] = "stun", -- Hammer of Justice
[255941] = "stun", -- Wake of Ashes
[64044] = "stun", -- Psychic Horror
[200200] = "stun", -- Holy Word: Chastise Censure
[1833] = "stun", -- Cheap Shot
[408] = "stun", -- Kidney Shot
[118905] = "stun", -- Static Charge (Capacitor Totem)
[118345] = "stun", -- Pulverize (Primal Earth Elemental)
[305485] = "stun", -- Lightning Lasso
[89766] = "stun", -- Axe Toss
[171017] = "stun", -- Meteor Strike (Infernal)
[171018] = "stun", -- Meteor Strike (Abyssal)
[30283] = "stun", -- Shadowfury
[46968] = "stun", -- Shockwave
[132168] = "stun", -- Shockwave (Protection)
[145047] = "stun", -- Shockwave (Proving Grounds PvE)
[132169] = "stun", -- Storm Bolt
[199085] = "stun", -- Warpath
[20549] = "stun", -- War Stomp (Tauren)
[255723] = "stun", -- Bull Rush (Highmountain Tauren)
[287712] = "stun", -- Haymaker (Kul Tiran)
[332423] = "stun", -- Sparkling Driftglobe Core (Kyrian Covenant)
[204085] = "root", -- Deathchill (Chains of Ice)
[233395] = "root", -- Deathchill (Remorseless Winter)
[339] = "root", -- Entangling Roots
[170855] = "root", -- Entangling Roots (Nature's Grasp)
[102359] = "root", -- Mass Entanglement
[117526] = "root", -- Binding Shot
[162480] = "root", -- Steel Trap
[273909] = "root", -- Steelclaw Trap
-- [190927] = "root_harpoon", -- Harpoon (TODO: confirm)
[212638] = "root", -- Tracker's Net
[201158] = "root", -- Super Sticky Tar
[122] = "root", -- Frost Nova
[33395] = "root", -- Freeze
[198121] = "root", -- Frostbite
[342375] = "root", -- Tormenting Backlash (Torghast PvE)
[233582] = "root", -- Entrenched in Flame
[116706] = "root", -- Disable
[324382] = "root", -- Clash
[64695] = "root", -- Earthgrab (Totem effect)
[285515] = "root", -- Surge of Power
[39965] = "root", -- Frost Grenade (Item)
[75148] = "root", -- Embersilk Net (Item)
[55536] = "root", -- Frostweave Net (Item)
[268966] = "root", -- Hooked Deep Sea Net (Item)
[209749] = "disarm", -- Faerie Swarm (Balance Honor Talent)
[207777] = "disarm", -- Dismantle
[233759] = "disarm", -- Grapple Weapon
[236077] = "disarm", -- Disarm
[56222] = "taunt", -- Dark Command
[51399] = "taunt", -- Death Grip (Taunt Effect)
[185245] = "taunt", -- Torment
[6795] = "taunt", -- Growl (Druid)
[2649] = "taunt", -- Growl (Hunter Pet) (TODO: confirm)
[20736] = "taunt", -- Distracting Shot
[116189] = "taunt", -- Provoke
[118635] = "taunt", -- Provoke (Black Ox Statue)
[196727] = "taunt", -- Provoke (Niuzao)
[204079] = "taunt", -- Final Stand
[62124] = "taunt", -- Hand of Reckoning
[17735] = "taunt", -- Suffering (Voidwalker) (TODO: confirm)
[355] = "taunt", -- Taunt
-- Experimental
[108199] = "knockback", -- Gorefiend's Grasp
[202249] = "knockback", -- Overrun
[61391] = "knockback", -- Typhoon
[102793] = "knockback", -- Ursol's Vortex
[186387] = "knockback", -- Bursting Shot
[236777] = "knockback", -- Hi-Explosive Trap
[157981] = "knockback", -- Blast Wave
[237371] = "knockback", -- Ring of Peace
[204263] = "knockback", -- Shining Force
[51490] = "knockback", -- Thunderstorm
-- [287712] = "knockback", -- Haywire (Kul'Tiran Racial)
}
elseif Lib.gameExpansion == "tbc" then
-- SpellID list for The Burning Crusade
-- spellID for every rank is used over spell name to avoid name collisions, and faster lookups
Lib.spellList = {
[2637] = "incapacitate", -- Hibernate (Rank 1)
[18657] = "incapacitate", -- Hibernate (Rank 2)
[18658] = "incapacitate", -- Hibernate (Rank 3)
[22570] = "incapacitate", -- Maim
[3355] = "incapacitate", -- Freezing Trap Effect (Rank 1)
[14308] = "incapacitate", -- Freezing Trap Effect (Rank 2)
[14309] = "incapacitate", -- Freezing Trap Effect (Rank 3)
[19386] = "incapacitate", -- Wyvern Sting (Rank 1)
[24132] = "incapacitate", -- Wyvern Sting (Rank 2)
[24133] = "incapacitate", -- Wyvern Sting (Rank 3)
[27068] = "incapacitate", -- Wyvern Sting (Rank 4)
[118] = "incapacitate", -- Polymorph (Rank 1)
[12824] = "incapacitate", -- Polymorph (Rank 2)
[12825] = "incapacitate", -- Polymorph (Rank 3)
[12826] = "incapacitate", -- Polymorph (Rank 4)
[28271] = "incapacitate", -- Polymorph: Turtle
[28272] = "incapacitate", -- Polymorph: Pig
[20066] = "incapacitate", -- Repentance
[6770] = "incapacitate", -- Sap (Rank 1)
[2070] = "incapacitate", -- Sap (Rank 2)
[11297] = "incapacitate", -- Sap (Rank 3)
[1776] = "incapacitate", -- Gouge (Rank 1)
[1777] = "incapacitate", -- Gouge (Rank 2)
[8629] = "incapacitate", -- Gouge (Rank 3)
[11285] = "incapacitate", -- Gouge (Rank 4)
[11286] = "incapacitate", -- Gouge (Rank 5)
[38764] = "incapacitate", -- Gouge (Rank 6)
[13327] = "incapacitate", -- Reckless Charge (Rocket Helmet)
[4064] = "incapacitate", -- Rough Copper Bomb
[4065] = "incapacitate", -- Large Copper Bomb
[4066] = "incapacitate", -- Small Bronze Bomb
[4067] = "incapacitate", -- Big Bronze Bomb
[4068] = "incapacitate", -- Iron Grenade
[12421] = "incapacitate", -- Mithril Frag Bomb
[4069] = "incapacitate", -- Big Iron Bomb
[12562] = "incapacitate", -- The Big One
[12543] = "incapacitate", -- Hi-Explosive Bomb
[19769] = "incapacitate", -- Thorium Grenade
[19784] = "incapacitate", -- Dark Iron Bomb
[30216] = "incapacitate", -- Fel Iron Bomb
[30461] = "incapacitate", -- The Bigger One
[30217] = "incapacitate", -- Adamantite Grenade
[33786] = "disorient", -- Cyclone
[2094] = "disorient", -- Blind
[5211] = "stun", -- Bash (Rank 1)
[6798] = "stun", -- Bash (Rank 2)
[8983] = "stun", -- Bash (Rank 3)
[9005] = "stun", -- Pounce (Rank 1)
[9823] = "stun", -- Pounce (Rank 2)
[9827] = "stun", -- Pounce (Rank 3)
[27006] = "stun", -- Pounce (Rank 4)
[24394] = "stun", -- Intimidation
[853] = "stun", -- Hammer of Justice (Rank 1)
[5588] = "stun", -- Hammer of Justice (Rank 2)
[5589] = "stun", -- Hammer of Justice (Rank 3)
[10308] = "stun", -- Hammer of Justice (Rank 4)
[1833] = "stun", -- Cheap Shot
[30283] = "stun", -- Shadowfury (Rank 1)
[30413] = "stun", -- Shadowfury (Rank 2)
[30414] = "stun", -- Shadowfury (Rank 3)
[12809] = "stun", -- Concussion Blow
[7922] = "stun", -- Charge Stun
[20253] = "stun", -- Intercept Stun (Rank 1)
[20614] = "stun", -- Intercept Stun (Rank 2)
[20615] = "stun", -- Intercept Stun (Rank 3)
[25273] = "stun", -- Intercept Stun (Rank 4)
[25274] = "stun", -- Intercept Stun (Rank 5)
[20549] = "stun", -- War Stomp (Racial)
[13237] = "stun", -- Goblin Mortar
[835] = "stun", -- Tidal Charm
[16922] = "random_stun", -- Celestial Focus (Starfire Stun)
[19410] = "random_stun", -- Improved Concussive Shot
[12355] = "random_stun", -- Impact
[20170] = "random_stun", -- Seal of Justice Stun
[15269] = "random_stun", -- Blackout
[18093] = "random_stun", -- Pyroclasm
[39796] = "random_stun", -- Stoneclaw Stun
[12798] = "random_stun", -- Revenge Stun
[5530] = "random_stun", -- Mace Stun Effect (Mace Specialization)
[15283] = "random_stun", -- Stunning Blow (Weapon Proc)
[56] = "random_stun", -- Stun (Weapon Proc)
[34510] = "random_stun", -- Stormherald/Deep Thunder (Weapon Proc)
[10326] = "fear", -- Turn Evil (Might be PvE only until wotlk, adding just incase)
[8122] = "fear", -- Psychic Scream (Rank 1)
[8124] = "fear", -- Psychic Scream (Rank 2)
[10888] = "fear", -- Psychic Scream (Rank 3)
[10890] = "fear", -- Psychic Scream (Rank 4)
[5782] = "fear", -- Fear (Rank 1)
[6213] = "fear", -- Fear (Rank 2)
[6215] = "fear", -- Fear (Rank 3)
[6358] = "fear", -- Seduction (Succubus)
[5484] = "fear", -- Howl of Terror (Rank 1)
[17928] = "fear", -- Howl of Terror (Rank 2)
[1513] = "fear", -- Scare Beast (Rank 1)
[14326] = "fear", -- Scare Beast (Rank 2)
[14327] = "fear", -- Scare Beast (Rank 3)
[5246] = "fear", -- Intimidating Shout
[5134] = "fear", -- Flash Bomb Fear (Item)
[339] = "root", -- Entangling Roots (Rank 1)
[1062] = "root", -- Entangling Roots (Rank 2)
[5195] = "root", -- Entangling Roots (Rank 3)
[5196] = "root", -- Entangling Roots (Rank 4)
[9852] = "root", -- Entangling Roots (Rank 5)
[9853] = "root", -- Entangling Roots (Rank 6)
[26989] = "root", -- Entangling Roots (Rank 7)
[19975] = "root", -- Nature's Grasp (Rank 1)
[19974] = "root", -- Nature's Grasp (Rank 2)
[19973] = "root", -- Nature's Grasp (Rank 3)
[19972] = "root", -- Nature's Grasp (Rank 4)
[19971] = "root", -- Nature's Grasp (Rank 5)
[19970] = "root", -- Nature's Grasp (Rank 6)
[27010] = "root", -- Nature's Grasp (Rank 7)
[122] = "root", -- Frost Nova (Rank 1)
[865] = "root", -- Frost Nova (Rank 2)
[6131] = "root", -- Frost Nova (Rank 3)
[10230] = "root", -- Frost Nova (Rank 4)
[27088] = "root", -- Frost Nova (Rank 5)
[33395] = "root", -- Freeze (Water Elemental)
[39965] = "root", -- Frost Grenade (Item)
[605] = "mind_control", -- Mind Control (Rank 1)
[10911] = "mind_control", -- Mind Control (Rank 2)
[10912] = "mind_control", -- Mind Control (Rank 3)
[13181] = "mind_control", -- Gnomish Mind Control Cap
[14251] = "disarm", -- Riposte
[34097] = "disarm", -- Riposte 2 (TODO: Check which ID is the correct one)
[676] = "disarm", -- Disarm
[12494] = "random_root", -- Frostbite
[23694] = "random_root", -- Improved Hamstring
[19229] = "random_root", -- Improved Wing Clip
[19185] = "random_root", -- Entrapment
[19503] = "scatter", -- Scatter Shot
[31661] = "scatter", -- Dragon's Breath (Rank 1)
[33041] = "scatter", -- Dragon's Breath (Rank 2)
[33042] = "scatter", -- Dragon's Breath (Rank 3)
[33043] = "scatter", -- Dragon's Breath (Rank 4)
-- Spells that DR with itself only
[408] = "kidney_shot", -- Kidney Shot (Rank 1)
[8643] = "kidney_shot", -- Kidney Shot (Rank 2)
[43523] = "unstable_affliction", -- Unstable Affliction 1
[31117] = "unstable_affliction", -- Unstable Affliction 2
[6789] = "death_coil", -- Death Coil (Rank 1)
[17925] = "death_coil", -- Death Coil (Rank 2)
[17926] = "death_coil", -- Death Coil (Rank 3)
[27223] = "death_coil", -- Death Coil (Rank 4)
[44041] = "chastise", -- Chastise (Rank 1)
[44043] = "chastise", -- Chastise (Rank 2)
[44044] = "chastise", -- Chastise (Rank 3)
[44045] = "chastise", -- Chastise (Rank 4)
[44046] = "chastise", -- Chastise (Rank 5)
[44047] = "chastise", -- Chastise (Rank 6)
[19306] = "counterattack", -- Counterattack (Rank 1)
[20909] = "counterattack", -- Counterattack (Rank 2)
[20910] = "counterattack", -- Counterattack (Rank 3)
[27067] = "counterattack", -- Counterattack (Rank 4)
}
elseif Lib.gameExpansion == "wotlk" then -- STILL WORK IN PROGRESS, I DON'T HAVE BETA ACCESS
-- SpellID list for Wrath of the Lich King.
-- spellID for every rank is used over spell name to avoid name collisions, and faster lookups
Lib.spellList = {
[49203] = "incapacitate", -- Hungering Cold
[2637] = "incapacitate", -- Hibernate (Rank 1)
[18657] = "incapacitate", -- Hibernate (Rank 2)
[18658] = "incapacitate", -- Hibernate (Rank 3)
[60210] = "incapacitate", -- Freezing Arrow Effect (Rank 1)
[3355] = "incapacitate", -- Freezing Trap Effect (Rank 1)
[14308] = "incapacitate", -- Freezing Trap Effect (Rank 2)
[14309] = "incapacitate", -- Freezing Trap Effect (Rank 3)
[19386] = "incapacitate", -- Wyvern Sting (Rank 1)
[24132] = "incapacitate", -- Wyvern Sting (Rank 2)
[24133] = "incapacitate", -- Wyvern Sting (Rank 3)
[27068] = "incapacitate", -- Wyvern Sting (Rank 4)
[49011] = "incapacitate", -- Wyvern Sting (Rank 5)
[49012] = "incapacitate", -- Wyvern Sting (Rank 6)
[118] = "incapacitate", -- Polymorph (Rank 1)
[12824] = "incapacitate", -- Polymorph (Rank 2)
[12825] = "incapacitate", -- Polymorph (Rank 3)
[12826] = "incapacitate", -- Polymorph (Rank 4)
[28271] = "incapacitate", -- Polymorph: Turtle
[28272] = "incapacitate", -- Polymorph: Pig
[61721] = "incapacitate", -- Polymorph: Rabbit
[61780] = "incapacitate", -- Polymorph: Turkey
[61305] = "incapacitate", -- Polymorph: Black Cat
[20066] = "incapacitate", -- Repentance
[1776] = "incapacitate", -- Gouge
[6770] = "incapacitate", -- Sap (Rank 1)
[2070] = "incapacitate", -- Sap (Rank 2)
[11297] = "incapacitate", -- Sap (Rank 3)
[51724] = "incapacitate", -- Sap (Rank 4)
[710] = "incapacitate", -- Banish (Rank 1)
[18647] = "incapacitate", -- Banish (Rank 2)
[9484] = "incapacitate", -- Shackle Undead (Rank 1)
[9485] = "incapacitate", -- Shackle Undead (Rank 2)
[10955] = "incapacitate", -- Shackle Undead (Rank 3)
[51514] = "incapacitate", -- Hex
[13327] = "incapacitate", -- Reckless Charge (Rocket Helmet)
[4064] = "incapacitate", -- Rough Copper Bomb
[4065] = "incapacitate", -- Large Copper Bomb
[4066] = "incapacitate", -- Small Bronze Bomb
[4067] = "incapacitate", -- Big Bronze Bomb
[4068] = "incapacitate", -- Iron Grenade
[12421] = "incapacitate", -- Mithril Frag Bomb
[4069] = "incapacitate", -- Big Iron Bomb
[12562] = "incapacitate", -- The Big One
[12543] = "incapacitate", -- Hi-Explosive Bomb
[19769] = "incapacitate", -- Thorium Grenade
[19784] = "incapacitate", -- Dark Iron Bomb
[30216] = "incapacitate", -- Fel Iron Bomb
[30461] = "incapacitate", -- The Bigger One
[30217] = "incapacitate", -- Adamantite Grenade
[47481] = "stun", -- Gnaw (Ghoul Pet)
[5211] = "stun", -- Bash (Rank 1)
[6798] = "stun", -- Bash (Rank 2)
[8983] = "stun", -- Bash (Rank 3)
[22570] = "stun", -- Maim (Rank 1)
[49802] = "stun", -- Maim (Rank 2)
[24394] = "stun", -- Intimidation
[50519] = "stun", -- Sonic Blast (Pet Rank 1)
[53564] = "stun", -- Sonic Blast (Pet Rank 2)
[53565] = "stun", -- Sonic Blast (Pet Rank 3)
[53566] = "stun", -- Sonic Blast (Pet Rank 4)
[53567] = "stun", -- Sonic Blast (Pet Rank 5)
[53568] = "stun", -- Sonic Blast (Pet Rank 6)
[50518] = "stun", -- Ravage (Pet Rank 1)
[53558] = "stun", -- Ravage (Pet Rank 2)
[53559] = "stun", -- Ravage (Pet Rank 3)
[53560] = "stun", -- Ravage (Pet Rank 4)
[53561] = "stun", -- Ravage (Pet Rank 5)
[53562] = "stun", -- Ravage (Pet Rank 6)
[44572] = "stun", -- Deep Freeze
[853] = "stun", -- Hammer of Justice (Rank 1)
[5588] = "stun", -- Hammer of Justice (Rank 2)
[5589] = "stun", -- Hammer of Justice (Rank 3)
[10308] = "stun", -- Hammer of Justice (Rank 4)
[2812] = "stun", -- Holy Wrath (Rank 1)
[10318] = "stun", -- Holy Wrath (Rank 2)
[27139] = "stun", -- Holy Wrath (Rank 3)
[48816] = "stun", -- Holy Wrath (Rank 4)
[48817] = "stun", -- Holy Wrath (Rank 5)
[408] = "stun", -- Kidney Shot (Rank 1)
[8643] = "stun", -- Kidney Shot (Rank 2)
[58861] = "stun", -- Bash (Spirit Wolves)
[30283] = "stun", -- Shadowfury (Rank 1)
[30413] = "stun", -- Shadowfury (Rank 2)
[30414] = "stun", -- Shadowfury (Rank 3)
[47846] = "stun", -- Shadowfury (Rank 4)
[47847] = "stun", -- Shadowfury (Rank 5)
[12809] = "stun", -- Concussion Blow
[60995] = "stun", -- Demon Charge
[30153] = "stun", -- Intercept (Felguard Rank 1)
[30195] = "stun", -- Intercept (Felguard Rank 2)
[30197] = "stun", -- Intercept (Felguard Rank 3)
[47995] = "stun", -- Intercept (Felguard Rank 4)
[20253] = "stun", -- Intercept Stun (Rank 1)
[20614] = "stun", -- Intercept Stun (Rank 2)
[20615] = "stun", -- Intercept Stun (Rank 3)
[25273] = "stun", -- Intercept Stun (Rank 4)
[25274] = "stun", -- Intercept Stun (Rank 5)
[46968] = "stun", -- Shockwave
[20549] = "stun", -- War Stomp (Racial)
[16922] = "random_stun", -- Celestial Focus (Starfire Stun)
[28445] = "random_stun", -- Improved Concussive Shot
[12355] = "random_stun", -- Impact
[20170] = "random_stun", -- Seal of Justice Stun
[39796] = "random_stun", -- Stoneclaw Stun
[12798] = "random_stun", -- Revenge Stun
[5530] = "random_stun", -- Mace Stun Effect (Mace Specialization)
[15283] = "random_stun", -- Stunning Blow (Weapon Proc)
[56] = "random_stun", -- Stun (Weapon Proc)
[34510] = "random_stun", -- Stormherald/Deep Thunder (Weapon Proc)
[1513] = "fear", -- Scare Beast (Rank 1)
[14326] = "fear", -- Scare Beast (Rank 2)
[14327] = "fear", -- Scare Beast (Rank 3)
[10326] = "fear", -- Turn Evil
[8122] = "fear", -- Psychic Scream (Rank 1)
[8124] = "fear", -- Psychic Scream (Rank 2)
[10888] = "fear", -- Psychic Scream (Rank 3)
[10890] = "fear", -- Psychic Scream (Rank 4)
[2094] = "fear", -- Blind
[5782] = "fear", -- Fear (Rank 1)
[6213] = "fear", -- Fear (Rank 2)
[6215] = "fear", -- Fear (Rank 3)
[6358] = "fear", -- Seduction (Succubus)
[5484] = "fear", -- Howl of Terror (Rank 1)
[17928] = "fear", -- Howl of Terror (Rank 2)
[5246] = "fear", -- Intimidating Shout
[5134] = "fear", -- Flash Bomb Fear (Item)
[339] = "root", -- Entangling Roots (Rank 1)
[1062] = "root", -- Entangling Roots (Rank 2)
[5195] = "root", -- Entangling Roots (Rank 3)
[5196] = "root", -- Entangling Roots (Rank 4)
[9852] = "root", -- Entangling Roots (Rank 5)
[9853] = "root", -- Entangling Roots (Rank 6)
[26989] = "root", -- Entangling Roots (Rank 7)
[53308] = "root", -- Entangling Roots (Rank 8)
[19975] = "root", -- Nature's Grasp (Rank 1)
[19974] = "root", -- Nature's Grasp (Rank 2)
[19973] = "root", -- Nature's Grasp (Rank 3)
[19972] = "root", -- Nature's Grasp (Rank 4)
[19971] = "root", -- Nature's Grasp (Rank 5)
[19970] = "root", -- Nature's Grasp (Rank 6)
[27010] = "root", -- Nature's Grasp (Rank 7)
[53312] = "root", -- Nature's Grasp (Rank 8)
[50245] = "root", -- Pin (Rank 1)
[53544] = "root", -- Pin (Rank 2)
[53545] = "root", -- Pin (Rank 3)
[53546] = "root", -- Pin (Rank 4)
[53547] = "root", -- Pin (Rank 5)
[53548] = "root", -- Pin (Rank 6)
[33395] = "root", -- Freeze (Water Elemental)
[122] = "root", -- Frost Nova (Rank 1)
[865] = "root", -- Frost Nova (Rank 2)
[6131] = "root", -- Frost Nova (Rank 3)
[10230] = "root", -- Frost Nova (Rank 4)
[27088] = "root", -- Frost Nova (Rank 5)
[42917] = "root", -- Frost Nova (Rank 6)
[39965] = "root", -- Frost Grenade (Item)
[63685] = "root", -- Freeze (Frost Shock)
[12494] = "random_root", -- Frostbite
[55080] = "random_root", -- Shattered Barrier
[58373] = "random_root", -- Glyph of Hamstring
[23694] = "random_root", -- Improved Hamstring
[47168] = "random_root", -- Improved Wing Clip
[19185] = "random_root", -- Entrapment
[53359] = "disarm", -- Chimera Shot (Scorpid)
[50541] = "disarm", -- Snatch (Rank 1)
[53537] = "disarm", -- Snatch (Rank 2)
[53538] = "disarm", -- Snatch (Rank 3)
[53540] = "disarm", -- Snatch (Rank 4)
[53542] = "disarm", -- Snatch (Rank 5)
[53543] = "disarm", -- Snatch (Rank 6)
[64058] = "disarm", -- Psychic Horror Disarm Effect
[51722] = "disarm", -- Dismantle
[676] = "disarm", -- Disarm
[47476] = "silence", -- Strangulate
[34490] = "silence", -- Silencing Shot
[35334] = "silence", -- Nether Shock 1 -- TODO: verify
[44957] = "silence", -- Nether Shock 2 -- TODO: verify
[18469] = "silence", -- Silenced - Improved Counterspell (Rank 1)
[55021] = "silence", -- Silenced - Improved Counterspell (Rank 2)
[63529] = "silence", -- Silenced - Shield of the Templar
[15487] = "silence", -- Silence
[1330] = "silence", -- Garrote - Silence
[18425] = "silence", -- Silenced - Improved Kick
[24259] = "silence", -- Spell Lock
[43523] = "silence", -- Unstable Affliction 1
[31117] = "silence", -- Unstable Affliction 2
[18498] = "silence", -- Silenced - Gag Order 1
[74347] = "silence", -- Silenced - Gag Order 1
[50613] = "silence", -- Arcane Torrent (Racial, Runic Power)
[28730] = "silence", -- Arcane Torrent (Racial, Mana)
[25046] = "silence", -- Arcane Torrent (Racial, Energy)
[64044] = "horror", -- Psychic Horror
[6789] = "horror", -- Death Coil (Rank 1)
[17925] = "horror", -- Death Coil (Rank 2)
[17926] = "horror", -- Death Coil (Rank 3)
[27223] = "horror", -- Death Coil (Rank 4)
[47859] = "horror", -- Death Coil (Rank 5)
[47860] = "horror", -- Death Coil (Rank 6)
[1833] = "opener_stun", -- Cheap Shot
[9005] = "opener_stun", -- Pounce (Rank 1)
[9823] = "opener_stun", -- Pounce (Rank 2)
[9827] = "opener_stun", -- Pounce (Rank 3)
[27006] = "opener_stun", -- Pounce (Rank 4)
[49803] = "opener_stun", -- Pounce (Rank 5)
[31661] = "scatter", -- Dragon's Breath (Rank 1)
[33041] = "scatter", -- Dragon's Breath (Rank 2)
[33042] = "scatter", -- Dragon's Breath (Rank 3)
[33043] = "scatter", -- Dragon's Breath (Rank 4)
[42949] = "scatter", -- Dragon's Breath (Rank 5)
[42950] = "scatter", -- Dragon's Breath (Rank 6)
[19503] = "scatter", -- Scatter Shot
-- Spells that DR with itself only
[33786] = "cyclone", -- Cyclone
[605] = "mind_control", -- Mind Control
[13181] = "mind_control", -- Gnomish Mind Control Cap
[7922] = "charge", -- Charge Stun
[19306] = "counterattack", -- Counterattack 1
[20909] = "counterattack", -- Counterattack 2
[20910] = "counterattack", -- Counterattack 3
[27067] = "counterattack", -- Counterattack 4
[48998] = "counterattack", -- Counterattack 5
[48999] = "counterattack", -- Counterattack 6
--Storm, Earth and Fire has no DR
-- TODO: profession stuff
}
elseif Lib.gameExpansion == "classic" then
-- SpellID list for Classic Era (vanilla)
-- In Classic the spell ID payload is gone from the combat log, so we need the key here to be
-- spell name instead. We also provide spell ID in the table value so it's possible to retrieve
-- for example spell icon using GetSpellTexture(spellID) later on. (These functions only accept
-- spell names if the player has the spell in their spell book)
local GetSpellInfo = _G.GetSpellInfo -- upvalue
Lib.spellList = {
-- Controlled roots
[GetSpellInfo(339)] = { category = "root", spellID = 339 }, -- Entangling Roots
[GetSpellInfo(19306)] = { category = "root", spellID = 19306 }, -- Counterattack
[GetSpellInfo(122)] = { category = "root", spellID = 122 }, -- Frost Nova
-- [GetSpellInfo(13099)] = { category = "root", spellID = 13099 }, -- Net-o-Matic
-- [GetSpellInfo(8312)] = { category = "root", spellID = 8312 }, -- Trap
-- Controlled stuns
[GetSpellInfo(5211)] = { category = "stun", spellID = 5211 }, -- Bash
[GetSpellInfo(24394)] = { category = "stun", spellID = 24394 }, -- Intimidation
[GetSpellInfo(853)] = { category = "stun", spellID = 853 }, -- Hammer of Justice
[GetSpellInfo(9005)] = { category = "stun", spellID = 9005 }, -- Pounce
[GetSpellInfo(1833)] = { category = "stun", spellID = 1833 }, -- Cheap Shot
[GetSpellInfo(12809)] = { category = "stun", spellID = 12809 }, -- Concussion Blow
[GetSpellInfo(20253)] = { category = "stun", spellID = 20253 }, -- Intercept Stun
[GetSpellInfo(7922)] = { category = "stun", spellID = 7922 }, -- Charge Stun
[GetSpellInfo(20549)] = { category = "stun", spellID = 20549 }, -- War Stomp (Racial)
[GetSpellInfo(4068)] = { category = "stun", spellID = 4068 }, -- Iron Grenade
[GetSpellInfo(19769)] = { category = "stun", spellID = 19769 }, -- Thorium Grenade
[GetSpellInfo(13808)] = { category = "stun", spellID = 13808 }, -- M73 Frag Grenade
[GetSpellInfo(4069)] = { category = "stun", spellID = 4069 }, -- Big Iron Bomb
[GetSpellInfo(12543)] = { category = "stun", spellID = 12543 }, -- Hi-Explosive Bomb
[GetSpellInfo(4064)] = { category = "stun", spellID = 4064 }, -- Rough Copper Bomb
[GetSpellInfo(12421)] = { category = "stun", spellID = 12421 }, -- Mithril Frag Bomb
[GetSpellInfo(19784)] = { category = "stun", spellID = 19784 }, -- Dark Iron Bomb
[GetSpellInfo(4067)] = { category = "stun", spellID = 4067 }, -- Big Bronze Bomb
[GetSpellInfo(4066)] = { category = "stun", spellID = 4066 }, -- Small Bronze Bomb
[GetSpellInfo(4065)] = { category = "stun", spellID = 4065 }, -- Large Copper Bomb
[GetSpellInfo(13237)] = { category = "stun", spellID = 13237 }, -- Goblin Mortar
[GetSpellInfo(835)] = { category = "stun", spellID = 835 }, -- Tidal Charm
[GetSpellInfo(12562)] = { category = "stun", spellID = 12562 }, -- The Big One
-- Incapacitates
[GetSpellInfo(2637)] = { category = "incapacitate", spellID = 2637 }, -- Hibernate
[GetSpellInfo(3355)] = { category = "incapacitate", spellID = 3355 }, -- Freezing Trap
[GetSpellInfo(19503)] = { category = "incapacitate", spellID = 19503 }, -- Scatter Shot
[GetSpellInfo(19386)] = { category = "incapacitate", spellID = 19386 }, -- Wyvern Sting
[GetSpellInfo(28271)] = { category = "incapacitate", spellID = 28271 }, -- Polymorph: Turtle
[GetSpellInfo(28272)] = { category = "incapacitate", spellID = 28272 }, -- Polymorph: Pig
[GetSpellInfo(118)] = { category = "incapacitate", spellID = 118 }, -- Polymorph
[GetSpellInfo(20066)] = { category = "incapacitate", spellID = 20066 }, -- Repentance
[GetSpellInfo(1776)] = { category = "incapacitate", spellID = 1776 }, -- Gouge
[GetSpellInfo(6770)] = { category = "incapacitate", spellID = 6770 }, -- Sap
[GetSpellInfo(1090)] = { category = "incapacitate", spellID = 1090 }, -- Sleep
[GetSpellInfo(13327)] = { category = "incapacitate", spellID = 13327 }, -- Reckless Charge (Rocket Helmet)
[GetSpellInfo(26108)] = { category = "incapacitate", spellID = 26108 }, -- Glimpse of Madness
-- Fears
[GetSpellInfo(1513)] = { category = "fear", spellID = 1513 }, -- Scare Beast
[GetSpellInfo(8122)] = { category = "fear", spellID = 8122 }, -- Psychic Scream
[GetSpellInfo(5782)] = { category = "fear", spellID = 5782 }, -- Fear
[GetSpellInfo(5484)] = { category = "fear", spellID = 5484 }, -- Howl of Terror
[GetSpellInfo(6358)] = { category = "fear", spellID = 6358 }, -- Seduction
[GetSpellInfo(5246)] = { category = "fear", spellID = 5246 }, -- Intimidating Shout
[GetSpellInfo(5134)] = { category = "fear", spellID = 5134 }, -- Flash Bomb Fear
-- Random/short roots
[GetSpellInfo(19229)] = { category = "random_root", spellID = 19229 }, -- Improved Wing Clip
-- [GetSpellInfo(27868)] = { category = "random_root", spellID = 12494 }, -- Frostbite
[GetSpellInfo(23694)] = { category = "random_root", spellID = 23694 }, -- Improved Hamstring
[GetSpellInfo(27868)] = { category = "random_root", spellID = 27868 }, -- Freeze (Item proc and set bonus)
-- Random/short stuns
[GetSpellInfo(16922)] = { category = "random_stun", spellID = 16922 }, -- Improved Starfire
[GetSpellInfo(19410)] = { category = "random_stun", spellID = 19410 }, -- Improved Concussive Shot
[GetSpellInfo(12355)] = { category = "random_stun", spellID = 12355 }, -- Impact
[GetSpellInfo(20170)] = { category = "random_stun", spellID = 20170 }, -- Seal of Justice Stun
[GetSpellInfo(15269)] = { category = "random_stun", spellID = 15269 }, -- Blackout
[GetSpellInfo(18093)] = { category = "random_stun", spellID = 18093 }, -- Pyroclasm
[GetSpellInfo(12798)] = { category = "random_stun", spellID = 12798 }, -- Revenge Stun
[GetSpellInfo(5530)] = { category = "random_stun", spellID = 5530 }, -- Mace Stun Effect (Mace Specialization)
[GetSpellInfo(15283)] = { category = "random_stun", spellID = 15283 }, -- Stunning Blow (Weapon Proc)
[GetSpellInfo(56)] = { category = "random_stun", spellID = 56 }, -- Stun (Weapon Proc)
[GetSpellInfo(21152)] = { category = "random_stun", spellID = 21152 }, -- Earthshaker (Weapon Proc)
-- Spells that DRs with itself only
[GetSpellInfo(408)] = { category = "kidney_shot", spellID = 408 }, -- Kidney Shot
[GetSpellInfo(605)] = { category = "mind_control", spellID = 605 }, -- Mind Control
[GetSpellInfo(13181)] = { category = "mind_control", spellID = 13181 }, -- Gnomish Mind Control Cap
[GetSpellInfo(8056)] = { category = "frost_shock", spellID = 8056 }, -- Frost Shock
}
else
print("DRList-1.0: Unsupported game expansion loaded.") -- luacheck: ignore
end
-- Alias for DRData-1.0
Lib.spells = Lib.spellList

View File

@ -6,24 +6,23 @@ local Buff = LibClassAuras.Buff
-------------
-- PRIEST
-------------
Buff({ 1243, 1244, 1245, 2791, 10937, 10938, 25389 }, { buffType = "magic" }, "PRIEST") -- Power Word: Fortitude
Buff({ 21562, 21564, 25392 }, { buffType = "magic" }, "PRIEST") -- Prayer of Fortitude
Buff({ 17, 592, 600, 3747, 6065, 6066, 10898, 10899, 10900, 10901, 25217, 25218 }, { buffType = "magic" }, "PRIEST") -- Power Word: Shield
Buff({ 588, 7128, 602, 1006, 10951, 10952, 25431 }, { buffType = "magic" }, "PRIEST") -- Inner Fire
Buff({ 1243, 1244, 1245, 2791, 10937, 10938, 25389, 48161 }, { buffType = "magic" }, "PRIEST") -- Power Word: Fortitude
Buff({ 21562, 21564, 25392, 48162 }, { buffType = "magic" }, "PRIEST") -- Prayer of Fortitude
Buff({ 17, 592, 600, 3747, 6065, 6066, 10898, 10899, 10900, 10901, 25217, 25218, 48065, 48066 }, { buffType = "magic" }, "PRIEST") -- Power Word: Shield
Buff({ 588, 7128, 602, 1006, 10951, 10952, 25431, 48040, 48168 }, { buffType = "magic" }, "PRIEST") -- Inner Fire
Buff({ 2651 }, { buffType = "magic" }, "PRIEST") -- Elune's Grace
Buff({ 6346 }, { buffType = "magic" }, "PRIEST") -- Fear Ward
Buff({ 14752, 14818, 14819, 27841, 25312 }, { buffType = "magic" }, "PRIEST") -- Divine Spirit
Buff({ 27681, 32999 }, { buffType = "magic" }, "PRIEST") -- Prayer of Spirit
Buff({ 14752, 14818, 14819, 27841, 25312, 48073 }, { buffType = "magic" }, "PRIEST") -- Divine Spirit
Buff({ 27681, 32999, 48074 }, { buffType = "magic" }, "PRIEST") -- Prayer of Spirit
Buff({ 1706 }, { buffType = "magic" }, "PRIEST") -- Levitate
Buff({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315, 25221, 25222 }, { buffType = "magic" }, "PRIEST") -- Renew
Buff({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315, 25221, 25222, 48067, 48068 }, { buffType = "magic" }, "PRIEST") -- Renew
Buff({ 552 }, { buffType = "magic" }, "PRIEST") -- Abolish Disease
Buff({ 33076 }, { buffType = "magic" }, "PRIEST") -- Prayer of Mending
Buff({ 33076, 48112, 48113 }, { buffType = "magic" }, "PRIEST") -- Prayer of Mending
Buff({ 586, 9578, 9579, 9592, 10941, 10942, 25429 }, { buffType = "magic" }, "PRIEST") -- Fade
Buff({ 2652, 19261, 19262, 19264, 19265, 19266, 25461 }, { buffType = "magic" }, "PRIEST") -- Touch of Weakness
Buff({ 18137, 19308, 19310, 19311, 19312, 25477 }, { buffType = "magic" }, "PRIEST") -- Shadowguard
Buff({ 976, 10957, 10958, 16874, 25433 }, { buffType = "magic" }, "PRIEST") -- Shadow Protection
Buff({ 27683, 39374 }, { buffType = "magic" }, "PRIEST") -- Prayer of Shadow Protection
Buff({ 15473 }, { buffType = "form" }, "PRIEST") -- Shadowform
--talents
Buff({ 14893, 15357, 15359 }, { buffType = "magic" }, "PRIEST") -- Inspiration
Buff({ 27813, 27817, 27818 }, { buffType = "magic" }, "PRIEST") -- Blessed Recovery
@ -32,51 +31,74 @@ Buff({ 14751 }, { buffType = "magic" }, "PRIEST") -- Inner Focus
Buff({ 10060 }, { buffType = "magic" }, "PRIEST") -- Power Infusion
Buff({ 33206 }, { buffType = "magic" }, "PRIEST") -- Pain Suppression
Buff({ 34754 }, { buffType = "magic" }, "PRIEST") -- Clearcasting
Buff({ 15473 }, { buffType = "form" }, "PRIEST") -- Shadowform
Buff({ 47788 }, { buffType = "magic" }, "PRIEST") -- Guardian's Spirit
Buff({ 47585 }, { buffType = "magic" }, "PRIEST") -- Dispersion
Buff({ 65081 }, { buffType = "magic" }, "PRIEST") -- Body and Soul
Buff({ 33151 }, { buffType = "magic" }, "PRIEST") -- Surge of Light
Buff({ 47753 }, { buffType = "magic" }, "PRIEST") -- Divine Aegis
Buff({ 47930 }, { buffType = "magic" }, "PRIEST") -- Grace
Buff({ 63734 }, { buffType = "magic" }, "PRIEST") -- Serendipity
---------------
-- DRUID
---------------
Buff({ 467, 782, 1075, 8914, 9756, 9910, 26992 }, { buffType = "magic"}, "DRUID") -- Thorns
Buff({ 467, 782, 1075, 8914, 9756, 9910, 26992, 53307 }, { buffType = "magic"}, "DRUID") -- Thorns
Buff({ 5487 }, { buffType = "form"}, "DRUID") -- Bear Form
Buff({ 783 }, { buffType = "form"}, "DRUID") -- Travel Form
Buff({ 9634 }, { buffType = "form"}, "DRUID") -- Dire Bear Form
Buff({ 768 }, { buffType = "form"}, "DRUID") -- Cat Form
Buff({ 22812 }, { buffType = "magic"}, "DRUID") -- Barkskin
Buff({ 5229 }, { buffType = "physical"}, "DRUID") -- Enrage
Buff({ 5217, 6793, 9845, 9846 }, { buffType = "physical"}, "DRUID") -- Tiger's Fury
Buff({ 5229 }, { buffType = "enrage"}, "DRUID") -- Enrage
Buff({ 5217, 6793, 9845, 9846, 50212, 50213 }, { buffType = "physical"}, "DRUID") -- Tiger's Fury
Buff({ 1850, 9821, 33357 }, { buffType = "physical"}, "DRUID") -- Dash
Buff({ 22842, 22895, 22896, 26999 }, { buffType = "physical"}, "DRUID") -- Frenzied Regeneration
Buff({ 1126, 5232, 6756, 5234, 8907, 9884, 9885, 26990 }, { buffType = "magic"}, "DRUID") -- Mark of the Wild
Buff({ 21849, 21850, 26991 }, { buffType = "magic"}, "DRUID") -- Gift of the Wild
Buff({ 774, 1058, 1430, 2090, 2091, 3627, 8910, 9839, 9840, 9841, 25299, 26981, 26982 }, { buffType = "magic"}, "DRUID") -- Regrowth
Buff({ 8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858, 26980 }, { buffType = "magic"}, "DRUID") -- Rejuvenation
Buff({ 22842 }, { buffType = "physical"}, "DRUID") -- Frenzied Regeneration
Buff({ 1126, 5232, 6756, 5234, 8907, 9884, 9885, 26990, 48469 }, { buffType = "magic"}, "DRUID") -- Mark of the Wild
Buff({ 21849, 21850, 26991, 48470 }, { buffType = "magic"}, "DRUID") -- Gift of the Wild
Buff({ 774, 1058, 1430, 2090, 2091, 3627, 8910, 9839, 9840, 9841, 25299, 26981, 26982, 48442, 48443 }, { buffType = "magic"}, "DRUID") -- Regrowth
Buff({ 8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858, 26980, 48440, 48441 }, { buffType = "magic"}, "DRUID") -- Rejuvenation
Buff({ 2893 }, { buffType = "magic"}, "DRUID") -- Abolish Poison
Buff({ 33763 }, { buffType = "magic"}, "DRUID") -- Lifebloom
Buff({ 33763, 48450, 48451}, { buffType = "magic"}, "DRUID") -- Lifebloom
--Talents
Buff({ 24858 }, { buffType = "form"}, "DRUID") -- Moonkin Form
Buff({ 24907 }, { buffType = "aura"}, "DRUID") -- Moonkin Aura
Buff({ 33891 }, { buffType = "form"}, "DRUID") -- Tree of Life
Buff({ 16864 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity
Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp
Buff({ 16864, 16870 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity
Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009, 53312 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp
Buff({ 45281, 45282, 45283 }, { buffType = "magic"}, "DRUID") -- Natural Perfection
Buff({ 17116 }, { buffType = "magic"}, "DRUID") -- Nature's Swiftness
Buff({ 17007 }, { buffType = "aura"}, "DRUID") -- Leader of the Pack
Buff({ 48518 }, { buffType = "physical"}, "DRUID") -- Eclipse (Lunar)
Buff({ 48517 }, { buffType = "physical"}, "DRUID") -- Eclipse (Solar)
Buff({ 16886 }, { buffType = "magic"}, "DRUID") -- Nature's Grace
Buff({ 48503, 48504 }, { buffType = "magic"}, "DRUID") -- Living Seed
Buff({ 50334 }, { buffType = "physical"}, "DRUID") -- Berserk
Buff({ 52610, 62071 }, { buffType = "enrage"}, "DRUID") -- Savage Roar
Buff({ 48391 }, { buffType = "enrage"}, "DRUID") -- Owlkin Frenzy
-------------
-- WARRIOR -- TODO
-------------
Buff({ 29838 }, { buffType = "physical"}, "WARRIOR") -- Second Wind
Buff({ 12292 }, { buffType = "physical"}, "WARRIOR") -- Death Wish
Buff({ 12292 }, { buffType = "enrage"}, "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({ 29801, 30032 }, { buffType = "aura"}, "WARRIOR") -- Rampage
Buff({ 2687 }, { buffType = "enrage"}, "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({ 18499 }, { buffType = "enrage"}, "WARRIOR") -- Berserker Rage
Buff({ 23885 }, { buffType = "enrage"}, "WARRIOR") -- Bloodthirst
Buff({ 3411 }, { buffType = "physical"}, "WARRIOR") -- Intervene
Buff({ 50622 }, { buffType = "physical"}, "WARRIOR") -- Bladestorm (whirlwind)
Buff({ 52437 }, { buffType = "physical"}, "WARRIOR") -- Sudden Death
Buff({ 57522 }, { buffType = "physical"}, "WARRIOR") -- Wrecking Crew
Buff({ 46916 }, { buffType = "physical"}, "WARRIOR") -- Slam!
Buff({ 50720 }, { buffType = "physical"}, "WARRIOR") -- Vigilance
Buff({ 55694 }, { buffType = "enrage"}, "WARRIOR") -- Enraged Regeneration
Buff({ 1719 }, { buffType = "enrage"}, "WARRIOR") -- Recklessness
--------------
@ -87,24 +109,35 @@ Buff({ 2983 }, { buffType = "physical" }, "ROGUE") -- Sprint
Buff({ 5277 }, { buffType = "physical" }, "ROGUE") -- Evasion
Buff({ 31224 }, { buffType = "physical" }, "ROGUE") -- Cloak of Shadows
Buff({ 14278 }, { buffType = "physical" }, "ROGUE") -- Ghostly Strike
Buff({ 51713 }, { buffType = "physical" }, "ROGUE") -- Shadow Dance
Buff({ 31665 }, { buffType = "physical" }, "ROGUE") -- Master of Subtlety
Buff({ 51690 }, { buffType = "physical" }, "ROGUE") -- Killing Spree
Buff({ 63848 }, { buffType = "enrage" }, "ROGUE") -- Hunger For Blood
Buff({ 57934 }, { buffType = "physical" }, "ROGUE") -- Tricks of the Trade
------------
-- WARLOCK --TODO
------------
Buff({ 19028 }, { buffType = "aura"}, "WARLOCK") -- Soul Link
Buff({ 696 }, { buffType = "aura"}, "WARLOCK") -- Demon Skin
Buff({ 706 }, { buffType = "aura"}, "WARLOCK") -- Demon Armor
Buff({ 28176 }, { buffType = "aura"}, "WARLOCK") -- Fel Armor
Buff({ 687, 696 }, { buffType = "aura"}, "WARLOCK") -- Demon Skin
Buff({ 706, 1086, 11733, 11734, 11735, 27260, 47793, 47889 }, { buffType = "aura"}, "WARLOCK") -- Demon Armor
Buff({ 28176, 28189, 47892, 47893 }, { 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
Buff({ 1949, 11683, 11684, 27213, 47823 }, { buffType = "aura"}, "WARLOCK") -- Hellfire
Buff({ 6229, 11739, 11740, 28610, 47890, 47891 }, { buffType = "magic"}, "WARLOCK") -- Shadow Ward
Buff({ 19480, 20435, 41002 }, { buffType = "aura"}, "WARLOCK") -- Paranoia
Buff({ 7812, 19438, 19440, 19441, 19442, 19443, 27273, 47985, 47986 }, { buffType = "magic"}, "WARLOCK") -- Sacrifice
Buff({ 2947, 8316, 8317, 11770, 11771, 27269, 47983 }, { buffType = "magic"}, "WARLOCK") -- Fire Shield
Buff({ 48018 }, { buffType = "magic"}, "WARLOCK") -- Demonic Circle: Summon
Buff({ 59672 }, { buffType = "physical"}, "WARLOCK") -- Metamorphosis
Buff({ 54277 }, { buffType = "physical"}, "WARLOCK") -- Backdraft
Buff({ 47283 }, { buffType = "magic"}, "WARLOCK") -- Empowered Imp
Buff({ 64371 }, { buffType = "magic"}, "WARLOCK") -- Eradication
Buff({ 18093, 63243, 63244 } ,{ buffType = "physical" }, "WARLOCK") -- Pyroclasm
---------------
@ -115,35 +148,43 @@ 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({ 974, 32593, 32594, 49283, 49284 } ,{ buffType = "magic" }, "SHAMAN") -- Earth Shield
Buff({ 24398, 33736, 57960 } ,{ buffType = "magic" }, "SHAMAN") -- Water Shield
Buff({ 324, 25472, 49280, 49281 } ,{ buffType = "magic" }, "SHAMAN") -- Lightning Shield
Buff({ 16188 } ,{ buffType = "magic" }, "SHAMAN") -- Nature's Swiftness
Buff({ 16166 } ,{ buffType = "magic" }, "SHAMAN") -- Elemental Mastery
Buff({ 51470 } ,{ buffType = "aura" }, "SHAMAN") -- Elemental Oath
Buff({ 30809 } ,{ buffType = "aura" }, "SHAMAN") -- Unleashed Rage
Buff({ 52179 } ,{ buffType = "magic" }, "SHAMAN") -- Astral Shift
Buff({ 61295, 61299, 61300, 61301 } ,{ buffType = "magic" }, "SHAMAN") -- Riptide
Buff({ 53390 } ,{ buffType = "magic" }, "SHAMAN") -- Tidal Waves
Buff({ 52000, 51999, 51998, 51997, 51990, 51945 } ,{ buffType = "magic" }, "SHAMAN") -- Earthliving proc
--------------
-- PALADIN --TODO
--------------
--Blessings
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( { 1022, 5599, 10278 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Protection
Buff( { 6940 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Sacrifice
Buff( { 1044, 66115 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Freedom
Buff( { 19740, 19834, 19835, 19836, 19837, 19838, 25291, 27140, 48931, 48932 }, { buffType = "magic"}, "PALADIN") -- Blessing of Might
Buff( { 19742, 19850, 19852, 19853, 19854, 25290, 27142, 48935, 48936 }, { 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( { 1038 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand 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( { 25782, 27141, 48933, 48934 }, { 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( { 25894, 48937 }, { 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( { 465, 10290, 643, 10291, 1032, 10292, 10293, 27149, 48941, 48942 }, { 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
@ -152,7 +193,7 @@ 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( { 20154, 21084, 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
@ -161,6 +202,18 @@ 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
Buff( { 53563 }, { buffType = "magic"}, "PALADIN") -- Beacon of Light
Buff( { 54149 }, { buffType = "magic"}, "PALADIN") -- Infusion of Light
Buff( { 59578 }, { buffType = "magic"}, "PALADIN") -- The Art of War
Buff( { 20925, 20927, 20928, 27179, 48951, 48952 }, { buffType = "magic"}, "PALADIN") -- Holy Shield
Buff( { 53601 }, { buffType = "magic"}, "PALADIN") -- Sacred Shield
Buff( { 54428 }, { buffType = "magic"}, "PALADIN") -- Divine Plea
Buff( { 31821 }, { buffType = "magic"}, "PALADIN") -- Aura Mastery
Buff( { 31842 }, { buffType = "magic"}, "PALADIN") -- Divine Illumination
Buff( { 20216 }, { buffType = "magic"}, "PALADIN") -- Divine Favor
Buff( { 25780 }, { buffType = "magic"}, "PALADIN") -- Righteous Fury
-------------
@ -170,7 +223,10 @@ Buff( { 21082 }, { buffType = "magic"}, "PALADIN") -- Seal of the Crusade
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
Buff( { 64420 }, { buffType = "physical"}, "HUNTER") -- Sniper Training
Buff( { 34835 }, { buffType = "physical"}, "HUNTER") -- Master Tactician
Buff( { 54216 }, { buffType = "physical"}, "HUNTER") -- Master's Call
Buff( { 34471 }, { buffType = "physical"}, "HUNTER") -- The Beast Within
-------------
@ -178,20 +234,50 @@ Buff( { 3045 }, { buffType = "physical"}, "HUNTER") -- Rapid Fire
-------------
Buff({ 66 }, { buffType = "magic"}, "MAGE") -- Invisibility
Buff({ 1459 }, { buffType = "magic"}, "MAGE") -- Arcane Intellect
Buff({ 1459, 1460, 1461, 10156, 10157, 27126, 42995 }, { buffType = "magic"}, "MAGE") -- Arcane Intellect
Buff({ 130 }, { buffType = "magic"}, "MAGE") -- Slow Fall
Buff({ 604 }, { buffType = "magic"}, "MAGE") -- Dampen Magic
Buff({ 1008 }, { buffType = "magic"}, "MAGE") -- Amplify Magic
Buff({ 1463 }, { buffType = "magic"}, "MAGE") -- Mana Shield
Buff({ 6117 }, { buffType = "form"}, "MAGE") -- Mage Armor
Buff({ 604, 8450, 8451, 10173, 10174, 33944, 43015 }, { buffType = "magic"}, "MAGE") -- Dampen Magic
Buff({ 1008, 8455, 10169, 10170, 27130, 33946, 43017, }, { buffType = "magic"}, "MAGE") -- Amplify Magic
Buff({ 1463, 8494, 8495, 10191, 10192, 10193, 27131, 43019, 43020 }, { buffType = "magic"}, "MAGE") -- Mana Shield
Buff({ 6117, 22782, 22783, 27125, 43023, 43024 }, { buffType = "form"}, "MAGE") -- Mage Armor
Buff({ 31643 }, { buffType = "magic"}, "MAGE") -- Blazing Speed
Buff({ 543 }, { buffType = "magic"}, "MAGE") -- Fire Ward
Buff({ 543, 8457, 8458, 10223, 10225, 27128, 43010 }, { buffType = "magic"}, "MAGE") -- Fire Ward
Buff({ 11129 }, { buffType = "magic"}, "MAGE") -- Combustion
Buff({ 30482 }, { buffType = "form"}, "MAGE") -- Molten Armor
Buff({ 168 }, { buffType = "form"}, "MAGE") -- Frost Armor
Buff({ 7302 }, { buffType = "form"}, "MAGE") -- Ice Armor
Buff({ 30482, 43045, 43046 }, { buffType = "form"}, "MAGE") -- Molten Armor
Buff({ 168, 7300, 7301 }, { buffType = "form"}, "MAGE") -- Frost Armor
Buff({ 7302, 7320, 10219, 10220, 27124, 43008 }, { buffType = "form"}, "MAGE") -- Ice Armor
Buff({ 45438 }, { buffType = "immune"}, "MAGE") -- Ice Block
Buff({ 6143 }, { buffType = "magic"}, "MAGE") -- Frost Ward
Buff({ 6143, 32796, 8462, 28609, 10177, 43012, 8461 }, { buffType = "magic"}, "MAGE") -- Frost Ward
--talents
Buff({ 11426 }, { buffType = "magic"}, "MAGE") -- Ice Barrier
Buff({ 11426, 13031, 13032, 13033, 27134, 33405, 43038, 43039 }, { buffType = "magic"}, "MAGE") -- Ice Barrier
Buff({ 12472 }, { buffType = "magic"}, "MAGE") -- Icy Veins
Buff({ 74396 }, { buffType = "magic"}, "MAGE") -- Fingers of Frost
Buff({ 57761 }, { buffType = "magic"}, "MAGE") -- FireBall!
Buff({ 44413 }, { buffType = "magic"}, "MAGE") -- Incanter's Absorption
Buff({ 48108 }, { buffType = "magic"}, "MAGE") -- Hot Streak
Buff({ 54741 }, { buffType = "magic"}, "MAGE") -- Hot Streak
Buff({ 61316 }, { buffType = "magic"}, "MAGE") -- Dalaran Brilliance
Buff({ 44401 }, { buffType = "magic"}, "MAGE") -- Missile Barrage
-------------
-- DEATHKNIGHT
-------------
Buff({ 48707 }, { buffType = "physical"}, "DEATHKNIGHT") -- Anti-Magic Shell
Buff({ 48792 }, { buffType = "physical"}, "DEATHKNIGHT") -- Icebound Fortitude
Buff({ 49039 }, { buffType = "physical"}, "DEATHKNIGHT") -- Lichborne
Buff({ 50461 }, { buffType = "physical"}, "DEATHKNIGHT") -- Anti-Magic Zone
Buff({ 57330, 57623 }, { buffType = "physical"}, "DEATHKNIGHT") -- Horn of Winter
Buff({ 49222 }, { buffType = "physical"}, "DEATHKNIGHT") -- Bone Shield
Buff({ 49016 }, { buffType = "enrage"}, "DEATHKNIGHT") -- Unholy Frenzy
Buff({ 59052 }, { buffType = "physical"}, "DEATHKNIGHT") -- Freezing Fog
Buff({ 55233 }, { buffType = "physical"}, "DEATHKNIGHT") -- Vampiric Blood
Buff({ 51271 }, { buffType = "physical"}, "DEATHKNIGHT") -- Unbreakable Armor
Buff({ 49796 }, { buffType = "physical"}, "DEATHKNIGHT") -- Deathchill
Buff({ 50485 }, { buffType = "physical"}, "DEATHKNIGHT") -- Acclimation
Buff({ 66803 }, { buffType = "physical"}, "DEATHKNIGHT") -- Desolation
Buff({ 55610 }, { buffType = "aura"}, "DEATHKNIGHT") -- Improved Icy Talons
Buff({ 53138 }, { buffType = "aura"}, "DEATHKNIGHT") -- Abomination's Might

View File

@ -11,129 +11,151 @@ Debuff({ 9035, 19281, 19282, 19283, 19284, 19285, 25470 }, { buffType = "curse"
Debuff({ 6788 }, { }, "PRIEST") -- Weakened Soul
Debuff({ 15487 }, { buffType = "magic" }, "PRIEST") -- Silence
Debuff({ 10797, 19296, 19299, 19302, 19303, 19304, 19305, 25446 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "PRIEST") -- starshards
Debuff({ 2944, 19276, 19277, 19278, 19279, 19280, 25467 }, { stacking = true , buffType = "disease", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") --devouring plague
Debuff({ 2944, 19276, 19277, 19278, 19279, 19280, 25467, 48299, 48300 }, { stacking = true , buffType = "disease", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") --devouring plague
Debuff({ 453, 8192, 10953, 25596 }, { }, "PRIEST") -- mind soothe
Debuff({ 14914, 15261, 15262, 15263, 15264, 15265, 15266, 15267, 25384 }, { stacking = true, buffType = "magic", preEvent = "SPELL_DAMAGE"}, "PRIEST") -- Holy Fire, stacking?
Debuff({ 589, 594, 970, 992, 2767, 10892, 10893, 10894, 25367, 25368 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") -- SW:P
Debuff({ 14914, 15261, 15262, 15263, 15264, 15265, 15266, 15267, 25384, 48134, 48135 }, { stacking = true, buffType = "magic", preEvent = "SPELL_DAMAGE"}, "PRIEST") -- Holy Fire, stacking?
Debuff({ 589, 594, 970, 992, 2767, 10892, 10893, 10894, 25367, 25368, 48124, 48125 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") -- SW:P
Debuff({ 15258 } ,{ buffType = "magic" }, "PRIEST") -- Shadow Vulnerability (Shadow Weaving Talent Effect)
Debuff({ 15286 } ,{ buffType = "magic" }, "PRIEST") -- Vampiric Embrace
Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387 }, { buffType = "magic" }, "PRIEST") -- Mind Flay
Debuff({ 34914, 34916, 34917, 48159, 48160 }, { buffType = "magic"}, "PRIEST") -- Vampiric Touch
Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387, 48155, 48156 }, { buffType = "magic" }, "PRIEST") -- Mind Flay
Debuff({ 605, 10911, 10912 }, { buffType = "magic" }, "PRIEST") -- Mind Control
Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream
Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") -- Blackout
Debuff({ 44041, 44043, 44044, 44045, 44046, 44047 }, { buffType = "magic"}, "PRIEST") -- Chastise
Debuff({ 48045, 53023 }, {stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") -- Mind Sear
Debuff({ 64044 }, { buffType = "magic" }, "PRIEST") -- Psychic Horror
Debuff({ 64058 }, { buffType = "physical" }, "PRIEST") -- Psychic Horror Disarm
---------------
-- DRUID
---------------
Debuff({ 33786 }, { buffType = "immune"}, "DRUID") -- Cyclone
Debuff({ 19675 }, { }, "DRUID") -- Feral Charge
Debuff( { 22570}, { buffType = "physical"}, "DRUID") -- Maim
Debuff({ 19975, 19974, 19973, 19972, 19971, 19970, 27010 }, { buffType = "magic", altName = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)) }, "DRUID") -- Nature's Grasp root
Debuff({ 22570, 49802}, { buffType = "physical"}, "DRUID") -- Maim
Debuff({ 19975, 19974, 19973, 19972, 19971, 19970, 27010, 53313 }, { buffType = "magic", altName = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)) }, "DRUID") -- Nature's Grasp root
Debuff({ 339, 1062, 5195, 5196, 9852, 9853, 26989 }, { buffType = "magic"}, "DRUID") -- Entangling Roots
Debuff({ 770, 778, 9749, 9907, 26993 }, { buffType = "magic" }, "DRUID") -- Faerie Fire
Debuff({ 16857, 17390, 17391, 17392, 27011 }, { buffType = "magic" }, "DRUID") -- Faerie Fire (Feral)
Debuff({ 2637, 18657, 18658 }, { buffType = "magic"}, "DRUID") -- Hibernate
Debuff({ 99, 1735, 9490, 9747, 9898, 26998 }, { buffType = "physical" }, "DRUID") -- Demoralizing Roar
Debuff({ 99, 1735, 9490, 9747, 9898, 26998, 48559, 48560 }, { buffType = "physical" }, "DRUID") -- Demoralizing Roar
Debuff({ 5209 }, { buffType = "physical" }, "DRUID") -- Challenging Roar
Debuff({ 6795 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Taunt
Debuff({ 16922 }, { buffType = "physical" }, "DRUID") -- Imp Starfire Stun
Debuff({ 9005, 9823, 9827, 27006 }, { buffType = "physical" }, "DRUID") -- Pounce
Debuff({ 9007, 9824, 9826, 27007 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Pounce Bleed
Debuff({ 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835, 26987, 26988 }, { stacking = true, buffType = "magic"}, "DRUID") -- Moonfire
Debuff({ 1822, 1823, 1824, 9904, 27003 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rake
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({ 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)
Debuff({ 9005, 9823, 9827, 27006, 49803 }, { buffType = "physical" }, "DRUID") -- Pounce
Debuff({ 9007, 9824, 9826, 27007, 49804 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Pounce Bleed
Debuff({ 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835, 26987, 26988, 48462, 48463 }, { stacking = true, buffType = "magic"}, "DRUID") -- Moonfire
Debuff({ 1822, 1823, 1824, 9904, 27003, 48573, 48574, 59886 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rake
Debuff({ 1079, 9492, 9493, 9752, 9894, 9896, 27008, 49799, 49800 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rip
Debuff({ 5570, 24974, 24975, 24976, 24977, 27013, 48468 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Insect Swarm
Debuff({ 33745, 48567, 48568 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Lacerate
Debuff({ 33878, 33986, 33987, 48563, 48564 }, { buffType = "physical" }, "DRUID") -- Mangle (Bear)
Debuff({ 33876, 33982, 33983, 48565, 48566 }, { buffType = "physical" }, "DRUID") -- Mangle (Cat)
Debuff({ 60433 }, { buffType = "magic" }, "DRUID") -- Earth and Moon
Debuff({ 58181 }, { buffType = "physical" }, "DRUID") -- Infected Wounds
-------------
-- WARRIOR
-------------
Debuff({ 29703 }, { buffType = "physical"}, "WARRIOR") -- Dazed
Debuff({ 12294, 21551, 21552, 21553, 25248, 30330 }, { buffType = "physical" }, "WARRIOR") -- Mortal Strike
Debuff({ 72, 1671, 1672, 29704}, { buffType = "physical" }, "WARRIOR") -- Shield Bash
Debuff({ 12294, 21551, 21552, 21553, 25248, 30330, 47485, 47486 }, { buffType = "physical" }, "WARRIOR") -- Mortal Strike
Debuff({ 72, 1671, 1672, 29704 }, { buffType = "physical" }, "WARRIOR") -- Shield Bash
Debuff({ 18498 }, { buffType = "physical" }, "WARRIOR") -- Improved Shield Bash
Debuff({ 772, 6546, 6547, 6548, 11572, 11573, 11574, 25208 }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Rend
Debuff({ 12721, 43104 }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Deep Wounds
Debuff({ 772, 6546, 6547, 6548, 11572, 11573, 11574, 25208, 46845, 47465 }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Rend
Debuff({ 12721, 43104, }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Deep Wounds
Debuff({ 12323 }, { buffType = "physical"}, "WARRIOR") -- Piercing Howl
Debuff({ 1715, 7372, 7373, 25212 }, { buffType = "physical" }, "WARRIOR") -- Hamstring
Debuff({ 23694 } , { buffType = "physical" }, "WARRIOR") -- Improved Hamstring
Debuff({ 6343, 8198, 8204, 8205, 11580, 11581, 25264 }, { buffType = "physical"}, "WARRIOR") -- Thunder Clap
Debuff({ 6343, 8198, 8204, 8205, 11580, 11581, 25264, 47501, 47502 }, { buffType = "physical"}, "WARRIOR") -- Thunder Clap
Debuff({ 694, 7400, 7402, 20559, 20560 }, { buffType = "physical", }, "WARRIOR") -- Mocking Blow
Debuff({ 1161 } ,{ buffType = "physical", }, "WARRIOR") -- Challenging Shout
Debuff({ 355 } ,{ stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "WARRIOR") -- Taunt
Debuff({ 1160, 6190, 11554, 11555, 11556, 25202, 25203 }, { buffType = "physical" }, "WARRIOR") -- Demoralizing Shout, varies
Debuff({ 1160, 6190, 11554, 11555, 11556, 25202, 25203, 47437 }, { buffType = "physical" }, "WARRIOR") -- Demoralizing Shout, varies
Debuff({ 5246 }, { buffType = "physical" }, "WARRIOR") -- Intimidating Shout Fear
Debuff({ 676 } ,{ buffType = "physical" }, "WARRIOR") -- Disarm
Debuff({ 12798 } , { buffType = "physical" }, "WARRIOR") -- Imp Revenge Stun
Debuff({ 7386, 7405, 8380, 11596, 11597, 25225, buffType = "physical" }, { }, "WARRIOR") -- Sunder Armor
Debuff({ 7386, 7405, 8380, 11596, 11597, 25225 }, { buffType = "physical" }, { }, "WARRIOR") -- Sunder Armor
Debuff({ 12809 } ,{ buffType = "physical" }, "WARRIOR") -- Concussion Blow
Debuff({ 7922 }, { buffType = "physical" }, "WARRIOR") -- Charge Stun
Debuff({ 20253, 20614, 20615, 25273, 25274 }, { buffType = "physical" }, "WARRIOR") -- Intercept Stun
Debuff({ 20253, 20614, 20615, 25273, 25274, 47995 }, { buffType = "physical" }, "WARRIOR") -- Intercept Stun
Debuff({ 5530 }, { buffType = "physical"}, "WARRIOR") -- Mace Stun Effect (Mace Specialization)
Debuff({ 56112 }, { buffType = "physical"}, "WARRIOR") -- Furious Attacks
Debuff({ 18498, 74347 }, { buffType = "physical"}, "WARRIOR") -- Gag Order
Debuff({ 46857 }, { buffType = "physical"}, "WARRIOR") -- Trauma
Debuff({ 46968 }, { buffType = "physical"}, "WARRIOR") -- Shockwave
Debuff({ 64382 }, { buffType = "physical"}, "WARRIOR") -- Shattering Throw
--------------
-- ROGUE
--------------
Debuff({ 16511, 17347, 17348, 26864 }, { buffType = "physical" }, "ROGUE") -- Hemorrhage
Debuff({ 16511, 17347, 17348, 26864, 48660 }, { buffType = "physical" }, "ROGUE") -- Hemorrhage
Debuff({ 3409, 11201 }, { buffType = "poison" }, "ROGUE") -- Crippling Poison
Debuff({ 13218, 13222, 13223, 13224, 27189 }, { buffType = "poison" }, "ROGUE") -- Wound Poison
Debuff({ 13218, 13222, 13223, 13224, 27189, 57975 }, { buffType = "poison" }, "ROGUE") -- Wound Poison
Debuff({ 26679 }, { buffType = "physical"}, "ROGUE") -- Deadly Throw Slow
Debuff({ 2818, 2819, 11353, 11354, 25349, 26968, 27187 }, { stacking = true, buffType = "poison", preEvent = { { event = "SPELL_DAMAGE", spellID = 5940}, "SWING_DAMAGE" }}, "ROGUE") -- Deadly Poison
Debuff({ 2818, 2819, 11353, 11354, 25349, 26968, 27187, 57970 }, { stacking = true, buffType = "poison", preEvent = { { event = "SPELL_DAMAGE", spellID = 5940}, "SWING_DAMAGE" }}, "ROGUE") -- Deadly Poison
Debuff({ 5760, 8692, 11398 }, { buffType = "poison" }, "ROGUE") -- Mind-numbing Poison
Debuff({ 18425 }, { buffType = "physical" }, "ROGUE") -- Improved Kick Silence
Debuff({ 1833 }, { buffType = "physical" }, "ROGUE") -- Cheap Shot
Debuff({ 2070, 6770, 11297 }, { buffType = "physical" }, "ROGUE") -- Sap
Debuff({ 2094 } , { buffType = "physical" }, "ROGUE") -- Blind
Debuff({ 8647, 8649, 8650, 11197, 11198, 26866 }, { buffType = "physical" }, "ROGUE") -- Expose Armor
Debuff({ 703, 8631, 8632, 8633, 11289, 11290, 26839, 26884 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "ROGUE") -- Garrote
Debuff({ 703, 8631, 8632, 8633, 11289, 11290, 26839, 26884, 48676 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "ROGUE") -- Garrote
Debuff({ 1330 }, { buffType = "physical"}, "ROGUE")-- Garrote - Silence
Debuff({ 408, 8643 }, { buffType = "physical" }, "ROGUE") -- Kidney Shot
Debuff({ 1943, 8639, 8640, 11273, 11274, 11275, 26867 }, { buffType = "physical", stacking = true}, "ROGUE") -- Rupture
Debuff({ 1943, 8639, 8640, 11273, 11274, 11275, 26867, 48671, 48672 }, { buffType = "physical", stacking = true}, "ROGUE") -- Rupture
Debuff({ 1776, 1777, 8629, 11285, 11286, 38764 }, { buffType = "physical", }, "ROGUE") -- Gouge
Debuff({ 14251 } , { buffType = "physical", }, "ROGUE") -- Riposte (disarm)
Debuff({ 51693 } , { buffType = "physical", }, "ROGUE") -- Waylay
Debuff({ 51585 } , { buffType = "physical", }, "ROGUE") -- Blade Twisting
------------
-- WARLOCK
------------
Debuff({ 32386 }, { buffType = "magic"}, "WARLOCK") -- Shadow Embrace
Debuff({ 710, 18647 } ,{ buffType = "immune"}, "WARLOCK") -- Banish
Debuff( { 348, 707, 1094, 2941, 11665, 11667, 11668, 25309, 27215 }, { buffType = "magic", stacking = true, preEvent = "SPELL_DAMAGE"}, "WARLOCK") -- Immolate
Debuff( { 348, 707, 1094, 2941, 11665, 11667, 11668, 25309, 27215, 47810, 47811 }, { buffType = "magic", stacking = true, preEvent = "SPELL_DAMAGE"}, "WARLOCK") -- Immolate
Debuff({ 24259 } ,{ buffType = "magic" }, "WARLOCK") -- Spell Lock Silence
Debuff({ 27243 } ,{ buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Seed of Corruption
Debuff( { 689, 699, 709, 7651, 11699, 11700, 27219, 27220 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Life
Debuff( { 689, 699, 709, 7651, 11699, 11700, 27219, 27220, 47857 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Life
Debuff( { 5138, 6226, 11703, 11704, 27221, 30908 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Mana
Debuff( { 1120, 8288, 8289, 11675, 27217 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Soul
Debuff( { 1120, 8288, 8289, 11675, 27217, 47855 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Soul
Debuff( { 18265, 18879, 18880, 18881, 27264, 30911}, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Siphon Life
Debuff( { 172, 6222, 6223, 7648, 11671, 11672, 25311, 27216 }, { buffType = "magic", stacking = true }, "WARLOCK") -- Corruption
Debuff( { 980, 1014, 6217, 11711, 11712, 11713, 27218 }, { buffType = "curse", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Curse of Agony
Debuff( { 172, 6222, 6223, 7648, 11671, 11672, 25311, 27216, 47812, 47813 }, { buffType = "magic", stacking = true }, "WARLOCK") -- Corruption
Debuff( { 980, 1014, 6217, 11711, 11712, 11713, 27218, 47863, 47864 }, { buffType = "curse", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Curse of Agony
Debuff({ 18223, 29539, 46434 }, { buffType = "curse"}, "WARLOCK") -- Curse of Exhaustion
Debuff( { 704, 7658, 7659, 11717, 27226 }, { buffType = "curse"}, "WARLOCK") -- Curse of Recklessness
Debuff( { 1490, 11721, 11722, 27228 }, { buffType = "curse"}, "WARLOCK") -- Curse of the Elements
Debuff( { 16231, 704, 7658, 7659, 11717, 27226 }, { buffType = "curse"}, "WARLOCK") -- Curse of Recklessness
Debuff( { 1490, 11721, 11722, 27228, 47865 }, { buffType = "curse"}, "WARLOCK") -- Curse of the Elements
Debuff( { 1714, 11719 }, { buffType = "curse"}, "WARLOCK") -- Curse of Tongues
Debuff( { 702, 1108, 6205, 7646, 11707, 11708, 27224, 30909 }, { buffType = "curse"}, "WARLOCK") -- Curse of Weakness
Debuff( { 603, 30910 }, { buffType = "curse"}, "WARLOCK") -- Curse of Doom
Debuff( { 6789, 17925, 17926, 27223 }, { buffType = "magic"}, "WARLOCK") -- Death Coil
Debuff( { 702, 1108, 6205, 7646, 11707, 11708, 27224, 30909, 50511 }, { buffType = "curse"}, "WARLOCK") -- Curse of Weakness
Debuff( { 603, 30910, 47867 }, { buffType = "curse"}, "WARLOCK") -- Curse of Doom
Debuff( { 6789, 17925, 17926, 27223, 47859, 47860 }, { buffType = "magic"}, "WARLOCK") -- Death Coil
Debuff( { 5782, 6213, 6215 }, { buffType = "magic"}, "WARLOCK") -- Fear
Debuff( { 5484, 17928 }, { buffType = "magic"}, "WARLOCK") -- Howl of Terror
Debuff({ 6358 }, { buffType = "magic" }, "WARLOCK") -- Seduction
Debuff({ 30108, 30404, 30405 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Unstable Affliction
Debuff({ 31117, 43523 }, { buffType = "magic", altName = select(1, GetSpellInfo(30405)) .. " Silence" }, "WARLOCK") -- Unstable Affliction Silence
Debuff({ 30108, 30404, 30405, 47841, 47843 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Unstable Affliction
Debuff({ 31117, 43523, 65813 }, { buffType = "magic", altName = select(1, GetSpellInfo(30405)) .. " Silence" }, "WARLOCK") -- Unstable Affliction Silence
Debuff({ 18093 } ,{ buffType = "physical" }, "WARLOCK") -- Pyroclasm
Debuff({ 17877, 18867, 18868, 18869, 18870, 18871, 27263, 30546 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "WARLOCK") -- Shadowburn Debuff
Debuff({ 17877, 18867, 18868, 18869, 18870, 18871, 27263, 30546, 47826, 47827 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "WARLOCK") -- Shadowburn Debuff
Debuff({ 47960, 61291 } ,{ buffType = "magic" }, "WARLOCK") -- Shadowflame dot
Debuff({ 63311 } ,{ buffType = "physical" }, "WARLOCK") -- Shadowflame slow
Debuff({ 48181, 59161, 59163, 59164 }, { buffType = "magic" }, "WARLOCK") -- Haunt
---------------
-- SHAMAN
---------------
Debuff({ 17364 } ,{ buffType = "magic" }, "SHAMAN") -- Stormstrike
Debuff({ 8056, 8058, 10472, 10473, 25464 }, { buffType = "magic" }, "SHAMAN") -- Frost Shock
Debuff({ 8050, 8052, 8053, 10447, 10448, 29228, 25457 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "SHAMAN") -- Flame Shock
Debuff({ 8034, 8037, 10458, 16352, 16353, 25501 }, { buffType = "magic" }, "SHAMAN") -- Frostbrand Attack
Debuff({ 8056, 8058, 10472, 10473, 25464, 49235, 49236 }, { buffType = "magic" }, "SHAMAN") -- Frost Shock
Debuff({ 8050, 8052, 8053, 10447, 10448, 29228, 25457, 49232, 49233 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "SHAMAN") -- Flame Shock
Debuff({ 8034, 8037, 10458, 16352, 16353, 25501, 58797, 58798, 58799 }, { buffType = "magic" }, "SHAMAN") -- Frostbrand Attack
Debuff({ 3600 } ,{ buffType = "magic" }, "SHAMAN") -- Earthbind Totem
Debuff({ 63685 } ,{ buffType = "magic" }, "SHAMAN") -- Frozen Power
--------------
-- PALADIN
@ -143,59 +165,94 @@ Debuff( { 25771 }, { buffType = "immune"}, "PALADIN") -- Forbearance
Debuff({ 20066 }, { buffType = "magic" }, "PALADIN") -- Repentance
Debuff({ 2878, 5627, 5627 }, { buffType = "magic"}, "PALADIN") -- Turn Undead
Debuff({ 21183, 20188, 20300, 20301, 20302, 20303, 27159 }, { }, "PALADIN") -- Judgement of the Crusader
Debuff({ 20185, 20344, 20345, 20346 }, { buffType = "magic"}, "PALADIN") -- Judgement of Light
Debuff({ 20186, 20354, 20355 }, { buffType = "magic"}, "PALADIN") -- Judgement of Wisdom
Debuff({ 20184, 31896}, { buffType = "magic", }, "PALADIN") -- Judgement of Justice
Debuff({ 20271, 20185, 20344, 20345, 20346 }, { buffType = "magic"}, "PALADIN") -- Judgement of Light
Debuff({ 20186, 20354, 20355, 53408 }, { buffType = "magic"}, "PALADIN") -- Judgement of Wisdom
Debuff({ 20184, 31896, 53407}, { buffType = "magic", }, "PALADIN") -- Judgement of Justice
Debuff({ 853, 5588, 5589, 10308 }, { buffType = "magic" }, "PALADIN") -- Hammer of Justice
Debuff({ 20170 } ,{ buffType = "physical", }, "PALADIN") -- Seal of Justice stun
Debuff({ 63529 } ,{ buffType = "magic", }, "PALADIN") -- Shield of the Templar
Debuff({ 61840 } ,{ buffType = "magic", }, "PALADIN") -- Righteous Vengeance
Debuff({ 10326 }, { buffType = "magic"}, "PALADIN") -- Turn Evil
-------------
-- HUNTER
-------------
Debuff( { 19434, 20900, 20901, 20902, 20903, 20904}, { buffType = "physical"}, "HUNTER") -- Aimed Shot
Debuff({ 1130, 14323, 14324, 14325 }, { buffType = "magic", }, "HUNTER") -- Hunter's Mark
Debuff({ 1978, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 25295, 27016 }, { stacking = true, buffType = "poison", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Serpent Sting
Debuff( { 19434, 20900, 20901, 20902, 20903, 20904, 27065, 49049, 49050}, { buffType = "physical"}, "HUNTER") -- Aimed Shot
Debuff({ 1130, 14323, 14324, 14325, 53338 }, { buffType = "magic", }, "HUNTER") -- Hunter's Mark
Debuff({ 1978, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 25295, 27016, 49000, 49001 }, { stacking = true, buffType = "poison", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Serpent Sting
Debuff({ 34490 }, { buffType = "magic" }, "HUNTER") -- Silencing Shot
Debuff({ 3043 }, { buffType = "poison", }, "HUNTER") -- Scorpid Sting
Debuff({ 3034, 14279, 14280, 27018 }, { buffType = "poison", }, "HUNTER") -- Viper Sting
Debuff({ 19386, 24132, 24133, 27068 }, { buffType = "poison", }, "HUNTER") -- Wyvern Sting
Debuff({ 24131, 24134, 24135, 27069 }, { buffType = "poison", altName = select(1, GetSpellInfo(19386)) .. " Dot" }, "HUNTER") -- Wyvern Sting Dot
Debuff({ 19386, 24132, 24133, 27068, 49011, 49012 }, { buffType = "poison", }, "HUNTER") -- Wyvern Sting
Debuff({ 24131, 24134, 24135, 27069, 49009, 49010 }, { buffType = "poison", altName = select(1, GetSpellInfo(19386)) .. " Dot" }, "HUNTER") -- Wyvern Sting Dot
Debuff({ 1513, 14326, 14327 }, { buffType = "magic"}, "HUNTER") -- Scare Beast
Debuff({ 19229 }, { buffType = "physical", }, "HUNTER") -- Wing Clip Root
Debuff({ 19306, 20909, 20910 }, { buffType = "physical"}, "HUNTER") -- Counterattack
Debuff({ 13812, 14314, 14315, 27026 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Explosive Trap
Debuff({ 19229, 47168 }, { buffType = "physical", }, "HUNTER") -- Wing Clip Root
Debuff({ 19306, 20909, 20910, 27067, 48998, 48999 }, { buffType = "physical"}, "HUNTER") -- Counterattack
Debuff({ 13812, 14314, 14315, 27026, 49064, 49065 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Explosive Trap
Debuff({ 13797, 14298, 14299, 14300, 14301, 27024 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Immolation Trap
Debuff({ 3355, 14308, 14309 }, { buffType = "magic" }, "HUNTER") -- Freezing Trap
Debuff({ 19503 }, { buffType = "physical" }, "HUNTER") -- Scatter Shot
Debuff({ 2974, 14267, 14268 }, { buffType = "physical" }, "HUNTER") -- Wing Clip
Debuff({ 2974 }, { buffType = "physical" }, "HUNTER") -- Wing Clip
Debuff({ 19229, 47168 }, { buffType = "physical" }, "HUNTER") -- Improved Wing Clip
Debuff({ 5116 }, { buffType = "physical" }, "HUNTER") -- Concussive Shot
Debuff({ 19410 }, { buffType = "physical" }, "HUNTER") -- Conc Stun
Debuff({ 24394 }, { buffType = "physical" }, "HUNTER") -- Intimidation
Debuff({ 15571 }, { buffType = "physical" }, "HUNTER") -- Daze from Aspect
Debuff({ 19185 }, { buffType = "physical" }, "HUNTER") -- Entrapment
Debuff({ 25999 }, { buffType = "physical" }, "HUNTER") -- Boar Charge
Debuff({ 24640, 24583, 24586, 24587, 27060 }, { buffType = "poison" }, "HUNTER") -- Scorpid Poison
Debuff({ 24640, 24583, 24586, 24587, 27060, 55728 }, { buffType = "poison" }, "HUNTER") -- Scorpid Poison
Debuff({ 60053 }, { buffType = "magic" }, "HUNTER") -- Explosive Shot
Debuff({ 63468 }, { buffType = "physical" }, "HUNTER") -- Piercing Shots
Debuff({ 3674 }, { buffType = "magic" }, "HUNTER") -- Black Arrow
Debuff({ 60210 }, { buffType = "magic" }, "HUNTER") -- Freezing Arrow effect
-------------
-- MAGE
-------------
Debuff({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306, 27070 }, { buffType = "magic"}, "MAGE") -- Fireball
Debuff({ 11366, 12505, 12522, 12523, 12524, 12525, 12526, 18809, 27132, 33938 }, { buffType = "magic" }, "MAGE") -- Pyroblast
Debuff({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306, 27070, 38692, 42832, 42833 }, { buffType = "magic"}, "MAGE") -- Fireball
Debuff({ 11366, 12505, 12522, 12523, 12524, 12525, 12526, 18809, 27132, 33938, 42890, 42891 }, { buffType = "magic" }, "MAGE") -- Pyroblast
Debuff({ 18469 }, { buffType = "magic" }, "MAGE") -- Imp CS Silence
Debuff({ 118, 12824, 12825, 12826 }, { buffType = "magic" }, "MAGE") -- Polymorph
Debuff({ 118, 12824, 12825, 12826, 61721, 61305, 61780 }, { buffType = "magic" }, "MAGE") -- Polymorph
Debuff({ 12355 } , { buffType = "physical" }, "MAGE") -- Impact
Debuff({ 12654 }, { buffType = "magic" }, "MAGE") -- Ignite
Debuff({ 22959 }, { buffType = "magic" }, "MAGE") -- Fire Vulnerability
Debuff({ 12579 }, { buffType = "magic" }, "MAGE") -- Winter's Chill
Debuff({ 11113, 13018, 13019, 13020, 13021, 27133, 33933 }, { buffType = "physical" }, "MAGE") -- Blast Wave
Debuff({ 11113, 13018, 13019, 13020, 13021, 27133, 33933, 42944, 42945 }, { buffType = "physical" }, "MAGE") -- Blast Wave
--Spell({ 2120, 2121, 8422, 8423, 10215, 10216, 27086 }, { stacking = true, buffType = "physical" }) -- Flamestrike
Debuff({ 120, 8492, 10159, 10160, 10161, 27087 }, { buffType = "magic" }, "MAGE") -- Cone of Cold
Debuff({ 120, 8492, 10159, 10160, 10161, 27087, 42930, 42931 }, { buffType = "magic" }, "MAGE") -- Cone of Cold
Debuff({ 12484, 12485, 12486 }, { .5 }) -- Improved Blizzard (Chilled)
Debuff({ 6136, 7321, 18101, 20005, 16927, 15850, 31257}, { buffType = "magic" }, "MAGE") -- Frost/Ice Armor (Chilled)
Debuff({ 116, 205, 837, 7322, 8406, 8407, 8408, 10179, 10180, 10181, 25304, 27071, 27072, 38697 }, { buffType = "magic" }, "MAGE") -- Frostbolt
Debuff({ 116, 205, 837, 7322, 8406, 8407, 8408, 10179, 10180, 10181, 25304, 27071, 27072, 38697, 42841, 42842 }, { buffType = "magic" }, "MAGE") -- Frostbolt
Debuff({ 12494 }, { buffType = "magic" }, "MAGE") -- Frostbite
Debuff({ 122, 865, 6131, 10230 }, { buffType = "magic" }, "MAGE") -- Frost Nova
Debuff({ 122, 865, 6131, 10230, 27088, 42917 }, { buffType = "magic" }, "MAGE") -- Frost Nova
Debuff({ 31589 }, { buffType = "magic" }, "MAGE") -- Slow
Debuff({ 41425 }, { buffType = "immune" }, "MAGE") -- Hypothermia
Debuff({ 44572 }, { buffType = "magic" }, "MAGE") -- Deep Freeze
Debuff({ 55360 }, { buffType = "magic" }, "MAGE") -- Living Bomb
Debuff({ 64346 }, { buffType = "magic" }, "MAGE") -- Fiery Payback
Debuff({ 44614, 47610 }, { buffType = "magic" }, "MAGE") -- Frostfire Bolt
Debuff({ 31661, 33041, 33042, 33043, 42949, 42950 }, { buffType = "magic" }, "MAGE") -- Dragon's Breath
Debuff({ 36032 }, { }, "MAGE") -- Arcane Blast
Debuff({ 55080 }, { buffType = "magic" }, "MAGE") -- Shattered Barrier
-------------
-- Death Knight
-------------
Debuff({ 55095 }, { buffType = "disease" }, "DEATHKNIGHT") -- Frost Fever
Debuff({ 55078 }, { buffType = "disease" }, "DEATHKNIGHT") -- Blood Plague
Debuff({ 50510 }, { buffType = "disease" }, "DEATHKNIGHT") -- Crypt Fever
Debuff({ 51735 }, { buffType = "disease" }, "DEATHKNIGHT") -- Ebon Plague
Debuff({ 50536 }, { buffType = "physical" }, "DEATHKNIGHT") -- Unholy Blight
Debuff({ 51209 }, { buffType = "magic" }, "DEATHKNIGHT") -- Hungering Cold
Debuff({ 47476 }, { buffType = "magic" }, "DEATHKNIGHT") -- Strangulate
Debuff({ 43265, 49936, 49937, 49938 }, { buffType = "physical" }, "DEATHKNIGHT") -- Death and decay
Debuff({ 45524 }, { buffType = "magic" }, "DEATHKNIGHT") -- Chains of Ice
Debuff({ 66803 }, { buffType = "physical" }, "DEATHKNIGHT") -- Desecration
Debuff({ 50436 }, { buffType = "physical" }, "DEATHKNIGHT") -- Icy Clutch
Debuff({ 49005 }, { buffType = "physical" }, "DEATHKNIGHT") -- Mark of Blood

View File

@ -9,20 +9,31 @@ LibClassAuras.buffs = {}
LibClassAuras.buffToId = {}
LibClassAuras.altNames = {}
LibClassAuras.gameExpansion = ({
[WOW_PROJECT_MAINLINE] = "retail",
[WOW_PROJECT_CLASSIC] = "classic",
[WOW_PROJECT_BURNING_CRUSADE_CLASSIC or 5] = "tbc"
})[WOW_PROJECT_ID]
local function Spell(id, opts, class, spellTable, idTable)
if not opts or not class then
return
end
local lastRankID
local spellName
if type(id) == "table" then
local clones = id
lastRankID = clones[#clones]
local realIds = {}
for i = 1, #id do
if GetSpellInfo(id[i]) then
tinsert(realIds, id[i])
spellName = GetSpellInfo(id[i])
end
end
id = realIds
else
lastRankID = id
spellName = GetSpellInfo(id)
end
local spellName = GetSpellInfo(lastRankID)
if not spellName then
return
end

View File

@ -0,0 +1,711 @@
--[[
This library contains work of Hendrick "nevcairiel" Leppkes
https://www.wowace.com/projects/libbuttonglow-1-0
]]
-- luacheck: globals CreateFromMixins ObjectPoolMixin CreateTexturePool CreateFramePool
local MAJOR_VERSION = "LibCustomGlow-1.0"
local MINOR_VERSION = 16
if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
if not lib then return end
local Masque = LibStub("Masque", true)
local isRetail = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
local textureList = {
empty = [[Interface\AdventureMap\BrokenIsles\AM_29]],
white = [[Interface\BUTTONS\WHITE8X8]],
shine = [[Interface\ItemSocketingFrame\UI-ItemSockets]]
}
local shineCoords = {0.3984375, 0.4453125, 0.40234375, 0.44921875}
if isRetail then
textureList.shine = [[Interface\Artifacts\Artifacts]]
shineCoords = {0.8115234375,0.9169921875,0.8798828125,0.9853515625}
end
function lib.RegisterTextures(texture,id)
textureList[id] = texture
end
lib.glowList = {}
lib.startList = {}
lib.stopList = {}
local GlowParent = UIParent
local GlowMaskPool = CreateFromMixins(ObjectPoolMixin)
lib.GlowMaskPool = GlowMaskPool
local function MaskPoolFactory(maskPool)
return maskPool.parent:CreateMaskTexture()
end
local MaskPoolResetter = function(maskPool,mask)
mask:Hide()
mask:ClearAllPoints()
end
ObjectPoolMixin.OnLoad(GlowMaskPool,MaskPoolFactory,MaskPoolResetter)
GlowMaskPool.parent = GlowParent
local TexPoolResetter = function(pool,tex)
local maskNum = tex:GetNumMaskTextures()
for i = maskNum,1 do
tex:RemoveMaskTexture(tex:GetMaskTexture(i))
end
tex:Hide()
tex:ClearAllPoints()
end
local GlowTexPool = CreateTexturePool(GlowParent ,"ARTWORK",7,nil,TexPoolResetter)
lib.GlowTexPool = GlowTexPool
local FramePoolResetter = function(framePool,frame)
frame:SetScript("OnUpdate",nil)
local parent = frame:GetParent()
if parent[frame.name] then
parent[frame.name] = nil
end
if frame.textures then
for _, texture in pairs(frame.textures) do
GlowTexPool:Release(texture)
end
end
if frame.bg then
GlowTexPool:Release(frame.bg)
frame.bg = nil
end
if frame.masks then
for _,mask in pairs(frame.masks) do
GlowMaskPool:Release(mask)
end
frame.masks = nil
end
frame.textures = {}
frame.info = {}
frame.name = nil
frame.timer = nil
frame:Hide()
frame:ClearAllPoints()
end
local GlowFramePool = CreateFramePool("Frame",GlowParent,nil,FramePoolResetter)
lib.GlowFramePool = GlowFramePool
local function addFrameAndTex(r,color,name,key,N,xOffset,yOffset,texture,texCoord,desaturated,frameLevel)
key = key or ""
frameLevel = frameLevel or 8
if not r[name..key] then
r[name..key] = GlowFramePool:Acquire()
r[name..key]:SetParent(r)
r[name..key].name = name..key
end
local f = r[name..key]
f:SetFrameLevel(r:GetFrameLevel()+frameLevel)
f:SetPoint("TOPLEFT",r,"TOPLEFT",-xOffset+0.05,yOffset+0.05)
f:SetPoint("BOTTOMRIGHT",r,"BOTTOMRIGHT",xOffset,-yOffset+0.05)
f:Show()
if not f.textures then
f.textures = {}
end
for i=1,N do
if not f.textures[i] then
f.textures[i] = GlowTexPool:Acquire()
f.textures[i]:SetTexture(texture)
f.textures[i]:SetTexCoord(texCoord[1],texCoord[2],texCoord[3],texCoord[4])
f.textures[i]:SetDesaturated(desaturated)
f.textures[i]:SetParent(f)
f.textures[i]:SetDrawLayer("ARTWORK",7)
if not isRetail and name == "_AutoCastGlow" then
f.textures[i]:SetBlendMode("ADD")
end
end
f.textures[i]:SetVertexColor(color[1],color[2],color[3],color[4])
f.textures[i]:Show()
end
while #f.textures>N do
GlowTexPool:Release(f.textures[#f.textures])
table.remove(f.textures)
end
end
--Pixel Glow Functions--
local pCalc1 = function(progress,s,th,p)
local c
if progress>p[3] or progress<p[0] then
c = 0
elseif progress>p[2] then
c =s-th-(progress-p[2])/(p[3]-p[2])*(s-th)
elseif progress>p[1] then
c =s-th
else
c = (progress-p[0])/(p[1]-p[0])*(s-th)
end
return math.floor(c+0.5)
end
local pCalc2 = function(progress,s,th,p)
local c
if progress>p[3] then
c = s-th-(progress-p[3])/(p[0]+1-p[3])*(s-th)
elseif progress>p[2] then
c = s-th
elseif progress>p[1] then
c = (progress-p[1])/(p[2]-p[1])*(s-th)
elseif progress>p[0] then
c = 0
else
c = s-th-(progress+1-p[3])/(p[0]+1-p[3])*(s-th)
end
return math.floor(c+0.5)
end
local pUpdate = function(self,elapsed)
self.timer = self.timer+elapsed/self.info.period
if self.timer>1 or self.timer <-1 then
self.timer = self.timer%1
end
local progress = self.timer
local width,height = self:GetSize()
if width ~= self.info.width or height ~= self.info.height then
local perimeter = 2*(width+height)
if not (perimeter>0) then
return
end
self.info.width = width
self.info.height = height
self.info.pTLx = {
[0] = (height+self.info.length/2)/perimeter,
[1] = (height+width+self.info.length/2)/perimeter,
[2] = (2*height+width-self.info.length/2)/perimeter,
[3] = 1-self.info.length/2/perimeter
}
self.info.pTLy ={
[0] = (height-self.info.length/2)/perimeter,
[1] = (height+width+self.info.length/2)/perimeter,
[2] = (height*2+width+self.info.length/2)/perimeter,
[3] = 1-self.info.length/2/perimeter
}
self.info.pBRx ={
[0] = self.info.length/2/perimeter,
[1] = (height-self.info.length/2)/perimeter,
[2] = (height+width-self.info.length/2)/perimeter,
[3] = (height*2+width+self.info.length/2)/perimeter
}
self.info.pBRy ={
[0] = self.info.length/2/perimeter,
[1] = (height+self.info.length/2)/perimeter,
[2] = (height+width-self.info.length/2)/perimeter,
[3] = (height*2+width-self.info.length/2)/perimeter
}
end
if self:IsShown() then
if not (self.masks[1]:IsShown()) then
self.masks[1]:Show()
self.masks[1]:SetPoint("TOPLEFT",self,"TOPLEFT",self.info.th,-self.info.th)
self.masks[1]:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",-self.info.th,self.info.th)
end
if self.masks[2] and not(self.masks[2]:IsShown()) then
self.masks[2]:Show()
self.masks[2]:SetPoint("TOPLEFT",self,"TOPLEFT",self.info.th+1,-self.info.th-1)
self.masks[2]:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",-self.info.th-1,self.info.th+1)
end
if self.bg and not(self.bg:IsShown()) then
self.bg:Show()
end
for k,line in pairs(self.textures) do
line:SetPoint("TOPLEFT",self,"TOPLEFT",pCalc1((progress+self.info.step*(k-1))%1,width,self.info.th,self.info.pTLx),-pCalc2((progress+self.info.step*(k-1))%1,height,self.info.th,self.info.pTLy))
line:SetPoint("BOTTOMRIGHT",self,"TOPLEFT",self.info.th+pCalc2((progress+self.info.step*(k-1))%1,width,self.info.th,self.info.pBRx),-height+pCalc1((progress+self.info.step*(k-1))%1,height,self.info.th,self.info.pBRy))
end
end
end
function lib.PixelGlow_Start(r,color,N,frequency,length,th,xOffset,yOffset,border,key,frameLevel)
if not r then
return
end
if not color then
color = {0.95,0.95,0.32,1}
end
if not(N and N>0) then
N = 8
end
local period
if frequency then
if not(frequency>0 or frequency<0) then
period = 4
else
period = 1/frequency
end
else
period = 4
end
local width,height = r:GetSize()
length = length or math.floor((width+height)*(2/N-0.1))
length = min(length,min(width,height))
th = th or 1
xOffset = xOffset or 0
yOffset = yOffset or 0
key = key or ""
addFrameAndTex(r,color,"_PixelGlow",key,N,xOffset,yOffset,textureList.white,{0,1,0,1},nil,frameLevel)
local f = r["_PixelGlow"..key]
if not f.masks then
f.masks = {}
end
if not f.masks[1] then
f.masks[1] = GlowMaskPool:Acquire()
f.masks[1]:SetTexture(textureList.empty, "CLAMPTOWHITE","CLAMPTOWHITE")
f.masks[1]:Show()
end
f.masks[1]:SetPoint("TOPLEFT",f,"TOPLEFT",th,-th)
f.masks[1]:SetPoint("BOTTOMRIGHT",f,"BOTTOMRIGHT",-th,th)
if not(border==false) then
if not f.masks[2] then
f.masks[2] = GlowMaskPool:Acquire()
f.masks[2]:SetTexture(textureList.empty, "CLAMPTOWHITE","CLAMPTOWHITE")
end
f.masks[2]:SetPoint("TOPLEFT",f,"TOPLEFT",th+1,-th-1)
f.masks[2]:SetPoint("BOTTOMRIGHT",f,"BOTTOMRIGHT",-th-1,th+1)
if not f.bg then
f.bg = GlowTexPool:Acquire()
f.bg:SetColorTexture(0.1,0.1,0.1,0.8)
f.bg:SetParent(f)
f.bg:SetAllPoints(f)
f.bg:SetDrawLayer("ARTWORK",6)
f.bg:AddMaskTexture(f.masks[2])
end
else
if f.bg then
GlowTexPool:Release(f.bg)
f.bg = nil
end
if f.masks[2] then
GlowMaskPool:Release(f.masks[2])
f.masks[2] = nil
end
end
for _,tex in pairs(f.textures) do
if tex:GetNumMaskTextures() < 1 then
tex:AddMaskTexture(f.masks[1])
end
end
f.timer = f.timer or 0
f.info = f.info or {}
f.info.step = 1/N
f.info.period = period
f.info.th = th
if f.info.length ~= length then
f.info.width = nil
f.info.length = length
end
pUpdate(f, 0)
f:SetScript("OnUpdate",pUpdate)
end
function lib.PixelGlow_Stop(r,key)
if not r then
return
end
key = key or ""
if not r["_PixelGlow"..key] then
return false
else
GlowFramePool:Release(r["_PixelGlow"..key])
end
end
table.insert(lib.glowList, "Pixel Glow")
lib.startList["Pixel Glow"] = lib.PixelGlow_Start
lib.stopList["Pixel Glow"] = lib.PixelGlow_Stop
--Autocast Glow Funcitons--
local function acUpdate(self,elapsed)
local width,height = self:GetSize()
if width ~= self.info.width or height ~= self.info.height then
if width*height == 0 then return end -- Avoid division by zero
self.info.width = width
self.info.height = height
self.info.perimeter = 2*(width+height)
self.info.bottomlim = height*2+width
self.info.rightlim = height+width
self.info.space = self.info.perimeter/self.info.N
end
local texIndex = 0;
for k=1,4 do
self.timer[k] = self.timer[k]+elapsed/(self.info.period*k)
if self.timer[k] > 1 or self.timer[k] <-1 then
self.timer[k] = self.timer[k]%1
end
for i = 1,self.info.N do
texIndex = texIndex+1
local position = (self.info.space*i+self.info.perimeter*self.timer[k])%self.info.perimeter
if position>self.info.bottomlim then
self.textures[texIndex]: SetPoint("CENTER",self,"BOTTOMRIGHT",-position+self.info.bottomlim,0)
elseif position>self.info.rightlim then
self.textures[texIndex]: SetPoint("CENTER",self,"TOPRIGHT",0,-position+self.info.rightlim)
elseif position>self.info.height then
self.textures[texIndex]: SetPoint("CENTER",self,"TOPLEFT",position-self.info.height,0)
else
self.textures[texIndex]: SetPoint("CENTER",self,"BOTTOMLEFT",0,position)
end
end
end
end
function lib.AutoCastGlow_Start(r,color,N,frequency,scale,xOffset,yOffset,key,frameLevel)
if not r then
return
end
if not color then
color = {0.95,0.95,0.32,1}
end
if not(N and N>0) then
N = 4
end
local period
if frequency then
if not(frequency>0 or frequency<0) then
period = 8
else
period = 1/frequency
end
else
period = 8
end
scale = scale or 1
xOffset = xOffset or 0
yOffset = yOffset or 0
key = key or ""
addFrameAndTex(r,color,"_AutoCastGlow",key,N*4,xOffset,yOffset,textureList.shine,shineCoords, true, frameLevel)
local f = r["_AutoCastGlow"..key]
local sizes = {7,6,5,4}
for k,size in pairs(sizes) do
for i = 1,N do
f.textures[i+N*(k-1)]:SetSize(size*scale,size*scale)
end
end
f.timer = f.timer or {0,0,0,0}
f.info = f.info or {}
f.info.N = N
f.info.period = period
f:SetScript("OnUpdate",acUpdate)
end
function lib.AutoCastGlow_Stop(r,key)
if not r then
return
end
key = key or ""
if not r["_AutoCastGlow"..key] then
return false
else
GlowFramePool:Release(r["_AutoCastGlow"..key])
end
end
table.insert(lib.glowList, "Autocast Shine")
lib.startList["Autocast Shine"] = lib.AutoCastGlow_Start
lib.stopList["Autocast Shine"] = lib.AutoCastGlow_Stop
--Action Button Glow--
local function ButtonGlowResetter(framePool,frame)
frame:SetScript("OnUpdate",nil)
local parent = frame:GetParent()
if parent._ButtonGlow then
parent._ButtonGlow = nil
end
frame:Hide()
frame:ClearAllPoints()
end
local ButtonGlowPool = CreateFramePool("Frame",GlowParent,nil,ButtonGlowResetter)
lib.ButtonGlowPool = ButtonGlowPool
local function CreateScaleAnim(group, target, order, duration, x, y, delay)
local scale = group:CreateAnimation("Scale")
scale:SetChildKey(target)
scale:SetOrder(order)
scale:SetDuration(duration)
scale:SetScale(x, y)
if delay then
scale:SetStartDelay(delay)
end
end
local function CreateAlphaAnim(group, target, order, duration, fromAlpha, toAlpha, delay, appear)
local alpha = group:CreateAnimation("Alpha")
alpha:SetChildKey(target)
alpha:SetOrder(order)
alpha:SetDuration(duration)
alpha:SetFromAlpha(fromAlpha)
alpha:SetToAlpha(toAlpha)
if delay then
alpha:SetStartDelay(delay)
end
if appear then
table.insert(group.appear, alpha)
else
table.insert(group.fade, alpha)
end
end
local function AnimIn_OnPlay(group)
local frame = group:GetParent()
local frameWidth, frameHeight = frame:GetSize()
frame.spark:SetSize(frameWidth, frameHeight)
frame.spark:SetAlpha(not(frame.color) and 1.0 or 0.3*frame.color[4])
frame.innerGlow:SetSize(frameWidth / 2, frameHeight / 2)
frame.innerGlow:SetAlpha(not(frame.color) and 1.0 or frame.color[4])
frame.innerGlowOver:SetAlpha(not(frame.color) and 1.0 or frame.color[4])
frame.outerGlow:SetSize(frameWidth * 2, frameHeight * 2)
frame.outerGlow:SetAlpha(not(frame.color) and 1.0 or frame.color[4])
frame.outerGlowOver:SetAlpha(not(frame.color) and 1.0 or frame.color[4])
frame.ants:SetSize(frameWidth * 0.85, frameHeight * 0.85)
frame.ants:SetAlpha(0)
frame:Show()
end
local function AnimIn_OnFinished(group)
local frame = group:GetParent()
local frameWidth, frameHeight = frame:GetSize()
frame.spark:SetAlpha(0)
frame.innerGlow:SetAlpha(0)
frame.innerGlow:SetSize(frameWidth, frameHeight)
frame.innerGlowOver:SetAlpha(0.0)
frame.outerGlow:SetSize(frameWidth, frameHeight)
frame.outerGlowOver:SetAlpha(0.0)
frame.outerGlowOver:SetSize(frameWidth, frameHeight)
frame.ants:SetAlpha(not(frame.color) and 1.0 or frame.color[4])
end
local function AnimIn_OnStop(group)
local frame = group:GetParent()
local frameWidth, frameHeight = frame:GetSize()
frame.spark:SetAlpha(0)
frame.innerGlow:SetAlpha(0)
frame.innerGlowOver:SetAlpha(0.0)
frame.outerGlowOver:SetAlpha(0.0)
end
local function bgHide(self)
if self.animOut:IsPlaying() then
self.animOut:Stop()
ButtonGlowPool:Release(self)
end
end
local function bgUpdate(self, elapsed)
AnimateTexCoords(self.ants, 256, 256, 48, 48, 22, elapsed, self.throttle);
local cooldown = self:GetParent().cooldown;
if(cooldown and cooldown:IsShown() and cooldown:GetCooldownDuration() > 3000) then
self:SetAlpha(0.5);
else
self:SetAlpha(1.0);
end
end
local function configureButtonGlow(f,alpha)
f.spark = f:CreateTexture(nil, "BACKGROUND")
f.spark:SetPoint("CENTER")
f.spark:SetAlpha(0)
f.spark:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
f.spark:SetTexCoord(0.00781250, 0.61718750, 0.00390625, 0.26953125)
-- inner glow
f.innerGlow = f:CreateTexture(nil, "ARTWORK")
f.innerGlow:SetPoint("CENTER")
f.innerGlow:SetAlpha(0)
f.innerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
f.innerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
-- inner glow over
f.innerGlowOver = f:CreateTexture(nil, "ARTWORK")
f.innerGlowOver:SetPoint("TOPLEFT", f.innerGlow, "TOPLEFT")
f.innerGlowOver:SetPoint("BOTTOMRIGHT", f.innerGlow, "BOTTOMRIGHT")
f.innerGlowOver:SetAlpha(0)
f.innerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
f.innerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
-- outer glow
f.outerGlow = f:CreateTexture(nil, "ARTWORK")
f.outerGlow:SetPoint("CENTER")
f.outerGlow:SetAlpha(0)
f.outerGlow:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
f.outerGlow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52734375)
-- outer glow over
f.outerGlowOver = f:CreateTexture(nil, "ARTWORK")
f.outerGlowOver:SetPoint("TOPLEFT", f.outerGlow, "TOPLEFT")
f.outerGlowOver:SetPoint("BOTTOMRIGHT", f.outerGlow, "BOTTOMRIGHT")
f.outerGlowOver:SetAlpha(0)
f.outerGlowOver:SetTexture([[Interface\SpellActivationOverlay\IconAlert]])
f.outerGlowOver:SetTexCoord(0.00781250, 0.50781250, 0.53515625, 0.78515625)
-- ants
f.ants = f:CreateTexture(nil, "OVERLAY")
f.ants:SetPoint("CENTER")
f.ants:SetAlpha(0)
f.ants:SetTexture([[Interface\SpellActivationOverlay\IconAlertAnts]])
f.animIn = f:CreateAnimationGroup()
f.animIn.appear = {}
f.animIn.fade = {}
CreateScaleAnim(f.animIn, "spark", 1, 0.2, 1.5, 1.5)
CreateAlphaAnim(f.animIn, "spark", 1, 0.2, 0, alpha, nil, true)
CreateScaleAnim(f.animIn, "innerGlow", 1, 0.3, 2, 2)
CreateScaleAnim(f.animIn, "innerGlowOver", 1, 0.3, 2, 2)
CreateAlphaAnim(f.animIn, "innerGlowOver", 1, 0.3, alpha, 0, nil, false)
CreateScaleAnim(f.animIn, "outerGlow", 1, 0.3, 0.5, 0.5)
CreateScaleAnim(f.animIn, "outerGlowOver", 1, 0.3, 0.5, 0.5)
CreateAlphaAnim(f.animIn, "outerGlowOver", 1, 0.3, alpha, 0, nil, false)
CreateScaleAnim(f.animIn, "spark", 1, 0.2, 2/3, 2/3, 0.2)
CreateAlphaAnim(f.animIn, "spark", 1, 0.2, alpha, 0, 0.2, false)
CreateAlphaAnim(f.animIn, "innerGlow", 1, 0.2, alpha, 0, 0.3, false)
CreateAlphaAnim(f.animIn, "ants", 1, 0.2, 0, alpha, 0.3, true)
f.animIn:SetScript("OnPlay", AnimIn_OnPlay)
f.animIn:SetScript("OnStop", AnimIn_OnStop)
f.animIn:SetScript("OnFinished", AnimIn_OnFinished)
f.animOut = f:CreateAnimationGroup()
f.animOut.appear = {}
f.animOut.fade = {}
CreateAlphaAnim(f.animOut, "outerGlowOver", 1, 0.2, 0, alpha, nil, true)
CreateAlphaAnim(f.animOut, "ants", 1, 0.2, alpha, 0, nil, false)
CreateAlphaAnim(f.animOut, "outerGlowOver", 2, 0.2, alpha, 0, nil, false)
CreateAlphaAnim(f.animOut, "outerGlow", 2, 0.2, alpha, 0, nil, false)
f.animOut:SetScript("OnFinished", function(self) ButtonGlowPool:Release(self:GetParent()) end)
f:SetScript("OnHide", bgHide)
end
local function updateAlphaAnim(f,alpha)
for _,anim in pairs(f.animIn.appear) do
anim:SetToAlpha(alpha)
end
for _,anim in pairs(f.animIn.fade) do
anim:SetFromAlpha(alpha)
end
for _,anim in pairs(f.animOut.appear) do
anim:SetToAlpha(alpha)
end
for _,anim in pairs(f.animOut.fade) do
anim:SetFromAlpha(alpha)
end
end
local ButtonGlowTextures = {["spark"] = true,["innerGlow"] = true,["innerGlowOver"] = true,["outerGlow"] = true,["outerGlowOver"] = true,["ants"] = true}
function lib.ButtonGlow_Start(r,color,frequency,frameLevel)
if not r then
return
end
frameLevel = frameLevel or 8;
local throttle
if frequency and frequency > 0 then
throttle = 0.25/frequency*0.01
else
throttle = 0.01
end
if r._ButtonGlow then
local f = r._ButtonGlow
local width,height = r:GetSize()
f:SetFrameLevel(r:GetFrameLevel()+frameLevel)
f:SetSize(width*1.4 , height*1.4)
f:SetPoint("TOPLEFT", r, "TOPLEFT", -width * 0.2, height * 0.2)
f:SetPoint("BOTTOMRIGHT", r, "BOTTOMRIGHT", width * 0.2, -height * 0.2)
f.ants:SetSize(width*1.4*0.85, height*1.4*0.85)
AnimIn_OnFinished(f.animIn)
if f.animOut:IsPlaying() then
f.animOut:Stop()
f.animIn:Play()
end
if not(color) then
for texture in pairs(ButtonGlowTextures) do
f[texture]:SetDesaturated(nil)
f[texture]:SetVertexColor(1,1,1)
f[texture]:SetAlpha(f[texture]:GetAlpha()/(f.color and f.color[4] or 1))
updateAlphaAnim(f, 1)
end
f.color = false
else
for texture in pairs(ButtonGlowTextures) do
f[texture]:SetDesaturated(1)
f[texture]:SetVertexColor(color[1],color[2],color[3])
f[texture]:SetAlpha(f[texture]:GetAlpha()/(f.color and f.color[4] or 1)*color[4])
updateAlphaAnim(f,color and color[4] or 1)
end
f.color = color
end
f.throttle = throttle
else
local f, new = ButtonGlowPool:Acquire()
if new then
configureButtonGlow(f,color and color[4] or 1)
else
updateAlphaAnim(f,color and color[4] or 1)
end
r._ButtonGlow = f
local width,height = r:GetSize()
f:SetParent(r)
f:SetFrameLevel(r:GetFrameLevel()+frameLevel)
f:SetSize(width * 1.4, height * 1.4)
f:SetPoint("TOPLEFT", r, "TOPLEFT", -width * 0.2, height * 0.2)
f:SetPoint("BOTTOMRIGHT", r, "BOTTOMRIGHT", width * 0.2, -height * 0.2)
if not(color) then
f.color = false
for texture in pairs(ButtonGlowTextures) do
f[texture]:SetDesaturated(nil)
f[texture]:SetVertexColor(1,1,1)
end
else
f.color = color
for texture in pairs(ButtonGlowTextures) do
f[texture]:SetDesaturated(1)
f[texture]:SetVertexColor(color[1],color[2],color[3])
end
end
f.throttle = throttle
f:SetScript("OnUpdate", bgUpdate)
f.animIn:Play()
if Masque and Masque.UpdateSpellAlert and (not r.overlay or not issecurevariable(r, "overlay")) then
local old_overlay = r.overlay
r.overlay = f
Masque:UpdateSpellAlert(r)
r.overlay = old_overlay
end
end
end
function lib.ButtonGlow_Stop(r)
if r._ButtonGlow then
if r._ButtonGlow.animIn:IsPlaying() then
r._ButtonGlow.animIn:Stop()
ButtonGlowPool:Release(r._ButtonGlow)
elseif r:IsVisible() then
r._ButtonGlow.animOut:Play()
else
ButtonGlowPool:Release(r._ButtonGlow)
end
end
end
table.insert(lib.glowList, "Action Button Glow")
lib.startList["Action Button Glow"] = lib.ButtonGlow_Start
lib.stopList["Action Button Glow"] = lib.ButtonGlow_Stop

View File

@ -0,0 +1,12 @@
## Interface: 80200
## Title: Lib: CustomGlow
## Notes: Creates custom glow functions
## Author: deezo
## X-Category: Library
## X-License: BSD
## Version: f15e6de
## OptionalDeps: Masque
LibStub\LibStub.lua
LibCustomGlow-1.0.xml

View File

@ -1,4 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="DRData-1.0.lua"/>
<Script file = "LibCustomGlow-1.0.lua"/>
</Ui>

View File

@ -0,0 +1,51 @@
Adds functions:
`PixelGlow_Start(frame[, color[, N[, frequency[, length[, th[, xOffset[, yOffset[, border[ ,key]]]]]]]])`
Starts glow over target frame with set parameters:
- frame - target frame to set glowing;
- color - {r,g,b,a}, color of lines and opacity, from 0 to 1. Defaul value is {0.95, 0.95, 0.32, 1};
- N - number of lines. Defaul value is 8;
- frequency - frequency, set to negative to inverse direction of rotation. Default value is 0.25;
- length - length of lines. Default value depends on region size and number of lines;
- th - thickness of lines. Default value is 2;
- xOffset,yOffset - offset of glow relative to region border;
- border - set to true to create border under lines;
- key - key of glow, allows for multiple glows on one frame;
`PixelGlow_Stop(frame[, key])`
Stops glow with set key over target frame
`AutoCastGlow_Start(frame[, color[, N[, frequency[, scale[, xOffset[, yOffset[, key]]]]]]])`
Starts glow over target frame with set parameters:
- frame - target frame to set glowing;
- color - {r,g,b,a}, color of particles and opacity, from 0 to 1. Defaul value is {0.95, 0.95, 0.32, 1};
- N - number of particle groups. Each group contains 4 particles. Defaul value is 4;
- frequency - frequency, set to negative to inverse direction of rotation. Default value is 0.125;
- scale - scale of particles;
- xOffset,yOffset - offset of glow relative to region border;
- key - key of glow, allows for multiple glows on one frame;
`AutoCastGlow_Stop(frame[, key])`
Stops glow with set key over target frame
Blizzard glow is based heavily on https://www.wowace.com/projects/libbuttonglow-1-0
`ButtonGlow_Start(frame[, color[, frequency]]])`
Starts glow over target frame with set parameters:
- frame - target frame to set glowing;
- color - {r,g,b,a}, color of particles and opacity, from 0 to 1. Defaul value is {0.95, 0.95, 0.32, 1};
- frequency - frequency. Default value is 0.125;
- frameLevel - frameLevel. Default value is 8;
`ButtonGlow_Stop(frame)`
Stops glow over target frame

View File

@ -16,7 +16,7 @@ local UnitName = UnitName
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local Announcements = Gladdy:NewModule("Announcements", nil, {
local Announcements = Gladdy:NewModule("Announcements", 101, {
announcements = {
drinks = true,
resurrections = true,
@ -42,18 +42,20 @@ function Announcements:Initialize()
[GetSpellInfo(20777)] = true,
}
self:RegisterMessage("CAST_START")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_HEALTH")
self:RegisterMessage("TRINKET_USED")
self:RegisterMessage("TRINKET_READY")
self:RegisterMessage("SHADOWSIGHT")
self:RegisterMessage("SPELL_INTERRUPT")
self:RegisterMessage("JOINED_ARENA")
end
function Announcements:Reset()
self:UnregisterAllMessages()
self:UnregisterMessages(
"CAST_START",
"ENEMY_SPOTTED",
"UNIT_SPEC",
"AURA_GAIN",
"UNIT_HEALTH",
"TRINKET_USED",
"TRINKET_READY",
"SHADOWSIGHT",
"SPELL_INTERRUPT")
self.enemy = {}
self.throttled = {}
end
@ -63,17 +65,25 @@ function Announcements:Test(unit)
if (not button) then
return
end
if (unit == "arena1") then
self:UNIT_SPEC(unit, button.testSpec)
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)
self:JOINED_ARENA()
if unit == "arena1" then
self:AURA_GAIN(unit, nil, nil, self.DRINK_AURA)
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)
local button = Gladdy.buttons[unit]
if (not button or not Gladdy.db.announcements.resurrections) then
@ -81,7 +91,7 @@ function Announcements:CAST_START(unit, spell)
end
if (self.RES_SPELLS[spell]) then
self:Send(L["RESURRECTING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
self:Send(L["RESURRECTING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class], unit)
end
end
@ -95,7 +105,7 @@ function Announcements:ENEMY_SPOTTED(unit)
if button.name == "Unknown" then
button.name = UnitName(unit)
end
self:Send("ENEMY SPOTTED:" .. ("%s (%s)"):format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
self:Send("ENEMY SPOTTED:" .. ("%s (%s)"):format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class], unit)
self.enemy[unit] = true
end
end
@ -108,7 +118,7 @@ function Announcements:UNIT_SPEC(unit, spec)
if button.name == "Unknown" then
button.name = UnitName(unit)
end
self:Send(L["SPEC DETECTED: %s - %s (%s)"]:format(button.name, spec, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
self:Send(L["SPEC DETECTED: %s - %s (%s)"]:format(button.name, spec, button.classLoc), 1, RAID_CLASS_COLORS[button.class], unit)
end
function Announcements:UNIT_HEALTH(unit, health, healthMax)
@ -119,7 +129,7 @@ function Announcements:UNIT_HEALTH(unit, health, healthMax)
local healthPercent = floor(health * 100 / healthMax)
if (healthPercent < Gladdy.db.announcements.healthThreshold) then
self:Send(L["LOW HEALTH: %s (%s)"]:format(button.name, button.classLoc), 10, RAID_CLASS_COLORS[button.class])
self:Send(L["LOW HEALTH: %s (%s)"]:format(button.name, button.classLoc), 10, RAID_CLASS_COLORS[button.class], unit)
end
end
@ -129,7 +139,7 @@ function Announcements:TRINKET_USED(unit)
return
end
self:Send(L["TRINKET USED: %s (%s)"]:format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
self:Send(L["TRINKET USED: %s (%s)"]:format(button.name, button.classLoc), 1, RAID_CLASS_COLORS[button.class], unit)
end
function Announcements:TRINKET_READY(unit)
@ -138,25 +148,25 @@ function Announcements:TRINKET_READY(unit)
return
end
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), 1, RAID_CLASS_COLORS[button.class], unit)
end
function Announcements:SPELL_INTERRUPT(destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
local button = Gladdy.buttons[destUnit]
function Announcements:SPELL_INTERRUPT(unit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
local button = Gladdy.buttons[unit]
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])
self:Send(L["INTERRUPTED: %s (%s)"]:format(extraSpellName, button.name or ""), nil, RAID_CLASS_COLORS[button.class], unit)
end
function Announcements:CheckDrink(unit, aura)
function Announcements:AURA_GAIN(unit, auraType, spellID, spellName)
local button = Gladdy.buttons[unit]
if (not button or not Gladdy.db.announcements.drinks) then
return
end
if (aura == self.DRINK_AURA) then
self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
if (spellName == self.DRINK_AURA) then
self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class], unit)
end
end
@ -164,16 +174,17 @@ function Announcements:SHADOWSIGHT(msg)
self:Send(msg, 2)
end
function Announcements:Send(msg, throttle, color)
function Announcements:Send(msg, throttle, color, unit)
if (throttle and throttle > 0) then
if (not self.throttled[msg]) then
self.throttled[msg] = GetTime() + throttle
Gladdy:Debug("INFO", msg, "- NOT THROTTLED -", self.throttled[msg])
elseif (self.throttled[msg] < GetTime()) then
Gladdy:Debug("INFO", msg, "- THROTTLED OVER -", self.throttled[msg])
self.throttled[msg] = GetTime() + throttle
local throttledMsg = unit and msg .. unit or msg
if (not self.throttled[throttledMsg]) then
self.throttled[throttledMsg] = GetTime() + throttle
Gladdy:Debug("INFO", throttledMsg, "- NOT THROTTLED -", self.throttled[throttledMsg])
elseif (self.throttled[throttledMsg] < GetTime()) then
Gladdy:Debug("INFO", throttledMsg, "- THROTTLED OVER -", self.throttled[throttledMsg])
self.throttled[throttledMsg] = GetTime() + throttle
else
Gladdy:Debug("INFO", msg, "- THROTTLED -", self.throttled[msg])
Gladdy:Debug("INFO", throttledMsg, "- THROTTLED -", self.throttled[throttledMsg])
return
end
end

View File

@ -1,6 +1,5 @@
local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs
local str_find, pairs = string.find, pairs
local CreateFrame = CreateFrame
local GetTime = GetTime
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
@ -17,121 +16,55 @@ end
function ACDFrame:Initialize()
self.locale = Gladdy:GetArenaTimer()
self.hidden = false
self.countdown = -1
self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\";
local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent)
ACDNumFrame:EnableMouse(false)
ACDNumFrame:SetHeight(512)
ACDNumFrame:SetWidth(512)
ACDNumFrame:SetPoint("CENTER", 0, 256)
ACDNumFrame:Show()
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")
ACDNumTens:SetWidth(256)
ACDNumTens:SetHeight(256)
ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -50, 0)
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")
ACDNumOnes:SetWidth(256)
ACDNumOnes:SetHeight(256)
ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", 50, 0)
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")
ACDNumOne:SetWidth(256)
ACDNumOne:SetHeight(256)
ACDNumOne:SetPoint("CENTER", ACDNumFrame, "CENTER", 0, 0)
self.ACDNumOne = ACDNumOne
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
if Gladdy.db.countdown then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
end
self.faction = UnitFactionGroup("player")
self:SetScript("OnEvent", ACDFrame.OnEvent)
end
function ACDFrame:UpdateFrameOnce()
if Gladdy.db.countdown then
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)
end
function ACDFrame.OnUpdate(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 (str_len(str) == 2) then
-- Display has 2 digits
self.ACDNumOne:Hide();
self.ACDNumTens:Show();
self.ACDNumOnes:Show();
self.ACDNumTens:SetTexture(self.texturePath .. str_sub(str, 0, 1));
self.ACDNumOnes:SetTexture(self.texturePath .. str_sub(str, 2, 2));
self.ACDNumFrame:SetScale(0.7)
elseif (str_len(str) == 1) then
-- Display has 1 digit
local numStr = str_sub(str, 0, 1)
local path = numStr == "0" and self.faction or numStr
self.ACDNumOne:Show();
self.ACDNumOne:SetTexture(self.texturePath .. path);
self.ACDNumOnes:Hide();
self.ACDNumTens:Hide();
self.ACDNumFrame:SetScale(1.0)
end
end
self.countdown = self.countdown - elapse;
else
self.hidden = true;
self.ACDNumTens:Hide();
self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
end
if (GetTime() > self.endTime) then
self:SetScript("OnUpdate", nil)
end
end
function ACDFrame:JOINED_ARENA()
if Gladdy.db.countdown then
self.ACDNumFrame:Show()
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
function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
for k,v in pairs(self.locale) do
if str_find(msg, v) then
if k == 0 then
ACDFrame:Reset()
else
self.countdown = k
end
end
end
end
function ACDFrame:UpdateFrame()
self.ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetPoint("CENTER", 0, 128)
@ -149,21 +82,97 @@ function ACDFrame:UpdateFrame()
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
end
function ACDFrame:Test()
self.countdown = 30
self:JOINED_ARENA()
function ACDFrame:HideAll()
self.ACDNumFrame:Hide()
self.ACDNumTens:Hide()
self.ACDNumOnes:Hide()
self.ACDNumOne:Hide()
end
function ACDFrame:CreateTicker(countdown)
self.countdown = countdown
if self.ticker and not self.ticker:IsCancelled() then
self.ticker:Cancel()
end
self.ticker = C_Timer.NewTicker(1, ACDFrame.Ticker)
end
function ACDFrame.Ticker()
local self = ACDFrame
if (Gladdy.db.countdown) then
self.ACDNumFrame:Show()
if (self.countdown and self.countdown >= 10 and self.countdown <= 60) then
-- Display has 2 digits
local ones = self.countdown % 10
local tens = (self.countdown / 10) % 10
self.ACDNumOne:Hide()
self.ACDNumTens:Show()
self.ACDNumOnes:Show()
self.ACDNumTens:SetTexture(self.texturePath .. tens)
self.ACDNumOnes:SetTexture(self.texturePath .. ones)
self.ACDNumFrame:SetScale(0.7)
elseif (self.countdown and self.countdown < 10 and self.countdown > -1) then
-- Display has 1 digit
local path = self.countdown <= 0 and self.faction or self.countdown
self.ACDNumOne:Show()
self.ACDNumOne:SetTexture(self.texturePath .. path)
self.ACDNumOnes:Hide()
self.ACDNumTens:Hide()
self.ACDNumFrame:SetScale(1.0)
else
ACDFrame:HideAll()
if (self.countdown and self.countdown < -1) then
self.ticker:Cancel()
end
end
self.countdown = self.countdown and self.countdown - 1
else
ACDFrame:HideAll()
end
end
function ACDFrame:JOINED_ARENA()
if Gladdy.db.countdown then
self:CreateTicker(nil)
self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
end
end
function ACDFrame:Reset()
self.endTime = 0
self.countdown = 0
if self.ticker and not self.ticker:IsCancelled() then
self.ticker:Cancel()
end
self.countdown = nil
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();
ACDFrame:HideAll()
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
function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
for k,v in pairs(self.locale) do
if str_find(msg, v) then
if self.countdown and self.countdown == 0 then
return
end
self.countdown = k
end
end
end
function ACDFrame:TestOnce()
self:CreateTicker(30)
end
function ACDFrame:GetOptions()
@ -188,6 +197,7 @@ function ACDFrame:GetOptions()
max = 512,
step = 16,
width = "full",
disabled = function() return not Gladdy.db.countdown end,
}),
headerAuraLevel = {
type = "header",
@ -200,6 +210,7 @@ function ACDFrame:GetOptions()
order = 6,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
disabled = function() return not Gladdy.db.countdown end,
}),
arenaCountdownFrameLevel = Gladdy:option({
type = "range",
@ -209,6 +220,7 @@ function ACDFrame:GetOptions()
step = 1,
order = 7,
width = "full",
disabled = function() return not Gladdy.db.countdown end,
}),
}
end

View File

@ -1,5 +1,5 @@
local pairs, ipairs, select, tinsert, tbl_sort, tostring, tonumber, rand = pairs, ipairs, select, tinsert, table.sort, tostring, tonumber, math.random
local str_gsub = string.gsub
local GetSpellInfo = GetSpellInfo
local GetSpellDescription = GetSpellDescription
local CreateFrame, GetTime = CreateFrame, GetTime
@ -47,15 +47,21 @@ local Auras = Gladdy:NewModule("Auras", nil, {
auraYOffset = 0,
auraSize = 60 + 20 + 1,
auraWidthFactor = 0.9,
auraIconZoomed = false,
auraInterruptDetached = false,
auraInterruptXOffset = 0,
auraInterruptYOffset = 0,
auraInterruptSize = 60 + 20 + 1,
auraInterruptWidthFactor = 0.9,
auraInterruptIconZoomed = false,
auraFrameStrata = "MEDIUM",
auraFrameLevel = 5,
auraInterruptFrameStrata = "MEDIUM",
auraInterruptFrameLevel = 5,
auraGroup = false,
auraGroupDirection = "DOWN",
auraInterruptGroup = false,
auraInterruptGroupDirection = "DOWN",
})
function Auras:Initialize()
@ -97,6 +103,7 @@ function Auras:CreateFrame(unit)
auraFrame.icon = auraFrame.frame:CreateTexture(nil, "BACKGROUND")
auraFrame.icon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
auraFrame.icon:SetAllPoints(auraFrame)
auraFrame.icon.masked = true
auraFrame.icon.overlay = auraFrame.cooldownFrame:CreateTexture(nil, "OVERLAY")
auraFrame.icon.overlay:SetAllPoints(auraFrame)
@ -170,6 +177,7 @@ function Auras:CreateInterrupt(unit)
interruptFrame.icon = interruptFrame.frame:CreateTexture(nil, "BACKGROUND")
interruptFrame.icon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
interruptFrame.icon:SetAllPoints(interruptFrame.frame)
interruptFrame.icon.masked = true
interruptFrame.icon.overlay = interruptFrame.cooldownFrame:CreateTexture(nil, "OVERLAY")
interruptFrame.icon.overlay:SetAllPoints(interruptFrame.frame)
@ -239,6 +247,23 @@ function Auras:UpdateFrame(unit)
auraFrame:ClearAllPoints()
Gladdy:SetPosition(auraFrame, unit, "auraXOffset", "auraYOffset", true, Auras)
if (Gladdy.db.auraGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
self.frames[unit]:ClearAllPoints()
if Gladdy.db.auraGroupDirection == "RIGHT" then
self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
elseif Gladdy.db.auraGroupDirection == "LEFT" then
self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
elseif Gladdy.db.auraGroupDirection == "UP" then
self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
elseif Gladdy.db.auraGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end
end
if (unit == "arena1") then
Gladdy:CreateMover(auraFrame, "auraXOffset", "auraYOffset", L["Auras"],
{"TOPLEFT", "TOPLEFT"},
@ -266,6 +291,8 @@ function Auras:UpdateFrame(unit)
end
end
local testAgain = false
auraFrame:SetWidth(width)
auraFrame:SetHeight(height)
auraFrame.frame:SetWidth(height)
@ -275,8 +302,13 @@ function Auras:UpdateFrame(unit)
auraFrame.cooldown:ClearAllPoints()
auraFrame.cooldown:SetPoint("CENTER", auraFrame, "CENTER")
auraFrame.cooldown:SetWidth(width - width/16)
auraFrame.cooldown:SetHeight(height - height/16)
if Gladdy.db.auraIconZoomed then
auraFrame.cooldown:SetWidth(width)
auraFrame.cooldown:SetHeight(height)
else
auraFrame.cooldown:SetWidth(width - width/16)
auraFrame.cooldown:SetHeight(height - height/16)
end
auraFrame.cooldown:SetAlpha(Gladdy.db.auraCooldownAlpha)
auraFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE")
@ -296,7 +328,31 @@ function Auras:UpdateFrame(unit)
if Gladdy.db.auraDisableCircle then
auraFrame.cooldown:SetAlpha(0)
end
self:UpdateInterruptFrame(unit)
if Gladdy.db.auraIconZoomed then
if auraFrame.icon.masked then
auraFrame.icon:SetMask(nil)
auraFrame.icon:SetTexCoord(0.1,0.9,0.1,0.9)
auraFrame.icon.masked = nil
end
else
if not auraFrame.icon.masked then
auraFrame.icon:SetMask(nil)
auraFrame.icon:SetTexCoord(0,1,0,1)
auraFrame.icon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
auraFrame.icon.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
testAgain = testAgain or self:UpdateInterruptFrame(unit)
if testAgain then
Auras:ResetUnit(unit)
Auras:Test(unit)
end
end
function Auras:UpdateInterruptFrame(unit)
@ -321,6 +377,23 @@ function Auras:UpdateInterruptFrame(unit)
interruptFrame:ClearAllPoints()
Gladdy:SetPosition(interruptFrame, unit, "auraInterruptXOffset", "auraInterruptYOffset", true, Auras)
if (Gladdy.db.auraInterruptGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
self.frames[unit].interruptFrame:ClearAllPoints()
if Gladdy.db.auraInterruptGroupDirection == "RIGHT" then
self.frames[unit].interruptFrame:SetPoint("LEFT", self.frames[previousUnit].interruptFrame, "RIGHT", 0, 0)
elseif Gladdy.db.auraInterruptGroupDirection == "LEFT" then
self.frames[unit].interruptFrame:SetPoint("RIGHT", self.frames[previousUnit].interruptFrame, "LEFT", 0, 0)
elseif Gladdy.db.auraInterruptGroupDirection == "UP" then
self.frames[unit].interruptFrame:SetPoint("BOTTOM", self.frames[previousUnit].interruptFrame, "TOP", 0, 0)
elseif Gladdy.db.auraInterruptGroupDirection == "DOWN" then
self.frames[unit].interruptFrame:SetPoint("TOP", self.frames[previousUnit].interruptFrame, "BOTTOM", 0, 0)
end
end
end
if (unit == "arena1") then
Gladdy:CreateMover(interruptFrame, "auraInterruptXOffset", "auraInterruptYOffset", L["Interrupts"],
{"TOPLEFT", "TOPLEFT"},
@ -367,6 +440,8 @@ function Auras:UpdateInterruptFrame(unit)
end
end
local testAgain = false
interruptFrame:SetWidth(width)
interruptFrame:SetHeight(height)
interruptFrame.frame:SetWidth(width)
@ -376,8 +451,14 @@ function Auras:UpdateInterruptFrame(unit)
interruptFrame.cooldown:ClearAllPoints()
interruptFrame.cooldown:SetPoint("CENTER", interruptFrame, "CENTER")
interruptFrame.cooldown:SetWidth(width - width/16)
interruptFrame.cooldown:SetHeight(height - height/16)
if Gladdy.db.auraInterruptIconZoomed then
interruptFrame.cooldown:SetWidth(width)
interruptFrame.cooldown:SetHeight(height)
else
interruptFrame.cooldown:SetWidth(width - width/16)
interruptFrame.cooldown:SetHeight(height - height/16)
end
interruptFrame.cooldown:SetAlpha(Gladdy.db.auraCooldownAlpha)
interruptFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE")
@ -395,6 +476,25 @@ function Auras:UpdateInterruptFrame(unit)
if Gladdy.db.auraDisableCircle then
interruptFrame.cooldown:SetAlpha(0)
end
if Gladdy.db.auraInterruptIconZoomed then
if interruptFrame.icon.masked then
interruptFrame.icon:SetMask(nil)
interruptFrame.icon:SetTexCoord(0.1,0.9,0.1,0.9)
interruptFrame.icon.masked = nil
end
else
if not interruptFrame.icon.masked then
interruptFrame.icon:SetMask(nil)
interruptFrame.icon:SetTexCoord(0,1,0,1)
interruptFrame.icon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
interruptFrame.icon.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
return testAgain
end
function Auras:ResetUnit(unit)
@ -445,12 +545,13 @@ function Auras:Test(unit)
if Gladdy.exceptionNames[spellid] then
spellName = Gladdy.exceptionNames[spellid]
end
local duration = math.random(2,10)
if (unit == "arena2") then
if (v.value.track == AURA_TYPE_BUFF) then
self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration)
self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, duration, GetTime() + duration)
end
else
self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration)
self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, duration, GetTime() + duration)
end
end
-- /run LibStub("Gladdy").modules["Auras"]:Test("arena1")
@ -472,7 +573,7 @@ function Auras:Test(unit)
local extraSpellSchool = spellSchools[rand(1, #spellSchools)]
spellid = tonumber(enabledInterrupts[rand(1, #enabledInterrupts)])
spellName = select(1, GetSpellInfo(spellid))
self:SPELL_INTERRUPT(unit,spellid, spellName, "physical", spellid, spellName, extraSpellSchool)
Gladdy:SendMessage("SPELL_INTERRUPT", unit,spellid, spellName, "physical", spellid, spellName, extraSpellSchool)
end
end
end
@ -503,7 +604,9 @@ function Auras:AURA_GAIN(unit, auraType, spellID, spellName, icon, duration, exp
return
end
-- don't use spellId from combatlog, in case of different spellrank
if not Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)] or not Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)].enabled then
if not Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)]
or not Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)].enabled
or Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)].track ~= auraType then
return
end
@ -682,10 +785,63 @@ function Auras:GetOptions()
name = L["Frame"],
order = 3,
args = {
groupOptions = {
type = "group",
name = L["Group"],
order = 4,
args = {
headerAuras = {
type = "header",
name = L["Auras"],
order = 1,
},
auraGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Auras"],
order = 2,
disabled = function() return not Gladdy.db.auraDetached end,
}),
auraGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 3,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function() return not Gladdy.db.auraGroup or not Gladdy.db.auraDetached end,
}),
headerInterrupts = {
type = "header",
name = L["Interrupts"],
order = 4,
},
auraInterruptGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Interrupts"],
order = 5,
disabled = function() return not Gladdy.db.auraInterruptDetached end,
}),
auraInterruptGroupDirection = 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.auraInterruptGroup or not Gladdy.db.auraInterruptDetached end,
}),
}
},
detachedAuraMode = {
type = "group",
name = L["Detached Aura"],
order = 4,
order = 5,
args = {
headerDetachedMode = {
type = "header",
@ -698,6 +854,21 @@ function Auras:GetOptions()
order = 2,
width = "full"
}),
headerIcon = {
type = "header",
name = L["Icon"],
order = 5,
},
auraIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
disabled = function()
return not Gladdy.db.auraDetached
end,
order = 6,
width = "full",
}),
headerAuraSize = {
type = "header",
name = L["Size"],
@ -789,7 +960,7 @@ function Auras:GetOptions()
detachedInterruptMode = {
type = "group",
name = L["Detached Interrupt"],
order = 5,
order = 6,
args = {
headerDetachedMode = {
type = "header",
@ -802,6 +973,21 @@ function Auras:GetOptions()
order = 2,
width = "full"
}),
headerIcon = {
type = "header",
name = L["Icon"],
order = 5,
},
auraInterruptIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
disabled = function()
return not Gladdy.db.auraInterruptDetached
end,
order = 6,
width = "full",
}),
headerAuraSize = {
type = "header",
name = L["Size"],
@ -890,10 +1076,29 @@ function Auras:GetOptions()
}),
}
},
icon = {
type = "group",
name = L["Icon"],
order = 1,
args = {
headerIcon = {
type = "header",
name = L["Icon"],
order = 1,
},
auraIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
},
},
cooldown = {
type = "group",
name = L["Cooldown"],
order = 1,
order = 2,
args = {
headerAuras = {
type = "header",
@ -936,7 +1141,7 @@ function Auras:GetOptions()
font = {
type = "group",
name = L["Font"],
order = 2,
order = 3,
args = {
headerAuras = {
type = "header",
@ -973,7 +1178,7 @@ function Auras:GetOptions()
border = {
type = "group",
name = L["Border"],
order = 3,
order = 4,
args = borderArgs
}
}

View File

@ -20,10 +20,12 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsAlpha = 1,
buffsIconSize = 30,
buffsWidthFactor = 1,
buffsIconZoomed = false,
buffsIconPadding = 1,
buffsBuffsAlpha = 1,
buffsBuffsIconSize = 30,
buffsBuffsWidthFactor = 1,
buffsBuffsIconZoomed = false,
buffsBuffsIconPadding = 1,
buffsDisableCircle = false,
buffsCooldownAlpha = 1,
@ -42,25 +44,30 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsBorderColorsEnabled = true,
trackedDebuffs = defaultTrackedDebuffs,
trackedBuffs = defaultTrackedBuffs,
buffsBorderColorCurse = Gladdy:GetAuraTypeColor()["curse"],
buffsBorderColorMagic = Gladdy:GetAuraTypeColor()["magic"],
buffsBorderColorPoison = Gladdy:GetAuraTypeColor()["poison"],
buffsBorderColorPhysical = Gladdy:GetAuraTypeColor()["none"],
buffsBorderColorImmune = Gladdy:GetAuraTypeColor()["immune"],
buffsBorderColorDisease = Gladdy:GetAuraTypeColor()["disease"],
buffsBorderColorForm = Gladdy:GetAuraTypeColor()["form"],
buffsBorderColorAura = Gladdy:GetAuraTypeColor()["aura"],
buffsBorderColorEnrage = Gladdy:GetDispelTypeColors()["enrage"],
buffsBorderColorCurse = Gladdy:GetDispelTypeColors()["curse"],
buffsBorderColorMagic = Gladdy:GetDispelTypeColors()["magic"],
buffsBorderColorPoison = Gladdy:GetDispelTypeColors()["poison"],
buffsBorderColorPhysical = Gladdy:GetDispelTypeColors()["none"],
buffsBorderColorImmune = Gladdy:GetDispelTypeColors()["immune"],
buffsBorderColorDisease = Gladdy:GetDispelTypeColors()["disease"],
buffsBorderColorForm = Gladdy:GetDispelTypeColors()["form"],
buffsBorderColorAura = Gladdy:GetDispelTypeColors()["aura"],
buffFrameStrata = "MEDIUM",
buffsFrameLevel = 9,
})
local spellSchoolToOptionValueTable
local function spellSchoolToOptionValue(spellSchool)
if Gladdy.db.buffsBorderColorsEnabled and spellSchool then
return spellSchoolToOptionValueTable[spellSchool].r,
spellSchoolToOptionValueTable[spellSchool].g,
spellSchoolToOptionValueTable[spellSchool].b,
spellSchoolToOptionValueTable[spellSchool].a
local dispelTypeToOptionValueTable
local function dispelTypeToOptionValue(dispelType)
if Gladdy.db.buffsBorderColorsEnabled then
dispelType = dispelType and lower(dispelType) or "physical"
if not dispelTypeToOptionValueTable[dispelType] then
dispelType = "physical"
end
return dispelTypeToOptionValueTable[dispelType].r,
dispelTypeToOptionValueTable[dispelType].g,
dispelTypeToOptionValueTable[dispelType].b,
dispelTypeToOptionValueTable[dispelType].a
else
return Gladdy:SetColor(Gladdy.db.buffsBorderColor)
end
@ -76,21 +83,28 @@ function BuffsDebuffs:Initialize()
self.icons = {}
self.trackedCC = {}
self.framePool = {}
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("UNIT_DESTROYED")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("AURA_FADE")
self:RegisterMessage("AURA_GAIN")
self:RegisterMessage("AURA_GAIN_LIMIT")
self:SetScript("OnEvent", BuffsDebuffs.OnEvent)
spellSchoolToOptionValueTable = {
curse = Gladdy.db.buffsBorderColorCurse,
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)
end
dispelTypeToOptionValueTable = {
none = Gladdy.db.buffsBorderColorPhysical,
magic = Gladdy.db.buffsBorderColorMagic,
curse = Gladdy.db.buffsBorderColorCurse,
disease = Gladdy.db.buffsBorderColorDisease,
poison = Gladdy.db.buffsBorderColorPoison,
stealth = Gladdy.db.buffsBorderColorPhysical,
invisibility = Gladdy.db.buffsBorderColorPhysical,
physical = Gladdy.db.buffsBorderColorPhysical,
immune = Gladdy.db.buffsBorderColorImmune,
disease = Gladdy.db.buffsBorderColorDisease,
form = Gladdy.db.buffsBorderColorForm,
enrage = Gladdy.db.buffsBorderColorEnrage,
}
end
@ -134,7 +148,7 @@ end
function BuffsDebuffs:Test(unit)
if Gladdy.db.buffsEnabled then
local spellSchools = { "physical", "magic", "curse", "poison", "disease", "immune" }
local dispelTypes = { "physical", "magic", "curse", "poison", "disease", "immune", "enrage"}
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF)
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF)
@ -146,7 +160,7 @@ function BuffsDebuffs:Test(unit)
break
end
if enabled then
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_DEBUFF, 15, 15, random(1,5), spellSchools[random(1,6)], select(3, GetSpellInfo(spellID)), i)
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_DEBUFF, 15, 15, random(1,5), dispelTypes[random(1,#dispelTypes)], select(3, GetSpellInfo(spellID)), i)
i = i + 1
end
end
@ -156,7 +170,7 @@ function BuffsDebuffs:Test(unit)
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)
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_BUFF, 15, 15, random(1,5), dispelTypes[random(1,#dispelTypes)], select(3, GetSpellInfo(spellID)), i)
i = i + 1
end
end
@ -193,7 +207,7 @@ function BuffsDebuffs:AURA_GAIN_LIMIT(unit, auraType, limit)
end
end
function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, duration, expirationTime, count, spellSchool)
function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, duration, expirationTime, count, dispelType)
if (not self.frames[unit] or not Gladdy.db.buffsEnabled) then
return
end
@ -224,7 +238,7 @@ function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, dur
auraFrame.numBuffs = auraFrame.numBuffs + 1
index = auraFrame.numBuffs
end
BuffsDebuffs:AddOrRefreshAura(unit,spellID, auraType, duration, expirationTime - GetTime(), count, spellSchool and lower(spellSchool) or "physical", texture, index)
BuffsDebuffs:AddOrRefreshAura(unit,spellID, auraType, duration, expirationTime - GetTime(), count, dispelType, texture, index)
end
end
@ -277,17 +291,60 @@ local function styleIcon(aura, auraType)
aura.cooldowncircle:SetAlpha(Gladdy.db.buffsCooldownAlpha)
end
local zoomedOption, testAgain
if auraType == AURA_TYPE_BUFF then
zoomedOption = Gladdy.db.buffsBuffsIconZoomed
else
zoomedOption = Gladdy.db.buffsIconZoomed
end
if zoomedOption then
if aura.texture.masked then
aura.texture:SetMask(nil)
aura.texture:SetTexCoord(0.1,0.9,0.1,0.9)
aura.texture.masked = nil
end
else
if not aura.texture.masked then
aura.texture:SetMask(nil)
aura.texture:SetTexCoord(0,1,0,1)
aura.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
aura.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
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:SetVertexColor(spellSchoolToOptionValue(aura.spellSchool))
aura.border:SetVertexColor(dispelTypeToOptionValue(aura.dispelType))
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.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, 1)
return testAgain
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
function BuffsDebuffs:UpdateFrame(unit)
@ -311,16 +368,23 @@ function BuffsDebuffs:UpdateFrame(unit)
0, 0, "buffsEnabled")
end
local testBuffsAgain, testDebuffsAgain
for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do
styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF)
testBuffsAgain = styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF)
end
for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do
styleIcon(self.frames[unit].auras[AURA_TYPE_DEBUFF][i], AURA_TYPE_DEBUFF)
testDebuffsAgain = styleIcon(self.frames[unit].auras[AURA_TYPE_DEBUFF][i], AURA_TYPE_DEBUFF)
end
for i=1, #self.framePool do
styleIcon(self.framePool[i])
end
self:UpdateAurasOnUnit(unit)
if Gladdy.frame.testing and (testBuffsAgain or testDebuffsAgain) then
self:ResetUnit(unit)
self:Test(unit)
end
end
---------------------------
@ -385,11 +449,12 @@ local function iconTimer(auraFrame, elapsed)
end
end
function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index)
local aura
if not self.frames[unit].auras[auraType][index] then
if #self.framePool > 0 then
aura = tremove(self.framePool, #self.framePool)
styleIcon(aura)
else
aura = CreateFrame("Frame")
aura:EnableMouse(false)
@ -397,6 +462,7 @@ function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stack
aura:SetFrameLevel(Gladdy.db.buffsFrameLevel)
aura.texture = aura:CreateTexture(nil, "BACKGROUND")
aura.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
aura.texture.masked = true
aura.texture:SetAllPoints(aura)
aura.cooldowncircle = CreateFrame("Cooldown", nil, aura, "CooldownFrameTemplate")
aura.cooldowncircle:SetFrameLevel(Gladdy.db.buffsFrameLevel + 1)
@ -438,12 +504,12 @@ function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stack
aura.spellID = spellID
aura.type = auraType
aura.unit = unit
aura.spellSchool = spellSchool
aura.border:SetVertexColor(spellSchoolToOptionValue(spellSchool))
aura.dispelType = dispelType
aura.border:SetVertexColor(dispelTypeToOptionValue(dispelType))
aura:Show()
end
function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index)
if self.frames[unit].auras[auraType][index] and self.frames[unit].auras[auraType][index].spellID == spellID then -- refresh
if duration == 0 then
self.frames[unit].auras[auraType][index].endtime = "undefined"
@ -459,7 +525,7 @@ function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLe
return
end
--add
self:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
self:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index)
self:UpdateAurasOnUnit(unit)
end
@ -485,12 +551,14 @@ function BuffsDebuffs:GetOptions()
name = L["Show CC"],
desc = L["Shows all debuffs, which are displayed on the ClassIcon as well"],
order = 4,
disabled = function() return not Gladdy.db.buffsEnabled end,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 5,
disabled = function() return not Gladdy.db.buffsEnabled end,
args = {
buffs = {
type = "group",
@ -499,14 +567,21 @@ function BuffsDebuffs:GetOptions()
args = {
size = {
type = "group",
name = L["Size & Padding"],
name = L["Icon"],
order = 1,
args = {
header = {
type = "header",
name = L["Size & Padding"],
order = 5,
name = L["Icon"],
order = 1,
},
buffsBuffsIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
buffsBuffsIconSize = Gladdy:option({
type = "range",
name = L["Icon Size"],
@ -609,14 +684,21 @@ function BuffsDebuffs:GetOptions()
args = {
size = {
type = "group",
name = L["Size & Padding"],
name = L["Icon"],
order = 1,
args = {
header = {
type = "header",
name = L["Size & Padding"],
order = 5,
name = L["Icon"],
order = 1,
},
buffsIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
buffsIconSize = Gladdy:option({
type = "range",
name = L["Icon Size"],
@ -882,6 +964,13 @@ function BuffsDebuffs:GetOptions()
order = 49,
hasAlpha = true,
}),
buffsBorderColorEnrage = Gladdy:colorOption({
type = "color",
name = L["Enrage"],
desc = L["Color of the border"],
order = 50,
hasAlpha = true,
}),
},
},
frameStrata = {
@ -919,6 +1008,7 @@ function BuffsDebuffs:GetOptions()
name = L["Debuff Lists"],
type = "group",
order = 11,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree",
args = select(1, Gladdy:GetAuras(AURA_TYPE_DEBUFF)),
set = function(info, state)
@ -934,6 +1024,7 @@ function BuffsDebuffs:GetOptions()
name = L["Buff Lists"],
type = "group",
order = 12,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree",
args = select(1, Gladdy:GetAuras(AURA_TYPE_BUFF)),
set = function(info, state)

View File

@ -23,8 +23,10 @@ local Castbar = Gladdy:NewModule("Cast Bar", 70, {
castBarHeight = 20,
castBarWidth = 160,
castBarIconSize = 22,
castBarIconZoomed = false,
castBarBorderSize = 8,
castBarFontSize = 12,
castBarFontOutline = false,
castBarTexture = "Smooth",
castBarIconStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
castBarBorderStyle = "Gladdy Tooltip round",
@ -48,8 +50,10 @@ local Castbar = Gladdy:NewModule("Cast Bar", 70, {
function Castbar:Initialize()
self.frames = {}
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA")
if Gladdy.db.castBarEnabled then
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA")
end
end
---------------------------
@ -101,10 +105,17 @@ function Castbar:CreateFrame(unit)
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.masked = true
castBar.icon.texture.overlay = castBar.icon:CreateTexture(nil, "BORDER")
castBar.icon.texture.overlay:SetAllPoints(castBar.icon.texture)
castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle)
castBar.shield = castBar.icon:CreateTexture(nil, "OVERLAY")
castBar.shield:SetTexture("Interface\\AddOns\\Gladdy\\Images\\castbar-shield")
castBar.shield:SetHeight(80)
castBar.shield:SetWidth(80)
castBar.shield:SetPoint("CENTER", castBar.icon, "CENTER", 0, -1.5)
castBar.icon:ClearAllPoints()
if (Gladdy.db.castBarIconPos == "LEFT") then
castBar.icon:SetPoint("RIGHT", castBar, "LEFT", -3, 0) -- Icon of castbar
@ -113,15 +124,15 @@ function Castbar:CreateFrame(unit)
end
castBar.spellText = castBar:CreateFontString(nil, "LOW")
castBar.spellText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize)
castBar.spellText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.spellText:SetShadowOffset(1, -1)
castBar.spellText:SetShadowColor(0, 0, 0, 1)
castBar.spellText:SetJustifyH("CENTER")
castBar.spellText:SetPoint("LEFT", 7, 0) -- Text of the spell
castBar.spellText:SetPoint("LEFT", 10, 0) -- Text of the spell
castBar.timeText = castBar:CreateFontString(nil, "LOW")
castBar.timeText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize)
castBar.timeText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.timeText:SetShadowOffset(1, -1)
castBar.timeText:SetShadowColor(0, 0, 0, 1)
@ -133,12 +144,23 @@ function Castbar:CreateFrame(unit)
self:ResetUnit(unit)
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)
local castBar = self.frames[unit]
if (not castBar) then
return
end
local testAgain = false
castBar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata)
@ -173,12 +195,27 @@ function Castbar:UpdateFrame(unit)
castBar.icon:SetWidth(Gladdy.db.castBarIconSize)
castBar.icon:SetHeight(Gladdy.db.castBarIconSize)
castBar.icon.texture:SetAllPoints(castBar.icon)
castBar.icon:ClearAllPoints()
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
if Gladdy.db.castBarIconZoomed then
if castBar.icon.texture.masked then
castBar.icon.texture:SetMask(nil)
castBar.icon.texture:SetTexCoord(0.1,0.9,0.1,0.9)
castBar.icon.texture.masked = nil
end
else
castBar.icon:Hide()
if not castBar.icon.texture.masked then
castBar.icon.texture:SetMask(nil)
castBar.icon.texture:SetTexCoord(0,1,0,1)
castBar.icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
castBar.icon.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
castBar.icon:ClearAllPoints()
castBar.shield:SetWidth(Gladdy.db.castBarIconSize * 3.2)
castBar.shield:SetHeight(Gladdy.db.castBarIconSize * 3.2)
local rightMargin = 0
local leftMargin = 0
@ -192,10 +229,10 @@ function Castbar:UpdateFrame(unit)
Gladdy:SetPosition(castBar, unit, "castBarXOffset", "castBarYOffset", Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin), Castbar)
castBar.spellText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize)
castBar.spellText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.timeText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize)
castBar.timeText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE")
castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor))
castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle)
@ -209,6 +246,16 @@ function Castbar:UpdateFrame(unit)
if not Gladdy.db.castBarEnabled then
self:CAST_STOP(unit)
end
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
if testAgain then
self:ResetUnit(unit)
self:Test(unit)
end
else
castBar.icon:Hide()
end
end
---------------------------
@ -268,7 +315,7 @@ end
Castbar.CastEventsFunc = {}
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, notInterruptible, spellId = UnitCastingInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:SetAlpha(0)
return
@ -364,7 +411,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_DELAYED"] = function(castBar, event, ...)
end
end
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, notInterruptible, spellId = UnitChannelInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:SetAlpha(0)
@ -402,7 +449,7 @@ function Castbar.OnEvent(self, event, ...)
Castbar.CastEventsFunc[event](self, event, ...)
end
function Castbar:CAST_START(unit, spell, icon, value, maxValue, test)
function Castbar:CAST_START(unit, spell, icon, value, maxValue, notInterruptible, test)
local castBar = self.frames[unit]
if (not castBar) then
return
@ -414,7 +461,12 @@ function Castbar:CAST_START(unit, spell, icon, value, maxValue, test)
castBar.channeling = test == "channel"
end
castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
if notInterruptible then
castBar.bar:SetStatusBarColor(.8,.8,.8,1)
else
castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
end
castBar.value = value
castBar.maxValue = maxValue
castBar.bar:SetMinMaxValues(0, maxValue)
@ -428,6 +480,11 @@ function Castbar:CAST_START(unit, spell, icon, value, maxValue, test)
if Gladdy.db.castBarSparkEnabled then
castBar.spark:Show()
end
if notInterruptible then
castBar.shield:Show()
else
castBar.shield:Hide()
end
castBar:SetAlpha(1)
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
@ -455,6 +512,7 @@ function Castbar:CAST_STOP(unit, ...)
castBar.backdrop:Hide()
castBar.spark:Hide()
castBar.icon:Hide()
castBar.shield:Hide()
else
castBar.bar:SetStatusBarColor(...)
end
@ -529,7 +587,8 @@ function Castbar:Test(unit)
end
if (spell) then
self:CAST_START(unit, spell, icon, value, maxValue, event)
local nonInterruptable = unit == "arena1" and Gladdy.expansion == "Wrath"
self:CAST_START(unit, spell, icon, value, maxValue, nonInterruptable, event)
end
else
self:CAST_STOP(unit)
@ -584,6 +643,7 @@ function Castbar:GetOptions()
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.castBarEnabled end,
args = {
barFrame = {
type = "group",
@ -678,7 +738,7 @@ function Castbar:GetOptions()
args = {
headerSize = {
type = "header",
name = L["Icon Size"],
name = L["Icon"],
order = 1,
},
castBarIconEnabled = option({
@ -687,6 +747,13 @@ function Castbar:GetOptions()
order = 2,
width = "full",
}),
castBarIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 3,
width = "full",
}),
castBarIconSize = option({
type = "range",
name = L["Icon size"],
@ -773,6 +840,12 @@ function Castbar:GetOptions()
max = 20,
width = "full",
}),
castBarFontOutline = option({
type = "toggle",
name = L["Outline"],
order = 5,
width = "full",
}),
headerFormat = {
type = "header",
name = L["Format"],
@ -879,6 +952,12 @@ function Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin)
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")

View File

@ -1,4 +1,4 @@
local select = select
local select, str_gsub = select, string.gsub
local Gladdy = LibStub("Gladdy")
local CreateFrame = CreateFrame
@ -8,6 +8,7 @@ local Classicon = Gladdy:NewModule("Class Icon", 81, {
classIconEnabled = true,
classIconSize = 60 + 20 + 1,
classIconWidthFactor = 0.9,
classIconZoomed = false,
classIconBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
classIconBorderColor = { r = 0, g = 0, b = 0, a = 1 },
classIconSpecIcon = false,
@ -15,11 +16,14 @@ local Classicon = Gladdy:NewModule("Class Icon", 81, {
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",
["DEATHKNIGHT"] = select(3, GetSpellInfo(49023)), --Might of Mograine
["HUNTER"] = classIconPath .. "inv_weapon_bow_07",
["MAGE"] = classIconPath .. "inv_staff_13",
["PALADIN"] = classIconPath .. "inv_hammer_01",
@ -37,6 +41,11 @@ local specIcons = {
[L["Feral"]] = select(3, GetSpellInfo(27545)), -- Cat Form
[L["Restoration"]] = select(3, GetSpellInfo(5185)), -- Healing Touch
},
["DEATHKNIGHT"] = {
[L["Unholy"]] = select(3, GetSpellInfo(48265)), -- Unholy Presence
[L["Blood"]] = select(3, GetSpellInfo(48266)), -- Blood Presence
[L["Frost"]] = select(3, GetSpellInfo(48263)), -- Frost Presence
},
["HUNTER"] = {
[L["Beast Mastery"]] = select(3, GetSpellInfo(1515)), -- Tame Beast
[L["Marksmanship"]] = select(3, GetSpellInfo(42243)), -- Volley
@ -82,9 +91,21 @@ local specIcons = {
function Classicon:Initialize()
self.frames = {}
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_SPEC")
if Gladdy.db.classIconEnabled then
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
function Classicon:CreateFrame(unit)
@ -95,6 +116,7 @@ function Classicon:CreateFrame(unit)
classIcon.texture = classIcon:CreateTexture(nil, "BACKGROUND")
classIcon.texture:SetAllPoints(classIcon)
classIcon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
classIcon.texture.masked = true
classIcon.texture.overlay = classIcon:CreateTexture(nil, "BORDER")
classIcon.texture.overlay:SetAllPoints(classIcon)
@ -113,14 +135,50 @@ function Classicon:UpdateFrame(unit)
return
end
local testAgain = false
classIcon:SetFrameStrata(Gladdy.db.classIconFrameStrata)
classIcon:SetFrameLevel(Gladdy.db.classIconFrameLevel)
classIcon:SetWidth(Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor)
classIcon:SetHeight(Gladdy.db.classIconSize)
if Gladdy.db.classIconZoomed then
if classIcon.texture.masked then
classIcon.texture:SetMask(nil)
classIcon.texture:SetTexCoord(0.1,0.9,0.1,0.9)
classIcon.texture.masked = nil
end
else
if not classIcon.texture.masked then
classIcon.texture:SetMask(nil)
classIcon.texture:SetTexCoord(0,1,0,1)
classIcon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
classIcon.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
Gladdy:SetPosition(classIcon, unit, "classIconXOffset", "classIconYOffset", Classicon:LegacySetPosition(classIcon, unit), Classicon)
if (Gladdy.db.classIconGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
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"},
@ -137,6 +195,10 @@ function Classicon:UpdateFrame(unit)
classIcon.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.classIconBorderColor))
if Gladdy.db.classIconEnabled then
classIcon:Show()
if testAgain then
Classicon:ResetUnit(unit)
Classicon:ENEMY_SPOTTED(unit)
end
else
classIcon:Hide()
end
@ -161,10 +223,6 @@ function Classicon:UNIT_SPEC(unit, spec)
classIcon.texture:SetTexture(specIcons[Gladdy.buttons[unit].class][spec])
end
function Classicon:Test(unit)
self:ENEMY_SPOTTED(unit)
end
function Classicon:ResetUnit(unit)
local classIcon = self.frames[unit]
if (not classIcon) then
@ -191,6 +249,7 @@ function Classicon:GetOptions()
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
@ -205,25 +264,53 @@ function Classicon:GetOptions()
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 = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 4,
order = 7,
disabled = function() return not Gladdy.db.classIconEnabled end,
args = {
size = {
type = "group",
name = L["Icon size"],
name = L["Icon"],
order = 1,
args = {
header = {
type = "header",
name = L["Icon size"],
name = L["Icon"],
order = 1,
},
classIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
classIconSize = Gladdy:option({
type = "range",
name = L["Icon size"],
name = L["Size"],
min = 3,
max = 100,
step = .1,

View File

@ -20,7 +20,9 @@ local CombatIndicator = Gladdy:NewModule("Combat Indicator", nil, {
function CombatIndicator:Initialize()
self.frames = {}
self:RegisterMessage("JOINED_ARENA")
if Gladdy.db.ciEnabled then
self:RegisterMessage("JOINED_ARENA")
end
self.updateInterval = 0.05
self.combatIndicatorIcon = select(3, GetSpellInfo(674))
end
@ -57,6 +59,14 @@ function CombatIndicator:CreateFrame(unit)
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]
@ -133,6 +143,7 @@ function CombatIndicator:GetOptions()
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.ciEnabled end,
args = {
general = {
type = "group",

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,14 @@
local select = select
local pairs,ipairs,tbl_sort,tinsert,format,rand = pairs,ipairs,table.sort,tinsert,format,math.random
local str_gsub = string.gsub
local GetSpellInfo = GetSpellInfo
local CreateFrame = CreateFrame
local GetTime = GetTime
local Gladdy = LibStub("Gladdy")
local DRData = LibStub("DRData-1.0-BCC")
--local DRData = LibStub("DRData-1.0-BCC")
local DRData = LibStub("DRList-1.0")
local L = Gladdy.L
local function defaultCategories()
local categories = {}
@ -35,6 +37,7 @@ local Diminishings = Gladdy:NewModule("Diminishings", nil, {
drXOffset = 0,
drYOffset = 0,
drIconSize = 36,
drIconZoomed = false,
drEnabled = true,
drBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_Gloss",
drBorderColor = { r = 1, g = 1, b = 1, a = 1 },
@ -55,6 +58,8 @@ local Diminishings = Gladdy:NewModule("Diminishings", nil, {
drDuration = 18,
drFrameStrata = "MEDIUM",
drFrameLevel = 3,
drGroup = false,
drGroupDirection = "DOWN"
})
local function getDiminishColor(dr)
@ -79,7 +84,7 @@ end
function Diminishings:Initialize()
self.frames = {}
self:RegisterMessage("UNIT_DEATH", "ResetUnit", "AURA_FADE", "UNIT_DESTROYED")
self:RegisterMessage("UNIT_DESTROYED")
end
function Diminishings:CreateFrame(unit)
@ -91,21 +96,21 @@ function Diminishings:CreateFrame(unit)
for i = 1, 16 do
local icon = CreateFrame("Frame", "GladdyDr" .. unit .. "Icon" .. i, drFrame)
icon.drFrame = drFrame
icon:Hide()
icon:EnableMouse(false)
icon:SetFrameStrata(Gladdy.db.drFrameStrata)
icon:SetFrameLevel(Gladdy.db.drFrameLevel)
icon.texture = icon:CreateTexture(nil, "BACKGROUND")
icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
icon.texture.masked = true
icon.texture:SetAllPoints(icon)
icon:SetScript("OnUpdate", function(self, elapsed)
if (self.active) then
if (self.running) then
if (self.timeLeft <= 0) then
if (self.factor == drFrame.tracked[self.dr]) then
drFrame.tracked[self.dr] = 0
end
self.drFrame.tracked[self.dr] = nil
self.active = false
self.running = false
self.dr = nil
self.diminishing = 1.0
self.texture:SetTexture("")
@ -187,6 +192,22 @@ function Diminishings:UpdateFrame(unit)
Gladdy:SetPosition(drFrame, unit, "drXOffset", "drYOffset", Diminishings:LegacySetPosition(drFrame, unit), Diminishings)
if (Gladdy.db.drGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
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(drFrame,"drXOffset", "drYOffset", L["Diminishings"],
Gladdy.db.drGrowDirection == "RIGHT" and {"TOPLEFT", "TOPLEFT"} or {"TOPRIGHT", "TOPRIGHT"},
@ -196,6 +217,7 @@ function Diminishings:UpdateFrame(unit)
0, "drEnabled")
end
local testAgain = false
for i = 1, 16 do
local icon = drFrame["icon" .. i]
@ -223,8 +245,13 @@ function Diminishings:UpdateFrame(unit)
icon.drLevelText:SetTextColor(Gladdy:SetColor(Gladdy.db.drLevelTextColor))
end
icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16)
icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16)
if Gladdy.db.drIconZoomed then
icon.cooldown:SetWidth(icon:GetWidth())
icon.cooldown:SetHeight(icon:GetHeight())
else
icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16)
icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16)
end
icon.cooldown:ClearAllPoints()
icon.cooldown:SetPoint("CENTER", icon, "CENTER")
if Gladdy.db.drDisableCircle then
@ -266,9 +293,27 @@ function Diminishings:UpdateFrame(unit)
icon.border:SetTexture(Gladdy.db.drBorderStyle)
end
--icon.texture:SetTexCoord(.1, .9, .1, .9)
--icon.texture:SetPoint("TOPLEFT", icon, "TOPLEFT", 2, -2)
--icon.texture:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -2, 2)
if Gladdy.db.drIconZoomed then
if icon.texture.masked then
icon.texture:SetMask(nil)
icon.texture:SetTexCoord(0.1,0.9,0.1,0.9)
icon.texture.masked = nil
end
else
if not icon.texture.masked then
icon.texture:SetMask(nil)
icon.texture:SetTexCoord(0,1,0,1)
icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
icon.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
end
if testAgain then
Diminishings:ResetUnit(unit)
Diminishings:Test(unit)
end
end
@ -283,6 +328,7 @@ function Diminishings:ResetUnit(unit)
for i = 1, 16 do
local icon = drFrame["icon" .. i]
icon.active = false
icon.running = false
icon.timeLeft = 0
icon.texture:SetTexture("")
icon.timeText:SetText("")
@ -321,12 +367,123 @@ function Diminishings:Test(unit)
amount = rand(1,3)
index = rand(1, #enabledCategories[i].spellIDs)
for _=1, amount do
self:AuraGain(unit, enabledCategories[i].spellIDs[index])
self:AuraFade(unit, enabledCategories[i].spellIDs[index])
end
end
end
end
--[[ testcases for show icon with icon.active = true and icon.running = false and no cooldown. Only when AuraFade start set icon.running = true and start cooldown
SPELL_AURA_APPLIED
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890)
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 2637)
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890) a:AuraGain("arena1", 2637)
expected: stale icon AND 1/2 dr
SPELL_AURA_REMOVED
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraFade("arena1", 10890)
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraFade("arena1", 2637)
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraFade("arena1", 2637) a:AuraFade("arena1", 10890)
expected: icon 1/2 AND 1/2 dr
SPELL_AURA_REFRESH
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890) a:AuraGain("arena1", 10890)
expected: icon 1/4 AND 1/4 dr
two different spells with same DR applied and one fades
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890) a:AuraGain("arena1", 2094) a:AuraFade("arena1", 10890)
expected: icon 1/4 AND 1/4 dr
two different spells with same DR applied and both fade
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890) a:AuraGain("arena1", 2094) a:AuraFade("arena1", 10890) a:AuraFade("arena1", 2094)
expected: icon 1/4 AND 1/4 dr
three different spells with same DR applied and two fade
Script: /run local a=LibStub("Gladdy").modules["Diminishings"] a:AuraGain("arena1", 10890) a:AuraGain("arena1", 2094) a:AuraGain("arena1", 5484) a:AuraFade("arena1", 10890) a:AuraFade("arena1", 2094)
expected: icon 0 AND 0 dr
--]]
function Diminishings:FindLastIcon(unit, drCat)
local drFrame = self.frames[unit]
if (not drFrame or not drCat) then
return
end
if not Gladdy.db.drCategories[drCat].enabled then
return
end
local lastIcon
for i = 1, 16 do
local icon = drFrame["icon" .. i]
if ((icon.active) and icon.dr and icon.dr == drCat) then
lastIcon = icon
break
elseif not icon.active and not lastIcon then
lastIcon = icon
end
end
return lastIcon
end
function Diminishings:PrepareIcon(unit, lastIcon, drCat, spellID)
local drFrame = self.frames[unit]
lastIcon.dr = drCat
lastIcon.diminishing = drFrame.tracked[drCat]
if Gladdy.db.drBorderColorsEnabled then
lastIcon.border:SetVertexColor(getDiminishColor(lastIcon.diminishing))
else
lastIcon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.drBorderColor))
end
if Gladdy.db.drCategories[drCat].forceIcon then
lastIcon.texture:SetTexture(Gladdy.db.drCategories[drCat].icon)
else
lastIcon.texture:SetTexture(select(3, GetSpellInfo(spellID)))
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("")
if Gladdy.db.drLevelTextColorsEnabled then
lastIcon.drLevelText:SetTextColor(getDiminishColor(lastIcon.diminishing))
else
lastIcon.drLevelText:SetTextColor(Gladdy:SetColor(Gladdy.db.drLevelTextColor))
end
lastIcon.drLevelText:SetText(getDiminishText(lastIcon.diminishing))
lastIcon.active = true
self:Positionate(unit)
lastIcon:Show()
end
function Diminishings:AuraGain(unit, spellID)
local drFrame = self.frames[unit]
local drCat = DRData:GetSpellCategory(spellID)
if (not drFrame or not drCat) then
return
end
if not Gladdy.db.drCategories[drCat].enabled then
return
end
-- due to dynamic DR we reset the DR here if dr == 0
if not drFrame.tracked[drCat] or drFrame.tracked[drCat] == 0 then
drFrame.tracked[drCat] = DRData:NextDR(1)
else
drFrame.tracked[drCat] = DRData:NextDR(drFrame.tracked[drCat] == 1.0 and 1 or drFrame.tracked[drCat] == 0.5 and 2 or 3)
end
-- add icon with no timer
local lastIcon = Diminishings:FindLastIcon(unit, drCat)
if not lastIcon then return end
Diminishings:PrepareIcon(unit, lastIcon, drCat, spellID)
lastIcon.running = false
lastIcon.cooldown:Hide()
lastIcon.cooldown:SetCooldown(0, 0)
lastIcon.timeText:SetText("")
end
function Diminishings:AuraFade(unit, spellID)
local drFrame = self.frames[unit]
local drCat = DRData:GetSpellCategory(spellID)
@ -337,49 +494,16 @@ function Diminishings:AuraFade(unit, spellID)
return
end
local lastIcon
for i = 1, 16 do
local icon = drFrame["icon" .. i]
if (icon.active and icon.dr and icon.dr == drCat) then
lastIcon = icon
break
elseif not icon.active and not lastIcon then
lastIcon = icon
lastIcon.diminishing = 1.0
end
end
-- find icon and start timer
local lastIcon = Diminishings:FindLastIcon(unit, drCat)
if not lastIcon then return end
lastIcon.dr = drCat
Diminishings:PrepareIcon(unit, lastIcon, drCat, spellID)
lastIcon.timeLeft = Gladdy.db.drDuration
lastIcon.diminishing = DRData:NextDR(lastIcon.diminishing)
if Gladdy.db.drBorderColorsEnabled then
lastIcon.border:SetVertexColor(getDiminishColor(lastIcon.diminishing))
else
lastIcon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.drBorderColor))
end
lastIcon.cooldown:Show()
lastIcon.cooldown:SetCooldown(GetTime(), Gladdy.db.drDuration)
if Gladdy.db.drCategories[drCat].forceIcon then
lastIcon.texture:SetTexture(Gladdy.db.drCategories[drCat].icon)
else
lastIcon.texture:SetTexture(select(3, GetSpellInfo(spellID)))
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
self:Positionate(unit)
lastIcon:Show()
lastIcon.running = true
end
function Diminishings:Positionate(unit)
@ -434,15 +558,37 @@ function Diminishings:GetOptions()
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 = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 5,
disabled = function() return not Gladdy.db.drEnabled end,
args = {
icon = {
type = "group",
@ -454,11 +600,18 @@ function Diminishings:GetOptions()
name = L["Icon"],
order = 4,
},
drIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 5,
width = "full",
}),
drIconSize = Gladdy:option({
type = "range",
name = L["Icon Size"],
desc = L["Size of the DR Icons"],
order = 5,
order = 6,
min = 5,
max = 80,
step = 1,
@ -468,7 +621,7 @@ function Diminishings:GetOptions()
type = "range",
name = L["Icon Width Factor"],
desc = L["Stretches the icon"],
order = 6,
order = 7,
min = 0.5,
max = 2,
step = 0.05,
@ -478,7 +631,7 @@ function Diminishings:GetOptions()
type = "range",
name = L["Icon Padding"],
desc = L["Space between Icons"],
order = 7,
order = 8,
min = 0,
max = 10,
step = 0.1,
@ -781,6 +934,7 @@ function Diminishings:GetOptions()
type = "group",
name = L["Categories"],
order = 6,
disabled = function() return not Gladdy.db.drEnabled end,
args = Diminishings:CategoryOptions(),
},
}

View File

@ -24,6 +24,7 @@ local function table_copy(t, str)
end
local ExportImport = Gladdy:NewModule("Export Import", nil, {
expansion = Gladdy.expansion,
})
local export = AceGUI:Create("Frame")
@ -111,6 +112,19 @@ local deletedOptions = { -- backwards compatibility
trinketPos = true,
padding = true,
growUp = true,
powerBarFontSize = true,
["38373"] = true, -- The Beast Within (Auras)
["34692"] = true, -- The Beast Within (Cooldowns)
}
local expansionSpecific = {
"drCategories",
"auraListDefault",
"auraListInterrupts",
"trackedDebuffs",
"trackedBuffs",
"cooldownCooldowns",
"cooldownCooldownsOrder",
}
local function checkIsDeletedOption(k, str, msg, errorFound, errorMsg)
@ -161,7 +175,7 @@ function ExportImport:CheckDeserializedOptions(tbl, refTbl, str)
end
if errorFound then
return false, errorMsg
--return false, errorMsg
end
return true
end
@ -226,17 +240,29 @@ function ExportImport:ApplyImport(t, table, str)
if (not t.newLayout) then
table.newLayout = false
end
if not t.expansion then
t.expansion = "BCC"
end
end
for k,v in pairs(t) do
if type(v) == "table" then
if (table[k] ~= nil) then
ExportImport:ApplyImport(v, table[k], str .. "." .. k)
else
Gladdy:Debug("ERROR", "ApplyImport failed for", str .. "." .. k)
local skip = k == "expansion"
if t.expansion and t.expansion ~= table.expansion then
if Gladdy:contains(k, expansionSpecific) then
Gladdy:Debug("WARN", "ExportImport:ApplyImport", "skipped", k, "- import string expansion is", t.expansion, "- current expansion is", table.expansion)
skip = true
end
end
if not skip then
if type(v) == "table" then
if (table[k] ~= nil) then
ExportImport:ApplyImport(v, table[k], str .. "." .. k)
else
Gladdy:Debug("ERROR", "ExportImport:ApplyImport", "failed for", str .. "." .. k)
end
else
table[k] = v
else
table[k] = v
end
end
end
end

View File

@ -1,5 +1,6 @@
local pairs = pairs
local floor = math.floor
local pairs, ipairs = pairs, ipairs
local floor, abs = math.floor, math.abs
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
@ -16,6 +17,15 @@ local Healthbar = Gladdy:NewModule("Health Bar", 100, {
healthBarBorderSize = 9,
healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
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 },
healthBarNameFontSize = 12,
healthBarHealthFontSize = 12,
@ -24,14 +34,23 @@ local Healthbar = Gladdy:NewModule("Health Bar", 100, {
healthActual = false,
healthMax = true,
healthPercentage = true,
healthFrameStrata = "MEDIUM",
healthFrameLevel = 1,
healthCustomTagsEnabled = false,
healthTextLeft = "[name]",
healthTextRight = "[percent|status]",
healthTextLeftOutline = false,
healthTextRightOutline = false,
healthTextLeftVOffset = 0,
healthTextLeftHOffset = 5,
healthTextRightVOffset = 0,
healthTextRightHOffset = -5,
})
function Healthbar:Initialize()
self.frames = {}
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("ENEMY_STEALTH")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DESTROYED")
self:RegisterMessage("UNIT_DEATH")
end
@ -65,52 +84,42 @@ function Healthbar:CreateFrame(unit)
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1)
healthBar.nameText:Hide()
else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize)
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE")
healthBar.nameText:Show()
end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.nameText:SetShadowOffset(1, -1)
healthBar.nameText:SetShadowColor(0, 0, 0, 1)
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")
if (Gladdy.db.healthBarHealthFontSize < 1) then
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1)
healthBar.healthText:Hide()
else
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize)
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE")
healthBar.healthText:Hide()
end
healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
healthBar.healthText:SetShadowOffset(1, -1)
healthBar.healthText:SetShadowColor(0, 0, 0, 1)
healthBar.healthText:SetJustifyH("CENTER")
healthBar.healthText:SetPoint("RIGHT", -5, 0)
healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset)
healthBar.unit = unit
self.frames[unit] = healthBar
button.healthBar = healthBar
self:ResetUnit(unit)
healthBar:RegisterUnitEvent("UNIT_HEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
healthBar:SetScript("OnEvent", Healthbar.OnEvent)
end
function Healthbar.OnEvent(self, event, unit)
local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit)
if event == "UNIT_HEALTH" then
if isDead then
Gladdy:SendMessage("UNIT_DEATH", unit)
return
end
local health = UnitHealth(unit)
local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax)
self.hp:SetValue(UnitHealth(unit))
Healthbar:SetHealthText(self, health, healthMax)
elseif event == "UNIT_MAXHEALTH" then
local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit) and not Gladdy:isFeignDeath(unit)
if event == "UNIT_HEALTH_FREQUENT" or event == "UNIT_MAXHEALTH" then
if isDead then
Gladdy:SendMessage("UNIT_DEATH", unit)
return
@ -119,35 +128,119 @@ function Healthbar.OnEvent(self, event, unit)
local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax)
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
local name = UnitName(unit)
Gladdy.buttons[unit].name = name
if Gladdy.db.healthName and not Gladdy.db.healthNameToArenaId then
self.nameText:SetText(name)
end
Healthbar:SetText(unit, self.hp.current, self.hp.max)
end
if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true)
end
end
function Healthbar:SetHealthText(healthBar, health, healthMax)
local healthText = ""
local healthPercentage = floor(health * 100 / healthMax)
local function getGradient(start, ending, percentage, factor)
return start * abs(-2 * percentage + 1) + ending * factor
end
if health == 0 and UnitExists(healthBar.unit) and UnitIsDeadOrGhost(healthBar.unit) then
self:UNIT_DEATH(healthBar.unit)
-- /run LibStub("Gladdy").modules["Health Bar"]:SetHealthStatusBarColor("arena1", 51, 100)
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
end
if (Gladdy.db.healthPercentage) then
healthText = ("%d%%"):format(healthPercentage)
local healthBar = Gladdy.buttons[unit].healthBar
if not healthBar.hp.oorFactor then
healthBar.hp.oorFactor = 1
end
healthBar.hp:SetMinMaxValues(0, healthMax)
healthBar.hp:SetValue(health)
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
healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.healthBarStatusBarColorMax, healthBar.hp.oorFactor))
end
end
if button.class and Gladdy.db.healthBarClassColored then
healthBar.hp:SetStatusBarColor(
RAID_CLASS_COLORS[button.class].r / healthBar.hp.oorFactor,
RAID_CLASS_COLORS[button.class].g / healthBar.hp.oorFactor,
RAID_CLASS_COLORS[button.class].b / healthBar.hp.oorFactor, 1)
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) and not Gladdy:isFeignDeath(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)
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)
local healthBar = self.frames[unit]
if (not healthBar) then
@ -178,15 +271,15 @@ function Healthbar:UpdateFrame(unit)
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1)
healthBar.healthText:Hide()
else
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize)
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE")
healthBar.healthText:Show()
end
if (Gladdy.db.healthBarNameFontSize < 1) then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1)
healthBar.nameText:Hide()
else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize)
if Gladdy.db.healthName then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE")
if Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled then
healthBar.nameText:Show()
else
healthBar.nameText:Hide()
@ -194,6 +287,10 @@ function Healthbar:UpdateFrame(unit)
end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor))
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
function Healthbar:ResetUnit(unit)
@ -206,6 +303,8 @@ function Healthbar:ResetUnit(unit)
healthBar.nameText:SetText("")
healthBar.healthText:SetText("")
healthBar.hp:SetValue(0)
healthBar.hp.current = nil
healthBar.hp.max = nil
end
function Healthbar:Test(unit)
@ -215,17 +314,30 @@ function Healthbar:Test(unit)
return
end
self:JOINED_ARENA()
Gladdy:SendMessage("UNIT_HEALTH", unit, button.health, button.healthMax)
healthBar.hp.current = button.health
healthBar.hp.max = button.healthMax
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()
if Gladdy.db.healthNameToArenaId and Gladdy.db.healthName then
for i=1,Gladdy.curBracket do
local healthBar = self.frames["arena" .. i]
healthBar.nameText:SetText(i)
end
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
@ -241,36 +353,23 @@ function Healthbar:ENEMY_SPOTTED(unit)
local healthMax = UnitHealthMax(unit)
healthBar.hp:SetMinMaxValues(0, healthMax)
healthBar.hp:SetValue(health)
Healthbar:SetHealthText(healthBar, health, healthMax)
end
if button.name and Gladdy.db.healthName and not Gladdy.db.healthNameToArenaId then
healthBar.nameText:SetText(button.name)
end
if button.class then
healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[button.class].r, RAID_CLASS_COLORS[button.class].g, RAID_CLASS_COLORS[button.class].b, 1)
healthBar.hp.current = health
healthBar.hp.max = healthMax
end
Healthbar:SetText(unit, healthBar.hp.current, healthBar.hp.max)
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end
function Healthbar:UNIT_HEALTH(unit, health, healthMax)
function Healthbar:ENEMY_STEALTH(unit, stealth)
local healthBar = self.frames[unit]
if (not healthBar) then
local button = Gladdy.buttons[unit]
if (not healthBar or not button) then
return
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)
local healthText = ""
healthBar.hp.stealth = stealth
if (Gladdy.db.healthPercentage) then
healthText = ("%d%%"):format(healthPercentage)
end
healthBar.healthText:SetText(healthText)
healthBar.hp:SetValue(healthPercentage)
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end
function Healthbar:UNIT_DEATH(unit)
@ -280,7 +379,8 @@ function Healthbar:UNIT_DEATH(unit)
end
healthBar.hp:SetValue(0)
healthBar.healthText:SetText(L["DEAD"])
healthBar.hp.current = 0
Healthbar:SetText(unit, 0, 100, L["DEAD"])
end
function Healthbar:UNIT_DESTROYED(unit)
@ -290,8 +390,8 @@ function Healthbar:UNIT_DESTROYED(unit)
end
healthBar.hp:SetValue(0)
healthBar.healthText:SetText(L["LEAVE"])
healthBar.nameText:SetText("")
healthBar.hp.current = 0
Healthbar:SetText(unit, 0, 100, L["LEAVE"])
end
local function option(params)
@ -307,8 +407,10 @@ local function option(params)
if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then
Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2
end
for i=1,Gladdy.curBracket do
Healthbar:Test("arena" .. i)
if Gladdy.frame.testing then
for i=1,Gladdy.curBracket do
Healthbar:Test("arena" .. i)
end
end
Gladdy:UpdateFrame()
end,
@ -362,19 +464,76 @@ function Healthbar:GetOptions()
dialogControl = "LSM30_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({
type = "color",
name = L["Background color"],
desc = L["Color of the status bar background"],
order = 5,
order = 4,
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 = {
type = "group",
name = L["Font"],
order = 2,
order = 3,
args = {
header = {
type = "header",
@ -396,11 +555,28 @@ function Healthbar:GetOptions()
order = 12,
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({
type = "range",
name = L["Name font size"],
desc = L["Size of the name text"],
order = 13,
order = 21,
step = 0.1,
min = 0,
max = 20,
@ -410,18 +586,59 @@ function Healthbar:GetOptions()
type = "range",
name = L["Health font size"],
desc = L["Size of the health text"],
order = 14,
order = 22,
step = 0.1,
min = 0,
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 = {
type = "group",
name = L["Border"],
order = 3,
order = 4,
args = {
header = {
type = "header",
@ -457,7 +674,7 @@ function Healthbar:GetOptions()
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
order = 5,
args = {
headerAuraLevel = {
type = "header",
@ -486,7 +703,7 @@ function Healthbar:GetOptions()
healthValues = {
type = "group",
name = L["Health Bar Text"],
order = 5,
order = 6,
args = {
header = {
type = "header",
@ -499,6 +716,7 @@ function Healthbar:GetOptions()
desc = L["Show the units name"],
order = 2,
width = "full",
disabled = function() return Gladdy.db.healthCustomTagsEnabled end,
}),
healthNameToArenaId = option({
type = "toggle",
@ -506,7 +724,7 @@ function Healthbar:GetOptions()
desc = L["Show 1-5 as name instead"],
order = 3,
width = "full",
disabled = function() return not Gladdy.db.healthName end
disabled = function() return not Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled end,
}),
healthPercentage = option({
type = "toggle",
@ -514,7 +732,16 @@ function Healthbar:GetOptions()
desc = L["Show health percentage on the health bar"],
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

@ -31,11 +31,25 @@ local Pets = Gladdy:NewModule("Pets", nil, {
function Pets:Initialize()
self.frames = {}
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("PET_SPOTTED")
self:RegisterMessage("PET_DESTROYED")
self:RegisterMessage("PET_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED")
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")
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
function Pets:JOINED_ARENA()
@ -219,7 +233,7 @@ function Pets:CreateFrame(unitId)
healthBar.unit = unit
button.healthBar = healthBar
healthBar:RegisterUnitEvent("UNIT_HEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_PORTRAIT_UPDATE", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
@ -375,11 +389,17 @@ function Pets:GetOptions()
desc = L["Enables Pets module"],
order = 3,
}),
petGroup = option({
type = "toggle",
name = L["Group Pets"],
order = 4,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 3,
disabled = function() return not Gladdy.db.petEnabled end,
args = {
general = {
type = "group",
@ -411,11 +431,6 @@ function Pets:GetOptions()
step = 1,
width = "full",
}),
petGroup = option({
type = "toggle",
name = L["Group Pets"],
order = 5,
}),
petMargin = option({
type = "range",
name = L["Margin"],

View File

@ -16,7 +16,8 @@ local Powerbar = Gladdy:NewModule("Power Bar", 90, {
powerBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 },
powerBarFontSize = 10,
powerBarRaceFontSize = 10,
powerBarPowerFontSize = 10,
powerShowSpec = true,
powerShowRace = true,
powerActual = true,
@ -24,15 +25,37 @@ local Powerbar = Gladdy:NewModule("Power Bar", 90, {
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()
self.frames = {}
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_DESTROYED")
if Gladdy.db.powerBarEnabled then
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
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
function Powerbar:CreateFrame(unit)
@ -59,64 +82,137 @@ function Powerbar:CreateFrame(unit)
powerBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.powerBarBgColor))
powerBar.raceText = powerBar:CreateFontString(nil, "LOW")
powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize)
powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarRaceFontSize, Gladdy.db.powerTextLeftOutline and "OUTLINE")
powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.raceText:SetShadowOffset(1, -1)
powerBar.raceText:SetShadowColor(0, 0, 0, 1)
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:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize)
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:SetShadowOffset(1, -1)
powerBar.powerText:SetShadowColor(0, 0, 0, 1)
powerBar.powerText:SetJustifyH("CENTER")
powerBar.powerText:SetPoint("RIGHT", -5, 1)
powerBar.powerText:SetPoint("RIGHT", Gladdy.db.powerTextRightHOffset, Gladdy.db.powerTextRightVOffset)
button.powerBar = powerBar
self.frames[unit] = powerBar
self:ResetUnit(unit)
powerBar.unit = unit
powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit)
powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit)
powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit)
powerBar:SetScript("OnEvent", Powerbar.OnEvent)
end
function Powerbar:UpdateFrame(unit)
local powerBar = self.frames[unit]
if (not powerBar) then
return
end
local healthBar = Gladdy.modules["Health Bar"].frames[unit]
if not Gladdy.db.powerBarEnabled then
powerBar:Hide()
powerBar:UnregisterEvent("UNIT_POWER_UPDATE")
powerBar:UnregisterEvent("UNIT_MAXPOWER")
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:SetHeight(Gladdy.db.powerBarHeight)
powerBar:ClearAllPoints()
powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1)
powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"),
edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.powerBarBorderColor))
powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.energy:ClearAllPoints()
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.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarRaceFontSize, Gladdy.db.powerTextLeftOutline and "OUTLINE")
powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.raceText:SetPoint("LEFT", Gladdy.db.powerTextLeftHOffset, Gladdy.db.powerTextLeftVOffset)
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)
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))
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, 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
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)
@ -132,54 +228,11 @@ function Powerbar:SetPower(powerBar, power, powerMax, powerType)
powerBar.powerType = powerType
end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetMinMaxValues(0, powerMax)
powerBar.energy:SetValue(power)
end
function Powerbar:UpdateFrame(unit)
local powerBar = self.frames[unit]
if (not powerBar) then
return
end
local healthBar = Gladdy.modules["Health Bar"].frames[unit]
if not Gladdy.db.powerBarEnabled then
powerBar:Hide()
return
else
powerBar:Show()
end
powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.powerBarBgColor))
powerBar:SetWidth(healthBar:GetWidth())
powerBar:SetHeight(Gladdy.db.powerBarHeight)
powerBar:ClearAllPoints()
powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1)
powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"),
edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.powerBarBorderColor))
powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture"))
powerBar.energy:ClearAllPoints()
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.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize)
powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize)
powerBar.powerText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor))
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:ResetUnit(unit)
local powerBar = self.frames[unit]
if (not powerBar) then
@ -201,8 +254,14 @@ function Powerbar:Test(unit)
return
end
powerBar.energy.current = button.power
powerBar.energy.max = button.powerMax
powerBar.energy.powerType = button.powerType
self:ENEMY_SPOTTED(unit)
self:UNIT_POWER(unit, button.power, button.powerMax, button.powerType)
if unit == "arena1" then
self:UNIT_DEATH(unit)
end
end
function Powerbar:ENEMY_SPOTTED(unit)
@ -212,15 +271,10 @@ function Powerbar:ENEMY_SPOTTED(unit)
return
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
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
@ -230,13 +284,10 @@ function Powerbar:UNIT_SPEC(unit, spec)
if (not powerBar or not button) then
return
end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if (button.spec and Gladdy.db.powerShowSpec) then
raceText = spec .. " " .. raceText
if UnitExists(unit) then
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType)
end
powerBar.raceText:SetText(raceText)
end
function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
@ -248,44 +299,7 @@ function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true)
end
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)
powerBar.powerColor = {r = 1, g = 0, b = 0}
elseif (powerType == 3) then
powerBar.energy:SetStatusBarColor(1, 1, 0, 1)
powerBar.powerColor = {r = 1, g = 1, b = 0}
else
powerBar.energy:SetStatusBarColor(.18, .44, .75, 1)
powerBar.powerColor = {r = .18, g = .44, b = .75}
end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetValue(powerPercentage)
Powerbar:SetPower(powerBar, unit, power, powerMax, powerType)
end
function Powerbar:UNIT_DEATH(unit)
@ -293,9 +307,7 @@ function Powerbar:UNIT_DEATH(unit)
if (not powerBar) then
return
end
powerBar.energy:SetValue(0)
powerBar.powerText:SetText("0%")
Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["DEAD"])
end
function Powerbar:UNIT_DESTROYED(unit)
@ -303,8 +315,7 @@ function Powerbar:UNIT_DESTROYED(unit)
if (not powerBar) then
return
end
powerBar.energy:SetValue(0)
powerBar.powerText:SetText("0%")
Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["LEAVE"])
end
local function option(params)
@ -320,8 +331,10 @@ local function option(params)
if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then
Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2
end
for i=1,Gladdy.curBracket do
Powerbar:Test("arena" .. i)
if Gladdy.frame.testing then
for i=1,Gladdy.curBracket do
Powerbar:Test("arena" .. i)
end
end
Gladdy:UpdateFrame()
end,
@ -351,6 +364,7 @@ function Powerbar:GetOptions()
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.powerBarEnabled end,
args = {
general = {
type = "group",
@ -414,16 +428,84 @@ function Powerbar:GetOptions()
order = 12,
hasAlpha = true,
}),
powerBarFontSize = option({
type = "range",
name = L["Font size"],
desc = L["Size of the text"],
powerTextLeftOutline = option({
type = "toggle",
name = L["Left Font Outline"],
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,
min = 1,
min = 0,
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",
}),
},
},
border = {
@ -506,31 +588,44 @@ function Powerbar:GetOptions()
name = L["Show race"],
desc = L["Show race"],
order = 2,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}),
powerShowSpec= option({
type = "toggle",
name = L["Show spec"],
desc = L["Show spec"],
order = 3,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}),
powerActual = option({
type = "toggle",
name = L["Show the actual power"],
desc = L["Show the actual power on the power bar"],
order = 31,
order = 4,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}),
powerMax = option({
type = "toggle",
name = L["Show max power"],
desc = L["Show max power on the power bar"],
order = 32,
order = 5,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}),
powerPercentage = option({
type = "toggle",
name = L["Show power percentage"],
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,4 +1,4 @@
local ceil = ceil
local ceil, str_gsub = ceil, string.gsub
local CreateFrame = CreateFrame
local GetTime = GetTime
@ -11,6 +11,7 @@ local Racial = Gladdy:NewModule("Racial", 79, {
racialEnabled = true,
racialSize = 60 + 20 + 1,
racialWidthFactor = 0.9,
racialIconZoomed = false,
racialXOffset = 0,
racialYOffset = 0,
racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
@ -20,15 +21,35 @@ local Racial = Gladdy:NewModule("Racial", 79, {
racialCooldownNumberAlpha = 1,
racialFrameStrata = "MEDIUM",
racialFrameLevel = 5,
racialGroup = false,
racialGroupDirection = "DOWN",
})
function Racial:Initialize()
self.frames = {}
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED")
if Gladdy.db.racialEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("TRINKET_USED")
end
end
end
function Racial:UpdateFrameOnce()
if Gladdy.db.racialEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("TRINKET_USED")
end
else
self:UnregisterAllMessages()
end
end
local function iconTimer(self,elapsed)
@ -71,6 +92,7 @@ function Racial:CreateFrame(unit)
racial.texture = racial:CreateTexture(nil, "BACKGROUND")
racial.texture:SetAllPoints(racial)
racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
racial.texture.masked = true
--racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate")
@ -113,6 +135,7 @@ function Racial:UpdateFrame(unit)
return
end
local testAgain = false
local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize
racial:SetFrameStrata(Gladdy.db.racialFrameStrata)
@ -126,8 +149,13 @@ function Racial:UpdateFrame(unit)
racial:SetWidth(width)
racial:SetHeight(height)
racial.cooldown:SetWidth(width - width/16)
racial.cooldown:SetHeight(height - height/16)
if Gladdy.db.racialIconZoomed then
racial.cooldown:SetWidth(width)
racial.cooldown:SetHeight(height)
else
racial.cooldown:SetWidth(width - width/16)
racial.cooldown:SetHeight(height - height/16)
end
racial.cooldown:ClearAllPoints()
racial.cooldown:SetPoint("CENTER", racial, "CENTER")
racial.cooldown.noCooldownCount = true -- Gladdy.db.racialDisableOmniCC
@ -139,8 +167,42 @@ function Racial:UpdateFrame(unit)
racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle)
racial.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.racialBorderColor))
if Gladdy.db.racialIconZoomed then
if racial.texture.masked then
racial.texture:SetMask(nil)
racial.texture:SetTexCoord(0.1,0.9,0.1,0.9)
racial.texture.masked = nil
end
else
if not racial.texture.masked then
racial.texture:SetMask(nil)
racial.texture:SetTexCoord(0,1,0,1)
racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
racial.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
end
end
Gladdy:SetPosition(racial, unit, "racialXOffset", "racialYOffset", Racial:LegacySetPosition(racial, unit), Racial)
if (Gladdy.db.racialGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
self.frames[unit]:ClearAllPoints()
if Gladdy.db.racialGroupDirection == "RIGHT" then
self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
elseif Gladdy.db.racialGroupDirection == "LEFT" then
self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
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"},
@ -153,11 +215,14 @@ function Racial:UpdateFrame(unit)
racial:Hide()
else
racial:Show()
if testAgain then
Racial:ResetUnit(unit)
Racial:Test(unit)
end
end
end
function Racial:JOINED_ARENA()
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE")
self:SetScript("OnEvent", function(self, event, ...)
if self[event] then
self[event](self, ...)
@ -165,13 +230,34 @@ function Racial:JOINED_ARENA()
end)
end
function Racial:RACIAL_USED(unit)
function Racial:RACIAL_USED(unit, expirationTime, spellName)
local racial = self.frames[unit]
local button = Gladdy.buttons[unit]
if (not racial or not button or not button.race or not Gladdy.db.racialEnabled) then
return
end
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
function Racial:TRINKET_USED(unit) -- Wrath only
local racial = self.frames[unit]
local button = Gladdy.buttons[unit]
if (not racial or not button or not button.race) then
return
end
Racial:Used(unit, GetTime(), Gladdy:Racials()[button.race].duration)
if button.race == "Scourge" then
if racial.active and racial.timeLeft >= 45 then
-- do nothing
else
self:Used(unit, GetTime(), 45)
end
elseif button.race == "Human" then
self:Used(unit, GetTime(), 120)
end
end
function Racial:Used(unit, startTime, duration)
@ -208,8 +294,8 @@ end
function Racial:Test(unit)
Racial:ENEMY_SPOTTED(unit)
if (unit == "arena1" or unit == "arena3") then
Racial:Used(unit, GetTime(), Gladdy:Racials()[Gladdy.buttons[unit].race].duration)
if (unit == "arena2" or unit == "arena3") then
Gladdy:SendMessage("RACIAL_USED", unit)
end
end
@ -226,29 +312,57 @@ function Racial:GetOptions()
desc = L["Enable racial icon"],
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 = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 4,
order = 6,
disabled = function() return not Gladdy.db.racialEnabled end,
args = {
general = {
type = "group",
name = L["Size"],
name = L["Icon"],
order = 1,
args = {
header = {
type = "header",
name = L["Size"],
name = L["Icon"],
order = 1,
},
racialIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
racialSize = Gladdy:option({
type = "range",
name = L["Icon size"],
min = 5,
max = 100,
step = 1,
order = 2,
order = 3,
width = "full",
}),
racialWidthFactor = Gladdy:option({
@ -257,7 +371,7 @@ function Racial:GetOptions()
min = 0.5,
max = 2,
step = 0.05,
order = 3,
order = 4,
width = "full",
}),
},

View File

@ -17,6 +17,7 @@ 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,
@ -52,12 +53,20 @@ local RangeCheck = Gladdy:NewModule("Range Check", nil, {
})
function RangeCheck:Initialize()
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED")
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
@ -66,7 +75,6 @@ function RangeCheck:ResetUnit(unit)
local button = Gladdy.buttons[unit]
self:CancelTimer(button)
self:SetColor(button, 1)
button.classColors = {}
end
function RangeCheck:Test(unit)
@ -74,11 +82,10 @@ function RangeCheck:Test(unit)
if not button then
return
end
self:ENEMY_SPOTTED(unit)
self.test = true
button.lastState = 0
if Gladdy.db.rangeCheckEnabled then
if unit == "arena1" then
if unit == "arena2" or unit == "arena4" then
--button.unit = "target"
--self:CreateTimer(button)
self:SetRangeAlpha(button, nil)
@ -101,18 +108,12 @@ function RangeCheck:SetColor(button, oorFac)
return
end
if not button.classColors.r then
if button.class then
button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
else
button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
end
end
if Gladdy.db.rangeCheckHealthBar then
button.healthBar.hp:SetStatusBarColor(button.classColors.r/oorFac, button.classColors.g/oorFac, button.classColors.b/oorFac, 1)
button.healthBar.hp.oorFactor = oorFac
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max)
else
button.healthBar.hp:SetStatusBarColor(button.classColors.r, button.classColors.g, button.classColors.b, 1)
button.healthBar.hp.oorFactor = 1
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max)
end
if Gladdy.db.rangeCheckHealthBarText then
@ -177,35 +178,6 @@ function RangeCheck:JOINED_ARENA()
end
end
function RangeCheck:ENEMY_STEALTH(unit, stealth)
local button = Gladdy.buttons[unit]
if not button then
return
end
button.lastState = 0
if stealth then
button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
if not Gladdy.db.rangeCheckEnabled then
button.healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1)
end
else
if button.class then
button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
if not Gladdy.db.rangeCheckEnabled then
button.healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[button.class].r, RAID_CLASS_COLORS[button.class].g, RAID_CLASS_COLORS[button.class].b, 1)
end
end
end
end
function RangeCheck:ENEMY_SPOTTED(unit)
local button = Gladdy.buttons[unit]
if (not button) then
return
end
button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
end
function RangeCheck.CheckRange(self)
local button = self.parent
@ -268,6 +240,7 @@ function RangeCheck:GetOptions()
childGroups = "tree",
name = L["General"],
order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = {
general = {
type = "group",
@ -340,6 +313,7 @@ function RangeCheck:GetOptions()
childGroups = "tree",
name = L["Spells"],
order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = RangeCheck:GetSpells(),
},
}

View File

@ -34,8 +34,10 @@ end
function ShadowsightTimer:Initialize()
self.locale = Gladdy:GetArenaTimer()
self:RegisterMessage("JOINED_ARENA")
self:CreateAnchor()
if Gladdy.db.shadowsightTimerEnabled then
self:RegisterMessage("JOINED_ARENA")
end
end
function ShadowsightTimer:Reset()
@ -106,6 +108,12 @@ function ShadowsightTimer:CreateAnchor()
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)
@ -148,13 +156,15 @@ end
---------------------------
function ShadowsightTimer:JOINED_ARENA()
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)
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
self.anchor:Show()
end
function ShadowsightTimer:AURA_GAIN(unit, auraType, spellID)
@ -297,23 +307,27 @@ function ShadowsightTimer:GetOptions()
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",

View File

@ -1,103 +1,41 @@
local select, pairs, string_lower, tremove, tinsert, format, string_gsub, ipairs = select, pairs, string.lower, tremove, tinsert, format, string.gsub, ipairs
local UnitExists, UnitIsUnit, UnitName, UnitIsEnemy = UnitExists, UnitIsUnit, UnitName, UnitIsEnemy
local select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs = select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs
local UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID = UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID
local C_NamePlate = C_NamePlate
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
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 = select(3, GetSpellInfo(5675)), 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 = select(3, GetSpellInfo(8835)), 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 = select(3, GetSpellInfo(8512)), color = {r = 0.96, g = 0, b = 0.07, a = 1}, enabled = true, priority = 2}, -- Windfury Totem
[string_lower("Sentry Totem")] = {id = 6495, texture = select(3, GetSpellInfo(6495)), 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 = select(3, GetSpellInfo(3738)), 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 = select(3, GetSpellInfo(25908)), 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 d'\195\169lementaire de terre")] = totemData[string_lower("Earth Elemental Totem")], -- Earth Elemental Totem
[string_lower("Totem d'\195\169lementaire de feu")] = totemData[string_lower("Fire Elemental Totem")], -- Fire Elemental Totem
},
["ruRU"] = {
[string_lower("")] = totemData[string_lower("Sentry Totem")], -- Sentry Totem
}
}
local function GetTotemColorDefaultOptions()
local defaultDB = {}
local options = {}
local indexedList = {}
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
table.sort(indexedList, function (a, b)
return a.name < b.name
end)
for i=1,#indexedList do
defaultDB["totem" .. indexedList[i].id] = {color = indexedList[i].color, enabled = indexedList[i].enabled, alpha = 0.6, customText = ""}
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] = {
order = i+1,
name = select(1, GetSpellInfo(indexedList[i].id)),
@ -174,17 +112,13 @@ local function GetTotemColorDefaultOptions()
return defaultDB, options, indexedList
end
function Gladdy:GetTotemColors()
return GetTotemColorDefaultOptions()
end
---------------------------------------------------
-- Core
---------------------------------------------------
local TotemPlates = Gladdy:NewModule("Totem Plates", nil, {
local TotemPlates = Gladdy:NewModule("Totem Plates", 2, {
npTotems = true,
npTotemsShowFriendly = true,
npTotemsShowEnemy = true,
@ -198,12 +132,10 @@ local TotemPlates = Gladdy:NewModule("Totem Plates", nil, {
npTotemPlatesAlpha = 0.6,
npTotemPlatesAlphaAlways = 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, ...)
TotemPlates[event](self, ...)
end
@ -212,19 +144,18 @@ function TotemPlates:Initialize()
self.numChildren = 0
self.activeTotemNameplates = {}
self.totemPlateCache = {}
self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", TotemPlates.OnEvent)
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)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then
--GetCVar("nameplateShowEnemyTotems")
--SetCVar("nameplateShowEnemyTotems", true);
SetCVar("nameplateShowEnemyTotems", true);
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then
--GetCVar("nameplateShowFriendlyTotems")
--SetCVar("nameplateShowFriendlyTotems", true);
SetCVar("nameplateShowFriendlyTotems", true);
end
self.addon = "Blizzard"
if (IsAddOnLoaded("Plater")) then
@ -248,17 +179,67 @@ function TotemPlates:Initialize()
end
end
---------------------------------------------------
-- Events
---------------------------------------------------
function TotemPlates:PLAYER_ENTERING_WORLD()
self.numChildren = 0
self.activeTotemNameplates = {}
end
function TotemPlates:Reset()
--self:CancelAllTimers()
--self:UnhookAll()
function TotemPlates:PLAYER_TARGET_CHANGED()
for k,nameplate in pairs(self.activeTotemNameplates) do
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
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()
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
local totemDataEntry = nameplate.gladdyTotemFrame.totemDataEntry
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
@ -295,6 +276,18 @@ function TotemPlates:UpdateFrameOnce()
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
for _,gladdyTotemFrame in ipairs(self.totemPlateCache) do
gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
@ -313,6 +306,7 @@ end
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)
@ -373,11 +367,7 @@ function TotemPlates:GetAddonFrame(nameplate)
end
end
function TotemPlates:PLAYER_TARGET_CHANGED()
for k,nameplate in pairs(self.activeTotemNameplates) do
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
end
end
function TotemPlates:ToggleAddon(nameplate, show)
local addonFrames = { self:GetAddonFrame(nameplate) }
@ -395,7 +385,7 @@ function TotemPlates:ToggleAddon(nameplate, show)
end
function TotemPlates.OnUpdate(self)
if (UnitIsUnit("mouseover", self.unitID) or UnitIsUnit("target", self.unitID)) then
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)
@ -423,12 +413,14 @@ function TotemPlates:OnUnitEvent(unitID)
self:ToggleAddon(nameplate, true)
return
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 totemDataEntry = localizedTotemData["default"][totemName] or localizedTotemData["frFR"][totemName] or localizedTotemData["ruRU"][totemName]
local npcType, _, _, _, _, npcId = strsplit("-", UnitGUID(unitID))
if npcType ~= "Creature" then
return
end
local totemDataEntry = npcIdToTotemData[tonumber(npcId)]
if not totemDataEntry then
return
end
if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates
if #self.totemPlateCache > 0 then
nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
@ -452,32 +444,19 @@ function TotemPlates:OnUnitEvent(unitID)
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID)
self:ToggleAddon(nameplate)
self.activeTotemNameplates[unitID] = nameplate
elseif totemDataEntry and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled and Gladdy.db.npTotemsHideDisabledTotems then
if nameplate.gladdyTotemFrame then
nameplate.gladdyTotemFrame:Hide()
nameplate.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
nameplate.gladdyTotemFrame = nil
end
self:ToggleAddon(nameplate)
else
self:ToggleAddon(nameplate, true)
end
end
function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
self:OnUnitEvent(...)
end
function TotemPlates:UNIT_NAME_UPDATE(...)
self:OnUnitEvent(...)
end
function TotemPlates:NAME_PLATE_UNIT_REMOVED(...)
local 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
function TotemPlates:SetTotemAlpha(gladdyTotemFrame, unitID)
local targetExists = UnitExists("target")
local totemDataEntry = gladdyTotemFrame.totemDataEntry
@ -502,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
---------------------------------------------------
@ -516,21 +554,23 @@ function TotemPlates:GetOptions()
npTotems = Gladdy:option({
type = "toggle",
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,
width = 0.9,
}),
npTotemsShowFriendly = Gladdy:option({
type = "toggle",
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,
width = 0.65,
}),
npTotemsShowEnemy = Gladdy:option({
type = "toggle",
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,
width = 0.6,
}),
@ -538,6 +578,7 @@ function TotemPlates:GetOptions()
type = "group",
childGroups = "tree",
name = L["Frame"],
disabled = function() return not Gladdy.db.npTotems end,
order = 4,
args = {
icon = {
@ -732,7 +773,8 @@ function TotemPlates:GetOptions()
name = L["Customize Totems"],
type = "group",
childGroups = "tree",
args = select(2, Gladdy:GetTotemColors())
disabled = function() return not Gladdy.db.npTotems end,
args = select(2, GetTotemColorDefaultOptions())
},
}
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 and timestamp.id 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 = ceil
local ceil, str_gsub = ceil, string.gsub
local C_PvP = C_PvP
local CreateFrame = CreateFrame
@ -13,6 +13,7 @@ local Trinket = Gladdy:NewModule("Trinket", 80, {
trinketEnabled = true,
trinketSize = 60 + 20 + 1,
trinketWidthFactor = 0.9,
trinketIconZoomed = false,
trinketBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
trinketBorderColor = { r = 0, g = 0, b = 0, a = 1 },
trinketDisableCircle = false,
@ -25,12 +26,30 @@ local Trinket = Gladdy:NewModule("Trinket", 80, {
trinketColored = false,
trinketColoredCd = { r = 1, g = 0, b = 0, a = 1 },
trinketColoredNoCd = { r = 0, g = 1, b = 0, a = 1 },
trinketGroup = false,
trinketGroupDirection = "DOWN",
})
function Trinket:Initialize()
self.frames = {}
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("TRINKET_USED")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("RACIAL_USED")
end
end
end
self:RegisterMessage("JOINED_ARENA")
function Trinket:UpdateFrameOnce()
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("RACIAL_USED")
end
else
self:UnregisterAllMessages()
end
end
local function iconTimer(self, elapsed)
@ -83,6 +102,7 @@ function Trinket:CreateFrame(unit)
trinket.texture:SetAllPoints(trinket)
trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
trinket.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
trinket.texture.masked = true
trinket.cooldown = CreateFrame("Cooldown", nil, trinket, "CooldownFrameTemplate")
trinket.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC
@ -126,17 +146,7 @@ function Trinket:UpdateFrame(unit)
return
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 testAgain = false
local width, height = Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor, Gladdy.db.trinketSize
@ -151,8 +161,14 @@ function Trinket:UpdateFrame(unit)
trinket:SetWidth(width)
trinket:SetHeight(height)
trinket.cooldown:SetWidth(width - width/16)
trinket.cooldown:SetHeight(height - height/16)
if Gladdy.db.trinketIconZoomed then
trinket.cooldown:SetWidth(width)
trinket.cooldown:SetHeight(height)
else
trinket.cooldown:SetWidth(width - width/16)
trinket.cooldown:SetHeight(height - height/16)
end
trinket.cooldown:ClearAllPoints()
trinket.cooldown:SetPoint("CENTER", trinket, "CENTER")
trinket.cooldown.noCooldownCount = true -- Gladdy.db.trinketDisableOmniCC
@ -164,8 +180,54 @@ function Trinket:UpdateFrame(unit)
trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle)
trinket.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.trinketBorderColor))
if Gladdy.db.trinketIconZoomed then
if trinket.texture.masked then
trinket.texture:SetMask(nil)
trinket.texture:SetTexCoord(0.1,0.9,0.1,0.9)
trinket.texture.masked = nil
end
else
if not trinket.texture.masked then
trinket.texture:SetMask(nil)
trinket.texture:SetTexCoord(0,1,0,1)
trinket.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
trinket.texture.masked = true
if Gladdy.frame.testing then
testAgain = true
end
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
Gladdy:SetPosition(trinket, unit, "trinketXOffset", "trinketYOffset", Trinket:LegacySetPosition(trinket, unit), Trinket)
if (Gladdy.db.trinketGroup) then
if (unit ~= "arena1") then
local previousUnit = "arena" .. str_gsub(unit, "arena", "") - 1
self.frames[unit]:ClearAllPoints()
if Gladdy.db.trinketGroupDirection == "RIGHT" then
self.frames[unit]:SetPoint("LEFT", self.frames[previousUnit], "RIGHT", 0, 0)
elseif Gladdy.db.trinketGroupDirection == "LEFT" then
self.frames[unit]:SetPoint("RIGHT", self.frames[previousUnit], "LEFT", 0, 0)
elseif Gladdy.db.trinketGroupDirection == "UP" then
self.frames[unit]:SetPoint("BOTTOM", self.frames[previousUnit], "TOP", 0, 0)
elseif Gladdy.db.trinketGroupDirection == "DOWN" then
self.frames[unit]:SetPoint("TOP", self.frames[previousUnit], "BOTTOM", 0, 0)
end
end
end
if (unit == "arena1") then
Gladdy:CreateMover(trinket,"trinketXOffset", "trinketYOffset", L["Trinket"],
{"TOPLEFT", "TOPLEFT"},
@ -187,6 +249,10 @@ function Trinket:UpdateFrame(unit)
trinket:Hide()
else
trinket:Show()
if testAgain then
Trinket:ResetUnit(unit)
Trinket:Test(unit)
end
end
end
@ -201,6 +267,7 @@ function Trinket:ResetUnit(unit)
return
end
trinket.itemID = nil
trinket.timeLeft = nil
trinket.active = false
trinket.cooldown:Clear()
@ -212,13 +279,14 @@ function Trinket:Test(unit)
if (not trinket) then
return
end
if (unit == "arena2" or unit == "arena3") then
self:Used(unit, GetTime() * 1000, 120000)
if (unit == "arena1" or unit == "arena2") then
Gladdy:SendMessage("TRINKET_USED", unit)
end
end
function Trinket:JOINED_ARENA()
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE")
self:RegisterEvent("ARENA_CROWD_CONTROL_SPELL_UPDATE")
self:SetScript("OnEvent", function(self, event, ...)
if self[event] then
self[event](self, ...)
@ -226,13 +294,52 @@ function Trinket:JOINED_ARENA()
end)
end
function Trinket:ARENA_CROWD_CONTROL_SPELL_UPDATE(...)
local unitID, spellID, itemID = ...
Gladdy:Debug("INFO", "Trinket:ARENA_CROWD_CONTROL_SPELL_UPDATE", unitID, spellID, itemID)
if Gladdy.buttons[unitID] and Gladdy:GetPvpTrinkets()[itemID] then
Gladdy.buttons[unitID].trinket.itemID = itemID
if not Gladdy.db.trinketColored then
self.frames[unitID].texture:SetTexture(GetItemIcon(itemID))
end
end
end
function Trinket:TRINKET_USED(unit)
if Gladdy.buttons[unit] then
self:Used(unit, GetTime() * 1000,
Gladdy.buttons[unit].trinket.itemID and Gladdy:GetPvpTrinkets()[Gladdy.buttons[unit].trinket.itemID]
or 120000)
end
end
function Trinket:RACIAL_USED(unit) -- Wrath only
local trinket = self.frames[unit]
if (not trinket) then
return
end
if Gladdy.buttons[unit].race == "Scourge" then
if trinket.active and trinket.timeLeft >= 45 then
-- do nothing
else
self:Used(unit, GetTime() * 1000, 45000)
end
elseif Gladdy.buttons[unit].race == "Human" then
self:Used(unit, GetTime() * 1000, 120000)
end
end
function Trinket:ARENA_COOLDOWNS_UPDATE()
for i=1, Gladdy.curBracket do
local unit = "arena" .. i
local spellID, itemID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unit);
local unitID = "arena" .. i
local spellID, itemID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unitID)
if (spellID) then
Gladdy:Debug("INFO", "Trinket:ARENA_COOLDOWNS_UPDATE", spellID, itemID, startTime, duration)
if not Gladdy.db.trinketColored and Gladdy:GetPvpTrinkets()[itemID] then
self.frames[unitID].texture:SetTexture(GetItemIcon(itemID))
end
if (startTime ~= 0 and duration ~= 0) then
self:Used(unit, startTime, duration)
self:Used(unitID, startTime, duration)
end
end
end
@ -240,18 +347,17 @@ end
function Trinket:Used(unit, startTime, duration)
local trinket = self.frames[unit]
if (not trinket) then
if (not trinket or not Gladdy.db.trinketEnabled) then
return
end
if not trinket.active then
--if not trinket.active then
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
trinket.active = true
if Gladdy.db.trinketColored then
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredCd))
end
Gladdy:SendMessage("TRINKET_USED", unit)
end
--end
end
function Trinket:GetOptions()
@ -272,6 +378,7 @@ function Trinket:GetOptions()
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",
@ -279,9 +386,7 @@ function Trinket:GetOptions()
desc = L["Color of the border"],
order = 5,
hasAlpha = true,
disabled = function()
return not Gladdy.db.trinketColored
end,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketColoredNoCd = Gladdy:colorOption({
type = "color",
@ -289,8 +394,26 @@ function Trinket:GetOptions()
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.trinketColored
return not Gladdy.db.trinketGroup or not Gladdy.db.trinketEnabled
end,
}),
group = {
@ -298,17 +421,25 @@ function Trinket:GetOptions()
childGroups = "tree",
name = L["Frame"],
order = 5,
disabled = function() return not Gladdy.db.trinketEnabled end,
args = {
general = {
type = "group",
name = L["Size"],
name = L["Icon"],
order = 1,
args = {
header = {
type = "header",
name = L["Size"],
name = L["Icon"],
order = 1,
},
trinketIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
trinketSize = Gladdy:option({
type = "range",
name = L["Size"],

View File

@ -1,4 +1,4 @@
local tonumber, tostring = tonumber, tostring
local tonumber, tostring, str_format = tonumber, tostring, string.format
local UnitName = UnitName
local IsInGroup, IsInRaid = IsInGroup, IsInRaid
@ -24,11 +24,11 @@ end
function VersionCheck:JOINED_ARENA()
self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived)
if IsInRaid(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", self.playerName)
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", tostring(Gladdy.version_num), "INSTANCE_CHAT", self.playerName)
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "INSTANCE_CHAT", self.playerName)
elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "PARTY", self.playerName)
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "PARTY", self.playerName)
end
end
@ -41,9 +41,9 @@ end
function VersionCheck.OnCommReceived(prefix, message, distribution, sender)
if sender ~= VersionCheck.playerName then
local addonVersion = Gladdy.version_num
message = tonumber(message)
if message and message <= Gladdy.version_num then
local addonVersion = str_format("%.2f", Gladdy.version_num)
local message_num = tonumber(message) or 0
if message and message_num <= Gladdy.version_num then
--Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date")
else
Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"")

View File

@ -1,9 +1,8 @@
local type, pairs, tinsert, tsort = type, pairs, table.insert, table.sort
local tostring, str_match, tonumber, string_format = tostring, string.match, tonumber, string.format
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 GetSpellInfo = GetSpellInfo
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
@ -31,7 +30,7 @@ function Gladdy:FormatTimer(fontString, timeLeft, milibreakpoint, showSeconds)
else
if time >= 60 then
if showSeconds then
fontString:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60)))
fontString:SetText(floor(timeLeft / 60) .. ":" .. str_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60)))
else
fontString:SetText(ceil(ceil(time / 60)) .. "m")
end
@ -48,6 +47,7 @@ Gladdy.defaults = {
x = 0,
y = 0,
growDirection = "BOTTOM",
growMiddle = false,
frameScale = 1,
pixelPerfect = false,
barWidth = 180,
@ -104,8 +104,11 @@ function Gladdy:option(params)
return defaults
end
function Gladdy:SetColor(option)
return option.r, option.g, option.b, option.a
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)
@ -278,7 +281,7 @@ function Gladdy:SetupOptions()
order = 5,
width = 1,
type = "description",
name = " Gladdy v" .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType
name = " " .. Gladdy.version
},
general = {
type = "group",
@ -311,7 +314,7 @@ function Gladdy:SetupOptions()
group = {
type = "group",
name = L["General"],
order = 5,
order = 6,
childGroups = "tree",
args = {
frameGeneral = {
@ -322,6 +325,12 @@ function Gladdy:SetupOptions()
headerFrame = {
type = "header",
name = L["Frame General"],
order = 2,
},
growMiddle = {
type = "toggle",
name = L["Grow Middle"],
desc = L["Frames expand along a centric anchor"],
order = 3,
},
pixelPerfect = {
@ -789,7 +798,7 @@ function Gladdy:SetupOptions()
end
function Gladdy:ShowOptions()
InterfaceOptionsFrame_OpenToFrame("Gladdy")
LibStub("AceConfigDialog-3.0"):Open("Gladdy")
end
function Gladdy:GetAuras(auraType)
@ -925,6 +934,17 @@ function Gladdy:GetAuras(auraType)
end
return args
end
if Gladdy.expansion == "Wrath" then
spells.deathknight = {
order = 3,
type = "group",
name = LOCALIZED_CLASS_NAMES_MALE["DEATHKNIGHT"],
icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes",
iconCoords = CLASS_ICON_TCOORDS["DEATHKNIGHT"],
args = {},
}
spells.deathknight.args = assignForClass("DEATHKNIGHT")
end
spells.druid.args = assignForClass("DRUID")
spells.hunter.args = assignForClass("HUNTER")
spells.mage.args = assignForClass("MAGE")

View File

@ -1,10 +1,10 @@
# Gladdy - TBC
# Gladdy - Classic
### The most powerful arena addon for WoW TBC 2.5.1
### The most powerful arena addon for WoW TBC 2.5.4 & WotLK 3.4.0
---
## [v2.00-Release Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v2.00-Release/Gladdy_TBC-Classic_v2.00-Release.zip)
## [v2.20-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v2.20-Release/Gladdy_Classic_v2.20-Beta.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
@ -34,6 +34,7 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca
- **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)
@ -72,12 +73,82 @@ Thank you!
- **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)
- **Xyz** (thanks for suggestions and extensive testing <3)
---
### Changes
### v2.20-Beta
- **Wrath** & **BCC** support
- different auras/DRs/Cooldowns/Buffs per expansion
- **Zoomed Icon** options added for all modules
- **Cooldowns**
- desaturate icon on cd added
- alpha on cd added
- glow on CD active added
- **Diminishing**
- replaced DRData with DRList (your dr-categories options will be reset like "force icon" and what is enabled)
- zoomed icons
- changed DR-tracking behaviour (DR will show once aura is applied and start CD once aura fades)
- **Trinket & Racial**
- in Wrath racials like wotf share CD with Trinket and vice versa
- fixed some potential API bug in Trinket use detection
- **ArenaCountdown**
- uses C_Timer now
- **Import/Export of Profiles**
- profiles should now be able to import/export between BCC and Wrath
- auras, cooldowns, DRs and buffs/debuffs are ignored
- positioning, style etc will be transferred between expansions
- proper Feign Death detection
- fix detect pet abilities CD like Spell Lock
- minor bugfixes
### 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.

182
Util.lua Normal file
View File

@ -0,0 +1,182 @@
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
local AuraUtil = AuraUtil
local GetSpellInfo = GetSpellInfo
local UnitIsUnit = UnitIsUnit
---------------------------
-- 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
function Gladdy:contains(entry, list)
for _,v in pairs(list) do
if entry == v then
return true
end
end
return false
end
local feignDeath = GetSpellInfo(5384)
function Gladdy:isFeignDeath(unit)
return AuraUtil.FindAuraByName(feignDeath, unit)
end
function Gladdy:GetArenaUnit(unitCaster, unify)
if unitCaster then
for i=1,5 do
local arenaUnit = "arena" .. i
local arenaUnitPet = "arenapet" .. i
if unify then
if unitCaster and (UnitIsUnit(arenaUnit, unitCaster) or UnitIsUnit(arenaUnitPet, unitCaster)) then
return arenaUnit
end
else
if unitCaster and UnitIsUnit(arenaUnit, unitCaster) then
return arenaUnit
end
if unitCaster and UnitIsUnit(arenaUnitPet, unitCaster) then
return arenaUnitPet
end
end
end
end
end

View File

@ -12,7 +12,8 @@
<Include file="libs\LibDeflate\lib.xml"/>
<Include file="libs\LibSharedMedia-3.0\lib.xml"/>
<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
<Include file="libs\DRData-1.0\DRData-1.0.xml"/>
<Include file="libs\DRList-1.0\DRList-1.0.xml"/>
<Include file="libs\LibClassAuras-1.0\lib.xml"/>
<Include file="libs\LibSpellRange-1.0\lib.xml"/>
<Include file="libs\LibCustomGlow-1.0\LibCustomGlow-1.0.lua"/>
</Ui>