Compare commits

..

No commits in common. "main" and "v1.19-Beta" have entirely different histories.

107 changed files with 3655 additions and 13893 deletions

3
.gitignore vendored
View File

@ -6,6 +6,3 @@ BuffLib
Ace-Libs Ace-Libs
Images_Raw Images_Raw
Gladdy_old Gladdy_old
DoNotCommit
untracked
Gladdy_TW

View File

@ -1,15 +1,16 @@
local tbl_sort, select, string_lower = table.sort, select, string.lower local tbl_sort, select = table.sort, select
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local GetItemInfo = GetItemInfo local GetLocale = GetLocale
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
Gladdy.expansion = "BCC"
Gladdy.CLASSES = {"MAGE", "PRIEST", "DRUID", "SHAMAN", "PALADIN", "WARLOCK", "WARRIOR", "HUNTER", "ROGUE"} Gladdy.CLASSES = {"MAGE", "PRIEST", "DRUID", "SHAMAN", "PALADIN", "WARLOCK", "WARRIOR", "HUNTER", "ROGUE"}
tbl_sort(Gladdy.CLASSES) tbl_sort(Gladdy.CLASSES)
Gladdy.RACES = {"Scourge", "BloodElf", "Tauren", "Orc", "Troll", "NightElf", "Draenei", "Human", "Gnome", "Dwarf"}
tbl_sort(Gladdy.RACES)
local specBuffs = { local specBuffs = {
-- DRUID -- DRUID
@ -18,23 +19,19 @@ local specBuffs = {
[GetSpellInfo(24858)] = L["Restoration"], -- Moonkin Form; Dreamstate spec in TBC equals Restoration [GetSpellInfo(24858)] = L["Restoration"], -- Moonkin Form; Dreamstate spec in TBC equals Restoration
[GetSpellInfo(17007)] = L["Feral"], -- Leader of the Pack [GetSpellInfo(17007)] = L["Feral"], -- Leader of the Pack
[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness [GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(33891)] = L["Restoration"], -- Tree of Life
-- HUNTER -- HUNTER
[GetSpellInfo(34471)] = L["Beast Mastery"], -- The Beast Within [GetSpellInfo(34692)] = L["Beast Mastery"], -- The Beast Within
[GetSpellInfo(20895)] = L["Beast Mastery"], -- Spirit Bond [GetSpellInfo(20895)] = L["Beast Mastery"], -- Spirit Bond
[GetSpellInfo(34455)] = L["Beast Mastery"], -- Ferocious Inspiration [GetSpellInfo(34455)] = L["Beast Mastery"], -- Ferocious Inspiration
[GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura [GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
[GetSpellInfo(34501)] = L["Survival"], -- Expose Weakness
-- MAGE -- MAGE
[GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier [GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier
[GetSpellInfo(11129)] = L["Fire"], -- Combustion [GetSpellInfo(11129)] = L["Fire"], -- Combustion
[GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power [GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power
[GetSpellInfo(12043)] = L["Arcane"], -- Presence of Mind [GetSpellInfo(12043)] = L["Arcane"], -- Presence of Mind
[GetSpellInfo(31589)] = L["Arcane"], -- Slow
[GetSpellInfo(12472)] = L["Frost"], -- Icy Veins [GetSpellInfo(12472)] = L["Frost"], -- Icy Veins
[GetSpellInfo(46989)] = L["Arcane"], -- Improved Blink
-- PALADIN -- PALADIN
[GetSpellInfo(31836)] = L["Holy"], -- Light's Grace [GetSpellInfo(31836)] = L["Holy"], -- Light's Grace
@ -43,12 +40,9 @@ local specBuffs = {
[GetSpellInfo(20375)] = L["Retribution"], -- Seal of Command [GetSpellInfo(20375)] = L["Retribution"], -- Seal of Command
[GetSpellInfo(20049)] = L["Retribution"], -- Vengeance [GetSpellInfo(20049)] = L["Retribution"], -- Vengeance
[GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura [GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura
[GetSpellInfo(26018)] = L["Retribution"], -- Vindication
[GetSpellInfo(27179)] = L["Protection"], -- Holy Shield
-- PRIEST -- PRIEST
[GetSpellInfo(15473)] = L["Shadow"], -- Shadowform [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
[GetSpellInfo(15286)] = L["Shadow"], -- Vampiric Embrace
[GetSpellInfo(45234)] = L["Discipline"], -- Focused Will [GetSpellInfo(45234)] = L["Discipline"], -- Focused Will
[GetSpellInfo(27811)] = L["Discipline"], -- Blessed Recovery [GetSpellInfo(27811)] = L["Discipline"], -- Blessed Recovery
[GetSpellInfo(33142)] = L["Holy"], -- Blessed Resilience [GetSpellInfo(33142)] = L["Holy"], -- Blessed Resilience
@ -64,22 +58,17 @@ local specBuffs = {
[GetSpellInfo(36563)] = L["Subtlety"], -- Shadowstep DMG [GetSpellInfo(36563)] = L["Subtlety"], -- Shadowstep DMG
[GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike [GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike
[GetSpellInfo(31233)] = L["Assassination"], -- Find Weakness [GetSpellInfo(31233)] = L["Assassination"], -- Find Weakness
[GetSpellInfo(13877)] = L["Combat"], -- Blade Flurry
--Shaman --Shaman
[GetSpellInfo(30807)] = L["Enhancement"], -- Unleashed Rage
[GetSpellInfo(16280)] = L["Enhancement"], -- Flurry
[GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
[GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
[GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
[GetSpellInfo(29202)] = L["Restoration"], -- Healing Way [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
-- WARLOCK -- WARLOCK
[GetSpellInfo(19028)] = L["Demonology"], -- Soul Link [GetSpellInfo(19028)] = L["Demonology"], -- Soul Link
[GetSpellInfo(23759)] = L["Demonology"], -- Master Demonologist [GetSpellInfo(23759)] = L["Demonology"], -- Master Demonologist
[GetSpellInfo(35696)] = L["Demonology"], -- Demonic Knowledge [GetSpellInfo(30302)] = L["Destruction"], -- Nether Protection
[GetSpellInfo(30300)] = L["Destruction"], -- Nether Protection [GetSpellInfo(34935)] = L["Destruction"], -- Backlash
[GetSpellInfo(34936)] = L["Destruction"], -- Backlash
-- WARRIOR -- WARRIOR
[GetSpellInfo(29838)] = L["Arms"], -- Second Wind [GetSpellInfo(29838)] = L["Arms"], -- Second Wind
@ -96,8 +85,7 @@ local specSpells = {
[GetSpellInfo(33983)] = L["Feral"], -- Mangle (Cat) [GetSpellInfo(33983)] = L["Feral"], -- Mangle (Cat)
[GetSpellInfo(33987)] = L["Feral"], -- Mangle (Bear) [GetSpellInfo(33987)] = L["Feral"], -- Mangle (Bear)
[GetSpellInfo(18562)] = L["Restoration"], -- Swiftmend [GetSpellInfo(18562)] = L["Restoration"], -- Swiftmend
[GetSpellInfo(17116)] = L["Restoration"], -- Nature's Swiftness [GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
[GetSpellInfo(33891)] = L["Restoration"], -- Tree of Life
-- HUNTER -- HUNTER
[GetSpellInfo(19577)] = L["Beast Mastery"], -- Intimidation [GetSpellInfo(19577)] = L["Beast Mastery"], -- Intimidation
@ -133,13 +121,11 @@ local specSpells = {
[GetSpellInfo(34861)] = L["Holy"], -- Circle of Healing [GetSpellInfo(34861)] = L["Holy"], -- Circle of Healing
[GetSpellInfo(15473)] = L["Shadow"], -- Shadowform [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
[GetSpellInfo(34917)] = L["Shadow"], -- Vampiric Touch [GetSpellInfo(34917)] = L["Shadow"], -- Vampiric Touch
[GetSpellInfo(15286)] = L["Shadow"], -- Vampiric Embrace
-- ROGUE -- ROGUE
[GetSpellInfo(34413)] = L["Assassination"], -- Mutilate [GetSpellInfo(34413)] = L["Assassination"], -- Mutilate
[GetSpellInfo(14177)] = L["Assassination"], -- Cold Blood [GetSpellInfo(14177)] = L["Assassination"], -- Cold Blood
[GetSpellInfo(13750)] = L["Combat"], -- Adrenaline Rush [GetSpellInfo(13750)] = L["Combat"], -- Adrenaline Rush
[GetSpellInfo(13877)] = L["Combat"], -- Blade Flurry
[GetSpellInfo(14185)] = L["Subtlety"], -- Preparation [GetSpellInfo(14185)] = L["Subtlety"], -- Preparation
[GetSpellInfo(16511)] = L["Subtlety"], -- Hemorrhage [GetSpellInfo(16511)] = L["Subtlety"], -- Hemorrhage
[GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep [GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep
@ -148,20 +134,16 @@ local specSpells = {
-- SHAMAN -- SHAMAN
[GetSpellInfo(16166)] = L["Elemental"], -- Elemental Mastery [GetSpellInfo(16166)] = L["Elemental"], -- Elemental Mastery
[GetSpellInfo(30706)] = L["Elemental"], -- Totem of Wrath
[GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
[GetSpellInfo(17364)] = L["Enhancement"], -- Stormstrike [GetSpellInfo(17364)] = L["Enhancement"], -- Stormstrike
[GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
[GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness --[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
-- WARLOCK -- WARLOCK
[GetSpellInfo(30405)] = L["Affliction"], -- Unstable Affliction [GetSpellInfo(30405)] = L["Affliction"], -- Unstable Affliction
[GetSpellInfo(18220)] = L["Affliction"], -- Dark Pact
--[GetSpellInfo(30911)] = L["Affliction"], -- Siphon Life --[GetSpellInfo(30911)] = L["Affliction"], -- Siphon Life
[GetSpellInfo(30414)] = L["Destruction"], -- Shadowfury [GetSpellInfo(30414)] = L["Destruction"], -- Shadowfury
[GetSpellInfo(30912)] = L["Destruction"], -- Conflagrate
[GetSpellInfo(18708)] = L["Demonology"], -- Fel Domination
-- WARRIOR -- WARRIOR
[GetSpellInfo(30330)] = L["Arms"], -- Mortal Strike [GetSpellInfo(30330)] = L["Arms"], -- Mortal Strike
@ -169,7 +151,6 @@ local specSpells = {
[GetSpellInfo(30335)] = L["Fury"], -- Bloodthirst [GetSpellInfo(30335)] = L["Fury"], -- Bloodthirst
[GetSpellInfo(12809)] = L["Protection"], -- Concussion Blow [GetSpellInfo(12809)] = L["Protection"], -- Concussion Blow
[GetSpellInfo(30022)] = L["Protection"], -- Devastation [GetSpellInfo(30022)] = L["Protection"], -- Devastation
[GetSpellInfo(30356)] = L["Protection"], -- Shield Slam
} }
function Gladdy:GetSpecSpells() function Gladdy:GetSpecSpells()
return specSpells return specSpells
@ -282,16 +263,6 @@ local importantAuras = {
onDamage = true, onDamage = true,
spellID = 19503, spellID = 19503,
}, },
-- Scare Beast
[GetSpellInfo(14327)] = {
track = AURA_TYPE_DEBUFF,
duration = 8,
priority = 40,
onDamage = true,
fear = true,
magic = true,
spellID = 14327,
},
-- Silencing Shot -- Silencing Shot
[GetSpellInfo(34490)] = { [GetSpellInfo(34490)] = {
track = AURA_TYPE_DEBUFF, track = AURA_TYPE_DEBUFF,
@ -308,11 +279,11 @@ local importantAuras = {
spellID = 19577, spellID = 19577,
}, },
-- The Beast Within -- The Beast Within
[GetSpellInfo(34471)] = { [GetSpellInfo(34692)] = {
track = AURA_TYPE_BUFF, track = AURA_TYPE_BUFF,
duration = 18, duration = 18,
priority = 20, priority = 20,
spellID = 34471, spellID = 34692,
}, },
@ -369,11 +340,6 @@ local importantAuras = {
priority = 20, priority = 20,
spellID = 45438, spellID = 45438,
}, },
[GetSpellInfo(41425)] = { -- Hypothermia (Ice Block Immune
track = AURA_TYPE_DEBUFF,
priority = 8,
spellID = 41425,
},
-- Impact -- Impact
[GetSpellInfo(12355)] = { [GetSpellInfo(12355)] = {
track = AURA_TYPE_DEBUFF, track = AURA_TYPE_DEBUFF,
@ -479,13 +445,6 @@ local importantAuras = {
priority = 10, priority = 10,
spellID = 33206, spellID = 33206,
}, },
-- Fear Ward
[GetSpellInfo(6346)] = {
track = AURA_TYPE_BUFF,
duration = 180,
priority = 9,
spellID = 6346,
},
-- Sap -- Sap
@ -556,13 +515,7 @@ local importantAuras = {
priority = 10, priority = 10,
spellID = 26669, spellID = 26669,
}, },
-- Riposte
[GetSpellInfo(14251)] = {
track = AURA_TYPE_DEBUFF,
duration = 6,
priority = 20,
spellID = 14251,
},
-- Fear -- Fear
[GetSpellInfo(5782)] = { [GetSpellInfo(5782)] = {
@ -626,7 +579,7 @@ local importantAuras = {
spellID = 24259, spellID = 24259,
}, },
-- Unstable Affliction Silence -- Unstable Affliction Silence
[select(1, GetSpellInfo(31117)) .. " Silence"] = { -- GetSpellInfo returns "Unstable Affliction" ["Unstable Affliction Silence"] = { -- GetSpellInfo returns "Unstable Affliction"
track = AURA_TYPE_DEBUFF, track = AURA_TYPE_DEBUFF,
altName = select(1, GetSpellInfo(31117)) .. " Silence", altName = select(1, GetSpellInfo(31117)) .. " Silence",
duration = 5, duration = 5,
@ -691,13 +644,6 @@ local importantAuras = {
spellSchool = "magic", spellSchool = "magic",
spellID = 12292, spellID = 12292,
}, },
--Disarm
[GetSpellInfo(676)] = {
track = AURA_TYPE_DEBUFF,
duration = 10,
priority = 20,
spellID = 676,
},
-- Grounding Totem Effect -- Grounding Totem Effect
[GetSpellInfo(8178)] = { [GetSpellInfo(8178)] = {
@ -759,49 +705,12 @@ local importantAuras = {
}, },
-- Shadowsight Buff -- Shadowsight Buff
[GetSpellInfo(34709)] = { [GetSpellInfo(34709)] = {
track = AURA_TYPE_DEBUFF, track = AURA_TYPE_BUFF,
duration = 15, duration = 15,
priority = 9, priority = 15,
magic = true, magic = true,
spellID = 34709, spellID = 34709,
}, },
-- Net-o-Matic
[GetSpellInfo(13120)] = {
track = AURA_TYPE_DEBUFF,
duration = 10,
priority = 30,
spellID = 13120,
},
-- Nigh Invulnerability Shield
[GetSpellInfo(30458)] = {
track = AURA_TYPE_BUFF,
duration = 8,
priority = 15,
spellID = 30458,
texture = select(10, GetItemInfo(23825))
},
-- Nigh Invulnerability Belt Backfire
[GetSpellInfo(30457)] = {
track = AURA_TYPE_DEBUFF,
duration = 8,
priority = 15,
spellID = 30457,
},
-- Flee (Skull of impending Doom) -- 5024
[GetSpellInfo(5024)] = {
track = AURA_TYPE_BUFF,
duration = 8,
priority = 15,
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() function Gladdy:GetImportantAuras()
return importantAuras return importantAuras
@ -821,13 +730,42 @@ function Gladdy:GetInterrupts()
return interrupts return interrupts
end 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 = { local cooldownList = {
-- Spell Name Cooldown[, Spec] -- Spell Name Cooldown[, Spec]
-- Mage -- Mage
["MAGE"] = { ["MAGE"] = {
[1953] = 15, -- Blink [1953] = 15, -- Blink
--[122] = 22, -- Frost Nova --[122] = 22, -- Frost Nova
[12051] = 480, --Evocation --[12051] = 480, --Evocation
[2139] = 24, -- Counterspell [2139] = 24, -- Counterspell
[45438] = { cd = 300, [L["Frost"]] = 240, }, -- Ice Block [45438] = { cd = 300, [L["Frost"]] = 240, }, -- Ice Block
[12472] = { cd = 180, spec = L["Frost"], }, -- Icy Veins [12472] = { cd = 180, spec = L["Frost"], }, -- Icy Veins
@ -859,8 +797,6 @@ local cooldownList = {
[10060] = { cd = 180, spec = L["Discipline"], }, -- Power Infusion [10060] = { cd = 180, spec = L["Discipline"], }, -- Power Infusion
[33206] = { cd = 120, spec = L["Discipline"], }, -- Pain Suppression [33206] = { cd = 120, spec = L["Discipline"], }, -- Pain Suppression
[34433] = 300, -- Shadowfiend [34433] = 300, -- Shadowfiend
[32379] = 12, -- Shadow Word: Death
[6346] = 180, -- Fear Ward
}, },
-- Druid -- Druid
@ -886,7 +822,6 @@ local cooldownList = {
[16166] = { cd = 180, spec = L["Elemental"], }, -- Elemental Mastery [16166] = { cd = 180, spec = L["Elemental"], }, -- Elemental Mastery
[16188] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness [16188] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness
[16190] = { cd = 300, spec = L["Restoration"], }, -- Mana Tide Totem [16190] = { cd = 300, spec = L["Restoration"], }, -- Mana Tide Totem
[8177] = 15, -- Grounding Totem
}, },
-- Paladin -- Paladin
@ -916,22 +851,20 @@ local cooldownList = {
["WARLOCK"] = { ["WARLOCK"] = {
[17928] = 40, -- Howl of Terror [17928] = 40, -- Howl of Terror
[27223] = 120, -- Death Coil [27223] = 120, -- Death Coil
[19647] = 24, -- Spell Lock --[19647] = { cd = 24 }, -- Spell Lock; how will I handle pet spells?
[27277] = 8, -- Devour Magic
[30414] = { cd = 20, spec = L["Destruction"], }, -- Shadowfury [30414] = { cd = 20, spec = L["Destruction"], }, -- Shadowfury
[17877] = { cd = 15, spec = L["Destruction"], }, -- Shadowburn [17877] = { cd = 15, spec = L["Destruction"], }, -- Shadowburn
[30912] = { cd = 10, spec = L["Destruction"], }, -- Conflagrate
[18708] = { cd = 900, spec = L["Demonology"], }, -- Feldom [18708] = { cd = 900, spec = L["Demonology"], }, -- Feldom
}, },
-- Warrior -- Warrior
["WARRIOR"] = { ["WARRIOR"] = {
[6552] = { cd = 10, -- Pummel --[[6552] = { cd = 10, -- Pummel
sharedCD = { sharedCD = {
[72] = true, [72] = true,
}, },
}, },
--[[72] = { cd = 12, -- Shield Bash [72] = { cd = 12, -- Shield Bash
sharedCD = { sharedCD = {
[6552] = true, [6552] = true,
}, },
@ -943,7 +876,6 @@ local cooldownList = {
[18499] = 30, -- Berserker Rage [18499] = 30, -- Berserker Rage
--[2565] = 60, -- Shield Block --[2565] = 60, -- Shield Block
[12292] = { cd = 180, spec = L["Arms"], }, -- Death Wish [12292] = { cd = 180, spec = L["Arms"], }, -- Death Wish
[20252] = { cd = 25, [L["Arms"]] = 15 }, -- Intercept
[12975] = { cd = 180, spec = L["Protection"], }, -- Last Stand [12975] = { cd = 180, spec = L["Protection"], }, -- Last Stand
[12809] = { cd = 30, spec = L["Protection"], }, -- Concussion Blow [12809] = { cd = 30, spec = L["Protection"], }, -- Concussion Blow
@ -952,38 +884,29 @@ local cooldownList = {
-- Hunter -- Hunter
["HUNTER"] = { ["HUNTER"] = {
[19503] = 30, -- Scatter Shot [19503] = 30, -- Scatter Shot
[14327] = 30, -- Scare Beast
[19263] = 300, -- Deterrence; not on BM but can't do 2 specs [19263] = 300, -- Deterrence; not on BM but can't do 2 specs
[13809] = { cd = 30, -- Frost Trap
sharedCD = {
[14311] = true, -- Freezing Trap
[34600] = true, -- Snake Trap
},
icon = select(3, GetSpellInfo(14311)),
},
[14311] = { cd = 30, -- Freezing Trap [14311] = { cd = 30, -- Freezing Trap
sharedCD = { sharedCD = {
[13809] = true, -- Frost Trap [13809] = true, -- Frost Trap
[34600] = true, -- Snake Trap [34600] = true, -- Snake Trap
}, },
icon = select(3, GetSpellInfo(14311)), },
[13809] = { cd = 30, -- Frost Trap
sharedCD = {
[14311] = true, -- Freezing Trap
[34600] = true, -- Snake Trap
},
}, },
[34600] = { cd = 30, -- Snake Trap [34600] = { cd = 30, -- Snake Trap
sharedCD = { sharedCD = {
[14311] = true, -- Freezing Trap [14311] = true, -- Freezing Trap
[13809] = true, -- Frost Trap [13809] = true, -- Frost Trap
}, },
icon = select(3, GetSpellInfo(14311)),
}, },
[34490] = { cd = 20, spec = L["Marksmanship"], }, -- Silencing Shot [34490] = { cd = 20, spec = L["Marksmanship"], }, -- Silencing Shot
[19386] = { cd = 120, spec = L["Survival"], }, -- Wyvern Sting [19386] = { cd = 60, spec = L["Survival"], }, -- Wyvern Sting
[19577] = { cd = 60, spec = L["Beast Mastery"], }, -- Intimidation [19577] = { cd = 60, spec = L["Beast Mastery"], }, -- Intimidation
[34471] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within [38373] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within
[5384] = 30, -- Feign Death
[3034] = 15, -- Viper Sting
[1543] = 20, -- Flare
}, },
-- Rogue -- Rogue
@ -1025,19 +948,19 @@ local cooldownList = {
}, },
["NightElf"] = { ["NightElf"] = {
[2651] = { cd = 180, spec = L["Discipline"], class = "PRIEST"}, -- Elune's Grace [2651] = { cd = 180, spec = L["Discipline"], }, -- Elune's Grace
[10797] = { cd = 30, spec = L["Discipline"], class = "PRIEST"}, -- Star Shards [10797] = { cd = 30, spec = L["Discipline"], }, -- Star Shards
}, },
["Draenei"] = { ["Draenei"] = {
[32548] = { cd = 300, spec = L["Discipline"], class = "PRIEST"}, -- Hymn of Hope [32548] = { cd = 300, spec = L["Discipline"], }, -- Hymn of Hope
}, },
["Human"] = { ["Human"] = {
[13908] = { cd = 600, spec = L["Discipline"], class = "PRIEST"}, -- Desperate Prayer [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
}, },
["Gnome"] = { ["Gnome"] = {
}, },
["Dwarf"] = { ["Dwarf"] = {
[13908] = { cd = 600, spec = L["Discipline"], class = "PRIEST"}, -- Desperate Prayer [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
}, },
} }
function Gladdy:GetCooldownList() function Gladdy:GetCooldownList()
@ -1114,62 +1037,73 @@ function Gladdy:Racials()
return racials return racials
end end
local arenaTimer = {
--------------------- ["default"] = {
-- TOTEM STUFF [61] = "One minute until the Arena battle begins!",
--------------------- [31] = "Thirty seconds until the Arena battle begins!",
[16] = "Fifteen seconds until the Arena battle begins!",
local totemData = { [0] = "The Arena battle has begun!",
-- Fire },
-- Water ["esES"] = {
[string_lower("Poison Cleansing Totem")] = {id = 8166,texture = select(3, GetSpellInfo(8166)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 5}, [61] = "¡Un minuto hasta que dé comienzo la batalla en arena!",
[string_lower("Mana Spring Totem")] = {id = 5675,texture = select(3, GetSpellInfo(5675)), color = {r = 0, g = 0, b = 0, a = 1}, pulse = 2}, [31] = "¡Treinta segundos hasta que comience la batalla en arena!",
-- Earth [16] = "¡Quince segundos hasta que comience la batalla en arena!",
-- Air [0] = "¡La batalla en arena ha comenzado!",
[string_lower("Grace of Air Totem")] = {id = 8835,texture = select(3, GetSpellInfo(8835)), 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}}, ["ptBR"] = {
[string_lower("Tranquil Air Totem")] = {id = 25908,texture = select(3, GetSpellInfo(25908)), color = {r = 0, g = 0, b = 0, a = 1}}, [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"] = {
[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"] = {
[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"]
local totemSpellIdToPulse = { function Gladdy:GetArenaTimer()
[GetSpellInfo(totemData[string_lower("Poison Cleansing Totem")].id)] = totemData[string_lower("Poison Cleansing Totem")].pulse, if arenaTimer[GetLocale()] then
[8166] = totemData[string_lower("Poison Cleansing Totem")].pulse, return arenaTimer[GetLocale()]
[GetSpellInfo(totemData[string_lower("Mana Spring Totem")].id)] = totemData[string_lower("Mana Spring Totem")].pulse, else
[5675] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 1 return arenaTimer["default"]
[10495] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 2 end
[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
[58771] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 6
[58773] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 7
[58774] = totemData[string_lower("Mana Spring Totem")].pulse, -- Rank 8
}
local totemNpcIdsToTotemData = {
--fire
-- Water
[5923] = totemData[string_lower("Poison Cleansing Totem")],
[22487] = totemData[string_lower("Poison Cleansing Totem")],
-- Earth
-- Air
[7486] = totemData[string_lower("Grace of Air Totem")],
[7487] = totemData[string_lower("Grace of Air Totem")],
[15463] = totemData[string_lower("Grace of Air 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")],
[15803] = totemData[string_lower("Tranquil Air Totem")],
}
local totemDataShared, totemNpcIdsToTotemDataShared, totemSpellIdToPulseShared = Gladdy:GetSharedTotemData()
Gladdy:AddEntriesToTable(totemData, totemDataShared)
Gladdy:AddEntriesToTable(totemNpcIdsToTotemData, totemNpcIdsToTotemDataShared)
Gladdy:AddEntriesToTable(totemSpellIdToPulse, totemSpellIdToPulseShared)
function Gladdy:GetTotemData()
return totemData, totemNpcIdsToTotemData, totemSpellIdToPulse
end end

File diff suppressed because it is too large Load Diff

View File

@ -1,641 +0,0 @@
local tbl_sort, select, string_lower = table.sort, select, string.lower
local GetLocale = GetLocale
local GetSpellInfo = GetSpellInfo
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",
}
Gladdy.exceptionNames = {
[50334] = (GetSpellInfo(50334) or "...") .. " Feral", -- Berserk
[30151] = select(1, GetSpellInfo(30151)) .. " Felguard", -- Intercept
[30194] = select(1, GetSpellInfo(30151)) .. " Felguard", -- Intercept
[30198] = select(1, GetSpellInfo(30151)) .. " Felguard", -- Intercept
[47996] = select(1, GetSpellInfo(30151)) .. " Felguard", -- Intercept
[31117] = select(1, GetSpellInfo(30405)) .. " Silence", -- Unstable Affliction Silence
[43523] = select(1, GetSpellInfo(30405)) .. " Silence",
[24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot
[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)),
[19972] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[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)),
}
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
---------------------
-- 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("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}, pulse = 3 },
[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("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("Wrath of Air Totem")] = {id = 3738,texture = select(3, GetSpellInfo(3738)), 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("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
[58731] = totemData[string_lower("Magma Totem")].pulse, -- Rank 6
[58734] = totemData[string_lower("Magma Totem")].pulse, -- Rank 7
[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
[58755] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 7
[58756] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 8
[58757] = totemData[string_lower("Healing Stream Totem")].pulse, -- Rank 9
[GetSpellInfo(totemData[string_lower("Mana Tide Totem")].id)] = totemData[string_lower("Mana Tide Totem")].pulse,
[16190] = totemData[string_lower("Mana Tide Totem")].pulse, -- Rank 1
[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
[58580] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 8
[58581] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 9
[58582] = totemData[string_lower("Stoneclaw Totem")].pulse, -- Rank 10
}
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")],
[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")],
[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")],
[15447] = totemData[string_lower("Wrath of Air Totem")],
[36556] = totemData[string_lower("Wrath of Air Totem")],
}
function Gladdy:GetSharedTotemData()
return totemData, totemNpcIdsToTotemData, totemSpellIdToPulse
end

View File

@ -1,23 +1,19 @@
local select, string_gsub, tostring, pairs, ipairs = select, string.gsub, tostring, pairs, ipairs local select, string_gsub, tostring = select, string.gsub, tostring
local wipe = wipe
local unpack = unpack
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
local AURA_TYPE_BUFF = AURA_TYPE_BUFF local AURA_TYPE_BUFF = AURA_TYPE_BUFF
local UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists = UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists local UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit = UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit
local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local FindAuraByName = AuraUtil.FindAuraByName local FindAuraByName = AuraUtil.FindAuraByName
local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local Cooldowns = Gladdy.modules["Cooldowns"] local Cooldowns = Gladdy.modules["Cooldowns"]
local Diminishings = Gladdy.modules["Diminishings"] local Diminishings = Gladdy.modules["Diminishings"]
local EventListener = Gladdy:NewModule("EventListener", 101, { local EventListener = Gladdy:NewModule("EventListener", nil, {
test = true, test = true,
}) })
@ -36,18 +32,6 @@ function EventListener:JOINED_ARENA()
self:RegisterEvent("UNIT_SPELLCAST_START") self:RegisterEvent("UNIT_SPELLCAST_START")
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
-- in case arena has started already we check for units
for i=1,Gladdy.curBracket do
if Gladdy.buttons["arena"..i].lastAuras then
wipe(Gladdy.buttons["arena"..i].lastAuras)
end
if UnitExists("arena" .. i) then
Gladdy:SpotEnemy("arena" .. i, true)
end
if UnitExists("arenapet" .. i) then
Gladdy:SendMessage("PET_SPOTTED", "arenapet" .. i)
end
end
self:SetScript("OnEvent", EventListener.OnEvent) self:SetScript("OnEvent", EventListener.OnEvent)
end end
@ -56,53 +40,34 @@ function EventListener:Reset()
self:SetScript("OnEvent", nil) self:SetScript("OnEvent", nil)
end end
function Gladdy:DetectSpec(unit, specSpell)
if specSpell then
self.modules["Cooldowns"]:DetectSpec(unit, specSpell)
end
end
function Gladdy:SpotEnemy(unit, auraScan) function Gladdy:SpotEnemy(unit, auraScan)
local button = self.buttons[unit] local button = self.buttons[unit]
if not unit or not button then
return
end
if UnitExists(unit) then
button.raceLoc = UnitRace(unit) button.raceLoc = UnitRace(unit)
button.race = select(2, UnitRace(unit)) button.race = select(2, UnitRace(unit))
button.classLoc = select(1, UnitClass(unit)) button.classLoc = select(1, UnitClass(unit))
button.class = select(2, UnitClass(unit)) button.class = select(2, UnitClass(unit))
button.name = UnitName(unit) button.name = UnitName(unit)
button.stealthed = false
Gladdy.guids[UnitGUID(unit)] = unit Gladdy.guids[UnitGUID(unit)] = unit
end
if button.class and button.race then
Gladdy:SendMessage("ENEMY_SPOTTED", unit) Gladdy:SendMessage("ENEMY_SPOTTED", unit)
end
if auraScan and not button.spec then if auraScan and not button.spec then
Gladdy:SendMessage("AURA_FADE", unit, "HELPFUL")
for n = 1, 30 do for n = 1, 30 do
local spellName, texture, count, dispelType, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, n, "HELPFUL") local spellName,_,_,_,_,_,unitCaster = UnitAura(unit, n, "HELPFUL")
if ( not spellName ) then if ( not spellName ) then
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, AURA_TYPE_BUFF, n - 1)
break break
end end
if Gladdy.specBuffs[spellName] then
if Gladdy.exceptionNames[spellID] then
spellName = Gladdy.exceptionNames[spellID]
end
if Gladdy.specBuffs[spellName] and unitCaster then -- Check for auras that detect a spec
local unitPet = string_gsub(unit, "%d$", "pet%1") local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
EventListener:DetectSpec(unit, Gladdy.specBuffs[spellName]) Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end end
end end
if Gladdy.cooldownBuffs[spellName] and unitCaster then -- Check for auras that detect used CDs (like Fear Ward)
for arenaUnit,v in pairs(self.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, Gladdy.cooldownBuffs[spellName].spellId, Gladdy.cooldownBuffs[spellName].cd(expirationTime - GetTime()))
-- /run LibStub("Gladdy").modules["Cooldowns"]:CooldownUsed("arena5", "PRIEST", 6346, 10)
end
end
end
if Gladdy.cooldownBuffs.racials[spellName] and Gladdy.cooldownBuffs.racials[spellName] then
Gladdy:SendMessage("RACIAL_USED", unit, spellName, Gladdy.cooldownBuffs.racials[spellName].cd(expirationTime - GetTime()), spellName)
end
Gladdy:SendMessage("AURA_GAIN", unit, AURA_TYPE_BUFF, spellID, spellName, texture, duration, expirationTime, count, dispelType, n, unitCaster)
end end
end end
end end
@ -110,90 +75,55 @@ end
function EventListener:COMBAT_LOG_EVENT_UNFILTERED() function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
-- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool -- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo() local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo()
local srcUnit = Gladdy.guids[sourceGUID] -- can be a PET local srcUnit = Gladdy.guids[sourceGUID]
local destUnit = Gladdy.guids[destGUID] -- can be a PET local destUnit = Gladdy.guids[destGUID]
if (Gladdy.db.shadowsightTimerEnabled and eventType == "SPELL_AURA_APPLIED" and spellID == 34709) then
Gladdy.modules["Shadowsight Timer"]:AURA_GAIN(nil, nil, 34709)
end
if Gladdy.exceptionNames[spellID] then
spellName = Gladdy.exceptionNames[spellID]
end
if destUnit then if destUnit then
-- diminish tracker -- diminish tracker
if Gladdy.buttons[destUnit] and Gladdy.db.drEnabled and extraSpellId == AURA_TYPE_DEBUFF then if (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then
if (eventType == "SPELL_AURA_REMOVED") then
Diminishings:AuraFade(destUnit, spellID) Diminishings:AuraFade(destUnit, spellID)
end 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 -- death detection
if (eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then if (eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
if not Gladdy:isFeignDeath(destUnit) then
Gladdy:SendMessage("UNIT_DEATH", destUnit) Gladdy:SendMessage("UNIT_DEATH", destUnit)
end end
end
-- spec detection -- spec detection
if Gladdy.buttons[destUnit] and (not Gladdy.buttons[destUnit].class or not Gladdy.buttons[destUnit].race) then if not Gladdy.buttons[destUnit].class then
Gladdy:SpotEnemy(destUnit, true) Gladdy:SpotEnemy(destUnit, true)
end end
--interrupt detection --interrupt detection
if Gladdy.buttons[destUnit] and eventType == "SPELL_INTERRUPT" then if eventType == "SPELL_INTERRUPT" then
Gladdy:SendMessage("SPELL_INTERRUPT", destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool) Gladdy:SendMessage("SPELL_INTERRUPT", destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
end end
end end
if srcUnit then if srcUnit then
srcUnit = string_gsub(srcUnit, "pet", "") if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED") then
if (not UnitExists(srcUnit)) then local unitRace = Gladdy.buttons[srcUnit].race
return
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
self:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_MISSED") then
-- cooldown tracker -- cooldown tracker
if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then
local unitClass local unitClass
local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank 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) if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
spellId = spellID
end
if Gladdy.db.cooldownCooldowns[tostring(spellId)] and (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_MISSED" or eventType == "SPELL_DODGED") then
if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
unitClass = Gladdy.buttons[srcUnit].class unitClass = Gladdy.buttons[srcUnit].class
else else
unitClass = Gladdy.buttons[srcUnit].race unitClass = Gladdy.buttons[srcUnit].race
end end
if spellID ~= 16188 and spellID ~= 17116 and spellID ~= 16166 and spellID ~= 12043 and spellID ~= 5384 then -- Nature's Swiftness CD starts when buff fades Cooldowns:CooldownUsed(srcUnit, unitClass, spellId, spellName)
Gladdy:Debug("INFO", eventType, "- CooldownUsed", srcUnit, "spellID:", spellID) Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
Cooldowns:CooldownUsed(srcUnit, unitClass, spellId)
end 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
end end
if (eventType == "SPELL_AURA_REMOVED" and (spellID == 16188 or spellID == 17116 or spellID == 16166 or spellID == 12043) and Gladdy.buttons[srcUnit].class) then
Gladdy:Debug("INFO", "SPELL_AURA_REMOVED - CooldownUsed", srcUnit, "spellID:", spellID) if not Gladdy.buttons[srcUnit].class then
Cooldowns:CooldownUsed(srcUnit, Gladdy.buttons[srcUnit].class, spellID) Gladdy:SpotEnemy(srcUnit, true)
end
if (eventType == "SPELL_AURA_REMOVED" and Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName]) then
local unit = Gladdy:GetArenaUnit(srcUnit, true)
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 unit then
--Gladdy:Debug("INFO", "EL:CL:SPELL_AURA_REMOVED (srcUnit)", "Cooldowns:AURA_FADE", unit, spellId)
Cooldowns:AURA_FADE(unit, spellId)
end end
if not Gladdy.buttons[srcUnit].spec then
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end end
end end
end end
@ -201,17 +131,14 @@ end
function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason) function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
--[[ updateReason: seen, unseen, destroyed, cleared ]] --[[ updateReason: seen, unseen, destroyed, cleared ]]
unit = Gladdy:GetArenaUnit(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
local pet = Gladdy.modules["Pets"].frames[unit] local pet = Gladdy.modules["Pets"].frames[unit]
Gladdy:Debug("INFO", "ARENA_OPPONENT_UPDATE", unit, updateReason)
if button or pet then if button or pet then
if updateReason == "seen" then if updateReason == "seen" then
-- ENEMY_SPOTTED -- ENEMY_SPOTTED
if button then if button then
button.stealthed = false
Gladdy:SendMessage("ENEMY_STEALTH", unit, false) Gladdy:SendMessage("ENEMY_STEALTH", unit, false)
if not button.class or not button.race then if not button.class then
Gladdy:SpotEnemy(unit, true) Gladdy:SpotEnemy(unit, true)
end end
end end
@ -221,7 +148,6 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
elseif updateReason == "unseen" then elseif updateReason == "unseen" then
-- STEALTH -- STEALTH
if button then if button then
button.stealthed = true
Gladdy:SendMessage("ENEMY_STEALTH", unit, true) Gladdy:SendMessage("ENEMY_STEALTH", unit, true)
end end
if pet then if pet then
@ -241,118 +167,60 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
end end
end end
Gladdy.cooldownBuffs = { local exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB
[GetSpellInfo(6346)] = { cd = function(expTime) -- 180s uptime == cd [31117] = GetSpellInfo(30405) .. " Silence", -- Unstable Affliction Silence
return expTime [43523] = GetSpellInfo(30405) .. " Silence",
end, spellId = 6346 }, -- Fear Ward [24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot
[GetSpellInfo(11305)] = { cd = function(expTime) -- 15s uptime [24134] = select(1, GetSpellInfo(19386)) .. " Dot",
return 300 - (15 - expTime) [24135] = select(1, GetSpellInfo(19386)) .. " Dot",
end, spellId = 11305 }, -- Sprint [27069] = select(1, GetSpellInfo(19386)) .. " Dot",
[36554] = { cd = function(expTime) -- 3s uptime [19975] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)), -- Entangling Roots Nature's Grasp
return 30 - (3 - expTime) [19974] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
end, spellId = 36554 }, -- Shadowstep speed buff [19973] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[36563] = { cd = function(expTime) -- 10s uptime [19972] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
return 30 - (10 - expTime) [19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
end, spellId = 36554 }, -- Shadowstep dmg buff [19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[GetSpellInfo(26889)] = { cd = function(expTime) -- 3s uptime [27010] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
return 180 - (10 - expTime)
end, spellId = 26889 }, -- Vanish
racials = {
[GetSpellInfo(20600)] = { cd = function(expTime) -- 20s uptime
return GetTime() - (20 - expTime)
end, spellId = 20600 }, -- Perception
}
} }
--[[
/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)
--]]
function EventListener:UNIT_AURA(unit, isFullUpdate, updatedAuras)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if not button then if not button then
return return
end end
if not button.auras then
button.auras = {}
end
wipe(button.auras)
if not button.lastAuras then
button.lastAuras = {}
end
Gladdy:Debug("INFO", "AURA_FADE", unit, AURA_TYPE_BUFF, AURA_TYPE_DEBUFF)
Gladdy:SendMessage("AURA_FADE", unit, AURA_TYPE_BUFF)
Gladdy:SendMessage("AURA_FADE", unit, AURA_TYPE_DEBUFF)
for i = 1, 2 do for i = 1, 2 do
if not Gladdy.buttons[unit].class or not Gladdy.buttons[unit].race then if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, false) Gladdy:SpotEnemy(unit, false)
end end
local filter = (i == 1 and "HELPFUL" or "HARMFUL") local filter = (i == 1 and "HELPFUL" or "HARMFUL")
local auraType = i == 1 and AURA_TYPE_BUFF or AURA_TYPE_DEBUFF local auraType = i == 1 and AURA_TYPE_BUFF or AURA_TYPE_DEBUFF
Gladdy:SendMessage("AURA_FADE", unit, auraType)
for n = 1, 30 do for n = 1, 30 do
local spellName, texture, count, dispelType, duration, expirationTime, unitCaster, _, shouldConsolidate, spellID = UnitAura(unit, n, filter) local spellName, texture, count, debuffType, duration, expirationTime, unitCaster, _, shouldConsolidate, spellID = UnitAura(unit, n, filter)
if ( not spellID ) then if ( not spellID ) then
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1) Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1)
break break
end end
if Gladdy.exceptionNames[spellID] then if not button.spec and Gladdy.specBuffs[spellName] then
spellName = Gladdy.exceptionNames[spellID]
end
button.auras[spellID] = { auraType, spellID, spellName, texture, duration, expirationTime, count, dispelType }
if not button.spec and Gladdy.specBuffs[spellName] and unitCaster then
local unitPet = string_gsub(unit, "%d$", "pet%1") local unitPet = string_gsub(unit, "%d$", "pet%1")
if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
self:DetectSpec(unit, Gladdy.specBuffs[spellName]) Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end end
end end
if (Gladdy.cooldownBuffs[spellName] or Gladdy.cooldownBuffs[spellID]) and unitCaster then -- Check for auras that hint used CDs (like Fear Ward) if exceptionNames[spellID] then
local cooldownBuff = Gladdy.cooldownBuffs[spellID] or Gladdy.cooldownBuffs[spellName] spellName = exceptionNames[spellID]
for arenaUnit,v in pairs(Gladdy.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, cooldownBuff.spellId, cooldownBuff.cd(expirationTime - GetTime()))
end end
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i)
Gladdy:Call("Announcements", "CheckDrink", unit, spellName)
end end
end end
if Gladdy.cooldownBuffs.racials[spellName] then
Gladdy:SendMessage("RACIAL_USED", unit, spellName, Gladdy.cooldownBuffs.racials[spellName].cd(expirationTime - GetTime()), spellName)
end
Gladdy:Debug("INFO", "AURA_GAIN", unit, auraType, spellName)
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, dispelType, i, unitCaster)
end
end
-- check auras
for spellID,v in pairs(button.lastAuras) do
if not button.auras[spellID] then
if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[v[3]] then
local spellId = Cooldowns.cooldownSpellIds[v[3]] -- 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
--Gladdy:Debug("INFO", "EL:UNIT_AURA Cooldowns:AURA_FADE", unit, spellId)
Cooldowns:AURA_FADE(unit, spellId)
if spellID == 5384 then -- Feign Death CD Detection needs this
Cooldowns:CooldownUsed(unit, Gladdy.buttons[unit].class, 5384)
end
end
end
end
wipe(button.lastAuras)
button.lastAuras = Gladdy:DeepCopy(button.auras)
end
function EventListener:UpdateAuras(unit)
local button = Gladdy.buttons[unit]
if not button or button.lastAuras then
return
end
for i=1, #button.lastAuras do
Gladdy.modules["Auras"]:AURA_GAIN(unit, unpack(button.lastAuras[i]))
end
end end
function EventListener:UNIT_SPELLCAST_START(unit) function EventListener:UNIT_SPELLCAST_START(unit)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit) local spellName = UnitCastingInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
self:DetectSpec(unit, Gladdy.specSpells[spellName]) Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
end end
end end
end end
@ -361,81 +229,16 @@ function EventListener:UNIT_SPELLCAST_CHANNEL_START(unit)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local spellName = UnitChannelInfo(unit) local spellName = UnitChannelInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
self:DetectSpec(unit, Gladdy.specSpells[spellName]) Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
end end
end end
end end
function EventListener:UNIT_SPELLCAST_SUCCEEDED(...) function EventListener:UNIT_SPELLCAST_SUCCEEDED(unit)
local unit, castGUID, spellID = ...
unit = Gladdy:GetArenaUnit(unit, true)
if Gladdy.buttons[unit] then if Gladdy.buttons[unit] then
local unitRace = Gladdy.buttons[unit].race local spellName = UnitCastingInfo(unit)
local spellName = GetSpellInfo(spellID) if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
if Gladdy.exceptionNames[spellID] then
spellName = Gladdy.exceptionNames[spellID]
end
-- spec detection
if spellName and Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
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 unitRace and 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
--cooldown
local unitClass
if (Gladdy:GetCooldownList()[Gladdy.buttons[unit].class][unit]) then
unitClass = Gladdy.buttons[unit].class
else
unitClass = Gladdy.buttons[unit].race
end
if spellID ~= 16188 and spellID ~= 17116 and spellID ~= 16166 and spellID ~= 12043 and spellID ~= 5384 then -- Nature's Swiftness CD starts when buff fades
Gladdy:Debug("INFO", "UNIT_SPELLCAST_SUCCEEDED", "- CooldownUsed", unit, "spellID:", spellID)
Cooldowns:CooldownUsed(unit, unitClass, spellID)
end end
end 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 not 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

315
Frame.lua
View File

@ -1,9 +1,6 @@
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local UIParent = UIParent local UIParent = UIParent
local InCombatLockdown = InCombatLockdown local InCombatLockdown = InCombatLockdown
local math_abs = math.abs
local pairs = pairs
local LibStub = LibStub
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
@ -31,8 +28,6 @@ Gladdy.BUTTON_DEFAULTS = {
stealthed = false, stealthed = false,
classColors = {}, classColors = {},
lastState = 0, lastState = 0,
auras = {},
lastAuras = {}
} }
function Gladdy:CreateFrame() function Gladdy:CreateFrame()
@ -41,7 +36,7 @@ function Gladdy:CreateFrame()
self.frame.background = CreateFrame("Frame", nil, self.frame, BackdropTemplateMixin and "BackdropTemplate") self.frame.background = CreateFrame("Frame", nil, self.frame, BackdropTemplateMixin and "BackdropTemplate")
self.frame.background:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = false, tileSize = 16}) self.frame.background:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = false, tileSize = 16})
self.frame.background:SetFrameStrata("BACKGROUND") self.frame.background:SetFrameStrata("BACKGROUND")
self.frame.background:SetBackdropColor(Gladdy:SetColor(self.db.backgroundColor)) self.frame.background:SetBackdropColor(self.db.backgroundColor.r, self.db.backgroundColor.g, self.db.backgroundColor.b, self.db.backgroundColor.a)
self.frame.background:SetAllPoints(self.frame) self.frame.background:SetAllPoints(self.frame)
--self.frame.texture = self.frame:CreateTexture(nil, "OVERLAY") --self.frame.texture = self.frame:CreateTexture(nil, "OVERLAY")
--self.frame.texture:SetAllPoints(self.frame) --self.frame.texture:SetAllPoints(self.frame)
@ -50,7 +45,7 @@ function Gladdy:CreateFrame()
self.frame:SetClampedToScreen(true) self.frame:SetClampedToScreen(true)
self.frame:EnableMouse(false) self.frame:EnableMouse(false)
self.frame:SetMovable(true) self.frame:SetMovable(true)
--self.frame:RegisterForDrag("LeftButton") self.frame:RegisterForDrag("LeftButton")
self.frame:SetScript("OnDragStart", function(f) self.frame:SetScript("OnDragStart", function(f)
if (not InCombatLockdown() and not self.db.locked) then if (not InCombatLockdown() and not self.db.locked) then
@ -63,7 +58,7 @@ function Gladdy:CreateFrame()
local scale = f:GetEffectiveScale() local scale = f:GetEffectiveScale()
self.db.x = f:GetLeft() * scale self.db.x = f:GetLeft() * scale
self.db.y = (self.db.growDirection == "TOP" and f:GetBottom() or f:GetTop()) * scale self.db.y = (self.db.growUp and f:GetBottom() or f:GetTop()) * scale
end end
end) end)
@ -87,7 +82,7 @@ function Gladdy:CreateFrame()
local scale = self.frame:GetEffectiveScale() local scale = self.frame:GetEffectiveScale()
self.db.x = self.frame:GetLeft() * scale self.db.x = self.frame:GetLeft() * scale
self.db.y = (self.db.growDirection == "TOP" and self.frame:GetBottom() or self.frame:GetTop()) * scale self.db.y = (self.db.growUp and self.frame:GetBottom() or self.frame:GetTop()) * scale
end end
end) end)
self.anchor:SetScript("OnClick", function() self.anchor:SetScript("OnClick", function()
@ -131,53 +126,96 @@ function Gladdy:UpdateFrame()
local highlightBorderSize = (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2) local highlightBorderSize = (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2)
local powerBarHeight = self.db.powerBarEnabled and (self.db.powerBarHeight + 1) or 0 local powerBarHeight = self.db.powerBarEnabled and (self.db.powerBarHeight + 1) or 0
local leftSize = 0
local rightSize = 0
--Trinket + Racial
if self.db.trinketEnabled and self.db.trinketPos == "LEFT" then
leftSize = leftSize + self.db.trinketSize * self.db.trinketWidthFactor + self.db.padding
if self.db.racialEnabled and self.db.racialAnchor == "trinket" and self.db.racialPos == "LEFT" then
leftSize = leftSize + self.db.racialSize * self.db.racialWidthFactor + self.db.padding
end
end
if self.db.trinketEnabled and self.db.trinketPos == "RIGHT" then
rightSize = rightSize + self.db.trinketSize * self.db.trinketWidthFactor + self.db.padding
if self.db.racialEnabled and self.db.racialAnchor == "trinket" and self.db.racialPos == "RIGHT" then
rightSize = rightSize + self.db.racialSize * self.db.racialWidthFactor + self.db.padding
end
end
--ClassIcon
if self.db.classIconPos == "LEFT" then
leftSize = leftSize + self.db.classIconSize * self.db.classIconWidthFactor + self.db.padding
else
rightSize = rightSize + self.db.classIconSize * self.db.classIconWidthFactor + self.db.padding
end
--Highlight
if not self.db.highlightInset then
leftSize = leftSize + self.db.highlightBorderSize
rightSize = rightSize + self.db.highlightBorderSize
end
local margin = powerBarHeight local margin = powerBarHeight
local width = self.db.barWidth + leftSize + rightSize
local height = (self.db.healthBarHeight + powerBarHeight) * teamSize local height = (self.db.healthBarHeight + powerBarHeight) * teamSize
+ (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2 * teamSize) + (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2 * teamSize)
+ self.db.bottomMargin * (teamSize - 1) + 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 -- Highlight
margin = margin + highlightBorderSize margin = margin + highlightBorderSize
margin, height = Gladdy:LegacyPositioning(margin, height, teamSize)
if (self.db.cooldownYPos == "TOP" or self.db.cooldownYPos == "BOTTOM") and self.db.cooldown then
margin = margin + self.db.cooldownSize
height = height + self.db.cooldownSize * (teamSize - 1)
end
if (self.db.buffsCooldownPos == "TOP" or self.db.buffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsIconSize
height = height + self.db.buffsIconSize * (teamSize - 1)
end
if (self.db.buffsBuffsCooldownPos == "TOP" or self.db.buffsBuffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsBuffsIconSize
height = height + self.db.buffsBuffsIconSize * (teamSize - 1)
end
if self.db.buffsCooldownPos == "TOP" and self.db.cooldownYPos == "TOP" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
if self.db.buffsCooldownPos == "BOTTOM" and self.db.cooldownYPos == "BOTTOM" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
-- GrowDirection -- GrowDirection
if (self.db.growDirection == "LEFT" or self.db.growDirection == "RIGHT") then if (self.db.growDirection == "LEFT" or self.db.growDirection == "RIGHT") then
width = self.db.barWidth * teamSize + (leftSize + rightSize) * teamSize + self.db.bottomMargin * (teamSize - 1)
height = self.db.healthBarHeight + powerBarHeight height = self.db.healthBarHeight + powerBarHeight
end end
self.frame:SetScale(self.db.frameScale) self.frame:SetScale(self.db.frameScale)
self:PixelPerfectScale(false) self.frame:SetWidth(width)
self.frame:SetWidth(self.db.barWidth + highlightBorderSize)
self.frame:SetHeight(height) self.frame:SetHeight(height)
self.frame:ClearAllPoints() self.frame:ClearAllPoints()
self.frame.background:SetBackdropColor(Gladdy:SetColor(self.db.backgroundColor)) self.frame.background:SetBackdropColor(self.db.backgroundColor.r, self.db.backgroundColor.g, self.db.backgroundColor.b, self.db.backgroundColor.a)
--self.frame:SetBackdropColor(self.db.frameColor.r, self.db.frameColor.g, self.db.frameColor.b, self.db.frameColor.a)
self.frame:ClearAllPoints() self.frame:ClearAllPoints()
if (self.db.x == 0 and self.db.y == 0) then if (self.db.x == 0 and self.db.y == 0) then
self.frame:SetPoint("CENTER") self.frame:SetPoint("CENTER")
else else
local scale = self.frame:GetEffectiveScale() local scale = self.frame:GetEffectiveScale()
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 if (self.db.growDirection == "TOP") then
self.frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale) - growMiddle) self.frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, self.db.y / scale)
elseif self.db.growDirection == "BOTTOM" then
self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale) + growMiddle)
else else
self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, (self.db.y / scale)) self.frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.x / scale, self.db.y / scale)
end end
end end
--Anchor --Anchor
self.anchor:SetWidth(self.db.barWidth * 2 + highlightBorderSize) self.anchor:SetWidth(width)
self.anchor:ClearAllPoints() self.anchor:ClearAllPoints()
if (self.db.growDirection == "TOP") then if (self.db.growDirection == "TOP") then
self.anchor:SetPoint("TOP", self.frame, "BOTTOM") self.anchor:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
elseif self.growDirection == "BOTTOM" or self.growDirection == "RIGHT" then elseif self.growDirection == "BOTTOM" or self.growDirection == "RIGHT" then
self.anchor:SetPoint("BOTTOM", self.frame, "TOP") self.anchor:SetPoint("BOTTOMLEFT", self.frame, "TOPLEFT")
else else
self.anchor:SetPoint("BOTTOM", self.frame, "TOP") self.anchor:SetPoint("BOTTOMRIGHT", self.frame, "TOPRIGHT")
end end
if (self.db.locked) then if (self.db.locked) then
@ -197,7 +235,7 @@ function Gladdy:UpdateFrame()
button.secure:ClearAllPoints() button.secure:ClearAllPoints()
if (self.db.growDirection == "TOP") then if (self.db.growDirection == "TOP") then
if (i == 1) then if (i == 1) then
button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", 0, powerBarHeight) button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", leftSize, powerBarHeight)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin) button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin)
@ -205,7 +243,7 @@ function Gladdy:UpdateFrame()
end end
elseif (self.db.growDirection == "BOTTOM") then elseif (self.db.growDirection == "BOTTOM") then
if (i == 1) then if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, 0) button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin) button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin)
@ -213,18 +251,18 @@ function Gladdy:UpdateFrame()
end end
elseif (self.db.growDirection == "LEFT") then elseif (self.db.growDirection == "LEFT") then
if (i == 1) then if (i == 1) then
button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -0, 0) button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -rightSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("TOPRIGHT", self.buttons["arena" .. (i - 1)], "TOPLEFT", - self.db.bottomMargin, 0) button:SetPoint("TOPRIGHT", self.buttons["arena" .. (i - 1)], "TOPLEFT", -rightSize - leftSize - self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end end
elseif (self.db.growDirection == "RIGHT") then elseif (self.db.growDirection == "RIGHT") then
if (i == 1) then if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, 0) button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "TOPRIGHT", self.db.bottomMargin, 0) button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "TOPRIGHT", leftSize + rightSize + self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT") button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end end
end end
@ -237,38 +275,6 @@ function Gladdy:UpdateFrame()
for _, v in self:IterModules() do for _, v in self:IterModules() do
self:Call(v, "UpdateFrameOnce") self:Call(v, "UpdateFrameOnce")
end end
if Gladdy.db.hideBlizzard == "always" then
Gladdy:BlizzArenaSetAlpha(0)
elseif Gladdy.db.hideBlizzard == "arena" then
if Gladdy.curBracket then
Gladdy:BlizzArenaSetAlpha(0)
else
Gladdy:BlizzArenaSetAlpha(1)
end
elseif Gladdy.db.hideBlizzard == "never" then
Gladdy:BlizzArenaSetAlpha(1)
end
if (not Gladdy.db.newLayout) then
Gladdy.db.newLayout = true
--get margin
local arena1Bottom
local arena2Top
if (self.db.growDirection == "BOTTOM") then
arena1Bottom = self.buttons["arena1"].secure:GetBottom()
arena2Top = self.buttons["arena2"].secure:GetTop()
elseif (self.db.growDirection == "TOP") then
arena1Bottom = self.buttons["arena1"].secure:GetTop()
arena2Top = self.buttons["arena2"].secure:GetBottom()
elseif (self.db.growDirection == "LEFT") then
arena1Bottom = self.buttons["arena1"].secure:GetLeft()
arena2Top = self.buttons["arena2"].secure:GetRight()
elseif (self.db.growDirection == "RIGHT") then
arena1Bottom = self.buttons["arena1"].secure:GetRight()
arena2Top = self.buttons["arena2"].secure:GetLeft()
end
Gladdy.db.bottomMargin = math_abs(arena1Bottom - arena2Top)
Gladdy:UpdateFrame()
end
end end
function Gladdy:HideFrame() function Gladdy:HideFrame()
@ -277,7 +283,6 @@ function Gladdy:HideFrame()
self.startTest = nil self.startTest = nil
self.hideFrame = true self.hideFrame = true
else else
self:Reset()
self.frame:Hide() self.frame:Hide()
end end
@ -288,7 +293,6 @@ end
function Gladdy:ToggleFrame(i) function Gladdy:ToggleFrame(i)
self:Reset() self:Reset()
if (self.frame and self.frame:IsShown() and i == self.curBracket) then if (self.frame and self.frame:IsShown() and i == self.curBracket) then
self.frame.testing = nil
self:HideFrame() self:HideFrame()
else else
self.curBracket = i self.curBracket = i
@ -296,7 +300,6 @@ function Gladdy:ToggleFrame(i)
if (not self.frame) then if (not self.frame) then
self:CreateFrame() self:CreateFrame()
end end
self.frame.testing = true
for o = 1, self.curBracket do for o = 1, self.curBracket do
local unit = "arena" .. o local unit = "arena" .. o
@ -364,188 +367,6 @@ function Gladdy:CreateButton(i)
self:ResetButton("arena" .. i) self:ResetButton("arena" .. i)
end end
function Gladdy:SetPosition(frame, unit, xOffsetDB, yOffsetDB, newLayout, module)
local button = self.buttons[unit]
if not button or not frame or not xOffsetDB or not yOffsetDB then
return
end
if (not newLayout) then
--Gladdy:Debug("INFO", name, "old X/Y:", frame:GetCenter())
local xOffset, yOffset = frame:GetLeft(), frame:GetTop()
if not xOffset or not yOffset then
xOffset = frame:GetCenter()-- - frame:GetWidth()/2
yOffset = select(2, frame:GetCenter())-- + frame:GetHeight()/2
end
local x,y = button.healthBar:GetLeft(), button.healthBar:GetTop()
local newXOffset = math_abs(x - xOffset) * (x > xOffset and -1 or 1)
local newYOffset = math_abs(y - yOffset) * (y > yOffset and -1 or 1)
frame:ClearAllPoints()
frame:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", newXOffset, newYOffset)
--Gladdy:Debug("INFO", name, "new X/Y:", frame:GetCenter())
if unit == "arena1" then
Gladdy.db[xOffsetDB] = newXOffset
Gladdy.db[yOffsetDB] = newYOffset
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end
else
frame:ClearAllPoints()
frame:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", Gladdy.db[xOffsetDB], Gladdy.db[yOffsetDB])
end
if (self.newDefaults[module.name]) then
for k,v in pairs(self.newDefaults[module.name]) do
module.defaults[k] = v
end
end
end
function Gladdy:CreateMover(frame, xConfig, yConfig, name, points, width, height, xOffset, yOffset, activated)
if not frame.mover then
frame:EnableMouse(false)
frame:SetMovable(true)
frame.mover = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate")
frame.mover:SetFrameStrata("TOOLTIP")
frame.mover:SetPoint(points[1], frame, points[2], xOffset or 0, yOffset or 0)
frame.mover:SetHeight(height or frame:GetHeight())
frame.mover:SetWidth(width or frame:GetWidth())
local backdrop = {
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "",
tile = true, tileSize = 16, edgeSize = 10,
insets = {left = 0, right = 0, top = 0, bottom = 0}
}
frame.mover:SetBackdrop(backdrop)
frame.mover:SetBackdropColor(0,1,0,0.5)
frame.mover.border = CreateFrame("Frame", nil, frame.mover, BackdropTemplateMixin and "BackdropTemplate")
frame.mover.border:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = 2 })
frame.mover.border:SetAllPoints(frame.mover)
frame.mover.border:SetBackdropBorderColor(0,1,0,1)
frame.mover.border:SetFrameStrata("TOOLTIP")
frame.mover.text = frame.mover.border:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
frame.mover.text:SetText(name)
frame.mover.text:SetPoint("CENTER")
frame.mover:SetMovable(true)
frame.mover:EnableMouse(true)
frame.mover:SetScript("OnMouseDown", function(self)
self.point = { frame:GetPoint() }
self.start = { frame:GetCenter() }
frame:StartMoving()
self:StartMoving()
end)
frame.mover:SetScript("OnMouseUp", function(self)
frame:StopMovingOrSizing()
self:StopMovingOrSizing()
self.stop = { frame:GetCenter() }
local diffX = math_abs(self.start[1] - self.stop[1])
diffX = self.start[1] > self.stop[1] and -diffX or diffX
local diffY = math_abs(self.start[2] - self.stop[2])
diffY = self.start[2] > self.stop[2] and -diffY or diffY
frame:ClearAllPoints()
frame:SetPoint(self.point[1], self.point[2], self.point[3], self.point[4] + diffX, self.point[5] + diffY)
Gladdy.db[xConfig] = self.point[4] + diffX
Gladdy.db[yConfig] = self.point[5] + diffY
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
Gladdy:UpdateFrame()
end)
else
frame.mover:ClearAllPoints()
frame.mover:SetPoint(points[1], frame, points[2], xOffset or 0, yOffset or 0)
frame.mover:SetHeight(height or frame:GetHeight())
frame.mover:SetWidth(width or frame:GetWidth())
end
if self.frame and self.frame.testing and self.db.showMover then
if (activated ~= nil and not Gladdy.db[activated]) then
frame.mover:Hide()
else
frame.mover:Show()
end
else
frame.mover:Hide()
end
end
---------------------------
-- LAGACY SUPPORT
---------------------------
function Gladdy:LegacyPositioning(margin, height, teamSize)
if not Gladdy.db.newLayout then
for k,v in pairs(Gladdy.legacy) do
if Gladdy.db[k] == nil then
Gladdy:Debug("INFO", "Gladdy:LegacyPositioning write", k,v)
Gladdy.db[k] = v
else
Gladdy:Debug("INFO", "Gladdy:LegacyPositioning found", k,v)
end
end
if (self.db.cooldownYPos == "TOP" or self.db.cooldownYPos == "BOTTOM") and self.db.cooldown then
margin = margin + self.db.cooldownSize
height = height + self.db.cooldownSize * (teamSize - 1)
end
if (self.db.buffsCooldownPos == "TOP" or self.db.buffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsIconSize
height = height + self.db.buffsIconSize * (teamSize - 1)
end
if (self.db.buffsBuffsCooldownPos == "TOP" or self.db.buffsBuffsCooldownPos == "BOTTOM") and self.db.buffsEnabled then
margin = margin + self.db.buffsBuffsIconSize
height = height + self.db.buffsBuffsIconSize * (teamSize - 1)
end
if self.db.buffsCooldownPos == "TOP" and self.db.cooldownYPos == "TOP" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
if self.db.buffsCooldownPos == "BOTTOM" and self.db.cooldownYPos == "BOTTOM" and self.db.cooldown and self.db.buffsEnabled then
margin = margin + 1
height = height + (teamSize - 1)
end
end
return margin, height
end
function Gladdy:PositionButton(button, i, leftSize, rightSize, powerBarHeight, margin)
if (self.db.growDirection == "TOP") then
if (i == 1) then
button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", leftSize, powerBarHeight)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "BOTTOM") then
if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "BOTTOMLEFT", 0, -margin - self.db.bottomMargin)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "LEFT") then
if (i == 1) then
button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -rightSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPRIGHT", self.buttons["arena" .. (i - 1)], "TOPLEFT", -rightSize - leftSize - self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
elseif (self.db.growDirection == "RIGHT") then
if (i == 1) then
button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", leftSize, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
else
button:SetPoint("TOPLEFT", self.buttons["arena" .. (i - 1)], "TOPRIGHT", leftSize + rightSize + self.db.bottomMargin, 0)
button.secure:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT")
end
end
end
function Gladdy:GetAnchor(unit, position) function Gladdy:GetAnchor(unit, position)
local anchor = "healthBar" local anchor = "healthBar"
if Gladdy.db.classIconPos == position then if Gladdy.db.classIconPos == position then

View File

@ -5,20 +5,15 @@ local select = select
local pairs = pairs local pairs = pairs
local tinsert = table.insert local tinsert = table.insert
local tsort = table.sort local tsort = table.sort
local str_lower = string.lower
local GetTime = GetTime
local GetPhysicalScreenSize = GetPhysicalScreenSize
local InCombatLockdown = InCombatLockdown
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME
local IsAddOnLoaded = IsAddOnLoaded local IsAddOnLoaded = IsAddOnLoaded
local GetBattlefieldStatus = GetBattlefieldStatus
local IsInInstance = IsInInstance local IsInInstance = IsInInstance
local GetNumArenaOpponents = GetNumArenaOpponents local GetBattlefieldStatus = GetBattlefieldStatus
local IsActiveBattlefieldArena = IsActiveBattlefieldArena
local RELEASE_TYPES = { alpha = "Alpha", beta = "Beta", release = "Release"} local RELEASE_TYPES = { alpha = "Alpha", beta = "Beta", release = "Release"}
local PREFIX = "Gladdy v" local PREFIX = "TBC-Classic_v"
local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)" local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)"
local LibStub = LibStub
--------------------------- ---------------------------
@ -26,18 +21,16 @@ local LibStub = LibStub
--------------------------- ---------------------------
local MAJOR, MINOR = "Gladdy", 15 local MAJOR, MINOR = "Gladdy", 4
local Gladdy = LibStub:NewLibrary(MAJOR, MINOR) local Gladdy = LibStub:NewLibrary(MAJOR, MINOR)
local L local L
Gladdy.version_major_num = 2 Gladdy.version_major_num = 1
Gladdy.version_minor_num = 0.27 Gladdy.version_minor_num = 0.19
Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num
Gladdy.version_releaseType = RELEASE_TYPES.release Gladdy.version_releaseType = RELEASE_TYPES.beta
Gladdy.version = PREFIX .. string.format("%.2f", Gladdy.version_num) .. "-" .. Gladdy.version_releaseType Gladdy.version = PREFIX .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType
Gladdy.VERSION_REGEX = VERSION_REGEX Gladdy.VERSION_REGEX = VERSION_REGEX
Gladdy.debug = false
LibStub("AceTimer-3.0"):Embed(Gladdy) LibStub("AceTimer-3.0"):Embed(Gladdy)
LibStub("AceComm-3.0"):Embed(Gladdy) LibStub("AceComm-3.0"):Embed(Gladdy)
Gladdy.modules = {} Gladdy.modules = {}
@ -59,17 +52,6 @@ function Gladdy:Print(...)
end end
function Gladdy:Warn(...) function Gladdy:Warn(...)
local text = "|cfff29f05Gladdy|r:"
local val
for i = 1, select("#", ...) do
val = select(i, ...)
if (type(val) == 'boolean') then val = val and "true" or false end
text = text .. " " .. tostring(val)
end
DEFAULT_CHAT_FRAME:AddMessage(text)
end
function Gladdy:Error(...)
local text = "|cfffc0303Gladdy|r:" local text = "|cfffc0303Gladdy|r:"
local val local val
for i = 1, select("#", ...) do for i = 1, select("#", ...) do
@ -80,38 +62,13 @@ function Gladdy:Error(...)
DEFAULT_CHAT_FRAME:AddMessage(text) DEFAULT_CHAT_FRAME:AddMessage(text)
end end
function Gladdy:Debug(lvl, ...)
if Gladdy.debug then
if lvl == "INFO" then
Gladdy:Print("[INFO]", ...)
elseif lvl == "WARN" then
Gladdy:Warn("[WARN]", ...)
elseif lvl == "ERROR" then
Gladdy:Error("[ERROR]", ...)
end
end
end
Gladdy.events = CreateFrame("Frame") Gladdy.events = CreateFrame("Frame")
Gladdy.events.registered = {} Gladdy.events.registered = {}
Gladdy.events:RegisterEvent("PLAYER_LOGIN") Gladdy.events:RegisterEvent("PLAYER_LOGIN")
Gladdy.events:RegisterEvent("PLAYER_LOGOUT")
Gladdy.events:RegisterEvent("CVAR_UPDATE")
hooksecurefunc("VideoOptionsFrameOkay_OnClick", function(self, button, down, apply)
if (self:GetName() == "VideoOptionsFrameApply") then
Gladdy:PixelPerfectScale(true)
end
end)
Gladdy.events:SetScript("OnEvent", function(self, event, ...) Gladdy.events:SetScript("OnEvent", function(self, event, ...)
if (event == "PLAYER_LOGIN") then if (event == "PLAYER_LOGIN") then
Gladdy:OnInitialize() Gladdy:OnInitialize()
Gladdy:OnEnable() Gladdy:OnEnable()
elseif (event == "CVAR_UPDATE") then
if (str_lower(select(1, ...)) == "uiscale") then
Gladdy:PixelPerfectScale(true)
end
elseif (event == "PLAYER_LOGOUT") then
Gladdy:DeleteUnknownOptions(Gladdy.db, Gladdy.defaults.profile)
else else
local func = self.registered[event] local func = self.registered[event]
@ -174,8 +131,8 @@ function Gladdy:Call(module, func, ...)
end end
end end
function Gladdy:SendMessage(message, ...) function Gladdy:SendMessage(message, ...)
for _, module in self:IterModules() do for k, v in self:IterModules() do
self:Call(module, module.messages[message], ...) self:Call(v, v.messages[message], ...)
end end
end end
@ -186,32 +143,10 @@ function Gladdy:NewModule(name, priority, defaults)
module.defaults = defaults or {} module.defaults = defaults or {}
module.messages = {} module.messages = {}
module.RegisterMessages = function(self, ...)
for _,message in pairs({...}) do
self.messages[message] = message
end
end
module.RegisterMessage = function(self, message, func) module.RegisterMessage = function(self, message, func)
self.messages[message] = func or message self.messages[message] = func or message
end end
module.UnregisterMessage = function(self, message)
self.messages[message] = nil
end
module.UnregisterMessages = function(self, ...)
for _,message in pairs({...}) do
self.messages[message] = nil
end
end
module.UnregisterAllMessages = function(self)
for msg,_ in pairs(self.messages) do
self.messages[msg] = nil
end
end
module.GetOptions = function() module.GetOptions = function()
return nil return nil
end end
@ -237,11 +172,11 @@ function Gladdy:DeleteUnknownOptions(tbl, refTbl, str)
end end
for k,v in pairs(tbl) do for k,v in pairs(tbl) do
if refTbl[k] == nil then if refTbl[k] == nil then
Gladdy:Debug("INFO", "SavedVariable deleted:", str .. "." .. k, "not found!") --Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "not found!")
tbl[k] = nil tbl[k] = nil
else else
if type(v) ~= type(refTbl[k]) then if type(v) ~= type(refTbl[k]) then
Gladdy:Debug("INFO", "SavedVariable deleted:", str .. "." .. k, "type error!", "Expected", type(refTbl[k]), "but found", type(v)) --Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "type error!", "Expected", type(refTbl[k]), "but found", type(v))
tbl[k] = nil tbl[k] = nil
elseif type(v) == "table" then elseif type(v) == "table" then
Gladdy:DeleteUnknownOptions(v, refTbl[k], str .. "." .. k) Gladdy:DeleteUnknownOptions(v, refTbl[k], str .. "." .. k)
@ -250,28 +185,11 @@ function Gladdy:DeleteUnknownOptions(tbl, refTbl, str)
end end
end end
function Gladdy:PixelPerfectScale(update)
local physicalWidth, physicalHeight = GetPhysicalScreenSize()
local perfectUIScale = 768.0/physicalHeight--768/select(2, strsplit("x",({ GetScreenResolutions()})[GetCurrentResolution()]))
if self.db and self.db.pixelPerfect and self.frame then
self.frame:SetIgnoreParentScale(true)
self.frame:SetScale(perfectUIScale)
--local adaptiveScale = (GetCVar("useUiScale") == "1" and 1.0 + perfectUIScale - GetCVar("UIScale") or perfectUIScale)
--self.frame:SetScale(adaptiveScale)
if update then
self:UpdateFrame()
end
elseif self.frame then
self.frame:SetScale(self.db.frameScale)
self.frame:SetIgnoreParentScale(false)
end
end
function Gladdy:OnInitialize() function Gladdy:OnInitialize()
self.dbi = LibStub("AceDB-3.0"):New("GladdyXZ", self.defaults) self.dbi = LibStub("AceDB-3.0"):New("GladdyXZ", self.defaults)
self.dbi.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged") self.dbi.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged")
self.dbi.RegisterCallback(self, "OnProfileCopied", "OnProfileChanged") self.dbi.RegisterCallback(self, "OnProfileCopied", "OnProfileChanged")
self.dbi.RegisterCallback(self, "OnProfileReset", "OnProfileReset") self.dbi.RegisterCallback(self, "OnProfileReset", "OnProfileChanged")
self.db = self.dbi.profile self.db = self.dbi.profile
self.LSM = LibStub("LibSharedMedia-3.0") self.LSM = LibStub("LibSharedMedia-3.0")
@ -279,7 +197,6 @@ function Gladdy:OnInitialize()
self.LSM:Register("statusbar", "Smooth", "Interface\\AddOns\\Gladdy\\Images\\Smooth") self.LSM:Register("statusbar", "Smooth", "Interface\\AddOns\\Gladdy\\Images\\Smooth")
self.LSM:Register("statusbar", "Minimalist", "Interface\\AddOns\\Gladdy\\Images\\Minimalist") self.LSM:Register("statusbar", "Minimalist", "Interface\\AddOns\\Gladdy\\Images\\Minimalist")
self.LSM:Register("statusbar", "LiteStep", "Interface\\AddOns\\Gladdy\\Images\\LiteStep.tga") self.LSM:Register("statusbar", "LiteStep", "Interface\\AddOns\\Gladdy\\Images\\LiteStep.tga")
self.LSM:Register("statusbar", "Flat", "Interface\\AddOns\\Gladdy\\Images\\UI-StatusBar")
self.LSM:Register("border", "Gladdy Tooltip round", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_round_selfmade") self.LSM:Register("border", "Gladdy Tooltip round", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_round_selfmade")
self.LSM:Register("border", "Gladdy Tooltip squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade") self.LSM:Register("border", "Gladdy Tooltip squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade")
self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF") self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF")
@ -288,11 +205,11 @@ function Gladdy:OnInitialize()
L = self.L L = self.L
self.testData = { self.testData = {
["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" }, ["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 = 99, healthMax = 100, power = 7833, powerMax = 10460, powerType = 0, testSpec = L["Frost"], race = "Scourge" }, ["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 = 10, healthMax = 100, power = 45, powerMax = 110, powerType = 3, testSpec = L["Subtlety"], race = "Human" }, ["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 = 40, healthMax = 100, power = 9855, powerMax = 9855, powerType = 0, testSpec = L["Demonology"], 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 = 70, healthMax = 100, power = 2515, powerMax = 10240, powerType = 0, testSpec = L["Discipline"], 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" },
} }
self.cooldownSpellIds = {} self.cooldownSpellIds = {}
@ -303,38 +220,31 @@ function Gladdy:OnInitialize()
self.guids = {} self.guids = {}
self.curBracket = nil self.curBracket = nil
self.curUnit = 1 self.curUnit = 1
self.lastInstance = nil
self:SetupOptions() self:SetupOptions()
for _, module in self:IterModules() do for k, v in self:IterModules() do
self:Call(module, "Initialize") -- B.E > A.E :D self:Call(v, "Initialize") -- B.E > A.E :D
end end
self:DeleteUnknownOptions(self.db, self.defaults.profile)
if Gladdy.db.hideBlizzard == "always" then if Gladdy.db.hideBlizzard == "always" then
Gladdy:BlizzArenaSetAlpha(0) if IsAddOnLoaded("Blizzard_ArenaUI") then
ArenaEnemyFrame1:SetAlpha(0)
ArenaEnemyFrame2:SetAlpha(0)
ArenaEnemyFrame3:SetAlpha(0)
ArenaEnemyFrame4:SetAlpha(0)
ArenaEnemyFrame5:SetAlpha(0)
end end
if not self.db.newLayout then
self:ToggleFrame(3)
self:HideFrame()
end end
end end
function Gladdy:OnProfileReset()
self.db = self.dbi.profile
Gladdy:Debug("INFO", "OnProfileReset")
self:HideFrame()
self:ToggleFrame(3)
Gladdy.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
Gladdy.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end
function Gladdy:OnProfileChanged() function Gladdy:OnProfileChanged()
self.db = self.dbi.profile self.db = self.dbi.profile
self:DeleteUnknownOptions(self.db, self.defaults.profile)
self:HideFrame() self:HideFrame()
self:ToggleFrame(3) self:ToggleFrame(3)
Gladdy.options.args.lock.name = Gladdy.db.locked and L["Unlock frame"] or L["Lock frame"]
Gladdy.options.args.showMover.name = Gladdy.db.showMover and L["Hide Mover"] or L["Show Mover"]
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end end
function Gladdy:OnEnable() function Gladdy:OnEnable()
@ -400,15 +310,12 @@ function Gladdy:Test()
button[k] = v button[k] = v
end end
for _, module in self:IterModules() do for k, v in self:IterModules() do
self:Call(module, "Test", unit) self:Call(v, "Test", unit)
end end
button:SetAlpha(1) button:SetAlpha(1)
end end
for _, module in self:IterModules() do
self:Call(module, "TestOnce")
end
end end
end end
@ -423,31 +330,35 @@ function Gladdy:PLAYER_ENTERING_WORLD()
LibStub("AceConfigDialog-3.0"):Open("Gladdy", nil, LibStub("AceConfigDialog-3.0"):SelectGroup("Gladdy", "XiconProfiles")) LibStub("AceConfigDialog-3.0"):Open("Gladdy", nil, LibStub("AceConfigDialog-3.0"):SelectGroup("Gladdy", "XiconProfiles"))
self.showConfig = nil self.showConfig = nil
end end
if (self.frame and self.frame:IsVisible()) then local instance = select(2, IsInInstance())
if (instance ~= "arena" and self.frame and self.frame:IsVisible() and not self.frame.testing) then
self:Reset() self:Reset()
self:HideFrame() self:HideFrame()
end end
if (instance == "arena") then
self:Reset()
self:HideFrame()
end
self.lastInstance = instance
end end
function Gladdy:UPDATE_BATTLEFIELD_STATUS(_, index) function Gladdy:UPDATE_BATTLEFIELD_STATUS(_, index)
local status, mapName, instanceID, levelRangeMin, levelRangeMax, teamSize, isRankedArena, suspendedQueue, bool, queueType = GetBattlefieldStatus(index) local status, mapName, instanceID, levelRangeMin, levelRangeMax, teamSize, isRankedArena, suspendedQueue, bool, queueType = GetBattlefieldStatus(index)
local instanceType = select(2, IsInInstance()) if (status == "active" and teamSize > 0 and IsActiveBattlefieldArena()) then
self:Debug("INFO", "UPDATE_BATTLEFIELD_STATUS", instanceType, status, teamSize)
if ((instanceType == "arena" or GetNumArenaOpponents() > 0) and status == "active" and teamSize > 0) then
self.curBracket = teamSize self.curBracket = teamSize
self:JoinedArena() self:JoinedArena()
elseif status == "active" then
if self.db.hideBlizzard == "always" then
self:BlizzArenaSetAlpha(0)
else
self:BlizzArenaSetAlpha(1)
end
end end
end end
function Gladdy:PLAYER_REGEN_ENABLED() function Gladdy:PLAYER_REGEN_ENABLED()
if self.showFrame then if self.showFrame then
self:InitFrames() self:UpdateFrame()
if self.startTest then
self:Test()
self.startTest = nil
end
self.frame:Show()
self.showFrame = nil
end end
if self.hideFrame then if self.hideFrame then
self:Reset() self:Reset()
@ -464,7 +375,7 @@ end
function Gladdy:Reset() function Gladdy:Reset()
if type(self.guids) == "table" then if type(self.guids) == "table" then
for k,_ in pairs(self.guids) do for k, v in pairs(self.guids) do
self.guids[k] = nil self.guids[k] = nil
end end
end end
@ -472,15 +383,21 @@ function Gladdy:Reset()
self.curBracket = nil self.curBracket = nil
self.curUnit = 1 self.curUnit = 1
for _, module in self:IterModules() do for k1, v1 in self:IterModules() do
self:Call(module, "Reset") self:Call(v1, "Reset")
end end
for unit in pairs(self.buttons) do for unit in pairs(self.buttons) do
self:ResetUnit(unit) self:ResetUnit(unit)
end end
if self.db.hideBlizzard == "never" or self.db.hideBlizzard == "arena" then if Gladdy.db.hideBlizzard == "never" or Gladdy.db.hideBlizzard == "arena" then
self:BlizzArenaSetAlpha(1) if IsAddOnLoaded("Blizzard_ArenaUI") then
ArenaEnemyFrame1:SetAlpha(1)
ArenaEnemyFrame2:SetAlpha(1)
ArenaEnemyFrame3:SetAlpha(1)
ArenaEnemyFrame4:SetAlpha(1)
ArenaEnemyFrame5:SetAlpha(1)
end
end end
end end
@ -493,8 +410,8 @@ function Gladdy:ResetUnit(unit)
button:SetAlpha(0) button:SetAlpha(0)
self:ResetButton(unit) self:ResetButton(unit)
for _, module in self:IterModules() do for k2, v2 in self:IterModules() do
self:Call(module, "ResetUnit", unit) self:Call(v2, "ResetUnit", unit)
end end
end end
@ -523,16 +440,6 @@ end
--------------------------- ---------------------------
function Gladdy:JoinedArena() function Gladdy:JoinedArena()
if InCombatLockdown() then
self:Print("Gladdy frames show as soon as you leave combat")
self.showFrame = true
else
self:InitFrames()
end
end
function Gladdy:InitFrames()
self.showFrame = nil
if not self.curBracket then if not self.curBracket then
self.curBracket = 2 self.curBracket = 2
end end
@ -543,85 +450,24 @@ function Gladdy:InitFrames()
end end
end end
self:UpdateFrame()
if self.startTest then
self:Test()
self.startTest = nil
end
self.frame:Show()
self:SendMessage("JOINED_ARENA") self:SendMessage("JOINED_ARENA")
if InCombatLockdown() then
Gladdy:Print("Gladdy frames show as soon as you leave combat")
self.showFrame = true
else
self:UpdateFrame()
self.frame:Show()
end
for i=1, self.curBracket do for i=1, self.curBracket do
self.buttons["arena" .. i]:SetAlpha(1) self.buttons["arena" .. i]:SetAlpha(1)
end end
if self.db.hideBlizzard == "arena" or self.db.hideBlizzard == "always" then if Gladdy.db.hideBlizzard == "arena" or Gladdy.db.hideBlizzard == "always" then
self:BlizzArenaSetAlpha(0)
else
self:BlizzArenaSetAlpha(1)
end
end
---------------------------
-- BLIZZARD FRAMES
---------------------------
function Gladdy:BlizzArenaSetAlpha(alpha)
if IsAddOnLoaded("Blizzard_ArenaUI") then if IsAddOnLoaded("Blizzard_ArenaUI") then
if (ArenaEnemyFrames) then ArenaEnemyFrame1:SetAlpha(0)
ArenaEnemyFrames:SetAlpha(alpha) ArenaEnemyFrame2:SetAlpha(0)
end ArenaEnemyFrame3:SetAlpha(0)
if ArenaEnemyFrame1 then ArenaEnemyFrame4:SetAlpha(0)
ArenaEnemyFrame1:SetAlpha(alpha) ArenaEnemyFrame5:SetAlpha(0)
end
if ArenaEnemyFrame1PetFrame then
ArenaEnemyFrame1PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame2 then
ArenaEnemyFrame2:SetAlpha(alpha)
end
if ArenaEnemyFrame2PetFrame then
ArenaEnemyFrame2PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame3 then
ArenaEnemyFrame3:SetAlpha(alpha)
end
if ArenaEnemyFrame3PetFrame then
ArenaEnemyFrame3PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame4 then
ArenaEnemyFrame4:SetAlpha(alpha)
end
if ArenaEnemyFrame4PetFrame then
ArenaEnemyFrame4PetFrame:SetAlpha(alpha)
end
if ArenaEnemyFrame5 then
ArenaEnemyFrame5:SetAlpha(alpha)
end
if ArenaEnemyFrame5PetFrame then
ArenaEnemyFrame5PetFrame:SetAlpha(alpha)
end end
end end
end end
---------------------------
-- FONT/STATUSBAR/BORDER
---------------------------
local defaults = {["statusbar"] = "Smooth", ["border"] = "Gladdy Tooltip round", ["font"] = "DorisPP"}
local lastWarning = {}
function Gladdy:SMFetch(lsmType, key)
local smMediaType = self.LSM:Fetch(lsmType, Gladdy.db[key])
if (smMediaType == nil and Gladdy.db[key] ~= "None") then
if not lastWarning[key] or GetTime() - lastWarning[key] > 120 then
lastWarning[key] = GetTime()
Gladdy:Warn("Could not find", "\"" .. lsmType .. "\" \"", Gladdy.db[key], " \" for", "\"" .. key .. "\"", "- setting it to", "\"" .. defaults[lsmType] .. "\"")
end
return self.LSM:Fetch(lsmType, defaults[lsmType])
end
return smMediaType
end

View File

@ -1,8 +1,41 @@
## Title: Gladdy |cFFFF0000 game client not supported|r ## Interface: 20501
## Version: 2.27-Release ## Title: Gladdy - TBC
## Notes: The most powerful arena AddOn for WoW Classic TBC/WotLK ## Version: 1.19-Beta
## Notes: The most powerful arena AddOn for WoW 2.5.1
## Author: XiconQoo, DnB_Junkee, Knall ## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751 ## X-Email: contact me on discord Knall#1751
## X-Curse-Project-ID: 482332 ## SavedVariables: GladdyXZ
## X-WoWI-ID: 26350 ## OptionalDeps: SharedMedia, Blizzard_CombatLog, Blizzard_ArenaUI, Blizzard_CombatText
## Notes: Gladdy only supports Classic TBC and Classic WotLK.
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

View File

@ -1,46 +0,0 @@
## Interface: 20504
## Title: Gladdy - TBC
## Version: 2.27-Release
## 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
Util.lua
Frame.lua
Options.lua
Constants_shared.lua
Constants_BCC.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\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

View File

@ -1,46 +0,0 @@
## Interface: 30402
## Title: Gladdy - WotLK
## Version: 2.27-Release
## Notes: The most powerful arena AddOn for WoW 3.4.2
## 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
Util.lua
Frame.lua
Options.lua
Constants_shared.lua
Constants_Wrath.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\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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

1240
Lang.lua

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
-- make into AceComm. -- make into AceComm.
-- @class file -- @class file
-- @name AceComm-3.0 -- @name AceComm-3.0
-- @release $Id: AceComm-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -- @release $Id: AceComm-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
--[[ AceComm-3.0 --[[ AceComm-3.0
@ -35,6 +35,10 @@ local error, assert = error, assert
-- WoW APIs -- WoW APIs
local Ambiguate = Ambiguate local Ambiguate = Ambiguate
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, DEFAULT_CHAT_FRAME, geterrorhandler, RegisterAddonMessagePrefix
AceComm.embeds = AceComm.embeds or {} AceComm.embeds = AceComm.embeds or {}
-- for my sanity and yours, let's give the message type bytes some names -- for my sanity and yours, let's give the message type bytes some names

View File

@ -75,7 +75,7 @@ local next = next
local strlen = string.len local strlen = string.len
local GetFramerate = GetFramerate local GetFramerate = GetFramerate
local strlower = string.lower local strlower = string.lower
local unpack,type,pairs,wipe = unpack,type,pairs,table.wipe local unpack,type,pairs,wipe = unpack,type,pairs,wipe
local UnitInRaid,UnitInParty = UnitInRaid,UnitInParty local UnitInRaid,UnitInParty = UnitInRaid,UnitInParty

View File

@ -1,7 +1,7 @@
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames. --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file -- @class file
-- @name AceConfigCmd-3.0 -- @name AceConfigCmd-3.0
-- @release $Id: AceConfigCmd-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
--[[ --[[
AceConfigCmd-3.0 AceConfigCmd-3.0
@ -37,10 +37,17 @@ local error, assert = error, assert
-- WoW APIs -- WoW APIs
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
local L = setmetatable({}, { -- TODO: replace with proper locale local L = setmetatable({}, { -- TODO: replace with proper locale
__index = function(self,k) return k end __index = function(self,k) return k end
}) })
local function print(msg) local function print(msg)
(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg) (SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
end end
@ -394,7 +401,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
return return
end end
local strInput = strsub(info.input,inputpos); local str = strsub(info.input,inputpos);
if tab.type=="execute" then if tab.type=="execute" then
------------ execute -------------------------------------------- ------------ execute --------------------------------------------
@ -407,21 +414,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
local res = true local res = true
if tab.pattern then if tab.pattern then
if type(tab.pattern)~="string" then err(info, inputpos, "'pattern' - expected a string") end if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
if not strmatch(strInput, tab.pattern) then if not strmatch(str, tab.pattern) then
usererr(info, inputpos, "'"..strInput.."' - " .. L["invalid input"]) usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
return return
end end
end end
do_final(info, inputpos, tab, "set", strInput) do_final(info, inputpos, tab, "set", str)
elseif tab.type=="toggle" then elseif tab.type=="toggle" then
------------ toggle -------------------------------------------- ------------ toggle --------------------------------------------
local b local b
local str = strtrim(strlower(strInput)) local str = strtrim(strlower(str))
if str=="" then if str=="" then
b = callmethod(info, inputpos, tab, "get") b = callmethod(info, inputpos, tab, "get")
@ -458,9 +465,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="range" then elseif tab.type=="range" then
------------ range -------------------------------------------- ------------ range --------------------------------------------
local val = tonumber(strInput) local val = tonumber(str)
if not val then if not val then
usererr(info, inputpos, "'"..strInput.."' - "..L["expected number"]) usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
return return
end end
if type(info.step)=="number" then if type(info.step)=="number" then
@ -480,7 +487,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="select" then elseif tab.type=="select" then
------------ select ------------------------------------ ------------ select ------------------------------------
local str = strtrim(strlower(strInput)) local str = strtrim(strlower(str))
local values = tab.values local values = tab.values
if type(values) == "function" or type(values) == "string" then if type(values) == "function" or type(values) == "string" then
@ -521,7 +528,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="multiselect" then elseif tab.type=="multiselect" then
------------ multiselect ------------------------------------------- ------------ multiselect -------------------------------------------
local str = strtrim(strlower(strInput)) local str = strtrim(strlower(str))
local values = tab.values local values = tab.values
if type(values) == "function" or type(values) == "string" then if type(values) == "function" or type(values) == "string" then
@ -558,7 +565,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
--check that the opt is valid --check that the opt is valid
local ok local ok
for k in pairs(values) do for k,v in pairs(values) do
if strlower(k)==opt then if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches) opt = k -- overwrite with key (in case of case mismatches)
ok = true ok = true
@ -627,7 +634,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="color" then elseif tab.type=="color" then
------------ color -------------------------------------------- ------------ color --------------------------------------------
local str = strtrim(strlower(strInput)) local str = strtrim(strlower(str))
if str == "" then if str == "" then
--TODO: Show current value --TODO: Show current value
return return
@ -699,7 +706,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
elseif tab.type=="keybinding" then elseif tab.type=="keybinding" then
------------ keybinding -------------------------------------------- ------------ keybinding --------------------------------------------
local str = strtrim(strlower(strInput)) local str = strtrim(strlower(str))
if str == "" then if str == "" then
--TODO: Show current value --TODO: Show current value
return return

View File

@ -1,13 +1,13 @@
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
-- @class file -- @class file
-- @name AceConfigDialog-3.0 -- @name AceConfigDialog-3.0
-- @release $Id: AceConfigDialog-3.0.lua 1296 2022-11-04 18:50:10Z nevcairiel $ -- @release $Id: AceConfigDialog-3.0.lua 1232 2020-04-14 22:21:22Z nevcairiel $
local LibStub = LibStub local LibStub = LibStub
local gui = LibStub("AceGUI-3.0") local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-3.0") local reg = LibStub("AceConfigRegistry-3.0")
local MAJOR, MINOR = "AceConfigDialog-3.0", 86 local MAJOR, MINOR = "AceConfigDialog-3.0", 79
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigDialog then return end if not AceConfigDialog then return end
@ -22,13 +22,19 @@ AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}
-- Lua APIs -- Lua APIs
local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe local tinsert, tsort, tremove = table.insert, table.sort, table.remove
local strmatch, format = string.match, string.format local strmatch, format = string.match, string.format
local error = error local error = error
local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs
local tostring, tonumber = tostring, tonumber local tostring, tonumber = tostring, tonumber
local math_min, math_max, math_floor = math.min, math.max, math.floor local math_min, math_max, math_floor = math.min, math.max, math.floor
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL
-- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
-- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
local emptyTbl = {} local emptyTbl = {}
--[[ --[[
@ -147,7 +153,6 @@ local stringIsLiteral = {
width = true, width = true,
image = true, image = true,
fontSize = true, fontSize = true,
tooltipHyperlink = true
} }
--Is Never a function or method --Is Never a function or method
@ -189,8 +194,9 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
--We have a function to call --We have a function to call
local info = new() local info = new()
--traverse the options table, picking up the handler and filling the info with the path --traverse the options table, picking up the handler and filling the info with the path
local handler
local group = options local group = options
local handler = group.handler handler = group.handler or handler
for i = 1, #path do for i = 1, #path do
group = GetSubOption(group, path[i]) group = GetSubOption(group, path[i])
@ -502,14 +508,6 @@ local function OptionOnMouseOver(widget, event)
local tooltip = AceConfigDialog.tooltip local tooltip = AceConfigDialog.tooltip
tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
local tooltipHyperlink = GetOptionsMemberValue("tooltipHyperlink", opt, options, path, appName)
if tooltipHyperlink then
tooltip:SetHyperlink(tooltipHyperlink)
tooltip:Show()
return
end
local name = GetOptionsMemberValue("name", opt, options, path, appName) local name = GetOptionsMemberValue("name", opt, options, path, appName)
local desc = GetOptionsMemberValue("desc", opt, options, path, appName) local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
local usage = GetOptionsMemberValue("usage", opt, options, path, appName) local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
@ -537,7 +535,8 @@ local function OptionOnMouseLeave(widget, event)
end end
local function GetFuncName(option) local function GetFuncName(option)
if option.type == "execute" then local type = option.type
if type == "execute" then
return "func" return "func"
else else
return "set" return "set"
@ -545,15 +544,13 @@ local function GetFuncName(option)
end end
do do
local frame = AceConfigDialog.popup local frame = AceConfigDialog.popup
if not frame or oldminor < 81 then if not frame then
frame = CreateFrame("Frame", nil, UIParent) frame = CreateFrame("Frame", nil, UIParent)
AceConfigDialog.popup = frame AceConfigDialog.popup = frame
frame:Hide() frame:Hide()
frame:SetPoint("CENTER", UIParent, "CENTER") frame:SetPoint("CENTER", UIParent, "CENTER")
frame:SetSize(320, 72) frame:SetSize(320, 72)
frame:EnableMouse(true) -- Do not allow click-through on the frame
frame:SetFrameStrata("TOOLTIP") frame:SetFrameStrata("TOOLTIP")
frame:SetFrameLevel(100) -- Lots of room to draw under it
frame:SetScript("OnKeyDown", function(self, key) frame:SetScript("OnKeyDown", function(self, key)
if key == "ESCAPE" then if key == "ESCAPE" then
self:SetPropagateKeyboardInput(false) self:SetPropagateKeyboardInput(false)
@ -567,17 +564,26 @@ do
end end
end) end)
local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate") if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then
frame:SetBackdrop({
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
tile = true,
tileSize = 32,
edgeSize = 32,
insets = { left = 11, right = 11, top = 11, bottom = 11 },
})
else
local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate")
border:SetAllPoints(frame) border:SetAllPoints(frame)
frame:SetFixedFrameStrata(true) end
frame:SetFixedFrameLevel(true)
local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight") local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
text:SetSize(290, 0) text:SetSize(290, 0)
text:SetPoint("TOP", 0, -16) text:SetPoint("TOP", 0, -16)
frame.text = text frame.text = text
local function newButton(newText) local function newButton(text)
local button = CreateFrame("Button", nil, frame) local button = CreateFrame("Button", nil, frame)
button:SetSize(128, 21) button:SetSize(128, 21)
button:SetNormalFontObject(GameFontNormal) button:SetNormalFontObject(GameFontNormal)
@ -588,7 +594,7 @@ do
button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight" button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight"
button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetText(newText) button:SetText(text)
return button return button
end end
@ -675,7 +681,7 @@ local function ActivateControl(widget, event, ...)
if group[funcname] ~= nil then if group[funcname] ~= nil then
func = group[funcname] func = group[funcname]
end end
handler = group.handler handler = group.handler or handler
confirm = group.confirm confirm = group.confirm
validate = group.validate validate = group.validate
for i = 1, #path do for i = 1, #path do
@ -739,6 +745,7 @@ local function ActivateControl(widget, event, ...)
end end
end end
local rootframe = user.rootframe
if not validated or type(validated) == "string" then if not validated or type(validated) == "string" then
if not validated then if not validated then
if usage then if usage then
@ -753,8 +760,8 @@ local function ActivateControl(widget, event, ...)
end end
-- show validate message -- show validate message
if user.rootframe.SetStatusText then if rootframe.SetStatusText then
user.rootframe:SetStatusText(validated) rootframe:SetStatusText(validated)
else else
validationErrorPopup(validated) validationErrorPopup(validated)
end end
@ -791,14 +798,14 @@ local function ActivateControl(widget, event, ...)
if type(confirm) == "boolean" then if type(confirm) == "boolean" then
if confirm then if confirm then
if not confirmText then if not confirmText then
local option_name, desc = option.name, option.desc local name, desc = option.name, option.desc
if type(option_name) == "function" then if type(name) == "function" then
option_name = option_name(info) name = name(info)
end end
if type(desc) == "function" then if type(desc) == "function" then
desc = desc(info) desc = desc(info)
end end
confirmText = option_name confirmText = name
if desc then if desc then
confirmText = confirmText.." - "..desc confirmText = confirmText.." - "..desc
end end
@ -1140,6 +1147,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
--Control to feed --Control to feed
local control local control
local name = GetOptionsMemberValue("name", v, options, path, appName)
if v.type == "execute" then if v.type == "execute" then
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
@ -1242,7 +1251,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end end
tsort(sorting, sortTblAsStrings) tsort(sorting, sortTblAsStrings)
end end
for _, value in ipairs(sorting) do for k, value in ipairs(sorting) do
local text = values[value] local text = values[value]
local radio = gui:Create("CheckBox") local radio = gui:Create("CheckBox")
radio:SetLabel(text) radio:SetLabel(text)
@ -1324,8 +1333,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetWidth(width_multiplier) control:SetWidth(width_multiplier)
end end
--check:SetTriState(v.tristate) --check:SetTriState(v.tristate)
for s = 1, #valuesort do for i = 1, #valuesort do
local key = valuesort[s] local key = valuesort[i]
local value = GetOptionsMemberValue("get",v, options, path, appName, key) local value = GetOptionsMemberValue("get",v, options, path, appName, key)
control:SetItemValue(key,value) control:SetItemValue(key,value)
end end
@ -1337,8 +1346,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:PauseLayout() control:PauseLayout()
local width = GetOptionsMemberValue("width",v,options,path,appName) local width = GetOptionsMemberValue("width",v,options,path,appName)
for s = 1, #valuesort do for i = 1, #valuesort do
local value = valuesort[s] local value = valuesort[i]
local text = values[value] local text = values[value]
local check = gui:Create("CheckBox") local check = gui:Create("CheckBox")
check:SetLabel(text) check:SetLabel(text)
@ -1355,7 +1364,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
elseif width == "half" then elseif width == "half" then
check:SetWidth(width_multiplier / 2) check:SetWidth(width_multiplier / 2)
elseif (type(width) == "number") then elseif (type(width) == "number") then
check:SetWidth(width_multiplier * width) control:SetWidth(width_multiplier * width)
elseif width == "full" then elseif width == "full" then
check.width = "fill" check.width = "fill"
else else
@ -1425,8 +1434,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end end
control:SetImageSize(width, height) control:SetImageSize(width, height)
end end
local controlWidth = GetOptionsMemberValue("width",v,options,path,appName) local width = GetOptionsMemberValue("width",v,options,path,appName)
control.width = not controlWidth and "fill" control.width = not width and "fill"
end end
--Common Init --Common Init
@ -1681,29 +1690,29 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
elseif grouptype == "select" then elseif grouptype == "select" then
local selectGroup = gui:Create("DropdownGroup") local select = gui:Create("DropdownGroup")
selectGroup:SetTitle(name) select:SetTitle(name)
InjectInfo(selectGroup, options, group, path, rootframe, appName) InjectInfo(select, options, group, path, rootframe, appName)
selectGroup:SetCallback("OnGroupSelected", GroupSelected) select:SetCallback("OnGroupSelected", GroupSelected)
local status = AceConfigDialog:GetStatusTable(appName, path) local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then if not status.groups then
status.groups = {} status.groups = {}
end end
selectGroup:SetStatusTable(status.groups) select:SetStatusTable(status.groups)
local grouplist, orderlist = BuildSelect(group, options, path, appName) local grouplist, orderlist = BuildSelect(group, options, path, appName)
selectGroup:SetGroupList(grouplist, orderlist) select:SetGroupList(grouplist, orderlist)
selectGroup:SetUserData("grouplist", grouplist) select:SetUserData("grouplist", grouplist)
selectGroup:SetUserData("orderlist", orderlist) select:SetUserData("orderlist", orderlist)
local firstgroup = orderlist[1] local firstgroup = orderlist[1]
if firstgroup then if firstgroup then
selectGroup:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end end
selectGroup.width = "fill" select.width = "fill"
selectGroup.height = "fill" select.height = "fill"
container:AddChild(selectGroup) container:AddChild(select)
--assume tree group by default --assume tree group by default
--if parenttype is tree then this group is already a node on that tree --if parenttype is tree then this group is already a node on that tree
@ -1931,13 +1940,13 @@ end
-- convert pre-39 BlizOptions structure to the new format -- convert pre-39 BlizOptions structure to the new format
if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then
local old = AceConfigDialog.BlizOptions local old = AceConfigDialog.BlizOptions
local newOpt = {} local new = {}
for key, widget in pairs(old) do for key, widget in pairs(old) do
local appName = widget:GetUserData("appName") local appName = widget:GetUserData("appName")
if not newOpt[appName] then newOpt[appName] = {} end if not new[appName] then new[appName] = {} end
newOpt[appName][key] = widget new[appName][key] = widget
end end
AceConfigDialog.BlizOptions = newOpt AceConfigDialog.BlizOptions = new
else else
AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {} AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {}
end end
@ -1970,7 +1979,6 @@ end
-- @param parent The parent to use in the interface options tree. -- @param parent The parent to use in the interface options tree.
-- @param ... The path in the options table to feed into the interface options panel. -- @param ... The path in the options table to feed into the interface options panel.
-- @return The reference to the frame registered into the Interface Options. -- @return The reference to the frame registered into the Interface Options.
-- @return The category ID to pass to Settings.OpenToCategory (or InterfaceOptionsFrame_OpenToCategory)
function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = AceConfigDialog.BlizOptions local BlizOptions = AceConfigDialog.BlizOptions
@ -1986,6 +1994,7 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
if not BlizOptions[appName][key] then if not BlizOptions[appName][key] then
local group = gui:Create("BlizOptionsGroup") local group = gui:Create("BlizOptionsGroup")
BlizOptions[appName][key] = group BlizOptions[appName][key] = group
group:SetName(name or appName, parent)
group:SetTitle(name or appName) group:SetTitle(name or appName)
group:SetUserData("appName", appName) group:SetUserData("appName", appName)
@ -1998,30 +2007,8 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
end end
group:SetCallback("OnShow", FeedToBlizPanel) group:SetCallback("OnShow", FeedToBlizPanel)
group:SetCallback("OnHide", ClearBlizPanel) group:SetCallback("OnHide", ClearBlizPanel)
if Settings and Settings.RegisterCanvasLayoutCategory then
local categoryName = name or appName
if parent then
local category = Settings.GetCategory(parent)
if not category then
error(("The parent category '%s' was not found"):format(parent), 2)
end
local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName)
-- force the generated ID to be used for subcategories, as these can have very simple names like "Profiles"
group:SetName(subcategory.ID, parent)
else
local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName)
-- using appName here would be cleaner, but would not be 100% compatible
-- but for top-level categories it should be fine, as these are typically addon names
category.ID = categoryName
group:SetName(categoryName, parent)
Settings.RegisterAddOnCategory(category)
end
else
group:SetName(name or appName, parent)
InterfaceOptions_AddCategory(group.frame) InterfaceOptions_AddCategory(group.frame)
end return group.frame
return group.frame, group.frame.name
else else
error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2) error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
end end

View File

@ -8,10 +8,10 @@
-- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
-- @class file -- @class file
-- @name AceConfigRegistry-3.0 -- @name AceConfigRegistry-3.0
-- @release $Id: AceConfigRegistry-3.0.lua 1296 2022-11-04 18:50:10Z nevcairiel $ -- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
local CallbackHandler = LibStub("CallbackHandler-1.0") local CallbackHandler = LibStub("CallbackHandler-1.0")
local MAJOR, MINOR = "AceConfigRegistry-3.0", 21 local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigRegistry then return end if not AceConfigRegistry then return end
@ -83,7 +83,6 @@ local basekeys={
dialogHidden=optmethodbool, dialogHidden=optmethodbool,
dropdownHidden=optmethodbool, dropdownHidden=optmethodbool,
cmdHidden=optmethodbool, cmdHidden=optmethodbool,
tooltipHyperlink=optstringfunc,
icon=optstringnumberfunc, icon=optstringnumberfunc,
iconCoords=optmethodtable, iconCoords=optmethodtable,
handler=opttable, handler=opttable,

View File

@ -40,8 +40,8 @@
-- end -- end
-- @class file -- @class file
-- @name AceDB-3.0.lua -- @name AceDB-3.0.lua
-- @release $Id: AceDB-3.0.lua 1306 2023-06-23 14:55:09Z nevcairiel $ -- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 28 local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
if not AceDB then return end -- No upgrade needed if not AceDB then return end -- No upgrade needed
@ -53,6 +53,10 @@ local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-- WoW APIs -- WoW APIs
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub
AceDB.db_registry = AceDB.db_registry or {} AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame") AceDB.frame = AceDB.frame or CreateFrame("Frame")
@ -94,11 +98,11 @@ local function copyDefaults(dest, src)
-- This is a metatable used for table defaults -- This is a metatable used for table defaults
local mt = { local mt = {
-- This handles the lookup and creation of new subtables -- This handles the lookup and creation of new subtables
__index = function(t,k2) __index = function(t,k)
if k2 == nil then return nil end if k == nil then return nil end
local tbl = {} local tbl = {}
copyDefaults(tbl, v) copyDefaults(tbl, v)
rawset(t, k2, tbl) rawset(t, k, tbl)
return tbl return tbl
end, end,
} }
@ -111,7 +115,7 @@ local function copyDefaults(dest, src)
end end
else else
-- Values are not tables, so this is just a simple return -- Values are not tables, so this is just a simple return
local mt = {__index = function(t,k2) return k2~=nil and v or nil end} local mt = {__index = function(t,k) return k~=nil and v or nil end}
setmetatable(dest, mt) setmetatable(dest, mt)
end end
elseif type(v) == "table" then elseif type(v) == "table" then
@ -260,7 +264,7 @@ local factionrealmKey = factionKey .. " - " .. realmKey
local localeKey = GetLocale():lower() local localeKey = GetLocale():lower()
local regionTable = { "US", "KR", "EU", "TW", "CN" } local regionTable = { "US", "KR", "EU", "TW", "CN" }
local regionKey = regionTable[GetCurrentRegion()] or GetCurrentRegionName() or "TR" local regionKey = regionTable[GetCurrentRegion()]
local factionrealmregionKey = factionrealmKey .. " - " .. regionKey local factionrealmregionKey = factionrealmKey .. " - " .. regionKey
-- Actual database initialization function -- Actual database initialization function

View File

@ -1,7 +1,7 @@
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
-- @class file -- @class file
-- @name AceDBOptions-3.0 -- @name AceDBOptions-3.0
-- @release $Id: AceDBOptions-3.0.lua 1304 2023-05-19 19:50:10Z nevcairiel $ -- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
@ -13,6 +13,10 @@ local pairs, next = pairs, next
-- WoW APIs -- WoW APIs
local UnitClass = UnitClass local UnitClass = UnitClass
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NORMAL_FONT_COLOR_CODE, FONT_COLOR_CODE_CLOSE
AceDBOptions.optionTables = AceDBOptions.optionTables or {} AceDBOptions.optionTables = AceDBOptions.optionTables or {}
AceDBOptions.handlers = AceDBOptions.handlers or {} AceDBOptions.handlers = AceDBOptions.handlers or {}
@ -84,25 +88,25 @@ elseif LOCALE == "frFR" then
L["reset_desc"] = "Réinitialise le profil actuel au cas où votre configuration est corrompue ou si vous voulez tout simplement faire table rase." L["reset_desc"] = "Réinitialise le profil actuel au cas où votre configuration est corrompue ou si vous voulez tout simplement faire table rase."
L["reset_sub"] = "Réinitialise le profil actuel avec les paramètres par défaut." L["reset_sub"] = "Réinitialise le profil actuel avec les paramètres par défaut."
elseif LOCALE == "koKR" then elseif LOCALE == "koKR" then
L["choose"] = "기존 프로필" L["choose"] = "저장 중인 프로필"
L["choose_desc"] = "편집 상자에 이름을 입력하여 새로운 프로필을 만들거나 이미 존재하는 프로필 중 하나를 선택할 수 있습니다." L["choose_desc"] = "입력창에 새로운 이름을 입력하거나 저장 중인 프로필 중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
L["choose_sub"] = "현재 이용할 수 있는 프로필 중 하나를 선택합니다." L["choose_sub"] = "현재 이용할 수 있는 프로필 중 하나를 선택합니다."
L["copy"] = "복사해 올 프로필" L["copy"] = "복사해오기"
L["copy_desc"] = "기존 프로필의 설정을 현재 활성화된 프로필로 복사합니다." L["copy_desc"] = "현재 사용 중인 프로필에 선택한 프로필의 설정을 복사합니다."
L["current"] = "현재 프로필:" L["current"] = "현재 프로필:"
L["default"] = "기본값" L["default"] = "기본값"
L["delete"] = "프로필 삭제" L["delete"] = "프로필 삭제"
L["delete_confirm"] = "선택한 프로필을 삭제하시겠습니까?" L["delete_confirm"] = "정말로 선택한 프로필을 삭제할까요?"
L["delete_desc"] = "데이터베이스에서 기존 프로필과 사용하지 않는 프로필을 삭제하여 공간을 절약하고 SavedVariables 파일을 정리합니다." L["delete_desc"] = "저장 공간 절약과 SavedVariables 파일의 정리를 위해 데이터베이스에서 사용하지 않는 프로필을 삭제하세요."
L["delete_sub"] = "데이터베이스에서 프로필을 삭제합니다." L["delete_sub"] = "데이터베이스 프로필을 삭제합니다."
L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있으며, 모든 캐릭터마다 서로 다른 설정을 지정할 수 있습니다." L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있고, 각 캐릭터 별로 다른 설정을 할 수 있습니다."
L["new"] = "새로운 프로필" L["new"] = "새로운 프로필"
L["new_sub"] = "비어 있는 프로필을 새로 만듭니다." L["new_sub"] = "새로운 프로필을 만듭니다."
L["profiles"] = "프로필" L["profiles"] = "프로필"
L["profiles_sub"] = "프로필 관리" L["profiles_sub"] = "프로필 관리"
L["reset"] = "프로필 재설정" L["reset"] = "프로필 초기화"
L["reset_desc"] = "구성이 손상되었거나 처음부터 다시 시작하고 싶은 경우 현재 프로필을 기본값으로 재설정하세요." L["reset_desc"] = "설정이 깨졌거나 처음부터 다시 설정을 원하는 경우, 현재 프로필을 기본값으로 초기화하세요."
L["reset_sub"] = "현재 프로필을 기본값으로 재설정합니다" L["reset_sub"] = "현재 프로필을 기본값으로 초기화합니다"
elseif LOCALE == "esES" or LOCALE == "esMX" then elseif LOCALE == "esES" or LOCALE == "esMX" then
L["choose"] = "Perfiles existentes" L["choose"] = "Perfiles existentes"
L["choose_desc"] = "Puedes crear un nuevo perfil introduciendo un nombre en el recuadro o puedes seleccionar un perfil de los ya existentes." L["choose_desc"] = "Puedes crear un nuevo perfil introduciendo un nombre en el recuadro o puedes seleccionar un perfil de los ya existentes."
@ -166,31 +170,31 @@ elseif LOCALE == "zhCN" then
elseif LOCALE == "ruRU" then elseif LOCALE == "ruRU" then
L["choose"] = "Существующие профили" L["choose"] = "Существующие профили"
L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей." L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей."
L["choose_sub"] = "Выбор одного из уже доступных профилей." L["choose_sub"] = "Выбор одиного из уже доступных профилей"
L["copy"] = "Скопировать из" L["copy"] = "Скопировать из"
L["copy_desc"] = "Копирование настроек из выбранного профиля в активный." L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный."
L["current"] = "Текущий профиль:" L["current"] = "Текущий профиль:"
L["default"] = "По умолчанию" L["default"] = "По умолчанию"
L["delete"] = "Удалить профиль" L["delete"] = "Удалить профиль"
L["delete_confirm"] = "Вы уверены, что хотите удалить выбранный профиль?" L["delete_confirm"] = "Вы уверены, что вы хотите удалить выбранный профиль?"
L["delete_desc"] = "Удаление существующего и неиспользуемого профиля из базы данных для сохранения места, и очистка файла SavedVariables." L["delete_desc"] = "Удалить существующий и неиспользуемый профиль из БД для сохранения места, и очистить SavedVariables файл."
L["delete_sub"] = "Удаление профиля из базы данных." L["delete_sub"] = "Удаление профиля из БД"
L["intro"] = "Изменяя активный профиль, Вы можете задать разные настройки для каждого персонажа." L["intro"] = "Изменяя активный профиль, вы можете задать различные настройки модификаций для каждого персонажа."
L["new"] = "Новый" L["new"] = "Новый"
L["new_sub"] = "Создание нового чистого профиля." L["new_sub"] = "Создать новый чистый профиль"
L["profiles"] = "Профили" L["profiles"] = "Профили"
L["profiles_sub"] = "Управление профилями" L["profiles_sub"] = "Управление профилями"
L["reset"] = "Сбросить профиль" L["reset"] = "Сброс профиля"
L["reset_desc"] = "Сброс текущего профиля к стандартным настройкам, если Ваша конфигурация испорчена или Вы хотите настроить все заново." L["reset_desc"] = "Сбросить текущий профиль к стандартным настройкам, если ваша конфигурация испорчена или вы хотите настроить всё заново."
L["reset_sub"] = "Сброс текущего профиля на стандартный" L["reset_sub"] = "Сброс текущего профиля на стандартный"
elseif LOCALE == "itIT" then elseif LOCALE == "itIT" then
L["choose"] = "Profili Esistenti" L["choose"] = "Profili Esistenti"
L["choose_desc"] = "Puoi creare un nuovo profilo digitando il nome della casella di testo, oppure scegliendone uno tra i profili già esistenti." L["choose_desc"] = "Puoi creare un nuovo profilo digitando il nome della casella di testo, oppure scegliendone uno tra i profili già esistenti."
L["choose_sub"] = "Seleziona uno dei profili attualmente disponibili." L["choose_sub"] = "Seleziona uno dei profili attualmente disponibili."
L["copy"] = "Copia Da" L["copy"] = "Copia Da"
L["copy_desc"] = "Copia le impostazioni da un profilo esistente nel profilo attivo in questo momento." L["copy_desc"] = "Copia le impostazioni da un profilo esistente, nel profilo attivo in questo momento."
L["current"] = "Profilo Attivo:" L["current"] = "Profilo Attivo:"
L["default"] = "Predefinito" L["default"] = "Standard"
L["delete"] = "Cancella un Profilo" L["delete"] = "Cancella un Profilo"
L["delete_confirm"] = "Sei sicuro di voler cancellare il profilo selezionato?" L["delete_confirm"] = "Sei sicuro di voler cancellare il profilo selezionato?"
L["delete_desc"] = "Cancella i profili non utilizzati dal database per risparmiare spazio e mantenere puliti i file di configurazione SavedVariables." L["delete_desc"] = "Cancella i profili non utilizzati dal database per risparmiare spazio e mantenere puliti i file di configurazione SavedVariables."

View File

@ -24,22 +24,28 @@
-- f:AddChild(btn) -- f:AddChild(btn)
-- @class file -- @class file
-- @name AceGUI-3.0 -- @name AceGUI-3.0
-- @release $Id: AceGUI-3.0.lua 1288 2022-09-25 14:19:00Z funkehdude $ -- @release $Id: AceGUI-3.0.lua 1231 2020-04-14 22:20:36Z nevcairiel $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
if not AceGUI then return end -- No upgrade needed if not AceGUI then return end -- No upgrade needed
-- Lua APIs -- Lua APIs
local tinsert, wipe = table.insert, table.wipe local tinsert = table.insert
local select, pairs, next, type = select, pairs, next, type local select, pairs, next, type = select, pairs, next, type
local error, assert = error, assert local error, assert = error, assert
local setmetatable, rawget = setmetatable, rawget local setmetatable, rawget = setmetatable, rawget
local math_max, math_min, math_ceil = math.max, math.min, math.ceil local math_max = math.max
-- WoW APIs -- WoW APIs
local UIParent = UIParent local UIParent = UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler, LibStub
--local con = LibStub("AceConsole-3.0",true)
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {} AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {} AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
AceGUI.WidgetBase = AceGUI.WidgetBase or {} AceGUI.WidgetBase = AceGUI.WidgetBase or {}
@ -88,38 +94,38 @@ do
AceGUI.objPools = AceGUI.objPools or {} AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor --Returns a new instance, if none are available either returns a new table or calls the given contructor
function newWidget(widgetType) function newWidget(type)
if not WidgetRegistry[widgetType] then if not WidgetRegistry[type] then
error("Attempt to instantiate unknown widget type", 2) error("Attempt to instantiate unknown widget type", 2)
end end
if not objPools[widgetType] then if not objPools[type] then
objPools[widgetType] = {} objPools[type] = {}
end end
local newObj = next(objPools[widgetType]) local newObj = next(objPools[type])
if not newObj then if not newObj then
newObj = WidgetRegistry[widgetType]() newObj = WidgetRegistry[type]()
newObj.AceGUIWidgetVersion = WidgetVersions[widgetType] newObj.AceGUIWidgetVersion = WidgetVersions[type]
else else
objPools[widgetType][newObj] = nil objPools[type][newObj] = nil
-- if the widget is older then the latest, don't even try to reuse it -- if the widget is older then the latest, don't even try to reuse it
-- just forget about it, and grab a new one. -- just forget about it, and grab a new one.
if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[widgetType] then if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
return newWidget(widgetType) return newWidget(type)
end end
end end
return newObj return newObj
end end
-- Releases an instance to the Pool -- Releases an instance to the Pool
function delWidget(obj,widgetType) function delWidget(obj,type)
if not objPools[widgetType] then if not objPools[type] then
objPools[widgetType] = {} objPools[type] = {}
end end
if objPools[widgetType][obj] then if objPools[type][obj] then
error("Attempt to Release Widget that is already released", 2) error("Attempt to Release Widget that is already released", 2)
end end
objPools[widgetType][obj] = true objPools[type][obj] = true
end end
end end
@ -135,9 +141,9 @@ end
-- OnAcquire function on it, before returning. -- OnAcquire function on it, before returning.
-- @param type The type of the widget. -- @param type The type of the widget.
-- @return The newly created widget. -- @return The newly created widget.
function AceGUI:Create(widgetType) function AceGUI:Create(type)
if WidgetRegistry[widgetType] then if WidgetRegistry[type] then
local widget = newWidget(widgetType) local widget = newWidget(type)
if rawget(widget, "Acquire") then if rawget(widget, "Acquire") then
widget.OnAcquire = widget.Acquire widget.OnAcquire = widget.Acquire
@ -155,7 +161,7 @@ function AceGUI:Create(widgetType)
if widget.OnAcquire then if widget.OnAcquire then
widget:OnAcquire() widget:OnAcquire()
else else
error(("Widget type %s doesn't supply an OnAcquire Function"):format(widgetType)) error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
end end
-- Set the default Layout ("List") -- Set the default Layout ("List")
safecall(widget.SetLayout, widget, "List") safecall(widget.SetLayout, widget, "List")
@ -583,25 +589,25 @@ AceGUI.counts = AceGUI.counts or {}
-- This is used by widgets that require a named frame, e.g. when a Blizzard -- This is used by widgets that require a named frame, e.g. when a Blizzard
-- Template requires it. -- Template requires it.
-- @param type The widget type -- @param type The widget type
function AceGUI:GetNextWidgetNum(widgetType) function AceGUI:GetNextWidgetNum(type)
if not self.counts[widgetType] then if not self.counts[type] then
self.counts[widgetType] = 0 self.counts[type] = 0
end end
self.counts[widgetType] = self.counts[widgetType] + 1 self.counts[type] = self.counts[type] + 1
return self.counts[widgetType] return self.counts[type]
end end
--- Return the number of created widgets for this type. --- Return the number of created widgets for this type.
-- In contrast to GetNextWidgetNum, the number is not incremented. -- In contrast to GetNextWidgetNum, the number is not incremented.
-- @param widgetType The widget type -- @param type The widget type
function AceGUI:GetWidgetCount(widgetType) function AceGUI:GetWidgetCount(type)
return self.counts[widgetType] or 0 return self.counts[type] or 0
end end
--- Return the version of the currently registered widget type. --- Return the version of the currently registered widget type.
-- @param widgetType The widget type -- @param type The widget type
function AceGUI:GetWidgetVersion(widgetType) function AceGUI:GetWidgetVersion(type)
return WidgetVersions[widgetType] return WidgetVersions[type]
end end
------------- -------------
@ -764,6 +770,7 @@ AceGUI:RegisterLayout("Flow",
usedwidth = 0 usedwidth = 0
rowstart = frame rowstart = frame
rowstartoffset = frameoffset
if child.DoLayout then if child.DoLayout then
child:DoLayout() child:DoLayout()
@ -806,8 +813,7 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
or colObj and (colObj["align" .. dir] or colObj.align) or colObj and (colObj["align" .. dir] or colObj.align)
or tableObj["align" .. dir] or tableObj.align or tableObj["align" .. dir] or tableObj.align
or "CENTERLEFT" or "CENTERLEFT"
local val local child, cell, val = child or 0, cell or 0, nil
child, cell = child or 0, cell or 0
if type(fn) == "string" then if type(fn) == "string" then
fn = fn:lower() fn = fn:lower()
@ -821,7 +827,7 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
val = fn val = fn
end end
return fn, math_max(0, math_min(val, cell)) return fn, max(0, min(val, cell))
end end
-- Get width or height for multiple cells combined -- Get width or height for multiple cells combined
@ -830,7 +836,7 @@ local GetCellDimension = function (dir, laneDim, from, to, space)
for cell=from,to do for cell=from,to do
dim = dim + (laneDim[cell] or 0) dim = dim + (laneDim[cell] or 0)
end end
return dim + math_max(0, to - from) * (space or 0) return dim + max(0, to - from) * (space or 0)
end end
--[[ Options --[[ Options
@ -876,7 +882,7 @@ AceGUI:RegisterLayout("Table",
repeat repeat
n = n + 1 n = n + 1
local col = (n - 1) % #cols + 1 local col = (n - 1) % #cols + 1
local row = math_ceil(n / #cols) local row = ceil(n / #cols)
local rowspan = rowspans[col] local rowspan = rowspans[col]
local cell = rowspan and rowspan.child or child local cell = rowspan and rowspan.child or child
local cellObj = cell:GetUserData("cell") local cellObj = cell:GetUserData("cell")
@ -892,7 +898,7 @@ AceGUI:RegisterLayout("Table",
end end
-- Colspan -- Colspan
local colspan = math_max(0, math_min((cellObj and cellObj.colspan or 1) - 1, #cols - col)) local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
n = n + colspan n = n + colspan
-- Place the cell -- Place the cell
@ -909,7 +915,7 @@ AceGUI:RegisterLayout("Table",
end end
end end
local rows = math_ceil(n / #cols) local rows = ceil(n / #cols)
-- Determine fixed size cols and collect weights -- Determine fixed size cols and collect weights
local extantH, totalWeight = totalH, 0 local extantH, totalWeight = totalH, 0
@ -934,16 +940,16 @@ AceGUI:RegisterLayout("Table",
f:ClearAllPoints() f:ClearAllPoints()
local childH = f:GetWidth() or 0 local childH = f:GetWidth() or 0
laneH[col] = math_max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH)) laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
end end
end end
laneH[col] = math_max(colObj.min or colObj[1] or 0, math_min(laneH[col], colObj.max or colObj[2] or laneH[col])) laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col]))
else else
-- Rel./Abs. width -- Rel./Abs. width
laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width
end end
extantH = math_max(0, extantH - laneH[col]) extantH = max(0, extantH - laneH[col])
end end
end end
@ -982,7 +988,7 @@ AceGUI:RegisterLayout("Table",
child:DoLayout() child:DoLayout()
end end
rowV = math_max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV)) rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
end end
end end

View File

@ -2,7 +2,7 @@
BlizOptionsGroup Container BlizOptionsGroup Container
Simple container widget for the integration of AceGUI into the Blizzard Interface Options Simple container widget for the integration of AceGUI into the Blizzard Interface Options
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "BlizOptionsGroup", 26 local Type, Version = "BlizOptionsGroup", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -99,7 +99,7 @@ local methods = {
Constructor Constructor
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Constructor() local function Constructor()
local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer) local frame = CreateFrame("Frame")
frame:Hide() frame:Hide()
-- support functions for the Blizzard Interface Options -- support functions for the Blizzard Interface Options
@ -108,11 +108,6 @@ local function Constructor()
frame.default = default frame.default = default
frame.refresh = refresh frame.refresh = refresh
-- 10.0 support function aliases (cancel has been removed)
frame.OnCommit = okay
frame.OnDefault = default
frame.OnRefresh = refresh
frame:SetScript("OnHide", OnHide) frame:SetScript("OnHide", OnHide)
frame:SetScript("OnShow", OnShow) frame:SetScript("OnShow", OnShow)

View File

@ -125,7 +125,7 @@ local function Constructor()
dropdown.frame:Show() dropdown.frame:Show()
dropdown:SetLabel("") dropdown:SetLabel("")
local border = CreateFrame("Frame", nil, frame, "BackdropTemplate") local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
border:SetPoint("TOPLEFT", 0, -26) border:SetPoint("TOPLEFT", 0, -26)
border:SetPoint("BOTTOMRIGHT", 0, 3) border:SetPoint("BOTTOMRIGHT", 0, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

View File

@ -1,7 +1,7 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Frame Container Frame Container
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Frame", 30 local Type, Version = "Frame", 27
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -13,6 +13,10 @@ local wipe = table.wipe
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: CLOSE
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -79,7 +83,6 @@ local methods = {
["OnAcquire"] = function(self) ["OnAcquire"] = function(self)
self.frame:SetParent(UIParent) self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
self.frame:SetFrameLevel(100) -- Lots of room to draw under it
self:SetTitle() self:SetTitle()
self:SetStatusText() self:SetStatusText()
self:ApplyStatus() self:ApplyStatus()
@ -176,21 +179,16 @@ local PaneBackdrop = {
} }
local function Constructor() local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent, "BackdropTemplate") local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
frame:Hide() frame:Hide()
frame:EnableMouse(true) frame:EnableMouse(true)
frame:SetMovable(true) frame:SetMovable(true)
frame:SetResizable(true) frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetFrameLevel(100) -- Lots of room to draw under it
frame:SetBackdrop(FrameBackdrop) frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0, 0, 0, 1) frame:SetBackdropColor(0, 0, 0, 1)
if frame.SetResizeBounds then -- WoW 10.0
frame:SetResizeBounds(400, 200)
else
frame:SetMinResize(400, 200) frame:SetMinResize(400, 200)
end
frame:SetToplevel(true) frame:SetToplevel(true)
frame:SetScript("OnShow", Frame_OnShow) frame:SetScript("OnShow", Frame_OnShow)
frame:SetScript("OnHide", Frame_OnClose) frame:SetScript("OnHide", Frame_OnClose)
@ -203,7 +201,7 @@ local function Constructor()
closebutton:SetWidth(100) closebutton:SetWidth(100)
closebutton:SetText(CLOSE) closebutton:SetText(CLOSE)
local statusbg = CreateFrame("Button", nil, frame, "BackdropTemplate") local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
statusbg:SetPoint("BOTTOMLEFT", 15, 15) statusbg:SetPoint("BOTTOMLEFT", 15, 15)
statusbg:SetPoint("BOTTOMRIGHT", -132, 15) statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
statusbg:SetHeight(24) statusbg:SetHeight(24)
@ -271,7 +269,7 @@ local function Constructor()
line2:SetHeight(8) line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8) line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
x = 0.1 * 8/17 local x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5) line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame", nil, frame) local sizer_s = CreateFrame("Frame", nil, frame)

View File

@ -75,7 +75,7 @@ local function Constructor()
titletext:SetJustifyH("LEFT") titletext:SetJustifyH("LEFT")
titletext:SetHeight(18) titletext:SetHeight(18)
local border = CreateFrame("Frame", nil, frame, "BackdropTemplate") local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
border:SetPoint("TOPLEFT", 0, -17) border:SetPoint("TOPLEFT", 0, -17)
border:SetPoint("BOTTOMRIGHT", -1, 3) border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

View File

@ -2,18 +2,22 @@
TabGroup Container TabGroup Container
Container that uses tabs on top to switch between groups. Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "TabGroup", 38 local Type, Version = "TabGroup", 37
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, table.wipe local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
-- WoW APIs -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-- local upvalue storage used by BuildTabs -- local upvalue storage used by BuildTabs
local widths = {} local widths = {}
local rowwidths = {} local rowwidths = {}
@ -22,143 +26,6 @@ local rowends = {}
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function PanelTemplates_TabResize(tab, padding, absoluteSize, minWidth, maxWidth, absoluteTextSize)
local tabName = tab:GetName();
local buttonMiddle = tab.Middle or tab.middleTexture or _G[tabName.."Middle"];
local buttonMiddleDisabled = tab.MiddleDisabled or (tabName and _G[tabName.."MiddleDisabled"]);
local left = tab.Left or tab.leftTexture or _G[tabName.."Left"];
local sideWidths = 2 * left:GetWidth();
local tabText = tab.Text or _G[tab:GetName().."Text"];
local highlightTexture = tab.HighlightTexture or (tabName and _G[tabName.."HighlightTexture"]);
local width, tabWidth;
local textWidth;
if ( absoluteTextSize ) then
textWidth = absoluteTextSize;
else
tabText:SetWidth(0);
textWidth = tabText:GetWidth();
end
-- If there's an absolute size specified then use it
if ( absoluteSize ) then
if ( absoluteSize < sideWidths) then
width = 1;
tabWidth = sideWidths
else
width = absoluteSize - sideWidths;
tabWidth = absoluteSize
end
tabText:SetWidth(width);
else
-- Otherwise try to use padding
if ( padding ) then
width = textWidth + padding;
else
width = textWidth + 24;
end
-- If greater than the maxWidth then cap it
if ( maxWidth and width > maxWidth ) then
if ( padding ) then
width = maxWidth + padding;
else
width = maxWidth + 24;
end
tabText:SetWidth(width);
else
tabText:SetWidth(0);
end
if (minWidth and width < minWidth) then
width = minWidth;
end
tabWidth = width + sideWidths;
end
if ( buttonMiddle ) then
buttonMiddle:SetWidth(width);
end
if ( buttonMiddleDisabled ) then
buttonMiddleDisabled:SetWidth(width);
end
tab:SetWidth(tabWidth);
if ( highlightTexture ) then
highlightTexture:SetWidth(tabWidth);
end
end
local function PanelTemplates_DeselectTab(tab)
local name = tab:GetName();
local left = tab.Left or _G[name.."Left"];
local middle = tab.Middle or _G[name.."Middle"];
local right = tab.Right or _G[name.."Right"];
left:Show();
middle:Show();
right:Show();
--tab:UnlockHighlight();
tab:Enable();
local text = tab.Text or _G[name.."Text"];
text:SetPoint("CENTER", tab, "CENTER", (tab.deselectedTextX or 0), (tab.deselectedTextY or 2));
local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
leftDisabled:Hide();
middleDisabled:Hide();
rightDisabled:Hide();
end
local function PanelTemplates_SelectTab(tab)
local name = tab:GetName();
local left = tab.Left or _G[name.."Left"];
local middle = tab.Middle or _G[name.."Middle"];
local right = tab.Right or _G[name.."Right"];
left:Hide();
middle:Hide();
right:Hide();
--tab:LockHighlight();
tab:Disable();
tab:SetDisabledFontObject(GameFontHighlightSmall);
local text = tab.Text or _G[name.."Text"];
text:SetPoint("CENTER", tab, "CENTER", (tab.selectedTextX or 0), (tab.selectedTextY or -3));
local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
leftDisabled:Show();
middleDisabled:Show();
rightDisabled:Show();
if GameTooltip:IsOwned(tab) then
GameTooltip:Hide();
end
end
local function PanelTemplates_SetDisabledTabState(tab)
local name = tab:GetName();
local left = tab.Left or _G[name.."Left"];
local middle = tab.Middle or _G[name.."Middle"];
local right = tab.Right or _G[name.."Right"];
left:Show();
middle:Show();
right:Show();
--tab:UnlockHighlight();
tab:Disable();
tab.text = tab:GetText();
-- Gray out text
tab:SetDisabledFontObject(GameFontDisableSmall);
local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
leftDisabled:Hide();
middleDisabled:Hide();
rightDisabled:Hide();
end
local function UpdateTabLook(frame) local function UpdateTabLook(frame)
if frame.disabled then if frame.disabled then
PanelTemplates_SetDisabledTabState(frame) PanelTemplates_SetDisabledTabState(frame)
@ -236,64 +103,11 @@ local methods = {
["CreateTab"] = function(self, id) ["CreateTab"] = function(self, id)
local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id) local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
local tab = CreateFrame("Button", tabname, self.border) local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
tab:SetSize(115, 24)
tab.deselectedTextY = -3
tab.selectedTextY = -2
tab.LeftDisabled = tab:CreateTexture(tabname .. "LeftDisabled", "BORDER")
tab.LeftDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
tab.LeftDisabled:SetSize(20, 24)
tab.LeftDisabled:SetPoint("BOTTOMLEFT", 0, -3)
tab.LeftDisabled:SetTexCoord(0, 0.15625, 0, 1.0)
tab.MiddleDisabled = tab:CreateTexture(tabname .. "MiddleDisabled", "BORDER")
tab.MiddleDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
tab.MiddleDisabled:SetSize(88, 24)
tab.MiddleDisabled:SetPoint("LEFT", tab.LeftDisabled, "RIGHT")
tab.MiddleDisabled:SetTexCoord(0.15625, 0.84375, 0, 1.0)
tab.RightDisabled = tab:CreateTexture(tabname .. "RightDisabled", "BORDER")
tab.RightDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
tab.RightDisabled:SetSize(20, 24)
tab.RightDisabled:SetPoint("LEFT", tab.MiddleDisabled, "RIGHT")
tab.RightDisabled:SetTexCoord(0.84375, 1.0, 0, 1.0)
tab.Left = tab:CreateTexture(tabname .. "Left", "BORDER")
tab.Left:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
tab.Left:SetSize(20, 24)
tab.Left:SetPoint("TOPLEFT")
tab.Left:SetTexCoord(0, 0.15625, 0, 1.0)
tab.Middle = tab:CreateTexture(tabname .. "Middle", "BORDER")
tab.Middle:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
tab.Middle:SetSize(88, 24)
tab.Middle:SetPoint("LEFT", tab.Left, "RIGHT")
tab.Middle:SetTexCoord(0.15625, 0.84375, 0, 1.0)
tab.Right = tab:CreateTexture(tabname .. "Right", "BORDER")
tab.Right:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
tab.Right:SetSize(20, 24)
tab.Right:SetPoint("LEFT", tab.Middle, "RIGHT")
tab.Right:SetTexCoord(0.84375, 1.0, 0, 1.0)
tab.Text = tab:CreateFontString(tabname .. "Text")
tab:SetFontString(tab.Text)
tab:SetNormalFontObject(GameFontNormalSmall)
tab:SetHighlightFontObject(GameFontHighlightSmall)
tab:SetDisabledFontObject(GameFontHighlightSmall)
tab:SetHighlightTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight", "ADD")
tab.HighlightTexture = tab:GetHighlightTexture()
tab.HighlightTexture:ClearAllPoints()
tab.HighlightTexture:SetPoint("LEFT", tab, "LEFT", 10, -4)
tab.HighlightTexture:SetPoint("RIGHT", tab, "RIGHT", -10, -4)
_G[tabname .. "HighlightTexture"] = tab.HighlightTexture
tab.obj = self tab.obj = self
tab.id = id tab.id = id
tab.text = tab.Text -- compat tab.text = _G[tabname .. "Text"]
tab.text:ClearAllPoints() tab.text:ClearAllPoints()
tab.text:SetPoint("LEFT", 14, -3) tab.text:SetPoint("LEFT", 14, -3)
tab.text:SetPoint("RIGHT", -12, -3) tab.text:SetPoint("RIGHT", -12, -3)
@ -502,7 +316,7 @@ local function Constructor()
titletext:SetHeight(18) titletext:SetHeight(18)
titletext:SetText("") titletext:SetText("")
local border = CreateFrame("Frame", nil, frame, "BackdropTemplate") local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
border:SetPoint("TOPLEFT", 1, -27) border:SetPoint("TOPLEFT", 1, -27)
border:SetPoint("BOTTOMRIGHT", -1, 3) border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

View File

@ -2,18 +2,22 @@
TreeGroup Container TreeGroup Container
Container that uses a tree control to switch between groups. Container that uses a tree control to switch between groups.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "TreeGroup", 47 local Type, Version = "TreeGroup", 45
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
local math_min, math_max, floor = math.min, math.max, math.floor local math_min, math_max, floor = math.min, math.max, floor
local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: FONT_COLOR_CODE_CLOSE
-- Recycling functions -- Recycling functions
local new, del local new, del
do do
@ -563,11 +567,7 @@ local methods = {
if maxtreewidth > 100 and status.treewidth > maxtreewidth then if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable) self:SetTreeWidth(maxtreewidth, status.treesizable)
end end
if treeframe.SetResizeBounds then
treeframe:SetResizeBounds(100, 1, maxtreewidth, 1600)
else
treeframe:SetMaxResize(maxtreewidth, 1600) treeframe:SetMaxResize(maxtreewidth, 1600)
end
end, end,
["OnHeightSet"] = function(self, height) ["OnHeightSet"] = function(self, height)
@ -637,7 +637,7 @@ local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type) local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent)
local treeframe = CreateFrame("Frame", nil, frame, "BackdropTemplate") local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
treeframe:SetPoint("TOPLEFT") treeframe:SetPoint("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT") treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH) treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@ -646,17 +646,13 @@ local function Constructor()
treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5) treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4) treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
treeframe:SetResizable(true) treeframe:SetResizable(true)
if treeframe.SetResizeBounds then -- WoW 10.0
treeframe:SetResizeBounds(100, 1, 400, 1600)
else
treeframe:SetMinResize(100, 1) treeframe:SetMinResize(100, 1)
treeframe:SetMaxResize(400, 1600) treeframe:SetMaxResize(400, 1600)
end
treeframe:SetScript("OnUpdate", FirstFrameUpdate) treeframe:SetScript("OnUpdate", FirstFrameUpdate)
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
local dragger = CreateFrame("Frame", nil, treeframe, "BackdropTemplate") local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
dragger:SetWidth(8) dragger:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT") dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT") dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
@ -681,7 +677,7 @@ local function Constructor()
scrollbg:SetAllPoints(scrollbar) scrollbg:SetAllPoints(scrollbar)
scrollbg:SetColorTexture(0,0,0,0.4) scrollbg:SetColorTexture(0,0,0,0.4)
local border = CreateFrame("Frame", nil, frame, "BackdropTemplate") local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT") border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT") border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

View File

@ -7,6 +7,10 @@ local pairs, assert, type = pairs, assert, type
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontNormal
---------------- ----------------
-- Main Frame -- -- Main Frame --
---------------- ----------------
@ -17,7 +21,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent
]] ]]
do do
local Type = "Window" local Type = "Window"
local Version = 8 local Version = 6
local function frameOnShow(this) local function frameOnShow(this)
this.obj:Fire("OnShow") this.obj:Fire("OnShow")
@ -182,11 +186,7 @@ do
frame:SetScript("OnShow",frameOnShow) frame:SetScript("OnShow",frameOnShow)
frame:SetScript("OnHide",frameOnClose) frame:SetScript("OnHide",frameOnClose)
if frame.SetResizeBounds then -- WoW 10.0
frame:SetResizeBounds(240,240)
else
frame:SetMinResize(240,240) frame:SetMinResize(240,240)
end
frame:SetToplevel(true) frame:SetToplevel(true)
local titlebg = frame:CreateTexture(nil, "BACKGROUND") local titlebg = frame:CreateTexture(nil, "BACKGROUND")
@ -300,7 +300,7 @@ do
line2:SetHeight(8) line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8) line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
x = 0.1 * 8/17 local x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5) line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame",nil,frame) local sizer_s = CreateFrame("Frame",nil,frame)

View File

@ -12,6 +12,10 @@ local select, pairs = select, pairs
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: SetDesaturation, GameFontHighlight
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -195,14 +199,14 @@ local methods = {
["SetDescription"] = function(self, desc) ["SetDescription"] = function(self, desc)
if desc then if desc then
if not self.desc then if not self.desc then
local f = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
f:ClearAllPoints() desc:ClearAllPoints()
f:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21) desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
f:SetWidth(self.frame.width - 30) desc:SetWidth(self.frame.width - 30)
f:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0) desc:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
f:SetJustifyH("LEFT") desc:SetJustifyH("LEFT")
f:SetJustifyV("TOP") desc:SetJustifyV("TOP")
self.desc = f self.desc = desc
end end
self.desc:Show() self.desc:Show()
--self.text:SetFontObject(GameFontNormal) --self.text:SetFontObject(GameFontNormal)

View File

@ -11,6 +11,10 @@ local pairs = pairs
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: ColorPickerFrame, OpacitySliderFrame
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]

View File

@ -1,4 +1,4 @@
--[[ $Id: AceGUIWidget-DropDown-Items.lua 1272 2022-08-29 15:56:35Z nevcairiel $ ]]-- --[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
@ -41,7 +41,7 @@ local ItemBase = {
-- NOTE: The ItemBase version is added to each item's version number -- NOTE: The ItemBase version is added to each item's version number
-- to ensure proper updates on ItemBase changes. -- to ensure proper updates on ItemBase changes.
-- Use at least 1000er steps. -- Use at least 1000er steps.
version = 2000, version = 1000,
counter = 0, counter = 0,
} }
@ -178,7 +178,7 @@ function ItemBase.Create(type)
highlight:Hide() highlight:Hide()
self.highlight = highlight self.highlight = highlight
local check = frame:CreateTexture(nil, "OVERLAY") local check = frame:CreateTexture("OVERLAY")
check:SetWidth(16) check:SetWidth(16)
check:SetHeight(16) check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1) check:SetPoint("LEFT",frame,"LEFT",3,-1)
@ -186,7 +186,7 @@ function ItemBase.Create(type)
check:Hide() check:Hide()
self.check = check self.check = check
local sub = frame:CreateTexture(nil, "OVERLAY") local sub = frame:CreateTexture("OVERLAY")
sub:SetWidth(16) sub:SetWidth(16)
sub:SetHeight(16) sub:SetHeight(16)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1) sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)

View File

@ -1,4 +1,4 @@
--[[ $Id: AceGUIWidget-DropDown.lua 1284 2022-09-25 09:15:30Z nevcairiel $ ]]-- --[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
-- Lua APIs -- Lua APIs
@ -11,6 +11,10 @@ local PlaySound = PlaySound
local UIParent, CreateFrame = UIParent, CreateFrame local UIParent, CreateFrame = UIParent, CreateFrame
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: CLOSE
local function fixlevels(parent,...) local function fixlevels(parent,...)
local i = 1 local i = 1
local child = select(i, ...) local child = select(i, ...)
@ -249,7 +253,7 @@ do
local function Constructor() local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType) local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, "BackdropTemplate") local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
local self = {} local self = {}
self.count = count self.count = count
self.type = widgetType self.type = widgetType
@ -300,7 +304,7 @@ do
scrollFrame.obj = self scrollFrame.obj = self
itemFrame.obj = self itemFrame.obj = self
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, "BackdropTemplate") local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil)
slider:SetOrientation("VERTICAL") slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0) slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop) slider:SetBackdrop(sliderBackdrop)
@ -347,7 +351,7 @@ end
do do
local widgetType = "Dropdown" local widgetType = "Dropdown"
local widgetVersion = 36 local widgetVersion = 35
--[[ Static data ]]-- --[[ Static data ]]--
@ -372,6 +376,7 @@ do
local function Dropdown_TogglePullout(this) local function Dropdown_TogglePullout(this)
local self = this.obj local self = this.obj
PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
if self.open then if self.open then
self.open = nil self.open = nil
self.pullout:Close() self.pullout:Close()

View File

@ -14,6 +14,10 @@ local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, Get
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]

View File

@ -13,6 +13,10 @@ local pairs = pairs
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NOT_BOUND
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Scripts Scripts
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -210,7 +214,7 @@ local function Constructor()
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER")
label:SetHeight(18) label:SetHeight(18)
local msgframe = CreateFrame("Frame", nil, UIParent, "BackdropTemplate") local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
msgframe:SetHeight(30) msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop) msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0) msgframe:SetBackdropColor(0,0,0)

View File

@ -2,7 +2,7 @@
Label Widget Label Widget
Displays text and optionally an icon. Displays text and optionally an icon.
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Label", 28 local Type, Version = "Label", 27
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -12,6 +12,10 @@ local max, select, pairs = math.max, select, pairs
-- WoW APIs -- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontHighlightSmall
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -125,16 +129,12 @@ local methods = {
end, end,
["SetFont"] = function(self, font, height, flags) ["SetFont"] = function(self, font, height, flags)
if not self.fontObject then self.label:SetFont(font, height, flags)
self.fontObject = CreateFont("AceGUI30LabelFont" .. AceGUI:GetNextWidgetNum(Type)) UpdateImageAnchor(self)
end
self.fontObject:SetFont(font, height, flags)
self:SetFontObject(self.fontObject)
end, end,
["SetFontObject"] = function(self, font) ["SetFontObject"] = function(self, font)
self.label:SetFontObject(font or GameFontHighlightSmall) self:SetFont((font or GameFontHighlightSmall):GetFont())
UpdateImageAnchor(self)
end, end,
["SetImageSize"] = function(self, width, height) ["SetImageSize"] = function(self, width, height)

View File

@ -1,4 +1,4 @@
local Type, Version = "MultiLineEditBox", 32 local Type, Version = "MultiLineEditBox", 29
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -10,6 +10,10 @@ local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, Cl
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G local _G = _G
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: ACCEPT, ChatFontNormal
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -141,14 +145,6 @@ local function OnVerticalScroll(self, offset)
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight()) editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
end end
local function OnScrollRangeChanged(self, xrange, yrange)
if yrange == 0 then
self.obj.editBox:SetHitRectInsets(0, 0, 0, 0)
else
OnVerticalScroll(self, self:GetVerticalScroll())
end
end
local function OnShowFocus(frame) local function OnShowFocus(frame)
frame.obj.editBox:SetFocus() frame.obj.editBox:SetFocus()
frame:SetScript("OnShow", nil) frame:SetScript("OnShow", nil)
@ -261,6 +257,8 @@ local methods = {
["SetCursorPosition"] = function(self, ...) ["SetCursorPosition"] = function(self, ...)
return self.editBox:SetCursorPosition(...) return self.editBox:SetCursorPosition(...)
end, end,
} }
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
@ -299,7 +297,7 @@ local function Constructor()
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1) text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
text:SetJustifyV("MIDDLE") text:SetJustifyV("MIDDLE")
local scrollBG = CreateFrame("Frame", nil, frame, "BackdropTemplate") local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
scrollBG:SetBackdrop(backdrop) scrollBG:SetBackdrop(backdrop)
scrollBG:SetBackdropColor(0, 0, 0) scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
@ -323,7 +321,6 @@ local function Constructor()
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag) scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged) scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll) scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
scrollFrame:HookScript("OnScrollRangeChanged", OnScrollRangeChanged)
local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame) local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
editBox:SetAllPoints() editBox:SetAllPoints()

View File

@ -14,6 +14,10 @@ local tonumber, pairs = tonumber, pairs
local PlaySound = PlaySound local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent local CreateFrame, UIParent = CreateFrame, UIParent
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontHighlightSmall
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Support functions Support functions
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
@ -27,13 +31,13 @@ local function UpdateText(self)
end end
local function UpdateLabels(self) local function UpdateLabels(self)
local min_value, max_value = (self.min or 0), (self.max or 100) local min, max = (self.min or 0), (self.max or 100)
if self.ispercent then if self.ispercent then
self.lowtext:SetFormattedText("%s%%", (min_value * 100)) self.lowtext:SetFormattedText("%s%%", (min * 100))
self.hightext:SetFormattedText("%s%%", (max_value * 100)) self.hightext:SetFormattedText("%s%%", (max * 100))
else else
self.lowtext:SetText(min_value) self.lowtext:SetText(min)
self.hightext:SetText(max_value) self.hightext:SetText(max)
end end
end end
@ -171,13 +175,13 @@ local methods = {
self.label:SetText(text) self.label:SetText(text)
end, end,
["SetSliderValues"] = function(self, min_value, max_value, step) ["SetSliderValues"] = function(self, min, max, step)
local frame = self.slider local frame = self.slider
frame.setup = true frame.setup = true
self.min = min_value self.min = min
self.max = max_value self.max = max
self.step = step self.step = step
frame:SetMinMaxValues(min_value or 0,max_value or 100) frame:SetMinMaxValues(min or 0,max or 100)
UpdateLabels(self) UpdateLabels(self)
frame:SetValueStep(step or 1) frame:SetValueStep(step or 1)
if self.value then if self.value then
@ -221,7 +225,7 @@ local function Constructor()
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER")
label:SetHeight(15) label:SetHeight(15)
local slider = CreateFrame("Slider", nil, frame, "BackdropTemplate") local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
slider:SetOrientation("HORIZONTAL") slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15) slider:SetHeight(15)
slider:SetHitRectInsets(0, 0, -10, 0) slider:SetHitRectInsets(0, 0, -10, 0)
@ -243,7 +247,7 @@ local function Constructor()
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
local editbox = CreateFrame("EditBox", nil, frame, "BackdropTemplate") local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
editbox:SetAutoFocus(false) editbox:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall) editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP", slider, "BOTTOM") editbox:SetPoint("TOP", slider, "BOTTOM")

View File

@ -9,8 +9,8 @@
-- make into AceHook. -- make into AceHook.
-- @class file -- @class file
-- @name AceHook-3.0 -- @name AceHook-3.0
-- @release $Id: AceHook-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9 local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
if not AceHook then return end -- No upgrade needed if not AceHook then return end -- No upgrade needed
@ -195,6 +195,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
registry[self][method] = nil registry[self][method] = nil
end end
handlers[uid], actives[uid], scripts[uid] = nil, nil, nil handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
uid = nil
end end
local orig local orig
@ -477,10 +478,10 @@ function AceHook:UnhookAll()
for key, value in pairs(registry[self]) do for key, value in pairs(registry[self]) do
if type(key) == "table" then if type(key) == "table" then
for method in pairs(value) do for method in pairs(value) do
AceHook.Unhook(self, key, method) self:Unhook(key, method)
end end
else else
AceHook.Unhook(self, key) self:Unhook(key)
end end
end end
end end

View File

@ -10,7 +10,7 @@
-- make into AceSerializer. -- make into AceSerializer.
-- @class file -- @class file
-- @name AceSerializer-3.0 -- @name AceSerializer-3.0
-- @release $Id: AceSerializer-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -- @release $Id: AceSerializer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
local MAJOR,MINOR = "AceSerializer-3.0", 5 local MAJOR,MINOR = "AceSerializer-3.0", 5
local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@ -83,9 +83,9 @@ local function SerializeValue(v, res, nres)
elseif t=="table" then -- ^T...^t = table (list of key,value pairs) elseif t=="table" then -- ^T...^t = table (list of key,value pairs)
nres=nres+1 nres=nres+1
res[nres] = "^T" res[nres] = "^T"
for key,value in pairs(v) do for k,v in pairs(v) do
nres = SerializeValue(key, res, nres) nres = SerializeValue(k, res, nres)
nres = SerializeValue(value, res, nres) nres = SerializeValue(v, res, nres)
end end
nres=nres+1 nres=nres+1
res[nres] = "^t" res[nres] = "^t"

View File

@ -15,7 +15,7 @@
-- make into AceTimer. -- make into AceTimer.
-- @class file -- @class file
-- @name AceTimer-3.0 -- @name AceTimer-3.0
-- @release $Id: AceTimer-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -- @release $Id: AceTimer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@ -61,11 +61,11 @@ local function new(self, loop, func, delay, ...)
-- Compensate delay to get a perfect average delay, even if individual times don't match up perfectly -- Compensate delay to get a perfect average delay, even if individual times don't match up perfectly
-- due to fps differences -- due to fps differences
local time = GetTime() local time = GetTime()
local ndelay = timer.delay - (time - timer.ends) local delay = timer.delay - (time - timer.ends)
-- Ensure the delay doesn't go below the threshold -- Ensure the delay doesn't go below the threshold
if ndelay < 0.01 then ndelay = 0.01 end if delay < 0.01 then delay = 0.01 end
C_TimerAfter(ndelay, timer.callback) C_TimerAfter(delay, timer.callback)
timer.ends = time + ndelay timer.ends = time + delay
else else
activeTimers[timer.handle or timer] = nil activeTimers[timer.handle or timer] = nil
end end

View File

@ -1,26 +1,61 @@
--[[ $Id: CallbackHandler-1.0.lua 1298 2022-12-12 15:10:10Z nevcairiel $ ]] --[[ $Id: CallbackHandler-1.0.lua 3 2008-09-29 16:54:20Z nevcairiel $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 8 local MAJOR, MINOR = "CallbackHandler-1.0", 3
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
if not CallbackHandler then return end -- No upgrade needed if not CallbackHandler then return end -- No upgrade needed
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
-- Lua APIs local type = type
local securecallfunction, error = securecallfunction, error local pcall = pcall
local setmetatable, rawget = setmetatable, rawget local pairs = pairs
local next, select, pairs, type, tostring = next, select, pairs, type, tostring local assert = assert
local concat = table.concat
local loadstring = loadstring
local next = next
local select = select
local type = type
local xpcall = xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function Dispatch(handlers, ...) local function CreateDispatcher(argCount)
local index, method = next(handlers) local code = [[
local next, xpcall, eh = ...
local method, ARGS
local function call() method(ARGS) end
local function dispatch(handlers, ...)
local index
index, method = next(handlers)
if not method then return end if not method then return end
local OLD_ARGS = ARGS
ARGS = ...
repeat repeat
securecallfunction(method, ...) xpcall(call, eh)
index, method = next(handlers, index) index, method = next(handlers, index)
until not method until not method
ARGS = OLD_ARGS
end
return dispatch
]]
local ARGS, OLD_ARGS = {}, {}
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
end end
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
-------------------------------------------------------------------------- --------------------------------------------------------------------------
-- CallbackHandler:New -- CallbackHandler:New
-- --
@ -29,7 +64,9 @@ end
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" -- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. -- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName) function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-- TODO: Remove this after beta has gone out
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
RegisterName = RegisterName or "RegisterCallback" RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback" UnregisterName = UnregisterName or "UnregisterCallback"
@ -51,19 +88,19 @@ function CallbackHandler.New(_self, target, RegisterName, UnregisterName, Unregi
local oldrecurse = registry.recurse local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1 registry.recurse = oldrecurse + 1
Dispatch(events[eventname], eventname, ...) Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
registry.recurse = oldrecurse registry.recurse = oldrecurse
if registry.insertQueue and oldrecurse==0 then if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued -- Something in one of our callbacks wanted to register more callbacks; they got queued
for event,callbacks in pairs(registry.insertQueue) do for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, event) or not next(events[event]) -- test for empty before. not test for one member after. that one member may have been overwritten. local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for object,func in pairs(callbacks) do for self,func in pairs(callbacks) do
events[event][object] = func events[eventname][self] = func
-- fire OnUsed callback? -- fire OnUsed callback?
if first and registry.OnUsed then if first and registry.OnUsed then
registry.OnUsed(registry, target, event) registry.OnUsed(registry, target, eventname)
first = nil first = nil
end end
end end
@ -109,9 +146,9 @@ function CallbackHandler.New(_self, target, RegisterName, UnregisterName, Unregi
regfunc = function(...) self[method](self,...) end regfunc = function(...) self[method](self,...) end
end end
else else
-- function ref with self=object or self="addonId" or self=thread -- function ref with self=object or self="addonId"
if type(self)~="table" and type(self)~="string" and type(self)~="thread" then if type(self)~="table" and type(self)~="string" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
end end
if select("#",...)>=1 then -- this is not the same as testing for arg==nil! if select("#",...)>=1 then -- this is not the same as testing for arg==nil!

View File

@ -0,0 +1,389 @@
local major = "DRData-1.0"
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",
--[[ 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",
--[[ RANDOM ROOTS ]]--
-- Improved Hamstring
[23694] = "rndroot",
-- Frostbite
[12494] = "rndroot",
--[[ SLEEPS ]]--
-- Hibernate
[2637] = "sleep",
[18657] = "sleep",
[18658] = "sleep",
-- Wyvern Sting
[19386] = "sleep",
[24132] = "sleep",
[24133] = "sleep",
[27068] = "sleep",
--[[ MISC ]]--
-- Chastise (Maybe this shares DR with Imp HS?)
[44041] = "root",
[44043] = "root",
[44044] = "root",
[44045] = "root",
[44046] = "root",
[44047] = "root",
-- Dragon's Breath
[31661] = "dragonsbreath", -- Dragon's Breath
[33041] = "dragonsbreath", -- Dragon's Breath
[33042] = "dragonsbreath", -- Dragon's Breath
[33043] = "dragonsbreath", -- Dragon's Breath
-- Repentance
[20066] = "repentance",
-- Scatter Shot
[19503] = "scatters",
-- Freezing Trap
[3355] = "freezetrap",
[14308] = "freezetrap",
[14309] = "freezetrap",
-- Improved Conc Shot
[19410] = "impconc",
[22915] = "impconc",
[28445] = "impconc",
-- Death Coil
[6789] = "dc",
[17925] = "dc",
[17926] = "dc",
[27223] = "dc",
-- Kidney Shot
[408] = "ks",
[8643] = "ks",
-- Mind Control
[605] = "charm",
[10911] = "charm",
[10912] = "charm",
}
-- 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",
}
-- 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

@ -0,0 +1,8 @@
## 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

@ -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/ <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"> ..\FrameXML\UI.xsd">
<Script file = "LibCustomGlow-1.0.lua"/> <Script file="DRData-1.0.lua"/>
</Ui> </Ui>

View File

@ -1,394 +0,0 @@
--[[
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", 54 -- 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_WRATH_CLASSIC or 11] = "wotlk",
})[WOW_PROJECT_ID]
-- How long it takes for a DR to expire, in seconds.
Lib.resetTimes = {
retail = {
["default"] = 18.5, -- static 18 sec + 0.5 latency
["npc"] = 21, -- Against mobs it seems to last slightly longer, depending on server load
["knockback"] = 10.5, -- Knockbacks are immediately immune and only DRs for 10s
},
classic = {
["default"] = 20, -- dynamic between 15 and 20s
["npc"] = 21,
},
tbc = {
["default"] = 20, -- dynamic between 15 and 20s
["npc"] = 21,
},
wotlk = {
["default"] = 20, -- dynamic between 15 and 20s
["npc"] = 21,
},
}
-- 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 = {
["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 for retail some special mobs have DR on all categories,
-- see UnitClassification() and UnitIsQuestBoss().
Lib.categoriesPvE = {
retail = {
["taunt"] = L.TAUNTS,
["stun"] = L.STUNS,
},
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.
-- Key is unlocalized name used for API functions, value is localized name used for UI.
-- Note that for retail some special mobs 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 for retail some special mobs have DR on all categories, you need to check for this yourself;
-- 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
-- @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.RESET_TIME = Lib.resetTimes[Lib.gameExpansion].default
Lib.pveDR = Lib.categoriesPvE
Lib.IterateSpells = function(cat) if cat then return Lib.IterateSpellsByCategory(cat) else return next, Lib.spellList end end

View File

@ -1,25 +0,0 @@
## Interface: 100105
## Interface-Classic: 11403
## Interface-BCC: 20504
## Interface-Wrath: 30402
## IconTexture: Interface\Icons\Spell_nature_heavypolymorph1
## 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

@ -1,4 +0,0 @@
<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>

View File

@ -1,734 +0,0 @@
local MAJOR, MINOR = "DRList-1.0", 54 -- Don't forget to change this in DRList-1.0.lua aswell!
local Lib = LibStub(MAJOR)
if Lib.spellListVersion and Lib.spellListVersion >= MINOR then
return
end
Lib.spellListVersion = MINOR
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
[360806] = "disorient", -- Sleep Walk
[1513] = "disorient", -- Scare Beast
[31661] = "disorient", -- Dragon's Breath
[198909] = "disorient", -- Song of Chi-ji
[202274] = "disorient", -- Hot Trub
[105421] = "disorient", -- Blinding Light
[10326] = "disorient", -- Turn Evil
[205364] = "disorient", -- Dominate Mind
[605] = "disorient", -- Mind Control
[8122] = "disorient", -- Psychic Scream
[226943] = "disorient", -- Mind Bomb
[2094] = "disorient", -- Blind
[118699] = "disorient", -- Fear
[130616] = "disorient", -- Fear (Horrify)
[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
[378441] = "incapacitate", -- Time Stop
[3355] = "incapacitate", -- Freezing Trap
[203337] = "incapacitate", -- Freezing Trap (Honor talent)
[213691] = "incapacitate", -- Scatter Shot
[383121] = "incapacitate", -- Mass Polymorph
[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)
[321395] = "incapacitate", -- Polymorph (Mawrat)
[391622] = "incapacitate", -- Polymorph (Duck)
[82691] = "incapacitate", -- Ring of Frost
[115078] = "incapacitate", -- Paralysis
[357768] = "incapacitate", -- Paralysis 2 (Perpetual 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 (has no DR)
[410065] = "silence", -- Reactive Resin
[202933] = "silence", -- Spider Sting
[356727] = "silence", -- Spider Venom
[354831] = "silence", -- Wailing Arrow 1
[355596] = "silence", -- Wailing Arrow 2
[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
[372245] = "stun", -- Terror of the Skies
[117526] = "stun", -- Binding Shot
[357021] = "stun", -- Consecutive Concussion
[24394] = "stun", -- Intimidation
[389831] = "stun", -- Snowdrift
[119381] = "stun", -- Leg Sweep
[202346] = "stun", -- Double Barrel
[385149] = "stun", -- Exorcism
[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
[385954] = "stun", -- Shield Charge
[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)
-- TODO: Inferal Awakening?
[204085] = "root", -- Deathchill (Chains of Ice)
[233395] = "root", -- Deathchill (Remorseless Winter)
[339] = "root", -- Entangling Roots
[235963] = "root", -- Entangling Roots (Earthen Grasp)
[170855] = "root", -- Entangling Roots (Nature's Grasp)
[102359] = "root", -- Mass Entanglement
[355689] = "root", -- Landslide
[393456] = "root", -- Entrapment (Tar Trap)
[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
[386770] = "root", -- Freezing Cold
[198121] = "root", -- Frostbite
[114404] = "root", -- Void Tendril's Grasp
[342375] = "root", -- Tormenting Backlash (Torghast PvE)
[233582] = "root", -- Entrenched in Flame
[116706] = "root", -- Disable
[324382] = "root", -- Clash
[64695] = "root", -- Earthgrab (Totem effect)
-- [356738] = "root", -- Earth Unleashed (doesn't seem to DR)
[285515] = "root", -- Surge of Power
[199042] = "root", -- Thunderstruck (Protection PvP Talent)
--[356356] = "root", -- Warbringer TODO: has DR?
[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)
[407032] = "disarm", -- Sticky Tar Bomb 1
[407031] = "disarm", -- Sticky Tar Bomb 2
[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)
[710] = "incapacitate", -- Banish (Rank 1)
[18647] = "incapacitate", -- Banish (Rank 2)
[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
-- 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
[67769] = "incapacitate", -- Cobalt Frag Bomb
[67890] = "incapacitate", -- Cobalt Frag Bomb (Frag Belt)
[54466] = "incapacitate", -- Saronite 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)
[65857] = "root", -- Entangling Roots (Rank 8) (TODO: Not sure which ID is correct)
[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)
[53313] = "root", -- Nature's Grasp (Rank 8)
[66070] = "root", -- Nature's Grasp (Rank 8) (TODO: Not sure which ID is correct)
[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)
[64695] = "root", -- Earthgrab
[39965] = "root", -- Frost Grenade (Item)
[63685] = "root", -- Freeze (Frost Shock)
[55536] = "root", -- Frostweave Net (Item)
[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)
[64346] = "disarm", -- Fiery Payback
[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 (Shield Slam)
[74347] = "silence", -- Silenced - Gag Order (Heroic Throw?)
[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
[67799] = "mind_control", -- Mind Amplification Dish
[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
}
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,23 +6,24 @@ local Buff = LibClassAuras.Buff
------------- -------------
-- PRIEST -- PRIEST
------------- -------------
Buff({ 1243, 1244, 1245, 2791, 10937, 10938, 25389, 48161 }, { buffType = "magic" }, "PRIEST") -- Power Word: Fortitude Buff({ 1243, 1244, 1245, 2791, 10937, 10938, 25389 }, { buffType = "magic" }, "PRIEST") -- Power Word: Fortitude
Buff({ 21562, 21564, 25392, 48162 }, { buffType = "magic" }, "PRIEST") -- Prayer of Fortitude Buff({ 21562, 21564, 25392 }, { 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({ 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, 48040, 48168 }, { buffType = "magic" }, "PRIEST") -- Inner Fire Buff({ 588, 7128, 602, 1006, 10951, 10952, 25431 }, { buffType = "magic" }, "PRIEST") -- Inner Fire
Buff({ 2651 }, { buffType = "magic" }, "PRIEST") -- Elune's Grace Buff({ 2651 }, { buffType = "magic" }, "PRIEST") -- Elune's Grace
Buff({ 6346 }, { buffType = "magic" }, "PRIEST") -- Fear Ward Buff({ 6346 }, { buffType = "magic" }, "PRIEST") -- Fear Ward
Buff({ 14752, 14818, 14819, 27841, 25312, 48073 }, { buffType = "magic" }, "PRIEST") -- Divine Spirit Buff({ 14752, 14818, 14819, 27841, 25312 }, { buffType = "magic" }, "PRIEST") -- Divine Spirit
Buff({ 27681, 32999, 48074 }, { buffType = "magic" }, "PRIEST") -- Prayer of Spirit Buff({ 27681, 32999 }, { buffType = "magic" }, "PRIEST") -- Prayer of Spirit
Buff({ 1706 }, { buffType = "magic" }, "PRIEST") -- Levitate Buff({ 1706 }, { buffType = "magic" }, "PRIEST") -- Levitate
Buff({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315, 25221, 25222, 48067, 48068 }, { buffType = "magic" }, "PRIEST") -- Renew Buff({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315, 25221, 25222 }, { buffType = "magic" }, "PRIEST") -- Renew
Buff({ 552 }, { buffType = "magic" }, "PRIEST") -- Abolish Disease Buff({ 552 }, { buffType = "magic" }, "PRIEST") -- Abolish Disease
Buff({ 33076, 48112, 48113 }, { buffType = "magic" }, "PRIEST") -- Prayer of Mending Buff({ 33076 }, { buffType = "magic" }, "PRIEST") -- Prayer of Mending
Buff({ 586, 9578, 9579, 9592, 10941, 10942, 25429 }, { buffType = "magic" }, "PRIEST") -- Fade 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({ 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({ 18137, 19308, 19310, 19311, 19312, 25477 }, { buffType = "magic" }, "PRIEST") -- Shadowguard
Buff({ 976, 10957, 10958, 16874, 25433 }, { buffType = "magic" }, "PRIEST") -- Shadow Protection Buff({ 976, 10957, 10958, 16874, 25433 }, { buffType = "magic" }, "PRIEST") -- Shadow Protection
Buff({ 27683, 39374 }, { buffType = "magic" }, "PRIEST") -- Prayer of Shadow Protection Buff({ 27683, 39374 }, { buffType = "magic" }, "PRIEST") -- Prayer of Shadow Protection
Buff({ 15473 }, { buffType = "form" }, "PRIEST") -- Shadowform
--talents --talents
Buff({ 14893, 15357, 15359 }, { buffType = "magic" }, "PRIEST") -- Inspiration Buff({ 14893, 15357, 15359 }, { buffType = "magic" }, "PRIEST") -- Inspiration
Buff({ 27813, 27817, 27818 }, { buffType = "magic" }, "PRIEST") -- Blessed Recovery Buff({ 27813, 27817, 27818 }, { buffType = "magic" }, "PRIEST") -- Blessed Recovery
@ -31,74 +32,51 @@ Buff({ 14751 }, { buffType = "magic" }, "PRIEST") -- Inner Focus
Buff({ 10060 }, { buffType = "magic" }, "PRIEST") -- Power Infusion Buff({ 10060 }, { buffType = "magic" }, "PRIEST") -- Power Infusion
Buff({ 33206 }, { buffType = "magic" }, "PRIEST") -- Pain Suppression Buff({ 33206 }, { buffType = "magic" }, "PRIEST") -- Pain Suppression
Buff({ 34754 }, { buffType = "magic" }, "PRIEST") -- Clearcasting 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 -- DRUID
--------------- ---------------
Buff({ 467, 782, 1075, 8914, 9756, 9910, 26992, 53307 }, { buffType = "magic"}, "DRUID") -- Thorns Buff({ 467, 782, 1075, 8914, 9756, 9910, 26992 }, { buffType = "magic"}, "DRUID") -- Thorns
Buff({ 5487 }, { buffType = "form"}, "DRUID") -- Bear Form Buff({ 5487 }, { buffType = "form"}, "DRUID") -- Bear Form
Buff({ 783 }, { buffType = "form"}, "DRUID") -- Travel Form Buff({ 783 }, { buffType = "form"}, "DRUID") -- Travel Form
Buff({ 9634 }, { buffType = "form"}, "DRUID") -- Dire Bear Form Buff({ 9634 }, { buffType = "form"}, "DRUID") -- Dire Bear Form
Buff({ 768 }, { buffType = "form"}, "DRUID") -- Cat Form Buff({ 768 }, { buffType = "form"}, "DRUID") -- Cat Form
Buff({ 22812 }, { buffType = "magic"}, "DRUID") -- Barkskin Buff({ 22812 }, { buffType = "magic"}, "DRUID") -- Barkskin
Buff({ 5229 }, { buffType = "enrage"}, "DRUID") -- Enrage Buff({ 5229 }, { buffType = "physical"}, "DRUID") -- Enrage
Buff({ 5217, 6793, 9845, 9846, 50212, 50213 }, { buffType = "physical"}, "DRUID") -- Tiger's Fury Buff({ 5217, 6793, 9845, 9846 }, { buffType = "physical"}, "DRUID") -- Tiger's Fury
Buff({ 1850, 9821, 33357 }, { buffType = "physical"}, "DRUID") -- Dash Buff({ 1850, 9821, 33357 }, { buffType = "physical"}, "DRUID") -- Dash
Buff({ 22842 }, { buffType = "physical"}, "DRUID") -- Frenzied Regeneration Buff({ 22842, 22895, 22896, 26999 }, { buffType = "physical"}, "DRUID") -- Frenzied Regeneration
Buff({ 1126, 5232, 6756, 5234, 8907, 9884, 9885, 26990, 48469 }, { buffType = "magic"}, "DRUID") -- Mark of the Wild Buff({ 1126, 5232, 6756, 5234, 8907, 9884, 9885, 26990 }, { buffType = "magic"}, "DRUID") -- Mark of the Wild
Buff({ 21849, 21850, 26991, 48470 }, { buffType = "magic"}, "DRUID") -- Gift 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, 48442, 48443 }, { buffType = "magic"}, "DRUID") -- Regrowth 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, 48440, 48441 }, { buffType = "magic"}, "DRUID") -- Rejuvenation Buff({ 8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858, 26980 }, { buffType = "magic"}, "DRUID") -- Rejuvenation
Buff({ 2893 }, { buffType = "magic"}, "DRUID") -- Abolish Poison Buff({ 2893 }, { buffType = "magic"}, "DRUID") -- Abolish Poison
Buff({ 33763, 48450, 48451}, { buffType = "magic"}, "DRUID") -- Lifebloom Buff({ 33763 }, { buffType = "magic"}, "DRUID") -- Lifebloom
--Talents --Talents
Buff({ 24858 }, { buffType = "form"}, "DRUID") -- Moonkin Form Buff({ 24858 }, { buffType = "form"}, "DRUID") -- Moonkin Form
Buff({ 24907 }, { buffType = "aura"}, "DRUID") -- Moonkin Aura Buff({ 24907 }, { buffType = "aura"}, "DRUID") -- Moonkin Aura
Buff({ 33891 }, { buffType = "form"}, "DRUID") -- Tree of Life Buff({ 33891 }, { buffType = "form"}, "DRUID") -- Tree of Life
Buff({ 16864, 16870 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity Buff({ 16864 }, { buffType = "magic"}, "DRUID") -- Omen of Clarity
Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009, 53312 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp Buff({ 16689, 16810, 16811, 16812, 16813, 17329, 27009 }, { buffType = "magic"}, "DRUID") -- Nature's Grasp
Buff({ 45281, 45282, 45283 }, { buffType = "magic"}, "DRUID") -- Natural Perfection Buff({ 45281, 45282, 45283 }, { buffType = "magic"}, "DRUID") -- Natural Perfection
Buff({ 17116 }, { buffType = "magic"}, "DRUID") -- Nature's Swiftness Buff({ 17116 }, { buffType = "magic"}, "DRUID") -- Nature's Swiftness
Buff({ 17007 }, { buffType = "aura"}, "DRUID") -- Leader of the Pack Buff({ 17007 }, { buffType = "aura"}, "DRUID") -- Leader of the Pack
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 -- WARRIOR -- TODO
------------- -------------
Buff({ 29838 }, { buffType = "physical"}, "WARRIOR") -- Second Wind Buff({ 29838 }, { buffType = "physical"}, "WARRIOR") -- Second Wind
Buff({ 12292 }, { buffType = "enrage"}, "WARRIOR") -- Death Wish Buff({ 12292 }, { buffType = "physical"}, "WARRIOR") -- Death Wish
Buff({ 6673 }, { buffType = "physical"}, "WARRIOR") -- Battle Shout Buff({ 6673 }, { buffType = "physical"}, "WARRIOR") -- Battle Shout
Buff({ 469 }, { buffType = "physical"}, "WARRIOR") -- Commanding Shout Buff({ 469 }, { buffType = "physical"}, "WARRIOR") -- Commanding Shout
Buff({ 12328 }, { buffType = "physical"}, "WARRIOR") -- Sweeping Strikes Buff({ 12328 }, { buffType = "physical"}, "WARRIOR") -- Sweeping Strikes
Buff({ 29801, 30032 }, { buffType = "aura"}, "WARRIOR") -- Rampage Buff({ 30032 }, { buffType = "physical"}, "WARRIOR") -- Rampage
Buff({ 2687 }, { buffType = "enrage"}, "WARRIOR") -- Blood Rage Buff({ 2687 }, { buffType = "physical"}, "WARRIOR") -- Blood Rage
Buff({ 20230 }, { buffType = "physical"}, "WARRIOR") -- Retaliation Buff({ 20230 }, { buffType = "physical"}, "WARRIOR") -- Retaliation
Buff({ 871 }, { buffType = "physical"}, "WARRIOR") -- Shield Wall Buff({ 871 }, { buffType = "physical"}, "WARRIOR") -- Shield Wall
Buff({ 18499 }, { buffType = "enrage"}, "WARRIOR") -- Berserker Rage Buff({ 18499 }, { buffType = "physical"}, "WARRIOR") -- Berserker Rage
Buff({ 23885 }, { buffType = "enrage"}, "WARRIOR") -- Bloodthirst Buff({ 23885 }, { buffType = "physical"}, "WARRIOR") -- Bloodthirst
Buff({ 3411 }, { buffType = "physical"}, "WARRIOR") -- Intervene 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
-------------- --------------
@ -109,35 +87,24 @@ Buff({ 2983 }, { buffType = "physical" }, "ROGUE") -- Sprint
Buff({ 5277 }, { buffType = "physical" }, "ROGUE") -- Evasion Buff({ 5277 }, { buffType = "physical" }, "ROGUE") -- Evasion
Buff({ 31224 }, { buffType = "physical" }, "ROGUE") -- Cloak of Shadows Buff({ 31224 }, { buffType = "physical" }, "ROGUE") -- Cloak of Shadows
Buff({ 14278 }, { buffType = "physical" }, "ROGUE") -- Ghostly Strike 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 -- WARLOCK --TODO
------------ ------------
Buff({ 19028 }, { buffType = "aura"}, "WARLOCK") -- Soul Link Buff({ 19028 }, { buffType = "aura"}, "WARLOCK") -- Soul Link
Buff({ 687, 696 }, { buffType = "aura"}, "WARLOCK") -- Demon Skin Buff({ 696 }, { buffType = "aura"}, "WARLOCK") -- Demon Skin
Buff({ 706, 1086, 11733, 11734, 11735, 27260, 47793, 47889 }, { buffType = "aura"}, "WARLOCK") -- Demon Armor Buff({ 706 }, { buffType = "aura"}, "WARLOCK") -- Demon Armor
Buff({ 28176, 28189, 47892, 47893 }, { buffType = "aura"}, "WARLOCK") -- Fel Armor Buff({ 28176 }, { buffType = "aura"}, "WARLOCK") -- Fel Armor
Buff({ 23759 }, { buffType = "aura"}, "WARLOCK") -- Master Demonologist Buff({ 23759 }, { buffType = "aura"}, "WARLOCK") -- Master Demonologist
Buff({ 34936 }, { buffType = "magic"}, "WARLOCK") -- Backlash Buff({ 34936 }, { buffType = "magic"}, "WARLOCK") -- Backlash
Buff({ 5697 }, { buffType = "magic"}, "WARLOCK") -- Unending Breath Buff({ 5697 }, { buffType = "magic"}, "WARLOCK") -- Unending Breath
Buff({ 132 }, { buffType = "magic"}, "WARLOCK") -- Detect Invisibility Buff({ 132 }, { buffType = "magic"}, "WARLOCK") -- Detect Invisibility
Buff({ 1949, 11683, 11684, 27213, 47823 }, { buffType = "aura"}, "WARLOCK") -- Hellfire Buff({ 1949 }, { buffType = "aura"}, "WARLOCK") -- Hellfire
Buff({ 6229, 11739, 11740, 28610, 47890, 47891 }, { buffType = "magic"}, "WARLOCK") -- Shadow Ward Buff({ 6229 }, { buffType = "magic"}, "WARLOCK") -- Shadow Ward
Buff({ 19480, 20435, 41002 }, { buffType = "aura"}, "WARLOCK") -- Paranoia Buff({ 19480 }, { buffType = "magic"}, "WARLOCK") -- Paranoia
Buff({ 7812, 19438, 19440, 19441, 19442, 19443, 27273, 47985, 47986 }, { buffType = "magic"}, "WARLOCK") -- Sacrifice Buff({ 7812 }, { buffType = "magic"}, "WARLOCK") -- Sacrifice
Buff({ 2947, 8316, 8317, 11770, 11771, 27269, 47983 }, { buffType = "magic"}, "WARLOCK") -- Fire Shield Buff({ 2947 }, { 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
--------------- ---------------
@ -148,43 +115,34 @@ Buff({ 8178 } ,{ buffType = "magic" }, "SHAMAN") -- Grounding Totem Effect
Buff({ 30823 } ,{ buffType = "magic" }, "SHAMAN") -- Shamanistic Rage Buff({ 30823 } ,{ buffType = "magic" }, "SHAMAN") -- Shamanistic Rage
Buff({ 32182 } ,{ buffType = "magic" }, "SHAMAN") -- Heroism Buff({ 32182 } ,{ buffType = "magic" }, "SHAMAN") -- Heroism
Buff({ 2825 } ,{ buffType = "magic" }, "SHAMAN") -- Bloodlust Buff({ 2825 } ,{ buffType = "magic" }, "SHAMAN") -- Bloodlust
Buff({ 974, 32593, 32594, 49283, 49284 } ,{ buffType = "magic" }, "SHAMAN") -- Earth Shield Buff({ 974 } ,{ buffType = "magic" }, "SHAMAN") -- Earth Shield
Buff({ 24398, 33736, 57960 } ,{ buffType = "magic" }, "SHAMAN") -- Water Shield Buff({ 24398 } ,{ buffType = "magic" }, "SHAMAN") -- Water Shield
Buff({ 324, 25472, 49280, 49281 } ,{ buffType = "magic" }, "SHAMAN") -- Lightning Shield Buff({ 324 } ,{ buffType = "magic" }, "SHAMAN") -- Lightning Shield
Buff({ 16188 } ,{ buffType = "magic" }, "SHAMAN") -- Nature's Swiftness Buff({ 16188 } ,{ buffType = "magic" }, "SHAMAN") -- Nature's Swiftness
Buff({ 16166 } ,{ buffType = "magic" }, "SHAMAN") -- Elemental Mastery 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 -- PALADIN --TODO
-------------- --------------
--Blessings --Blessings
Buff( { 1022, 5599, 10278 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Protection Buff( { 1022, 5599, 10278 }, { buffType = "magic"}, "PALADIN") -- Blessing of Protection
Buff( { 6940 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Sacrifice Buff( { 6940 }, { buffType = "magic"}, "PALADIN") -- Blessing of Sacrifice
Buff( { 1044, 66115 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Freedom Buff( { 1044 }, { buffType = "magic"}, "PALADIN") -- Blessing of Freedom
Buff( { 19740, 19834, 19835, 19836, 19837, 19838, 25291, 27140, 48931, 48932 }, { buffType = "magic"}, "PALADIN") -- Blessing of Might Buff( { 19740, 19834, 19835, 19836, 19837, 19838, 25291, 27140 }, { buffType = "magic"}, "PALADIN") -- Blessing of Might
Buff( { 19742, 19850, 19852, 19853, 19854, 25290, 27142, 48935, 48936 }, { buffType = "magic"}, "PALADIN") -- Blessing of Wisdom Buff( { 19742 }, { buffType = "magic"}, "PALADIN") -- Blessing of Wisdom
Buff( { 20217 }, { buffType = "magic"}, "PALADIN") -- Blessing of Kings Buff( { 20217 }, { buffType = "magic"}, "PALADIN") -- Blessing of Kings
Buff( { 19977 }, { buffType = "magic"}, "PALADIN") -- Blessing of Light Buff( { 19977 }, { buffType = "magic"}, "PALADIN") -- Blessing of Light
Buff( { 1038 }, { buffType = "magic"}, "PALADIN") -- Blessing/Hand of Salvation Buff( { 1038 }, { buffType = "magic"}, "PALADIN") -- Blessing of Salvation
Buff( { 20911 }, { buffType = "magic"}, "PALADIN") -- Blessing of Sanctuary Buff( { 20911 }, { buffType = "magic"}, "PALADIN") -- Blessing of Sanctuary
Buff( { 25898 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Kings Buff( { 25898 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Kings
Buff( { 25890 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Light Buff( { 25890 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Light
Buff( { 25782, 27141, 48933, 48934 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Might Buff( { 25782 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Might
Buff( { 25895 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Salvation Buff( { 25895 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Salvation
Buff( { 25899 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Sanctuary Buff( { 25899 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Sanctuary
Buff( { 25894, 48937 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Wisdom Buff( { 25894 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Wisdom
Buff( { 642 }, { buffType = "immune"}, "PALADIN") -- Divine Shield Buff( { 642 }, { buffType = "magic"}, "PALADIN") -- Divine Shield
Buff( { 31884 }, { buffType = "magic"}, "PALADIN") -- Avenging Wrath
--Auras --Auras
Buff( { 465, 10290, 643, 10291, 1032, 10292, 10293, 27149, 48941, 48942 }, { buffType = "aura"}, "PALADIN") -- Devotion Aura Buff( { 465, 10290, 643, 10291, 1032, 10292, 10293, 27149 }, { buffType = "aura"}, "PALADIN") -- Devotion Aura
Buff( { 7294 }, { buffType = "aura"}, "PALADIN") -- Retribution Aura Buff( { 7294 }, { buffType = "aura"}, "PALADIN") -- Retribution Aura
Buff( { 19746 }, { buffType = "aura"}, "PALADIN") -- Concentration Aura Buff( { 19746 }, { buffType = "aura"}, "PALADIN") -- Concentration Aura
Buff( { 19876 }, { buffType = "aura"}, "PALADIN") -- Shadow Resistance Aura Buff( { 19876 }, { buffType = "aura"}, "PALADIN") -- Shadow Resistance Aura
@ -193,7 +151,7 @@ Buff( { 19888 }, { buffType = "aura"}, "PALADIN") -- Frost Resistance Aura
Buff( { 19891 }, { buffType = "aura"}, "PALADIN") -- Fire Resistance Aura Buff( { 19891 }, { buffType = "aura"}, "PALADIN") -- Fire Resistance Aura
Buff( { 32223 }, { buffType = "aura"}, "PALADIN") -- Crusader Aura Buff( { 32223 }, { buffType = "aura"}, "PALADIN") -- Crusader Aura
--Seals --Seals
Buff( { 20154, 21084, 20287, 20288, 20289, 20290, 20291, 20292, 20293, 27155 }, { buffType = "magic"}, "PALADIN") -- Seal of Righteousness Buff( { 20154, 20287, 20288, 20289, 20290, 20291, 20292, 20293, 27155 }, { buffType = "magic"}, "PALADIN") -- Seal of Righteousness
Buff( { 31892 }, { buffType = "magic"}, "PALADIN") -- Seal of Blood Buff( { 31892 }, { buffType = "magic"}, "PALADIN") -- Seal of Blood
Buff( { 20375 }, { buffType = "magic"}, "PALADIN") -- Seal of Command Buff( { 20375 }, { buffType = "magic"}, "PALADIN") -- Seal of Command
Buff( { 20164 }, { buffType = "magic"}, "PALADIN") -- Seal of Justice Buff( { 20164 }, { buffType = "magic"}, "PALADIN") -- Seal of Justice
@ -202,18 +160,6 @@ Buff( { 15277 }, { buffType = "magic"}, "PALADIN") -- Seal of Reckoning
Buff( { 31801 }, { buffType = "magic"}, "PALADIN") -- Seal of Vengeance Buff( { 31801 }, { buffType = "magic"}, "PALADIN") -- Seal of Vengeance
Buff( { 20166 }, { buffType = "magic"}, "PALADIN") -- Seal of Wisdom Buff( { 20166 }, { buffType = "magic"}, "PALADIN") -- Seal of Wisdom
Buff( { 21082 }, { buffType = "magic"}, "PALADIN") -- Seal of the Crusade 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
------------- -------------
@ -221,12 +167,7 @@ Buff( { 25780 }, { buffType = "magic"}, "PALADIN") -- Righteous Fury
------------- -------------
Buff( { 5384 }, { buffType = "physical"}, "HUNTER") -- Feign Death Buff( { 5384 }, { buffType = "physical"}, "HUNTER") -- Feign Death
Buff( { 19263 }, { buffType = "physical"}, "HUNTER") -- Deterrence --local FEIGN_DEATH = GetSpellInfo(5384) -- Localized name for Feign Death
Buff( { 3045 }, { buffType = "physical"}, "HUNTER") -- Rapid Fire
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
------------- -------------
@ -234,50 +175,20 @@ Buff( { 34471 }, { buffType = "physical"}, "HUNTER") -- The Beast Within
------------- -------------
Buff({ 66 }, { buffType = "magic"}, "MAGE") -- Invisibility Buff({ 66 }, { buffType = "magic"}, "MAGE") -- Invisibility
Buff({ 1459, 1460, 1461, 10156, 10157, 27126, 42995 }, { buffType = "magic"}, "MAGE") -- Arcane Intellect Buff({ 1459 }, { buffType = "magic"}, "MAGE") -- Arcane Intellect
Buff({ 130 }, { buffType = "magic"}, "MAGE") -- Slow Fall Buff({ 130 }, { buffType = "magic"}, "MAGE") -- Slow Fall
Buff({ 604, 8450, 8451, 10173, 10174, 33944, 43015 }, { buffType = "magic"}, "MAGE") -- Dampen Magic Buff({ 604 }, { buffType = "magic"}, "MAGE") -- Dampen Magic
Buff({ 1008, 8455, 10169, 10170, 27130, 33946, 43017, }, { buffType = "magic"}, "MAGE") -- Amplify Magic Buff({ 1008 }, { buffType = "magic"}, "MAGE") -- Amplify Magic
Buff({ 1463, 8494, 8495, 10191, 10192, 10193, 27131, 43019, 43020 }, { buffType = "magic"}, "MAGE") -- Mana Shield Buff({ 1463 }, { buffType = "magic"}, "MAGE") -- Mana Shield
Buff({ 6117, 22782, 22783, 27125, 43023, 43024 }, { buffType = "form"}, "MAGE") -- Mage Armor Buff({ 6117 }, { buffType = "form"}, "MAGE") -- Mage Armor
Buff({ 31643 }, { buffType = "magic"}, "MAGE") -- Blazing Speed Buff({ 31643 }, { buffType = "magic"}, "MAGE") -- Blazing Speed
Buff({ 543, 8457, 8458, 10223, 10225, 27128, 43010 }, { buffType = "magic"}, "MAGE") -- Fire Ward Buff({ 543 }, { buffType = "magic"}, "MAGE") -- Fire Ward
Buff({ 11129 }, { buffType = "magic"}, "MAGE") -- Combustion Buff({ 11129 }, { buffType = "magic"}, "MAGE") -- Combustion
Buff({ 30482, 43045, 43046 }, { buffType = "form"}, "MAGE") -- Molten Armor Buff({ 30482 }, { buffType = "form"}, "MAGE") -- Molten Armor
Buff({ 168, 7300, 7301 }, { buffType = "form"}, "MAGE") -- Frost Armor Buff({ 168 }, { buffType = "form"}, "MAGE") -- Frost Armor
Buff({ 7302, 7320, 10219, 10220, 27124, 43008 }, { buffType = "form"}, "MAGE") -- Ice Armor Buff({ 7302 }, { buffType = "form"}, "MAGE") -- Ice Armor
Buff({ 45438 }, { buffType = "immune"}, "MAGE") -- Ice Block Buff({ 45438 }, { buffType = "immune"}, "MAGE") -- Ice Block
Buff({ 6143, 32796, 8462, 28609, 10177, 43012, 8461 }, { buffType = "magic"}, "MAGE") -- Frost Ward Buff({ 6143 }, { buffType = "magic"}, "MAGE") -- Frost Ward
--talents --talents
Buff({ 11426, 13031, 13032, 13033, 27134, 33405, 43038, 43039 }, { buffType = "magic"}, "MAGE") -- Ice Barrier Buff({ 11426 }, { buffType = "magic"}, "MAGE") -- Ice Barrier
Buff({ 12472 }, { buffType = "magic"}, "MAGE") -- Icy Veins 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,151 +11,126 @@ Debuff({ 9035, 19281, 19282, 19283, 19284, 19285, 25470 }, { buffType = "curse"
Debuff({ 6788 }, { }, "PRIEST") -- Weakened Soul Debuff({ 6788 }, { }, "PRIEST") -- Weakened Soul
Debuff({ 15487 }, { buffType = "magic" }, "PRIEST") -- Silence 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({ 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, 48299, 48300 }, { stacking = true , buffType = "disease", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") --devouring plague Debuff({ 2944, 19276, 19277, 19278, 19279, 19280, 25467 }, { stacking = true , buffType = "disease", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") --devouring plague
Debuff({ 453, 8192, 10953, 25596 }, { }, "PRIEST") -- mind soothe Debuff({ 453, 8192, 10953, 25596 }, { }, "PRIEST") -- mind soothe
Debuff({ 14914, 15261, 15262, 15263, 15264, 15265, 15266, 15267, 25384, 48134, 48135 }, { stacking = true, buffType = "magic", preEvent = "SPELL_DAMAGE"}, "PRIEST") -- Holy Fire, stacking? 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, 48124, 48125 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") -- SW:P Debuff({ 589, 594, 970, 992, 2767, 10892, 10893, 10894, 25367, 25368 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS"}, "PRIEST") -- SW:P
Debuff({ 15258 } ,{ buffType = "magic" }, "PRIEST") -- Shadow Vulnerability (Shadow Weaving Talent Effect) Debuff({ 15258 } ,{ buffType = "magic" }, "PRIEST") -- Shadow Vulnerability (Shadow Weaving Talent Effect)
Debuff({ 15286 } ,{ buffType = "magic" }, "PRIEST") -- Vampiric Embrace Debuff({ 15286 } ,{ buffType = "magic" }, "PRIEST") -- Vampiric Embrace
Debuff({ 34914, 34916, 34917, 48159, 48160 }, { buffType = "magic"}, "PRIEST") -- Vampiric Touch Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387 }, { buffType = "magic" }, "PRIEST") -- Mind Flay
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({ 605, 10911, 10912 }, { buffType = "magic" }, "PRIEST") -- Mind Control
Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream
Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") -- Blackout Debuff({ 15269 }, { buffType = "magic"}, "PRIEST")
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 -- DRUID
--------------- ---------------
Debuff({ 33786 }, { buffType = "immune"}, "DRUID") -- Cyclone Debuff({ 33786 }, { buffType = "immune"}, "DRUID") -- Cyclone
Debuff({ 19675 }, { }, "DRUID") -- Feral Charge Debuff({ 19675 }, { }, "DRUID") -- Feral Charge
Debuff({ 22570, 49802}, { buffType = "physical"}, "DRUID") -- Maim Debuff( { 22570}, { 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({ 19975, 19974, 19973, 19972, 19971, 19970, 27010 }, { 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({ 339, 1062, 5195, 5196, 9852, 9853, 26989 }, { buffType = "magic"}, "DRUID") -- Entangling Roots
Debuff({ 770, 778, 9749, 9907, 26993 }, { buffType = "magic" }, "DRUID") -- Faerie Fire Debuff({ 770, 778, 9749, 9907, 26993 }, { buffType = "magic" }, "DRUID") -- Faerie Fire
Debuff({ 16857, 17390, 17391, 17392, 27011 }, { buffType = "magic" }, "DRUID") -- Faerie Fire (Feral) Debuff({ 16857, 17390, 17391, 17392, 27011 }, { buffType = "magic" }, "DRUID") -- Faerie Fire (Feral)
Debuff({ 2637, 18657, 18658 }, { buffType = "magic"}, "DRUID") -- Hibernate Debuff({ 2637, 18657, 18658 }, { buffType = "magic"}, "DRUID") -- Hibernate
Debuff({ 99, 1735, 9490, 9747, 9898, 26998, 48559, 48560 }, { buffType = "physical" }, "DRUID") -- Demoralizing Roar Debuff({ 99, 1735, 9490, 9747, 9898, 26998 }, { buffType = "physical" }, "DRUID") -- Demoralizing Roar
Debuff({ 5209 }, { buffType = "physical" }, "DRUID") -- Challenging Roar Debuff({ 5209 }, { buffType = "physical" }, "DRUID") -- Challenging Roar
Debuff({ 6795 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Taunt Debuff({ 6795 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Taunt
Debuff({ 16922 }, { buffType = "physical" }, "DRUID") -- Imp Starfire Stun Debuff({ 16922 }, { buffType = "physical" }, "DRUID") -- Imp Starfire Stun
Debuff({ 9005, 9823, 9827, 27006, 49803 }, { buffType = "physical" }, "DRUID") -- Pounce Debuff({ 9005, 9823, 9827, 27006 }, { buffType = "physical" }, "DRUID") -- Pounce
Debuff({ 9007, 9824, 9826, 27007, 49804 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Pounce Bleed 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, 48462, 48463 }, { stacking = true, buffType = "magic"}, "DRUID") -- Moonfire 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, 48573, 48574, 59886 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rake Debuff({ 1822, 1823, 1824, 9904, 27003 }, { 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({ 1079, 9492, 9493, 9752, 9894, 9896, 27008 }, { 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({ 5570, 24974, 24975, 24976, 24977, 27013 }, { 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({ 33745 }, { 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 -- WARRIOR
------------- -------------
Debuff({ 29703 }, { buffType = "physical"}, "WARRIOR") -- Dazed Debuff({ 29703 }, { buffType = "physical"}, "WARRIOR") -- Dazed
Debuff({ 12294, 21551, 21552, 21553, 25248, 30330, 47485, 47486 }, { buffType = "physical" }, "WARRIOR") -- Mortal Strike Debuff({ 12294, 21551, 21552, 21553, 25248, 30330 }, { buffType = "physical" }, "WARRIOR") -- Mortal Strike
Debuff({ 72, 1671, 1672, 29704 }, { buffType = "physical" }, "WARRIOR") -- Shield Bash Debuff({ 72, 1671, 1672, 29704}, { buffType = "physical" }, "WARRIOR") -- Shield Bash
Debuff({ 18498 }, { buffType = "physical" }, "WARRIOR") -- Improved Shield Bash Debuff({ 18498 }, { buffType = "physical" }, "WARRIOR") -- Improved Shield Bash
Debuff({ 772, 6546, 6547, 6548, 11572, 11573, 11574, 25208, 46845, 47465 }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Rend 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({ 12721, 43104 }, { stacking = true, buffType = "physical"}, "WARRIOR") -- Deep Wounds
Debuff({ 12323 }, { buffType = "physical"}, "WARRIOR") -- Piercing Howl Debuff({ 12323 }, { buffType = "physical"}, "WARRIOR") -- Piercing Howl
Debuff({ 1715, 7372, 7373, 25212 }, { buffType = "physical" }, "WARRIOR") -- Hamstring Debuff({ 1715, 7372, 7373, 25212 }, { buffType = "physical" }, "WARRIOR") -- Hamstring
Debuff({ 23694 } , { buffType = "physical" }, "WARRIOR") -- Improved Hamstring Debuff({ 23694 } , { buffType = "physical" }, "WARRIOR") -- Improved Hamstring
Debuff({ 6343, 8198, 8204, 8205, 11580, 11581, 25264, 47501, 47502 }, { buffType = "physical"}, "WARRIOR") -- Thunder Clap Debuff({ 6343, 8198, 8204, 8205, 11580, 11581, 25264 }, { buffType = "physical"}, "WARRIOR") -- Thunder Clap
Debuff({ 694, 7400, 7402, 20559, 20560 }, { buffType = "physical", }, "WARRIOR") -- Mocking Blow Debuff({ 694, 7400, 7402, 20559, 20560 }, { buffType = "physical", }, "WARRIOR") -- Mocking Blow
Debuff({ 1161 } ,{ buffType = "physical", }, "WARRIOR") -- Challenging Shout Debuff({ 1161 } ,{ buffType = "physical", }, "WARRIOR") -- Challenging Shout
Debuff({ 355 } ,{ stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "WARRIOR") -- Taunt Debuff({ 355 } ,{ stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "WARRIOR") -- Taunt
Debuff({ 1160, 6190, 11554, 11555, 11556, 25202, 25203, 47437 }, { buffType = "physical" }, "WARRIOR") -- Demoralizing Shout, varies Debuff({ 1160, 6190, 11554, 11555, 11556, 25202, 25203 }, { buffType = "physical" }, "WARRIOR") -- Demoralizing Shout, varies
Debuff({ 5246 }, { buffType = "physical" }, "WARRIOR") -- Intimidating Shout Fear Debuff({ 5246 }, { buffType = "physical" }, "WARRIOR") -- Intimidating Shout Fear
Debuff({ 676 } ,{ buffType = "physical" }, "WARRIOR") -- Disarm Debuff({ 676 } ,{ buffType = "physical" }, "WARRIOR") -- Disarm
Debuff({ 12798 } , { buffType = "physical" }, "WARRIOR") -- Imp Revenge Stun 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({ 12809 } ,{ buffType = "physical" }, "WARRIOR") -- Concussion Blow
Debuff({ 7922 }, { buffType = "physical" }, "WARRIOR") -- Charge Stun Debuff({ 7922 }, { buffType = "physical" }, "WARRIOR") -- Charge Stun
Debuff({ 20253, 20614, 20615, 25273, 25274, 47995 }, { buffType = "physical" }, "WARRIOR") -- Intercept Stun Debuff({ 20253, 20614, 20615, 25273, 25274 }, { buffType = "physical" }, "WARRIOR") -- Intercept Stun
Debuff({ 5530 }, { buffType = "physical"}, "WARRIOR") -- Mace Stun Effect (Mace Specialization) 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 -- ROGUE
-------------- --------------
Debuff({ 16511, 17347, 17348, 26864, 48660 }, { buffType = "physical" }, "ROGUE") -- Hemorrhage Debuff({ 16511, 17347, 17348, 26864 }, { buffType = "physical" }, "ROGUE") -- Hemorrhage
Debuff({ 3409, 11201 }, { buffType = "poison" }, "ROGUE") -- Crippling Poison Debuff({ 3409, 11201 }, { buffType = "poison" }, "ROGUE") -- Crippling Poison
Debuff({ 13218, 13222, 13223, 13224, 27189, 57975 }, { buffType = "poison" }, "ROGUE") -- Wound Poison Debuff({ 13218, 13222, 13223, 13224, 27189 }, { buffType = "poison" }, "ROGUE") -- Wound Poison
Debuff({ 26679 }, { buffType = "physical"}, "ROGUE") -- Deadly Throw Slow Debuff({ 26679 }, { buffType = "physical"}, "ROGUE") -- Deadly Throw Slow
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({ 2818, 2819, 11353, 11354, 25349, 26968, 27187 }, { 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({ 5760, 8692, 11398 }, { buffType = "poison" }, "ROGUE") -- Mind-numbing Poison
Debuff({ 18425 }, { buffType = "physical" }, "ROGUE") -- Improved Kick Silence Debuff({ 18425 }, { buffType = "physical" }, "ROGUE") -- Improved Kick Silence
Debuff({ 1833 }, { buffType = "physical" }, "ROGUE") -- Cheap Shot Debuff({ 1833 }, { buffType = "physical" }, "ROGUE") -- Cheap Shot
Debuff({ 2070, 6770, 11297 }, { buffType = "physical" }, "ROGUE") -- Sap Debuff({ 2070, 6770, 11297 }, { buffType = "physical" }, "ROGUE") -- Sap
Debuff({ 2094 } , { buffType = "physical" }, "ROGUE") -- Blind Debuff({ 2094 } , { buffType = "physical" }, "ROGUE") -- Blind
Debuff({ 8647, 8649, 8650, 11197, 11198, 26866 }, { buffType = "physical" }, "ROGUE") -- Expose Armor Debuff({ 8647, 8649, 8650, 11197, 11198, 26866 }, { buffType = "physical" }, "ROGUE") -- Expose Armor
Debuff({ 703, 8631, 8632, 8633, 11289, 11290, 26839, 26884, 48676 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "ROGUE") -- Garrote Debuff({ 703, 8631, 8632, 8633, 11289, 11290, 26839, 26884 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "ROGUE") -- Garrote
Debuff({ 1330 }, { buffType = "physical"}, "ROGUE")-- Garrote - Silence Debuff({ 1330 }, { buffType = "physical"}, "ROGUE")-- Garrote - Silence
Debuff({ 408, 8643 }, { buffType = "physical" }, "ROGUE") -- Kidney Shot Debuff({ 408, 8643 }, { buffType = "physical" }, "ROGUE") -- Kidney Shot
Debuff({ 1943, 8639, 8640, 11273, 11274, 11275, 26867, 48671, 48672 }, { buffType = "physical", stacking = true}, "ROGUE") -- Rupture Debuff({ 1943, 8639, 8640, 11273, 11274, 11275, 26867 }, { buffType = "physical", stacking = true}, "ROGUE") -- Rupture
Debuff({ 1776, 1777, 8629, 11285, 11286, 38764 }, { buffType = "physical", }, "ROGUE") -- Gouge Debuff({ 1776, 1777, 8629, 11285, 11286, 38764 }, { buffType = "physical", }, "ROGUE") -- Gouge
Debuff({ 14251 } , { buffType = "physical", }, "ROGUE") -- Riposte (disarm) Debuff({ 14251 } , { buffType = "physical", }, "ROGUE") -- Riposte (disarm)
Debuff({ 51693 } , { buffType = "physical", }, "ROGUE") -- Waylay
Debuff({ 51585 } , { buffType = "physical", }, "ROGUE") -- Blade Twisting
------------ ------------
-- WARLOCK -- WARLOCK
------------ ------------
Debuff({ 32386 }, { buffType = "magic"}, "WARLOCK") -- Shadow Embrace Debuff({ 32386 }, { buffType = "magic"}, "WARLOCK") -- Shadow Embrace
Debuff({ 710, 18647 } ,{ buffType = "immune"}, "WARLOCK") -- Banish Debuff({ 710, 18647 } ,{ buffType = "immune"}, "WARLOCK") -- Banish
Debuff( { 348, 707, 1094, 2941, 11665, 11667, 11668, 25309, 27215, 47810, 47811 }, { buffType = "magic", stacking = true, preEvent = "SPELL_DAMAGE"}, "WARLOCK") -- Immolate Debuff( { 348, 707, 1094, 2941, 11665, 11667, 11668, 25309, 27215 }, { buffType = "magic", stacking = true, preEvent = "SPELL_DAMAGE"}, "WARLOCK") -- Immolate
Debuff({ 24259 } ,{ buffType = "magic" }, "WARLOCK") -- Spell Lock Silence Debuff({ 24259 } ,{ buffType = "magic" }, "WARLOCK") -- Spell Lock Silence
Debuff({ 27243 } ,{ buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Seed of Corruption Debuff({ 27243 } ,{ buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Seed of Corruption
Debuff( { 689, 699, 709, 7651, 11699, 11700, 27219, 27220, 47857 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Life Debuff( { 689, 699, 709, 7651, 11699, 11700, 27219, 27220 }, { 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( { 5138, 6226, 11703, 11704, 27221, 30908 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Mana
Debuff( { 1120, 8288, 8289, 11675, 27217, 47855 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Drain Soul Debuff( { 1120, 8288, 8289, 11675, 27217 }, { 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( { 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, 47812, 47813 }, { buffType = "magic", stacking = true }, "WARLOCK") -- Corruption Debuff( { 172, 6222, 6223, 7648, 11671, 11672, 25311, 27216 }, { 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( { 980, 1014, 6217, 11711, 11712, 11713, 27218 }, { buffType = "curse", stacking = true, preEvent = "SPELL_CAST_SUCCESS"}, "WARLOCK") -- Curse of Agony
Debuff({ 18223, 29539, 46434 }, { buffType = "curse"}, "WARLOCK") -- Curse of Exhaustion Debuff({ 18223, 29539, 46434 }, { buffType = "curse"}, "WARLOCK") -- Curse of Exhaustion
Debuff( { 16231, 704, 7658, 7659, 11717, 27226 }, { buffType = "curse"}, "WARLOCK") -- Curse of Recklessness Debuff( { 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( { 1490, 11721, 11722, 27228 }, { buffType = "curse"}, "WARLOCK") -- Curse of the Elements
Debuff( { 1714, 11719 }, { buffType = "curse"}, "WARLOCK") -- Curse of Tongues Debuff( { 1714, 11719 }, { buffType = "curse"}, "WARLOCK") -- Curse of Tongues
Debuff( { 702, 1108, 6205, 7646, 11707, 11708, 27224, 30909, 50511 }, { buffType = "curse"}, "WARLOCK") -- Curse of Weakness Debuff( { 702, 1108, 6205, 7646, 11707, 11708, 27224, 30909 }, { buffType = "curse"}, "WARLOCK") -- Curse of Weakness
Debuff( { 603, 30910, 47867 }, { buffType = "curse"}, "WARLOCK") -- Curse of Doom Debuff( { 603, 30910 }, { buffType = "curse"}, "WARLOCK") -- Curse of Doom
Debuff( { 6789, 17925, 17926, 27223, 47859, 47860 }, { buffType = "magic"}, "WARLOCK") -- Death Coil Debuff( { 6789, 17925, 17926, 27223 }, { buffType = "magic"}, "WARLOCK") -- Death Coil
Debuff( { 5782, 6213, 6215 }, { buffType = "magic"}, "WARLOCK") -- Fear Debuff( { 5782, 6213, 6215 }, { buffType = "magic"}, "WARLOCK") -- Fear
Debuff( { 5484, 17928 }, { buffType = "magic"}, "WARLOCK") -- Howl of Terror Debuff( { 5484, 17928 }, { buffType = "magic"}, "WARLOCK") -- Howl of Terror
Debuff({ 6358 }, { buffType = "magic" }, "WARLOCK") -- Seduction Debuff({ 6358 }, { buffType = "magic" }, "WARLOCK") -- Seduction
Debuff({ 30108, 30404, 30405, 47841, 47843 }, { buffType = "magic", stacking = true, preEvent = "SPELL_CAST_START" }, "WARLOCK") -- Unstable Affliction Debuff({ 30108, 30404, 30405 }, { 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({ 31117, 43523 }, { buffType = "magic", altName = select(1, GetSpellInfo(30405)) .. " Silence" }, "WARLOCK") -- Unstable Affliction Silence
Debuff({ 18093 } ,{ buffType = "physical" }, "WARLOCK") -- Pyroclasm Debuff({ 18093 } ,{ buffType = "physical" }, "WARLOCK") -- Pyroclasm
Debuff({ 17877, 18867, 18868, 18869, 18870, 18871, 27263, 30546, 47826, 47827 }, { buffType = "physical", stacking = true, preEvent = "SPELL_CAST_SUCCESS" }, "WARLOCK") -- Shadowburn Debuff Debuff({ 17877, 18867, 18868, 18869, 18870, 18871, 27263, 30546 }, { 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 -- SHAMAN
--------------- ---------------
Debuff({ 17364 } ,{ buffType = "magic" }, "SHAMAN") -- Stormstrike Debuff({ 17364 } ,{ buffType = "magic" }, "SHAMAN") -- Stormstrike
Debuff({ 8056, 8058, 10472, 10473, 25464, 49235, 49236 }, { buffType = "magic" }, "SHAMAN") -- Frost Shock Debuff({ 8056, 8058, 10472, 10473, 25464 }, { 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({ 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, 58797, 58798, 58799 }, { buffType = "magic" }, "SHAMAN") -- Frostbrand Attack Debuff({ 8034, 8037, 10458, 16352, 16353, 25501 }, { buffType = "magic" }, "SHAMAN") -- Frostbrand Attack
Debuff({ 3600 } ,{ buffType = "magic" }, "SHAMAN") -- Earthbind Totem Debuff({ 3600 } ,{ buffType = "magic" }, "SHAMAN") -- Earthbind Totem
Debuff({ 63685 } ,{ buffType = "magic" }, "SHAMAN") -- Frozen Power
-------------- --------------
-- PALADIN -- PALADIN
@ -165,94 +140,59 @@ Debuff( { 25771 }, { buffType = "immune"}, "PALADIN") -- Forbearance
Debuff({ 20066 }, { buffType = "magic" }, "PALADIN") -- Repentance Debuff({ 20066 }, { buffType = "magic" }, "PALADIN") -- Repentance
Debuff({ 2878, 5627, 5627 }, { buffType = "magic"}, "PALADIN") -- Turn Undead Debuff({ 2878, 5627, 5627 }, { buffType = "magic"}, "PALADIN") -- Turn Undead
Debuff({ 21183, 20188, 20300, 20301, 20302, 20303, 27159 }, { }, "PALADIN") -- Judgement of the Crusader Debuff({ 21183, 20188, 20300, 20301, 20302, 20303, 27159 }, { }, "PALADIN") -- Judgement of the Crusader
Debuff({ 20271, 20185, 20344, 20345, 20346 }, { buffType = "magic"}, "PALADIN") -- Judgement of Light Debuff({ 20185, 20344, 20345, 20346 }, { buffType = "magic"}, "PALADIN") -- Judgement of Light
Debuff({ 20186, 20354, 20355, 53408 }, { buffType = "magic"}, "PALADIN") -- Judgement of Wisdom Debuff({ 20186, 20354, 20355 }, { buffType = "magic"}, "PALADIN") -- Judgement of Wisdom
Debuff({ 20184, 31896, 53407}, { buffType = "magic", }, "PALADIN") -- Judgement of Justice Debuff({ 20184, 31896}, { buffType = "magic", }, "PALADIN") -- Judgement of Justice
Debuff({ 853, 5588, 5589, 10308 }, { buffType = "magic" }, "PALADIN") -- Hammer of Justice Debuff({ 853, 5588, 5589, 10308 }, { buffType = "magic" }, "PALADIN") -- Hammer of Justice
Debuff({ 20170 } ,{ buffType = "physical", }, "PALADIN") -- Seal of Justice stun 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 -- HUNTER
------------- -------------
Debuff( { 19434, 20900, 20901, 20902, 20903, 20904, 27065, 49049, 49050}, { buffType = "physical"}, "HUNTER") -- Aimed Shot Debuff( { 19434, 20900, 20901, 20902, 20903, 20904}, { buffType = "physical"}, "HUNTER") -- Aimed Shot
Debuff({ 1130, 14323, 14324, 14325, 53338 }, { buffType = "magic", }, "HUNTER") -- Hunter's Mark Debuff({ 1130, 14323, 14324, 14325 }, { 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({ 1978, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 25295, 27016 }, { stacking = true, buffType = "poison", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Serpent Sting
Debuff({ 34490 }, { buffType = "magic" }, "HUNTER") -- Silencing Shot Debuff({ 34490 }, { buffType = "magic" }, "HUNTER") -- Silencing Shot
Debuff({ 3043 }, { buffType = "poison", }, "HUNTER") -- Scorpid Sting Debuff({ 3043 }, { buffType = "poison", }, "HUNTER") -- Scorpid Sting
Debuff({ 3034, 14279, 14280, 27018 }, { buffType = "poison", }, "HUNTER") -- Viper Sting Debuff({ 3034, 14279, 14280, 27018 }, { buffType = "poison", }, "HUNTER") -- Viper Sting
Debuff({ 19386, 24132, 24133, 27068, 49011, 49012 }, { buffType = "poison", }, "HUNTER") -- Wyvern Sting Debuff({ 19386, 24132, 24133, 27068 }, { 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({ 24131, 24134, 24135, 27069 }, { buffType = "poison", altName = select(1, GetSpellInfo(19386)) .. " Dot" }, "HUNTER") -- Wyvern Sting Dot
Debuff({ 1513, 14326, 14327 }, { buffType = "magic"}, "HUNTER") -- Scare Beast Debuff({ 1513, 14326, 14327 }, { buffType = "magic"}, "HUNTER") -- Scare Beast
Debuff({ 19229, 47168 }, { buffType = "physical", }, "HUNTER") -- Wing Clip Root Debuff({ 19229 }, { buffType = "physical", }, "HUNTER") -- Wing Clip Root
Debuff({ 19306, 20909, 20910, 27067, 48998, 48999 }, { buffType = "physical"}, "HUNTER") -- Counterattack Debuff({ 19306, 20909, 20910 }, { buffType = "physical"}, "HUNTER") -- Counterattack
Debuff({ 13812, 14314, 14315, 27026, 49064, 49065 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "HUNTER") -- Explosive Trap Debuff({ 13812, 14314, 14315, 27026 }, { 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({ 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({ 3355, 14308, 14309 }, { buffType = "magic" }, "HUNTER") -- Freezing Trap
Debuff({ 19503 }, { buffType = "physical" }, "HUNTER") -- Scatter Shot Debuff({ 19503 }, { buffType = "physical" }, "HUNTER") -- Scatter Shot
Debuff({ 2974 }, { buffType = "physical" }, "HUNTER") -- Wing Clip Debuff({ 2974, 14267, 14268 }, { buffType = "physical" }, "HUNTER") -- Wing Clip
Debuff({ 19229, 47168 }, { buffType = "physical" }, "HUNTER") -- Improved Wing Clip
Debuff({ 5116 }, { buffType = "physical" }, "HUNTER") -- Concussive Shot Debuff({ 5116 }, { buffType = "physical" }, "HUNTER") -- Concussive Shot
Debuff({ 19410 }, { buffType = "physical" }, "HUNTER") -- Conc Stun Debuff({ 19410 }, { buffType = "physical" }, "HUNTER") -- Conc Stun
Debuff({ 24394 }, { buffType = "physical" }, "HUNTER") -- Intimidation Debuff({ 24394 }, { buffType = "physical" }, "HUNTER") -- Intimidation
Debuff({ 15571 }, { buffType = "physical" }, "HUNTER") -- Daze from Aspect Debuff({ 15571 }, { buffType = "physical" }, "HUNTER") -- Daze from Aspect
Debuff({ 19185 }, { buffType = "physical" }, "HUNTER") -- Entrapment Debuff({ 19185 }, { buffType = "physical" }, "HUNTER") -- Entrapment
Debuff({ 25999 }, { buffType = "physical" }, "HUNTER") -- Boar Charge Debuff({ 25999 }, { buffType = "physical" }, "HUNTER") -- Boar Charge
Debuff({ 24640, 24583, 24586, 24587, 27060, 55728 }, { buffType = "poison" }, "HUNTER") -- Scorpid Poison Debuff({ 24640, 24583, 24586, 24587, 27060 }, { 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 -- MAGE
------------- -------------
Debuff({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306, 27070, 38692, 42832, 42833 }, { buffType = "magic"}, "MAGE") -- Fireball 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, 42890, 42891 }, { buffType = "magic" }, "MAGE") -- Pyroblast Debuff({ 11366, 12505, 12522, 12523, 12524, 12525, 12526, 18809, 27132, 33938 }, { buffType = "magic" }, "MAGE") -- Pyroblast
Debuff({ 18469 }, { buffType = "magic" }, "MAGE") -- Imp CS Silence Debuff({ 18469 }, { buffType = "magic" }, "MAGE") -- Imp CS Silence
Debuff({ 118, 12824, 12825, 12826, 61721, 61305, 61780 }, { buffType = "magic" }, "MAGE") -- Polymorph Debuff({ 118, 12824, 12825, 12826 }, { buffType = "magic" }, "MAGE") -- Polymorph
Debuff({ 12355 } , { buffType = "physical" }, "MAGE") -- Impact Debuff({ 12355 } , { buffType = "physical" }, "MAGE") -- Impact
Debuff({ 12654 }, { buffType = "magic" }, "MAGE") -- Ignite Debuff({ 12654 }, { buffType = "magic" }, "MAGE") -- Ignite
Debuff({ 22959 }, { buffType = "magic" }, "MAGE") -- Fire Vulnerability Debuff({ 22959 }, { buffType = "magic" }, "MAGE") -- Fire Vulnerability
Debuff({ 12579 }, { buffType = "magic" }, "MAGE") -- Winter's Chill Debuff({ 12579 }, { buffType = "magic" }, "MAGE") -- Winter's Chill
Debuff({ 11113, 13018, 13019, 13020, 13021, 27133, 33933, 42944, 42945 }, { buffType = "physical" }, "MAGE") -- Blast Wave Debuff({ 11113, 13018, 13019, 13020, 13021, 27133, 33933 }, { buffType = "physical" }, "MAGE") -- Blast Wave
--Spell({ 2120, 2121, 8422, 8423, 10215, 10216, 27086 }, { stacking = true, buffType = "physical" }) -- Flamestrike --Spell({ 2120, 2121, 8422, 8423, 10215, 10216, 27086 }, { stacking = true, buffType = "physical" }) -- Flamestrike
Debuff({ 120, 8492, 10159, 10160, 10161, 27087, 42930, 42931 }, { buffType = "magic" }, "MAGE") -- Cone of Cold Debuff({ 120, 8492, 10159, 10160, 10161, 27087 }, { buffType = "magic" }, "MAGE") -- Cone of Cold
Debuff({ 12484, 12485, 12486 }, { .5 }) -- Improved Blizzard (Chilled) Debuff({ 12484, 12485, 12486 }, { .5 }) -- Improved Blizzard (Chilled)
Debuff({ 6136, 7321, 18101, 20005, 16927, 15850, 31257}, { buffType = "magic" }, "MAGE") -- Frost/Ice Armor (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, 42841, 42842 }, { buffType = "magic" }, "MAGE") -- Frostbolt Debuff({ 116, 205, 837, 7322, 8406, 8407, 8408, 10179, 10180, 10181, 25304, 27071, 27072, 38697 }, { buffType = "magic" }, "MAGE") -- Frostbolt
Debuff({ 12494 }, { buffType = "magic" }, "MAGE") -- Frostbite Debuff({ 12494 }, { buffType = "magic" }, "MAGE") -- Frostbite
Debuff({ 122, 865, 6131, 10230, 27088, 42917 }, { buffType = "magic" }, "MAGE") -- Frost Nova Debuff({ 122, 865, 6131, 10230 }, { buffType = "magic" }, "MAGE") -- Frost Nova
Debuff({ 31589 }, { buffType = "magic" }, "MAGE") -- Slow Debuff({ 31589 }, { buffType = "magic" }, "MAGE") -- Slow
Debuff({ 41425 }, { buffType = "immune" }, "MAGE") -- Hypothermia 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

@ -7,51 +7,28 @@ LibClassAuras.debuffs = {}
LibClassAuras.debuffToId = {} LibClassAuras.debuffToId = {}
LibClassAuras.buffs = {} LibClassAuras.buffs = {}
LibClassAuras.buffToId = {} 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) local function Spell(id, opts, class, spellTable, idTable)
if not opts or not class then if not opts or not class then
return return
end end
local spellName local lastRankID
if type(id) == "table" then if type(id) == "table" then
local realIds = {} local clones = id
for i = 1, #id do lastRankID = clones[#clones]
if GetSpellInfo(id[i]) then
tinsert(realIds, id[i])
spellName = GetSpellInfo(id[i])
end
end
id = realIds
else else
spellName = GetSpellInfo(id) lastRankID = id
end end
local spellName = GetSpellInfo(lastRankID)
if not spellName then if not spellName then
return return
end end
if opts.altName then if opts.altName then
for _,v in ipairs(id) do idTable[opts.altName] = {id = id , class = class}
LibClassAuras.altNames[v] = opts.altName
end
if idTable[opts.altName] then
tinsert(idTable[opts.altName], {id = id , class = class})
else else
idTable[opts.altName] = {[1] = {id = id , class = class}} idTable[spellName] = {id = id , class = class}
end
else
if idTable[spellName] then
tinsert(idTable[spellName], {id = id , class = class})
else
idTable[spellName] = {[1] = {id = id , class = class}}
end
end end
if type(id) == "table" then if type(id) == "table" then
@ -77,11 +54,9 @@ LibClassAuras.Buff = Buff
local function getClassDebuffs(class) local function getClassDebuffs(class)
local classSpells = {} local classSpells = {}
for name, spells in pairs(LibClassAuras.debuffToId) do for k,v in pairs(LibClassAuras.debuffToId) do
for _, spellInfo in ipairs(spells) do if v.class == class then
if spellInfo.class == class then tinsert(classSpells, {name = k, id = v.id})
tinsert(classSpells, {name = name, id = spellInfo.id})
end
end end
end end
return classSpells return classSpells
@ -90,11 +65,9 @@ LibClassAuras.GetClassDebuffs = getClassDebuffs
local function getClassBuffs(class) local function getClassBuffs(class)
local classSpells = {} local classSpells = {}
for name, spells in pairs(LibClassAuras.buffToId) do for k,v in pairs(LibClassAuras.buffToId) do
for _, spellInfo in ipairs(spells) do if v.class == class then
if spellInfo.class == class then tinsert(classSpells, {name = k, id = v.id})
tinsert(classSpells, {name = name, id = spellInfo.id})
end
end end
end end
return classSpells return classSpells
@ -110,8 +83,3 @@ local function getSpellNameToId(auraType)
end end
LibClassAuras.GetSpellNameToId = getSpellNameToId LibClassAuras.GetSpellNameToId = getSpellNameToId
local function getAltName(spellID)
return LibClassAuras.altNames[spellID]
end
LibClassAuras.GetAltName = getAltName

View File

@ -1,711 +0,0 @@
--[[
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, -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

@ -1,12 +0,0 @@
## 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,51 +0,0 @@
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

@ -1,7 +1,6 @@
--@curseforge-project-slug: libsharedmedia-3-0@
--[[ --[[
Name: LibSharedMedia-3.0 Name: LibSharedMedia-3.0
Revision: $Revision: 128 $ Revision: $Revision: 114 $
Author: Elkano (elkano@gmx.de) Author: Elkano (elkano@gmx.de)
Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com) Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
Website: http://www.wowace.com/projects/libsharedmedia-3-0/ Website: http://www.wowace.com/projects/libsharedmedia-3-0/

View File

@ -10,7 +10,7 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
function LibStub:NewLibrary(major, minor) function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(string.match(minor, "%d+")), "Minor version must either be a number or contain a number.") minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
local oldminor = self.minors[major] local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end if oldminor and oldminor >= minor then return nil end

View File

@ -16,7 +16,7 @@ local UnitName = UnitName
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Announcements = Gladdy:NewModule("Announcements", 101, { local Announcements = Gladdy:NewModule("Announcements", nil, {
announcements = { announcements = {
drinks = true, drinks = true,
resurrections = true, resurrections = true,
@ -26,7 +26,6 @@ local Announcements = Gladdy:NewModule("Announcements", 101, {
healthThreshold = 20, healthThreshold = 20,
trinketUsed = true, trinketUsed = true,
trinketReady = false, trinketReady = false,
spellInterrupt = true,
dest = "party", dest = "party",
}, },
}) })
@ -42,20 +41,16 @@ function Announcements:Initialize()
[GetSpellInfo(20777)] = true, [GetSpellInfo(20777)] = true,
} }
self:RegisterMessage("JOINED_ARENA") 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")
end end
function Announcements:Reset() function Announcements:Reset()
self:UnregisterMessages(
"CAST_START",
"ENEMY_SPOTTED",
"UNIT_SPEC",
"AURA_GAIN",
"UNIT_HEALTH",
"TRINKET_USED",
"TRINKET_READY",
"SHADOWSIGHT",
"SPELL_INTERRUPT")
self.enemy = {} self.enemy = {}
self.throttled = {} self.throttled = {}
end end
@ -65,23 +60,15 @@ function Announcements:Test(unit)
if (not button) then if (not button) then
return return
end end
self:JOINED_ARENA()
if unit == "arena1" then
self:AURA_GAIN(unit, nil, nil, self.DRINK_AURA)
end
end
function Announcements:JOINED_ARENA() if (unit == "arena1") then
self:RegisterMessages( self:UNIT_SPEC(unit, button.testSpec)
"CAST_START", elseif (unit == "arena2") then
"ENEMY_SPOTTED", self:CheckDrink(unit, self.DRINK_AURA)
"UNIT_SPEC", elseif (unit == "arena3") then
"AURA_GAIN", self:UNIT_HEALTH(unit, button.health, button.healthMax)
"UNIT_HEALTH", self:ENEMY_SPOTTED(unit)
"TRINKET_USED", end
"TRINKET_READY",
"SHADOWSIGHT",
"SPELL_INTERRUPT")
end end
function Announcements:CAST_START(unit, spell) function Announcements:CAST_START(unit, spell)
@ -91,7 +78,7 @@ function Announcements:CAST_START(unit, spell)
end end
if (self.RES_SPELLS[spell]) then if (self.RES_SPELLS[spell]) then
self:Send(L["RESURRECTING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class], unit) self:Send(L["RESURRECTING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
end end
end end
@ -105,7 +92,7 @@ function Announcements:ENEMY_SPOTTED(unit)
if button.name == "Unknown" then if button.name == "Unknown" then
button.name = UnitName(unit) button.name = UnitName(unit)
end end
self:Send("ENEMY SPOTTED:" .. ("%s (%s)"):format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class], unit) self:Send("ENEMY SPOTTED:" .. ("%s (%s)"):format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
self.enemy[unit] = true self.enemy[unit] = true
end end
end end
@ -118,7 +105,7 @@ function Announcements:UNIT_SPEC(unit, spec)
if button.name == "Unknown" then if button.name == "Unknown" then
button.name = UnitName(unit) button.name = UnitName(unit)
end end
self:Send(L["SPEC DETECTED: %s - %s (%s)"]:format(button.name, spec, button.classLoc), 1, RAID_CLASS_COLORS[button.class], unit) self:Send(L["SPEC DETECTED: %s - %s (%s)"]:format(button.name, spec, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
end end
function Announcements:UNIT_HEALTH(unit, health, healthMax) function Announcements:UNIT_HEALTH(unit, health, healthMax)
@ -129,7 +116,7 @@ function Announcements:UNIT_HEALTH(unit, health, healthMax)
local healthPercent = floor(health * 100 / healthMax) local healthPercent = floor(health * 100 / healthMax)
if (healthPercent < Gladdy.db.announcements.healthThreshold) then 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], unit) self:Send(L["LOW HEALTH: %s (%s)"]:format(button.name, button.classLoc), 10, RAID_CLASS_COLORS[button.class])
end end
end end
@ -139,7 +126,7 @@ function Announcements:TRINKET_USED(unit)
return return
end end
self:Send(L["TRINKET USED: %s (%s)"]:format(button.name, button.classLoc), 1, RAID_CLASS_COLORS[button.class], unit) self:Send(L["TRINKET USED: %s (%s)"]:format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
end end
function Announcements:TRINKET_READY(unit) function Announcements:TRINKET_READY(unit)
@ -148,25 +135,17 @@ function Announcements:TRINKET_READY(unit)
return return
end end
self:Send(L["TRINKET READY: %s (%s)"]:format(button.name, button.classLoc), 1, RAID_CLASS_COLORS[button.class], unit) self:Send(L["TRINKET READY: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
end end
function Announcements:SPELL_INTERRUPT(unit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool) function Announcements:CheckDrink(unit, aura)
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], unit)
end
function Announcements:AURA_GAIN(unit, auraType, spellID, spellName)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if (not button or not Gladdy.db.announcements.drinks) then if (not button or not Gladdy.db.announcements.drinks) then
return return
end end
if (spellName == self.DRINK_AURA) then if (aura == self.DRINK_AURA) then
self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class], unit) self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
end end
end end
@ -174,17 +153,13 @@ function Announcements:SHADOWSIGHT(msg)
self:Send(msg, 2) self:Send(msg, 2)
end end
function Announcements:Send(msg, throttle, color, unit) function Announcements:Send(msg, throttle, color)
if (throttle and throttle > 0) then if (throttle and throttle > 0) then
local throttledMsg = unit and msg .. unit or msg if (not self.throttled[msg]) then
if (not self.throttled[throttledMsg]) then self.throttled[msg] = GetTime() + throttle
self.throttled[throttledMsg] = GetTime() + throttle elseif (self.throttled[msg] < GetTime()) then
Gladdy:Debug("INFO", throttledMsg, "- NOT THROTTLED -", self.throttled[throttledMsg]) self.throttled[msg] = nil
elseif (self.throttled[throttledMsg] < GetTime()) then
Gladdy:Debug("INFO", throttledMsg, "- THROTTLED OVER -", self.throttled[throttledMsg])
self.throttled[throttledMsg] = GetTime() + throttle
else else
Gladdy:Debug("INFO", throttledMsg, "- THROTTLED -", self.throttled[throttledMsg])
return return
end end
end end
@ -235,15 +210,10 @@ function Announcements:GetOptions()
["self"] = L["Self"], ["self"] = L["Self"],
["party"] = L["Party"], ["party"] = L["Party"],
["rw"] = L["Raid Warning"], ["rw"] = L["Raid Warning"],
["fct"] = L["Blizzard's Floating Combat Text"],
["msbt"] = L["MikScrollingBattleText"],
} }
if IsAddOnLoaded("Blizzard_CombatText") then
destValues["fct"] = L["Blizzard's Floating Combat Text"]
end
if IsAddOnLoaded("MikScrollingBattleText") then
destValues["msbt"] = L["MikScrollingBattleText"]
end
return { return {
headerAnnouncements = { headerAnnouncements = {
type = "header", type = "header",
@ -262,47 +232,41 @@ function Announcements:GetOptions()
desc = L["Announce when an enemy's trinket is ready again"], desc = L["Announce when an enemy's trinket is ready again"],
order = 4, order = 4,
}), }),
spellInterrupt = option({
type = "toggle",
name = L["Interrupts"],
desc = L["Announces when enemies' spells are interrupted"],
order = 5,
}),
drinks = option({ drinks = option({
type = "toggle", type = "toggle",
name = L["Drinking"], name = L["Drinking"],
desc = L["Announces when enemies sit down to drink"], desc = L["Announces when enemies sit down to drink"],
order = 6, order = 5,
}), }),
resurrections = option({ resurrections = option({
type = "toggle", type = "toggle",
name = L["Resurrection"], name = L["Resurrection"],
desc = L["Announces when an enemy tries to resurrect a teammate"], desc = L["Announces when an enemy tries to resurrect a teammate"],
order = 7, order = 6,
}), }),
enemy = option({ enemy = option({
type = "toggle", type = "toggle",
name = L["New enemies"], name = L["New enemies"],
desc = L["Announces when new enemies are discovered"], desc = L["Announces when new enemies are discovered"],
order = 8, order = 7,
}), }),
spec = option({ spec = option({
type = "toggle", type = "toggle",
name = L["Spec Detection"], name = L["Spec Detection"],
desc = L["Announces when the spec of an enemy was detected"], desc = L["Announces when the spec of an enemy was detected"],
order = 9, order = 8,
}), }),
health = option({ health = option({
type = "toggle", type = "toggle",
name = L["Low health"], name = L["Low health"],
desc = L["Announces when an enemy drops below a certain health threshold"], desc = L["Announces when an enemy drops below a certain health threshold"],
order = 10, order = 9,
}), }),
healthThreshold = option({ healthThreshold = option({
type = "range", type = "range",
name = L["Low health threshold"], name = L["Low health threshold"],
desc = L["Choose how low an enemy must be before low health is announced"], desc = L["Choose how low an enemy must be before low health is announced"],
order = 11, order = 10,
min = 1, min = 1,
max = 100, max = 100,
step = 1, step = 1,
@ -314,7 +278,7 @@ function Announcements:GetOptions()
type = "select", type = "select",
name = L["Destination"], name = L["Destination"],
desc = L["Choose how your announcements are displayed"], desc = L["Choose how your announcements are displayed"],
order = 12, order = 11,
values = destValues, values = destValues,
}), }),
} }

View File

@ -1,13 +1,13 @@
local str_find, pairs = string.find, pairs local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetLocale = GetLocale
local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local ACDFrame = Gladdy:NewModule("Arena Countdown", nil, { local ACDFrame = Gladdy:NewModule("Arena Countdown", nil, {
countdown = true, countdown = true,
arenaCountdownSize = 256, arenaCountdownSize = 256
arenaCountdownFrameStrata = "HIGH",
arenaCountdownFrameLevel = 50,
}) })
function ACDFrame:OnEvent(event, ...) function ACDFrame:OnEvent(event, ...)
@ -16,163 +16,141 @@ end
function ACDFrame:Initialize() function ACDFrame:Initialize()
self.locale = Gladdy:GetArenaTimer() self.locale = Gladdy:GetArenaTimer()
self.hidden = false
self.countdown = -1 self.countdown = -1
self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\"; self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\";
local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent) local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent)
ACDNumFrame:EnableMouse(false)
ACDNumFrame:SetHeight(256)
ACDNumFrame:SetWidth(256)
ACDNumFrame:SetPoint("CENTER", 0, 128)
ACDNumFrame:Show()
self.ACDNumFrame = ACDNumFrame 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", "OVERLAY") local ACDNumTens = ACDNumFrame:CreateTexture("ACDNumTens", "HIGH")
ACDNumTens:SetWidth(256)
ACDNumTens:SetHeight(128)
ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -48, 0)
self.ACDNumTens = ACDNumTens 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", "OVERLAY") local ACDNumOnes = ACDNumFrame:CreateTexture("ACDNumOnes", "HIGH")
ACDNumOnes:SetWidth(256)
ACDNumOnes:SetHeight(128)
ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", 48, 0)
self.ACDNumOnes = ACDNumOnes 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", "OVERLAY") local ACDNumOne = ACDNumFrame:CreateTexture("ACDNumOne", "HIGH")
ACDNumOne:SetWidth(256)
ACDNumOne:SetHeight(128)
ACDNumOne:SetPoint("CENTER", ACDNumFrame, "CENTER", 0, 0)
self.ACDNumOne = ACDNumOne self.ACDNumOne = ACDNumOne
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
if Gladdy.db.countdown then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("UNIT_SPEC")
end
self.faction = UnitFactionGroup("player")
self:SetScript("OnEvent", ACDFrame.OnEvent)
end end
function ACDFrame:UpdateFrameOnce() function ACDFrame.OnUpdate(self, elapse)
if Gladdy.db.countdown then if (self.countdown > 0 and Gladdy.db.countdown) then
self:RegisterMessage("JOINED_ARENA") self.hidden = false;
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
else
self:UnregisterAllMessages()
end
self.ACDNumFrame:SetFrameStrata(Gladdy.db.arenaCountdownFrameStrata)
self.ACDNumFrame:SetFrameLevel(Gladdy.db.arenaCountdownFrameLevel)
self.ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize) if ((floor(self.countdown) ~= floor(self.countdown - elapse)) and (floor(self.countdown - elapse) >= 0)) then
self.ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize) local str = tostring(floor(self.countdown - elapse));
self.ACDNumFrame:SetPoint("CENTER", 0, 128)
self.ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize) if (floor(self.countdown - elapse) == 0) then
self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize) self.ACDNumTens:Hide();
self.ACDNumTens:SetPoint("CENTER", self.ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0) self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
self.ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize) elseif (str_len(str) == 2) then
self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetPoint("CENTER", self.ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
end
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 -- Display has 2 digits
local ones = self.countdown % 10 self.ACDNumOne:Hide();
local tens = (self.countdown / 10) % 10 self.ACDNumTens:Show();
self.ACDNumOne:Hide() self.ACDNumOnes:Show();
self.ACDNumTens:Show()
self.ACDNumOnes:Show()
self.ACDNumTens:SetTexture(self.texturePath .. tens) self.ACDNumTens:SetTexture(self.texturePath .. str_sub(str, 0, 1));
self.ACDNumOnes:SetTexture(self.texturePath .. ones) self.ACDNumOnes:SetTexture(self.texturePath .. str_sub(str, 2, 2));
self.ACDNumFrame:SetScale(0.7) self.ACDNumFrame:SetScale(0.7)
elseif (self.countdown and self.countdown < 10 and self.countdown > -1) then elseif (str_len(str) == 1) then
-- Display has 1 digit -- Display has 1 digit
local path = self.countdown <= 0 and self.faction or self.countdown self.ACDNumOne:Show();
self.ACDNumOne:Show() self.ACDNumOne:SetTexture(self.texturePath .. str_sub(str, 0, 1));
self.ACDNumOne:SetTexture(self.texturePath .. path) self.ACDNumOnes:Hide();
self.ACDNumOnes:Hide() self.ACDNumTens:Hide();
self.ACDNumTens:Hide()
self.ACDNumFrame:SetScale(1.0) self.ACDNumFrame:SetScale(1.0)
else
ACDFrame:HideAll()
if (self.countdown and self.countdown < -1) then
self.ticker:Cancel()
end end
end end
self.countdown = self.countdown and self.countdown - 1 self.countdown = self.countdown - elapse;
else else
ACDFrame:HideAll() self.hidden = true;
self.ACDNumTens:Hide();
self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
end
if (GetTime() > self.endTime) then
self:SetScript("OnUpdate", nil)
end end
end end
function ACDFrame:JOINED_ARENA() function ACDFrame:JOINED_ARENA()
if Gladdy.db.countdown then
self:CreateTicker(nil)
self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
end self:SetScript("OnEvent", ACDFrame.OnEvent)
end self.endTime = GetTime() + 70
self:SetScript("OnUpdate", ACDFrame.OnUpdate)
function ACDFrame:Reset()
if self.ticker and not self.ticker:IsCancelled() then
self.ticker:Cancel()
end
self.countdown = nil
self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
ACDFrame:HideAll()
end end
function ACDFrame:ENEMY_SPOTTED() function ACDFrame:ENEMY_SPOTTED()
if not Gladdy.frame.testing then
ACDFrame:Reset() ACDFrame:Reset()
end
end end
function ACDFrame:UNIT_SPEC() function ACDFrame:UNIT_SPEC()
if not Gladdy.frame.testing then
ACDFrame:Reset() ACDFrame:Reset()
end
end end
function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
for k,v in pairs(self.locale) do for k,v in pairs(self.locale) do
if str_find(msg, v) then if str_find(msg, v) then
if self.countdown and self.countdown == 0 then if k == 0 then
return ACDFrame:Reset()
end else
self.countdown = k self.countdown = k
end end
end end
end
end end
function ACDFrame:TestOnce() function ACDFrame:UpdateFrame()
self:CreateTicker(30) self.ACDNumFrame:SetHeight(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumFrame:SetPoint("CENTER", 0, 128)
self.ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize/2)
self.ACDNumTens:SetPoint("CENTER", self.ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
self.ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize/2)
self.ACDNumOnes:SetPoint("CENTER", self.ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0)
self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize)
self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize/2)
self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0)
end
function ACDFrame:Test()
self.countdown = 30
self:JOINED_ARENA()
end
function ACDFrame:Reset()
self.endTime = 0
self.countdown = 0
self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnUpdate", nil)
self.hidden = true;
self.ACDNumTens:Hide();
self.ACDNumOnes:Hide();
self.ACDNumOne:Hide();
end end
function ACDFrame:GetOptions() function ACDFrame:GetOptions()
@ -197,30 +175,6 @@ function ACDFrame:GetOptions()
max = 512, max = 512,
step = 16, step = 16,
width = "full", width = "full",
disabled = function() return not Gladdy.db.countdown end,
}),
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 5,
},
arenaCountdownFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 6,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
disabled = function() return not Gladdy.db.countdown end,
}),
arenaCountdownFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 7,
width = "full",
disabled = function() return not Gladdy.db.countdown end,
}), }),
} }
end end

File diff suppressed because it is too large Load Diff

View File

@ -20,12 +20,10 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsAlpha = 1, buffsAlpha = 1,
buffsIconSize = 30, buffsIconSize = 30,
buffsWidthFactor = 1, buffsWidthFactor = 1,
buffsIconZoomed = false,
buffsIconPadding = 1, buffsIconPadding = 1,
buffsBuffsAlpha = 1, buffsBuffsAlpha = 1,
buffsBuffsIconSize = 30, buffsBuffsIconSize = 30,
buffsBuffsWidthFactor = 1, buffsBuffsWidthFactor = 1,
buffsBuffsIconZoomed = false,
buffsBuffsIconPadding = 1, buffsBuffsIconPadding = 1,
buffsDisableCircle = false, buffsDisableCircle = false,
buffsCooldownAlpha = 1, buffsCooldownAlpha = 1,
@ -33,9 +31,11 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsFontScale = 1, buffsFontScale = 1,
buffsFontColor = {r = 1, g = 1, b = 0, a = 1}, buffsFontColor = {r = 1, g = 1, b = 0, a = 1},
buffsDynamicColor = true, buffsDynamicColor = true,
buffsCooldownPos = "TOP",
buffsCooldownGrowDirection = "RIGHT", buffsCooldownGrowDirection = "RIGHT",
buffsXOffset = 0, buffsXOffset = 0,
buffsYOffset = 0, buffsYOffset = 0,
buffsBuffsCooldownPos = "BOTTOM",
buffsBuffsCooldownGrowDirection = "RIGHT", buffsBuffsCooldownGrowDirection = "RIGHT",
buffsBuffsXOffset = 0, buffsBuffsXOffset = 0,
buffsBuffsYOffset = 0, buffsBuffsYOffset = 0,
@ -44,32 +44,25 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsBorderColorsEnabled = true, buffsBorderColorsEnabled = true,
trackedDebuffs = defaultTrackedDebuffs, trackedDebuffs = defaultTrackedDebuffs,
trackedBuffs = defaultTrackedBuffs, trackedBuffs = defaultTrackedBuffs,
buffsBorderColorEnrage = Gladdy:GetDispelTypeColors()["enrage"], buffsBorderColorCurse = Gladdy:GetAuraTypeColor()["curse"],
buffsBorderColorCurse = Gladdy:GetDispelTypeColors()["curse"], buffsBorderColorMagic = Gladdy:GetAuraTypeColor()["magic"],
buffsBorderColorMagic = Gladdy:GetDispelTypeColors()["magic"], buffsBorderColorPoison = Gladdy:GetAuraTypeColor()["poison"],
buffsBorderColorPoison = Gladdy:GetDispelTypeColors()["poison"], buffsBorderColorPhysical = Gladdy:GetAuraTypeColor()["none"],
buffsBorderColorPhysical = Gladdy:GetDispelTypeColors()["none"], buffsBorderColorImmune = Gladdy:GetAuraTypeColor()["immune"],
buffsBorderColorImmune = Gladdy:GetDispelTypeColors()["immune"], buffsBorderColorDisease = Gladdy:GetAuraTypeColor()["disease"],
buffsBorderColorDisease = Gladdy:GetDispelTypeColors()["disease"], buffsBorderColorForm = Gladdy:GetAuraTypeColor()["form"],
buffsBorderColorForm = Gladdy:GetDispelTypeColors()["form"], buffsBorderColorAura = Gladdy:GetAuraTypeColor()["aura"]
buffsBorderColorAura = Gladdy:GetDispelTypeColors()["aura"],
buffFrameStrata = "MEDIUM",
buffsFrameLevel = 9,
}) })
local dispelTypeToOptionValueTable local spellSchoolToOptionValueTable
local function dispelTypeToOptionValue(dispelType) local function spellSchoolToOptionValue(spellSchool)
if Gladdy.db.buffsBorderColorsEnabled then if Gladdy.db.buffsBorderColorsEnabled and spellSchool then
dispelType = dispelType and lower(dispelType) or "physical" return spellSchoolToOptionValueTable[spellSchool].r,
if not dispelTypeToOptionValueTable[dispelType] then spellSchoolToOptionValueTable[spellSchool].g,
dispelType = "physical" spellSchoolToOptionValueTable[spellSchool].b,
end spellSchoolToOptionValueTable[spellSchool].a
return dispelTypeToOptionValueTable[dispelType].r,
dispelTypeToOptionValueTable[dispelType].g,
dispelTypeToOptionValueTable[dispelType].b,
dispelTypeToOptionValueTable[dispelType].a
else else
return Gladdy:SetColor(Gladdy.db.buffsBorderColor) return Gladdy.db.buffsBorderColor.r,Gladdy.db.buffsBorderColor.g,Gladdy.db.buffsBorderColor.b,Gladdy.db.buffsBorderColor.a
end end
end end
@ -83,28 +76,21 @@ function BuffsDebuffs:Initialize()
self.icons = {} self.icons = {}
self.trackedCC = {} self.trackedCC = {}
self.framePool = {} self.framePool = {}
if Gladdy.db.buffsEnabled then self:RegisterMessage("JOINED_ARENA")
self:RegisterMessages( self:RegisterMessage("UNIT_DESTROYED")
"JOINED_ARENA", self:RegisterMessage("UNIT_DEATH")
"UNIT_DESTROYED", self:RegisterMessage("AURA_FADE")
"UNIT_DEATH", self:RegisterMessage("AURA_GAIN")
"AURA_FADE", self:RegisterMessage("AURA_GAIN_LIMIT")
"AURA_GAIN",
"AURA_GAIN_LIMIT")
self:SetScript("OnEvent", BuffsDebuffs.OnEvent) self:SetScript("OnEvent", BuffsDebuffs.OnEvent)
end spellSchoolToOptionValueTable = {
dispelTypeToOptionValueTable = {
none = Gladdy.db.buffsBorderColorPhysical,
magic = Gladdy.db.buffsBorderColorMagic,
curse = Gladdy.db.buffsBorderColorCurse, curse = Gladdy.db.buffsBorderColorCurse,
disease = Gladdy.db.buffsBorderColorDisease, magic = Gladdy.db.buffsBorderColorMagic,
poison = Gladdy.db.buffsBorderColorPoison, poison = Gladdy.db.buffsBorderColorPoison,
stealth = Gladdy.db.buffsBorderColorPhysical,
invisibility = Gladdy.db.buffsBorderColorPhysical,
physical = Gladdy.db.buffsBorderColorPhysical, physical = Gladdy.db.buffsBorderColorPhysical,
immune = Gladdy.db.buffsBorderColorImmune, immune = Gladdy.db.buffsBorderColorImmune,
disease = Gladdy.db.buffsBorderColorDisease,
form = Gladdy.db.buffsBorderColorForm, form = Gladdy.db.buffsBorderColorForm,
enrage = Gladdy.db.buffsBorderColorEnrage,
} }
end end
@ -148,19 +134,18 @@ end
function BuffsDebuffs:Test(unit) function BuffsDebuffs:Test(unit)
if Gladdy.db.buffsEnabled then if Gladdy.db.buffsEnabled then
local dispelTypes = { "physical", "magic", "curse", "poison", "disease", "immune", "enrage"} local spellSchools = { "physical", "magic", "curse", "poison", "disease", "immune" }
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF) BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF)
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF) BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF)
--BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 1243, select(1, GetSpellInfo(1243)), select(3, GetSpellInfo(1243)), 10, GetTime() + 10, 1, "physical")
--self:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 31117, select(1, GetSpellInfo(31117)), select(3, GetSpellInfo(31117)), 10, GetTime() + 10, 1, "physical")
local i = 1 local i = 1
for spellID, enabled in pairs(Gladdy.db.trackedDebuffs) do for spellID, enabled in pairs(Gladdy.db.trackedDebuffs) do
if i > 4 then if i > 4 then
break break
end end
if enabled then if enabled then
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_DEBUFF, 15, 15, random(1,5), dispelTypes[random(1,#dispelTypes)], select(3, GetSpellInfo(spellID)), i) BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_DEBUFF, 15, 15, random(1,5), spellSchools[random(1,6)], select(3, GetSpellInfo(spellID)), i)
i = i + 1 i = i + 1
end end
end end
@ -170,7 +155,7 @@ function BuffsDebuffs:Test(unit)
break break
end end
if enabled then if enabled then
BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_BUFF, 15, 15, random(1,5), dispelTypes[random(1,#dispelTypes)], select(3, GetSpellInfo(spellID)), i) BuffsDebuffs:AddOrRefreshAura(unit, spellID, AURA_TYPE_BUFF, 15, 15, random(1,5), spellSchools[random(1,6)], select(3, GetSpellInfo(spellID)), i)
i = i + 1 i = i + 1
end end
end end
@ -207,29 +192,18 @@ function BuffsDebuffs:AURA_GAIN_LIMIT(unit, auraType, limit)
end end
end end
function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, duration, expirationTime, count, dispelType) function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, duration, expirationTime, count, spellSchool)
if (not self.frames[unit] or not Gladdy.db.buffsEnabled) then if (not self.frames[unit] or not Gladdy.db.buffsEnabled) then
return return
end end
local auraFrame = self.frames[unit] local auraFrame = self.frames[unit]
spellName = LibClassAuras.GetAltName(spellID) or spellName
local aura = Gladdy:GetImportantAuras()[spellName] and Gladdy.db.auraListDefault[tostring(Gladdy:GetImportantAuras()[spellName].spellID)].enabled local aura = Gladdy:GetImportantAuras()[spellName] and Gladdy.db.auraListDefault[tostring(Gladdy:GetImportantAuras()[spellName].spellID)].enabled
if aura and Gladdy.db.buffsShowAuraDebuffs then if aura and Gladdy.db.buffsShowAuraDebuffs then
aura = false aura = false
end end
local auraNames = LibClassAuras.GetSpellNameToId(auraType) local auraNames = LibClassAuras.GetSpellNameToId(auraType)
local spellId local spellId = auraNames[spellName] and auraNames[spellName].id[1]
local isTracked = false if not aura and spellID and spellId and expirationTime and (Gladdy.db.trackedBuffs[tostring(spellId)] or Gladdy.db.trackedDebuffs[tostring(spellId)]) then
if auraNames[spellName] then
for _, spellInfo in ipairs(auraNames[spellName]) do
spellId = spellInfo.id[1]
if (Gladdy.db.trackedBuffs[tostring(spellId)] or Gladdy.db.trackedDebuffs[tostring(spellId)]) then
isTracked = true
break
end
end
end
if not aura and spellID and expirationTime and isTracked then
local index local index
if auraType == AURA_TYPE_DEBUFF then if auraType == AURA_TYPE_DEBUFF then
auraFrame.numDebuffs = auraFrame.numDebuffs + 1 auraFrame.numDebuffs = auraFrame.numDebuffs + 1
@ -238,7 +212,7 @@ function BuffsDebuffs:AURA_GAIN(unit, auraType, spellID, spellName, texture, dur
auraFrame.numBuffs = auraFrame.numBuffs + 1 auraFrame.numBuffs = auraFrame.numBuffs + 1
index = auraFrame.numBuffs index = auraFrame.numBuffs
end end
BuffsDebuffs:AddOrRefreshAura(unit,spellID, auraType, duration, expirationTime - GetTime(), count, dispelType, texture, index) BuffsDebuffs:AddOrRefreshAura(unit,spellID, auraType, duration, expirationTime - GetTime(), count, spellSchool and lower(spellSchool) or "physical", texture, index)
end end
end end
@ -247,19 +221,16 @@ end
--------------------------- ---------------------------
function BuffsDebuffs:CreateFrame(unit) function BuffsDebuffs:CreateFrame(unit)
local verticalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
local debuffFrame = CreateFrame("Frame", "GladdyDebuffs" .. unit, Gladdy.buttons[unit]) local debuffFrame = CreateFrame("Frame", "GladdyDebuffs" .. unit, Gladdy.buttons[unit])
debuffFrame:SetFrameStrata(Gladdy.db.buffFrameStrata)
debuffFrame:SetFrameLevel(Gladdy.db.buffsFrameLevel)
debuffFrame:SetMovable(true)
debuffFrame:SetHeight(Gladdy.db.buffsIconSize) debuffFrame:SetHeight(Gladdy.db.buffsIconSize)
debuffFrame:SetWidth(1) debuffFrame:SetWidth(1)
debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPLEFT", 0, verticalMargin)
debuffFrame.unit = unit debuffFrame.unit = unit
local buffFrame = CreateFrame("Frame", "GladdyBuffs" .. unit, Gladdy.buttons[unit]) local buffFrame = CreateFrame("Frame", "GladdyBuffs" .. unit, Gladdy.buttons[unit])
buffFrame:SetFrameStrata(Gladdy.db.buffFrameStrata)
buffFrame:SetFrameLevel(Gladdy.db.buffsFrameLevel)
buffFrame:SetMovable(true)
buffFrame:SetHeight(Gladdy.db.buffsIconSize) buffFrame:SetHeight(Gladdy.db.buffsIconSize)
buffFrame:SetWidth(1) buffFrame:SetWidth(1)
buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPLEFT", 0, verticalMargin)
buffFrame.unit = unit buffFrame.unit = unit
self.frames[unit] = {} self.frames[unit] = {}
self.frames[unit].buffFrame = buffFrame self.frames[unit].buffFrame = buffFrame
@ -291,100 +262,164 @@ local function styleIcon(aura, auraType)
aura.cooldowncircle:SetAlpha(Gladdy.db.buffsCooldownAlpha) aura.cooldowncircle:SetAlpha(Gladdy.db.buffsCooldownAlpha)
end 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("")
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("")
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:SetTexture(Gladdy.db.buffsBorderStyle)
aura.border:SetVertexColor(dispelTypeToOptionValue(aura.dispelType)) aura.border:SetVertexColor(spellSchoolToOptionValue(aura.spellSchool))
aura.cooldown:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.cooldown:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.buffsFont), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE")
aura.cooldown:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a) aura.cooldown:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a)
aura.stacks:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/3 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.stacks:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.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) aura.stacks:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a)
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 end
function BuffsDebuffs:UpdateFrame(unit) function BuffsDebuffs:UpdateFrame(unit)
--DEBUFFS
self.frames[unit].debuffFrame:SetHeight(Gladdy.db.buffsIconSize) self.frames[unit].debuffFrame:SetHeight(Gladdy.db.buffsIconSize)
Gladdy:SetPosition(self.frames[unit].debuffFrame, unit, "buffsXOffset", "buffsYOffset", BuffsDebuffs:LegacySetPositionDebuffs(unit), BuffsDebuffs) self.frames[unit].debuffFrame:ClearAllPoints()
if (unit == "arena1") then
Gladdy:CreateMover(self.frames[unit].debuffFrame, "buffsXOffset", "buffsYOffset", L["Debuffs"], --DEBUFFS
{"TOPRIGHT", "TOPRIGHT"}, local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
Gladdy.db.buffsIconSize * Gladdy.db.buffsWidthFactor, Gladdy.db.buffsIconSize, local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
0, 0, "buffsEnabled") local verticalMargin = -(Gladdy.db.powerBarHeight)/2
if Gladdy.db.buffsCooldownPos == "TOP" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin)
else
self.frames[unit].debuffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin)
end
elseif Gladdy.db.buffsCooldownPos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].debuffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
end
elseif Gladdy.db.buffsCooldownPos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
end
elseif Gladdy.db.buffsCooldownPos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset)
end
end end
--BUFFS --BUFFS
self.frames[unit].buffFrame:SetHeight(Gladdy.db.buffsBuffsIconSize) self.frames[unit].buffFrame:SetHeight(Gladdy.db.buffsBuffsIconSize)
Gladdy:SetPosition(self.frames[unit].buffFrame, unit, "buffsBuffsXOffset", "buffsBuffsYOffset", BuffsDebuffs:LegacySetPositionBuffs(unit), BuffsDebuffs) self.frames[unit].buffFrame:ClearAllPoints()
if (unit == "arena1") then horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
Gladdy:CreateMover(self.frames[unit].buffFrame, "buffsBuffsXOffset", "buffsBuffsYOffset", L["Buffs"], verticalMargin = -(Gladdy.db.powerBarHeight)/2
{"TOPRIGHT", "TOPRIGHT"}, if Gladdy.db.buffsBuffsCooldownPos == "TOP" then
Gladdy.db.buffsBuffsIconSize * Gladdy.db.buffsBuffsWidthFactor, Gladdy.db.buffsBuffsIconSize, verticalMargin = horizontalMargin + 1
0, 0, "buffsEnabled") if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
else
self.frames[unit].buffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
end
elseif Gladdy.db.buffsBuffsCooldownPos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].buffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
end
elseif Gladdy.db.buffsBuffsCooldownPos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "LEFT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "LEFT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
end end
local testBuffsAgain, testDebuffsAgain elseif Gladdy.db.buffsBuffsCooldownPos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "RIGHT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset)
end
end
for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do
testBuffsAgain = styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF) styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF)
end end
for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do
testDebuffsAgain = styleIcon(self.frames[unit].auras[AURA_TYPE_DEBUFF][i], AURA_TYPE_DEBUFF) styleIcon(self.frames[unit].auras[AURA_TYPE_DEBUFF][i], AURA_TYPE_DEBUFF)
end end
for i=1, #self.framePool do for i=1, #self.framePool do
styleIcon(self.framePool[i]) styleIcon(self.framePool[i])
end end
self:UpdateAurasOnUnit(unit) self:UpdateAurasOnUnit(unit)
if Gladdy.frame.testing and (testBuffsAgain or testDebuffsAgain) then
self:ResetUnit(unit)
self:Test(unit)
end
end end
--------------------------- ---------------------------
@ -394,8 +429,13 @@ end
function BuffsDebuffs:UpdateAurasOnUnit(unit) function BuffsDebuffs:UpdateAurasOnUnit(unit)
for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do
if i == 1 then if i == 1 then
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("RIGHT", self.frames[unit].buffFrame, "LEFT") self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("RIGHT", self.frames[unit].buffFrame, "LEFT")
else
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_BUFF][i]:SetPoint("LEFT", self.frames[unit].buffFrame, "RIGHT")
end
else else
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_BUFF][i]:ClearAllPoints()
@ -408,8 +448,13 @@ function BuffsDebuffs:UpdateAurasOnUnit(unit)
end end
for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do for i=1, #self.frames[unit].auras[AURA_TYPE_DEBUFF] do
if i == 1 then if i == 1 then
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("RIGHT", self.frames[unit].debuffFrame, "LEFT") self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("RIGHT", self.frames[unit].debuffFrame, "LEFT")
else
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:SetPoint("LEFT", self.frames[unit].debuffFrame, "RIGHT")
end
else else
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints() self.frames[unit].auras[AURA_TYPE_DEBUFF][i]:ClearAllPoints()
@ -429,15 +474,15 @@ local function iconTimer(auraFrame, elapsed)
auraFrame.timeLeft = timeLeftMilliSec auraFrame.timeLeft = timeLeftMilliSec
if Gladdy.db.buffsDynamicColor then if Gladdy.db.buffsDynamicColor then
if timeLeftSec >= 60 then if timeLeftSec >= 60 then
auraFrame.cooldown:SetTextColor(0.7, 1, 0, Gladdy.db.buffsFontColor.a) auraFrame.cooldown:SetTextColor(0.7, 1, 0)
elseif timeLeftSec < 60 and timeLeftSec >= 11 then elseif timeLeftSec < 60 and timeLeftSec >= 11 then
auraFrame.cooldown:SetTextColor(0.7, 1, 0, Gladdy.db.buffsFontColor.a) auraFrame.cooldown:SetTextColor(0.7, 1, 0)
elseif timeLeftSec <= 10 and timeLeftSec >= 5 then elseif timeLeftSec <= 10 and timeLeftSec >= 5 then
auraFrame.cooldown:SetTextColor(1, 0.7, 0, Gladdy.db.buffsFontColor.a) auraFrame.cooldown:SetTextColor(1, 0.7, 0)
elseif timeLeftSec <= 4 and timeLeftSec >= 3 then elseif timeLeftSec <= 4 and timeLeftSec >= 3 then
auraFrame.cooldown:SetTextColor(1, 0, 0, Gladdy.db.buffsFontColor.a) auraFrame.cooldown:SetTextColor(1, 0, 0)
elseif timeLeftMilliSec <= 3 and timeLeftMilliSec > 0 then elseif timeLeftMilliSec <= 3 and timeLeftMilliSec > 0 then
auraFrame.cooldown:SetTextColor(1, 0, 0, Gladdy.db.buffsFontColor.a) auraFrame.cooldown:SetTextColor(1, 0, 0)
end end
end end
if timeLeftMilliSec < 0 then if timeLeftMilliSec < 0 then
@ -449,29 +494,26 @@ local function iconTimer(auraFrame, elapsed)
end end
end end
function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index) function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
local aura local aura
if not self.frames[unit].auras[auraType][index] then if not self.frames[unit].auras[auraType][index] then
if #self.framePool > 0 then if #self.framePool > 0 then
aura = tremove(self.framePool, #self.framePool) aura = tremove(self.framePool, #self.framePool)
styleIcon(aura)
else else
aura = CreateFrame("Frame") aura = CreateFrame("Frame")
aura:EnableMouse(false) aura:EnableMouse(false)
aura:SetFrameStrata(Gladdy.db.buffFrameStrata) aura:SetFrameLevel(3)
aura:SetFrameLevel(Gladdy.db.buffsFrameLevel)
aura.texture = aura:CreateTexture(nil, "BACKGROUND") aura.texture = aura:CreateTexture(nil, "BACKGROUND")
aura.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") aura.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
aura.texture.masked = true
aura.texture:SetAllPoints(aura) aura.texture:SetAllPoints(aura)
aura.cooldowncircle = CreateFrame("Cooldown", nil, aura, "CooldownFrameTemplate") aura.cooldowncircle = CreateFrame("Cooldown", nil, aura, "CooldownFrameTemplate")
aura.cooldowncircle:SetFrameLevel(Gladdy.db.buffsFrameLevel + 1) aura.cooldowncircle:SetFrameLevel(4)
aura.cooldowncircle.noCooldownCount = true -- disable OmniCC aura.cooldowncircle.noCooldownCount = true -- disable OmniCC
aura.cooldowncircle:SetAllPoints(aura) aura.cooldowncircle:SetAllPoints(aura)
aura.cooldowncircle:SetReverse(true) aura.cooldowncircle:SetReverse(true)
aura.cooldowncircle:SetHideCountdownNumbers(true) aura.cooldowncircle:SetHideCountdownNumbers(true)
aura.overlay = CreateFrame("Frame", nil, aura) aura.overlay = CreateFrame("Frame", nil, aura)
aura.overlay:SetFrameLevel(Gladdy.db.buffsFrameLevel + 2) aura.overlay:SetFrameLevel(5)
aura.overlay:SetAllPoints(aura) aura.overlay:SetAllPoints(aura)
aura.border = aura.overlay:CreateTexture(nil, "OVERLAY") aura.border = aura.overlay:CreateTexture(nil, "OVERLAY")
aura.border:SetAllPoints(aura) aura.border:SetAllPoints(aura)
@ -504,12 +546,12 @@ function BuffsDebuffs:AddAura(unit, spellID, auraType, duration, timeLeft, stack
aura.spellID = spellID aura.spellID = spellID
aura.type = auraType aura.type = auraType
aura.unit = unit aura.unit = unit
aura.dispelType = dispelType aura.spellSchool = spellSchool
aura.border:SetVertexColor(dispelTypeToOptionValue(dispelType)) aura.border:SetVertexColor(spellSchoolToOptionValue(spellSchool))
aura:Show() aura:Show()
end end
function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index) function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
if self.frames[unit].auras[auraType][index] and self.frames[unit].auras[auraType][index].spellID == spellID then -- refresh if self.frames[unit].auras[auraType][index] and self.frames[unit].auras[auraType][index].spellID == spellID then -- refresh
if duration == 0 then if duration == 0 then
self.frames[unit].auras[auraType][index].endtime = "undefined" self.frames[unit].auras[auraType][index].endtime = "undefined"
@ -525,7 +567,7 @@ function BuffsDebuffs:AddOrRefreshAura(unit, spellID, auraType, duration, timeLe
return return
end end
--add --add
self:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, dispelType, icon, index) self:AddAura(unit, spellID, auraType, duration, timeLeft, stacks, spellSchool, icon, index)
self:UpdateAurasOnUnit(unit) self:UpdateAurasOnUnit(unit)
end end
@ -533,6 +575,36 @@ end
-- OPTIONS -- OPTIONS
------------ ------------
local function option(params)
local defaults = {
get = function(info)
local key = info.arg or info[#info]
return Gladdy.dbi.profile[key]
end,
set = function(info, value)
local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value
if Gladdy.db.buffsCooldownPos == "LEFT" then
Gladdy.db.buffsCooldownGrowDirection = "LEFT"
elseif Gladdy.db.buffsCooldownPos == "RIGHT" then
Gladdy.db.buffsCooldownGrowDirection = "RIGHT"
end
if Gladdy.db.buffsBuffsCooldownPos == "LEFT" then
Gladdy.db.buffsBuffsCooldownGrowDirection = "LEFT"
elseif Gladdy.db.buffsBuffsCooldownPos == "RIGHT" then
Gladdy.db.buffsBuffsCooldownGrowDirection = "RIGHT"
end
Gladdy:UpdateFrame()
end,
}
for k, v in pairs(params) do
defaults[k] = v
end
return defaults
end
function BuffsDebuffs:GetOptions() function BuffsDebuffs:GetOptions()
return { return {
headerBuffs = { headerBuffs = {
@ -551,14 +623,12 @@ function BuffsDebuffs:GetOptions()
name = L["Show CC"], name = L["Show CC"],
desc = L["Shows all debuffs, which are displayed on the ClassIcon as well"], desc = L["Shows all debuffs, which are displayed on the ClassIcon as well"],
order = 4, order = 4,
disabled = function() return not Gladdy.db.buffsEnabled end,
}), }),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 5, order = 5,
disabled = function() return not Gladdy.db.buffsEnabled end,
args = { args = {
buffs = { buffs = {
type = "group", type = "group",
@ -567,21 +637,14 @@ function BuffsDebuffs:GetOptions()
args = { args = {
size = { size = {
type = "group", type = "group",
name = L["Icon"], name = L["Size & Padding"],
order = 1, order = 1,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Size & Padding"],
order = 1, order = 5,
}, },
buffsBuffsIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
buffsBuffsIconSize = Gladdy:option({ buffsBuffsIconSize = Gladdy:option({
type = "range", type = "range",
name = L["Icon Size"], name = L["Icon Size"],
@ -624,6 +687,18 @@ function BuffsDebuffs:GetOptions()
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
buffsBuffsCooldownPos = option({
type = "select",
name = L["Aura Position"],
desc = L["Position of the aura icons"],
order = 21,
values = {
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
buffsBuffsCooldownGrowDirection = Gladdy:option({ buffsBuffsCooldownGrowDirection = Gladdy:option({
type = "select", type = "select",
name = L["Grow Direction"], name = L["Grow Direction"],
@ -684,21 +759,14 @@ function BuffsDebuffs:GetOptions()
args = { args = {
size = { size = {
type = "group", type = "group",
name = L["Icon"], name = L["Size & Padding"],
order = 1, order = 1,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Size & Padding"],
order = 1, order = 5,
}, },
buffsIconZoomed = Gladdy:option({
type = "toggle",
name = L["Zoomed Icon"],
desc = L["Zoomes the icon to remove borders"],
order = 2,
width = "full",
}),
buffsIconSize = Gladdy:option({ buffsIconSize = Gladdy:option({
type = "range", type = "range",
name = L["Icon Size"], name = L["Icon Size"],
@ -741,6 +809,18 @@ function BuffsDebuffs:GetOptions()
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
buffsCooldownPos = option({
type = "select",
name = L["Aura Position"],
desc = L["Position of the aura icons"],
order = 21,
values = {
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
buffsCooldownGrowDirection = Gladdy:option({ buffsCooldownGrowDirection = Gladdy:option({
type = "select", type = "select",
name = L["Grow Direction"], name = L["Grow Direction"],
@ -819,27 +899,11 @@ function BuffsDebuffs:GetOptions()
order = 10, order = 10,
width = "full", width = "full",
}), }),
buffsCooldownNumberAlpha = {
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 11,
width = "full",
set = function(info, value)
Gladdy.db.buffsFontColor.a = value
Gladdy:UpdateFrame()
end,
get = function(info)
return Gladdy.db.buffsFontColor.a
end,
},
}, },
}, },
font = { font = {
type = "group", type = "group",
name = L["Font"], name = "Font",
order = 4, order = 4,
args = { args = {
header = { header = {
@ -882,7 +946,7 @@ function BuffsDebuffs:GetOptions()
}, },
border = { border = {
type = "group", type = "group",
name = L["Border"], name = "Border",
order = 5, order = 5,
args = { args = {
header = { header = {
@ -964,51 +1028,14 @@ function BuffsDebuffs:GetOptions()
order = 49, order = 49,
hasAlpha = true, hasAlpha = true,
}), }),
buffsBorderColorEnrage = Gladdy:colorOption({
type = "color",
name = L["Enrage"],
desc = L["Color of the border"],
order = 50,
hasAlpha = true,
}),
},
},
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
buffFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
buffsFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
}, },
}, },
}, },
}, },
debuffList = { debuffList = {
name = L["Debuff Lists"], name = "Debuff Lists",
type = "group", type = "group",
order = 11, order = 11,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree", childGroups = "tree",
args = select(1, Gladdy:GetAuras(AURA_TYPE_DEBUFF)), args = select(1, Gladdy:GetAuras(AURA_TYPE_DEBUFF)),
set = function(info, state) set = function(info, state)
@ -1021,10 +1048,9 @@ function BuffsDebuffs:GetOptions()
end, end,
}, },
buffList = { buffList = {
name = L["Buff Lists"], name = "Buff Lists",
type = "group", type = "group",
order = 12, order = 12,
disabled = function() return not Gladdy.db.buffsEnabled end,
childGroups = "tree", childGroups = "tree",
args = select(1, Gladdy:GetAuras(AURA_TYPE_BUFF)), args = select(1, Gladdy:GetAuras(AURA_TYPE_BUFF)),
set = function(info, state) set = function(info, state)
@ -1039,168 +1065,3 @@ function BuffsDebuffs:GetOptions()
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function BuffsDebuffs:LegacySetPositionDebuffs(unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit].debuffFrame:ClearAllPoints()
local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
local verticalMargin = -(Gladdy.db.powerBarHeight)/2
local offset = 0
if (Gladdy.db.buffsCooldownGrowDirection == "RIGHT") then
offset = Gladdy.db.buffsIconSize * Gladdy.db.buffsWidthFactor
end
local pos = Gladdy.db.buffsCooldownPos
if pos == "TOP" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset + verticalMargin)
else
self.frames[unit].debuffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset + verticalMargin)
end
elseif pos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
self.frames[unit].debuffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].debuffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset -verticalMargin - powerBarHeight)
end
elseif pos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
end
elseif pos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
else
self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsYOffset)
end
end
return Gladdy.db.newLayout
end
function BuffsDebuffs:LegacySetPositionBuffs(unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit].buffFrame:ClearAllPoints()
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
local verticalMargin = -(Gladdy.db.powerBarHeight)/2
local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local offset = 0
if (Gladdy.db.buffsBuffsCooldownGrowDirection == "RIGHT") then
offset = Gladdy.db.buffsBuffsIconSize * Gladdy.db.buffsBuffsWidthFactor
end
local pos = Gladdy.db.buffsBuffsCooldownPos
if pos == "TOP" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "TOP" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("BOTTOMLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
else
self.frames[unit].buffFrame:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", Gladdy.db.buffsXOffset + offset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
end
elseif pos == "BOTTOM" then
verticalMargin = horizontalMargin + 1
if Gladdy.db.cooldownYPos == "BOTTOM" and Gladdy.db.cooldown then
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
self.frames[unit].buffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "BOTTOMRIGHT", Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
else
self.frames[unit].buffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "BOTTOMLEFT", Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset -verticalMargin - powerBarHeight)
end
elseif pos == "LEFT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "LEFT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "LEFT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "LEFT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
end
elseif pos == "RIGHT" then
horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
end
elseif (Gladdy.db.classIconPos == "RIGHT") then
horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding
if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then
horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding
end
end
if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then
verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2
end
if (Gladdy.db.castBarPos == "RIGHT") then
verticalMargin = verticalMargin -
(((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize
or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2)
end
if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then
verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2)
end
--self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin)
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) - 1 + Gladdy.db.padding
if anchor == Gladdy.buttons[unit].healthBar then
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
else
self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset + offset, Gladdy.db.buffsBuffsYOffset)
end
end
return Gladdy.db.newLayout
end

View File

@ -23,10 +23,8 @@ local Castbar = Gladdy:NewModule("Cast Bar", 70, {
castBarHeight = 20, castBarHeight = 20,
castBarWidth = 160, castBarWidth = 160,
castBarIconSize = 22, castBarIconSize = 22,
castBarIconZoomed = false,
castBarBorderSize = 8, castBarBorderSize = 8,
castBarFontSize = 12, castBarFontSize = 12,
castBarFontOutline = false,
castBarTexture = "Smooth", castBarTexture = "Smooth",
castBarIconStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", castBarIconStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
castBarBorderStyle = "Gladdy Tooltip round", castBarBorderStyle = "Gladdy Tooltip round",
@ -35,8 +33,8 @@ local Castbar = Gladdy:NewModule("Cast Bar", 70, {
castBarIconColor = { r = 0, g = 0, b = 0, a = 1 }, castBarIconColor = { r = 0, g = 0, b = 0, a = 1 },
castBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, castBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
castBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, castBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
castBarIconEnabled = true,
castBarGuesses = true, castBarGuesses = true,
castBarPos = "LEFT",
castBarXOffset = 0, castBarXOffset = 0,
castBarYOffset = 0, castBarYOffset = 0,
castBarIconPos = "LEFT", castBarIconPos = "LEFT",
@ -44,16 +42,12 @@ local Castbar = Gladdy:NewModule("Cast Bar", 70, {
castBarTimerFormat = "LEFT", castBarTimerFormat = "LEFT",
castBarSparkEnabled = true, castBarSparkEnabled = true,
castBarSparkColor = { r = 1, g = 1, b = 1, a = 1 }, castBarSparkColor = { r = 1, g = 1, b = 1, a = 1 },
castBarFrameStrata = "MEDIUM",
castBarFrameLevel = 5,
}) })
function Castbar:Initialize() function Castbar:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.castBarEnabled then
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
end
end end
--------------------------- ---------------------------
@ -63,28 +57,20 @@ end
--------------------------- ---------------------------
function Castbar:CreateFrame(unit) function Castbar:CreateFrame(unit)
local castBar = CreateFrame("Frame", nil, Gladdy.buttons[unit]) local castBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
castBar:EnableMouse(false) castBar:EnableMouse(false)
castBar:SetMovable(true)
castBar.unit = unit castBar.unit = unit
castBar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.backdrop = CreateFrame("Frame", nil, castBar, BackdropTemplateMixin and "BackdropTemplate") castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle),
castBar.backdrop:SetAllPoints(castBar)
castBar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"),
edgeSize = Gladdy.db.castBarBorderSize }) edgeSize = Gladdy.db.castBarBorderSize })
castBar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.castBarBorderColor)) castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a)
castBar.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata) castBar:SetFrameLevel(1)
castBar.backdrop:SetFrameLevel(Gladdy.db.castBarFrameLevel - 1)
castBar.bar = CreateFrame("StatusBar", nil, castBar) castBar.bar = CreateFrame("StatusBar", nil, castBar)
castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture))
castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor)) castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a)
castBar.bar:SetMinMaxValues(0, 100) castBar.bar:SetMinMaxValues(0, 100)
castBar.bar:SetFrameLevel(0) castBar.bar:SetFrameLevel(0)
castBar.bar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.bar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.spark = castBar:CreateTexture(nil, "OVERLAY") castBar.spark = castBar:CreateTexture(nil, "OVERLAY")
castBar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark") castBar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
@ -95,27 +81,18 @@ function Castbar:CreateFrame(unit)
castBar.bg = castBar.bar:CreateTexture(nil, "BACKGROUND") castBar.bg = castBar.bar:CreateTexture(nil, "BACKGROUND")
castBar.bg:SetAlpha(1) castBar.bg:SetAlpha(1)
castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture))
castBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarBgColor)) castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a)
castBar.bg:SetAllPoints(castBar.bar) castBar.bg:SetAllPoints(castBar.bar)
castBar.icon = CreateFrame("Frame", nil, castBar) castBar.icon = CreateFrame("Frame", nil, castBar)
castBar.icon:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.icon:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.icon.texture = castBar.icon:CreateTexture(nil, "BACKGROUND") castBar.icon.texture = castBar.icon:CreateTexture(nil, "BACKGROUND")
castBar.icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") castBar.icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
castBar.icon.texture:SetAllPoints(castBar.icon) castBar.icon.texture:SetAllPoints(castBar.icon)
castBar.icon.texture.masked = true
castBar.icon.texture.overlay = castBar.icon:CreateTexture(nil, "BORDER") castBar.icon.texture.overlay = castBar.icon:CreateTexture(nil, "BORDER")
castBar.icon.texture.overlay:SetAllPoints(castBar.icon.texture) castBar.icon.texture.overlay:SetAllPoints(castBar.icon.texture)
castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle) 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() castBar.icon:ClearAllPoints()
if (Gladdy.db.castBarIconPos == "LEFT") then if (Gladdy.db.castBarIconPos == "LEFT") then
castBar.icon:SetPoint("RIGHT", castBar, "LEFT", -3, 0) -- Icon of castbar castBar.icon:SetPoint("RIGHT", castBar, "LEFT", -3, 0) -- Icon of castbar
@ -123,17 +100,17 @@ function Castbar:CreateFrame(unit)
castBar.icon:SetPoint("LEFT", castBar, "RIGHT", 3, 0) -- Icon of castbar castBar.icon:SetPoint("LEFT", castBar, "RIGHT", 3, 0) -- Icon of castbar
end end
castBar.spellText = castBar:CreateFontString(nil, "OVERLAY") castBar.spellText = castBar:CreateFontString(nil, "LOW")
castBar.spellText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE") castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize)
castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor)) castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a)
castBar.spellText:SetShadowOffset(1, -1) castBar.spellText:SetShadowOffset(1, -1)
castBar.spellText:SetShadowColor(0, 0, 0, 1) castBar.spellText:SetShadowColor(0, 0, 0, 1)
castBar.spellText:SetJustifyH("CENTER") castBar.spellText:SetJustifyH("CENTER")
castBar.spellText:SetPoint("LEFT", 10, 0) -- Text of the spell castBar.spellText:SetPoint("LEFT", 7, 0) -- Text of the spell
castBar.timeText = castBar:CreateFontString(nil, "OVERLAY") castBar.timeText = castBar:CreateFontString(nil, "LOW")
castBar.timeText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE") castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize)
castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor)) castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a)
castBar.timeText:SetShadowOffset(1, -1) castBar.timeText:SetShadowOffset(1, -1)
castBar.timeText:SetShadowColor(0, 0, 0, 1) castBar.timeText:SetShadowColor(0, 0, 0, 1)
castBar.timeText:SetJustifyH("CENTER") castBar.timeText:SetJustifyH("CENTER")
@ -144,50 +121,31 @@ function Castbar:CreateFrame(unit)
self:ResetUnit(unit) self:ResetUnit(unit)
end end
function Castbar:UpdateFrameOnce()
if Gladdy.db.castBarEnabled then
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function Castbar:UpdateFrame(unit) function Castbar:UpdateFrame(unit)
local button = Gladdy.buttons[unit]
local castBar = self.frames[unit] local castBar = self.frames[unit]
if (not castBar) then if (not castBar) then
return return
end end
local testAgain = false
castBar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.backdrop:SetFrameLevel(Gladdy.db.castBarFrameLevel - 1)
castBar.bar:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.bar:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar.icon:SetFrameStrata(Gladdy.db.castBarFrameStrata)
castBar.icon:SetFrameLevel(Gladdy.db.castBarFrameLevel)
castBar:SetWidth(Gladdy.db.castBarWidth) castBar:SetWidth(Gladdy.db.castBarWidth)
castBar:SetHeight(Gladdy.db.castBarHeight) castBar:SetHeight(Gladdy.db.castBarHeight)
castBar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"), castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle),
edgeSize = Gladdy.db.castBarBorderSize }) edgeSize = Gladdy.db.castBarBorderSize })
castBar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.castBarBorderColor)) castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a)
castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture))
castBar.bar:ClearAllPoints() castBar.bar:ClearAllPoints()
castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor)) castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a)
castBar.bar:SetPoint("TOPLEFT", castBar, "TOPLEFT", (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) castBar.bar:SetPoint("TOPLEFT", castBar, "TOPLEFT", (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset))
castBar.bar:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) castBar.bar:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset))
castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture))
castBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarBgColor)) castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a)
if Gladdy.db.castBarSparkEnabled then if Gladdy.db.castBarSparkEnabled then
castBar.spark:SetHeight(Gladdy.db.castBarHeight * 1.8) castBar.spark:SetHeight(Gladdy.db.castBarHeight * 1.8)
castBar.spark:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarSparkColor)) castBar.spark:SetVertexColor(Gladdy.db.castBarSparkColor.r, Gladdy.db.castBarSparkColor.g, Gladdy.db.castBarSparkColor.b, Gladdy.db.castBarSparkColor.a)
else else
castBar.spark:SetAlpha(0) castBar.spark:SetAlpha(0)
end end
@ -195,28 +153,8 @@ function Castbar:UpdateFrame(unit)
castBar.icon:SetWidth(Gladdy.db.castBarIconSize) castBar.icon:SetWidth(Gladdy.db.castBarIconSize)
castBar.icon:SetHeight(Gladdy.db.castBarIconSize) castBar.icon:SetHeight(Gladdy.db.castBarIconSize)
castBar.icon.texture:SetAllPoints(castBar.icon) castBar.icon.texture:SetAllPoints(castBar.icon)
if Gladdy.db.castBarIconZoomed then
if castBar.icon.texture.masked then
castBar.icon.texture:SetMask("")
castBar.icon.texture:SetTexCoord(0.1,0.9,0.1,0.9)
castBar.icon.texture.masked = nil
end
else
if not castBar.icon.texture.masked then
castBar.icon.texture:SetMask("")
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.icon:ClearAllPoints()
castBar.shield:SetWidth(Gladdy.db.castBarIconSize * 3.2)
castBar.shield:SetHeight(Gladdy.db.castBarIconSize * 3.2)
local rightMargin = 0 local rightMargin = 0
local leftMargin = 0 local leftMargin = 0
if (Gladdy.db.castBarIconPos == "LEFT") then if (Gladdy.db.castBarIconPos == "LEFT") then
@ -227,35 +165,33 @@ function Castbar:UpdateFrame(unit)
leftMargin = Gladdy.db.castBarIconSize + 1 leftMargin = Gladdy.db.castBarIconSize + 1
end end
Gladdy:SetPosition(castBar, unit, "castBarXOffset", "castBarYOffset", Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin), Castbar) castBar:ClearAllPoints()
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.castBarPos == "LEFT") then
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
if (Gladdy.db.castBarPos == "RIGHT") then
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
castBar.spellText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE") castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.castBarFont), Gladdy.db.castBarFontSize)
castBar.spellText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor)) castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a)
castBar.timeText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize, Gladdy.db.castBarFontOutline and "OUTLINE") castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.castBarFont), Gladdy.db.castBarFontSize)
castBar.timeText:SetTextColor(Gladdy:SetColor(Gladdy.db.castBarFontColor)) castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a)
castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle) castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle)
castBar.icon.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.castBarIconColor)) castBar.icon.texture.overlay:SetVertexColor(Gladdy.db.castBarIconColor.r, Gladdy.db.castBarIconColor.g, Gladdy.db.castBarIconColor.b, Gladdy.db.castBarIconColor.a)
if (unit == "arena1") then
Gladdy:CreateMover(castBar, "castBarXOffset", "castBarYOffset", L["Cast Bar"],
{"TOPLEFT", "TOPLEFT"}, Gladdy.db.castBarWidth, Gladdy.db.castBarHeight,
0, 0, "castBarEnabled")
end
if not Gladdy.db.castBarEnabled then
self:CAST_STOP(unit)
end
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show()
if testAgain then
self:ResetUnit(unit)
self:Test(unit)
end
else
castBar.icon:Hide()
end
end end
--------------------------- ---------------------------
@ -296,7 +232,7 @@ function Castbar.OnUpdate(castBar, elapsed)
castBar.spark:SetPoint("CENTER", castBar.bar, "LEFT", castBar.spark.position, 0) castBar.spark:SetPoint("CENTER", castBar.bar, "LEFT", castBar.spark.position, 0)
castBar.spark:Show() castBar.spark:Show()
end end
elseif ( castBar.holdTime and GetTime() < castBar.holdTime ) then elseif ( GetTime() < castBar.holdTime ) then
castBar.timeText:Hide() castBar.timeText:Hide()
castBar.spark:Hide() castBar.spark:Hide()
return return
@ -308,16 +244,16 @@ function Castbar.OnUpdate(castBar, elapsed)
castBar.fadeOut = nil; castBar.fadeOut = nil;
castBar.timeText:Show() castBar.timeText:Show()
castBar.spark:Show() castBar.spark:Show()
castBar:SetAlpha(0) castBar:Hide();
end end
end end
end end
Castbar.CastEventsFunc = {} Castbar.CastEventsFunc = {}
Castbar.CastEventsFunc["UNIT_SPELLCAST_START"] = function(castBar, event, ...) Castbar.CastEventsFunc["UNIT_SPELLCAST_START"] = function(castBar, event, ...)
local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellId = UnitCastingInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill, castID = UnitCastingInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:SetAlpha(0) castBar:Hide()
return return
end end
@ -348,7 +284,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_SUCCEEDED"] = function(castBar, event, ..
end end
Castbar.CastEventsFunc["UNIT_SPELLCAST_STOP"] = function(castBar, event, ...) Castbar.CastEventsFunc["UNIT_SPELLCAST_STOP"] = function(castBar, event, ...)
if ( not castBar:IsVisible() ) then if ( not castBar:IsVisible() ) then
castBar:SetAlpha(0) castBar:Hide()
end end
if ( (castBar.casting and event == "UNIT_SPELLCAST_STOP" and select(2, ...) == castBar.castID) or if ( (castBar.casting and event == "UNIT_SPELLCAST_STOP" and select(2, ...) == castBar.castID) or
(castBar.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP") ) then (castBar.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP") ) then
@ -396,7 +332,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_DELAYED"] = function(castBar, event, ...)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
-- if there is no name, there is no bar -- if there is no name, there is no bar
castBar:SetAlpha(0) castBar:Hide()
return return
end end
castBar.value = (GetTime() - (startTime / 1000)) castBar.value = (GetTime() - (startTime / 1000))
@ -411,10 +347,10 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_DELAYED"] = function(castBar, event, ...)
end end
end end
Castbar.CastEventsFunc["UNIT_SPELLCAST_CHANNEL_START"] = function(castBar, event, ...) Castbar.CastEventsFunc["UNIT_SPELLCAST_CHANNEL_START"] = function(castBar, event, ...)
local name, text, texture, startTime, endTime, isTradeSkill, notInterruptible, spellId = UnitChannelInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill, spellID = UnitChannelInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:SetAlpha(0) castBar:Hide()
return return
end end
if ( castBar.spark ) then if ( castBar.spark ) then
@ -432,7 +368,7 @@ Castbar.CastEventsFunc["UNIT_SPELLCAST_CHANNEL_UPDATE"] = function(castBar, even
if ( castBar:IsShown() ) then if ( castBar:IsShown() ) then
local name, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(castBar.unit) local name, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(castBar.unit)
if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then if ( not name or (not castBar.showTradeSkills and isTradeSkill)) then
castBar:SetAlpha(0) castBar:Hide()
return return
end end
castBar.value = ((endTime / 1000) - GetTime()) castBar.value = ((endTime / 1000) - GetTime())
@ -449,7 +385,7 @@ function Castbar.OnEvent(self, event, ...)
Castbar.CastEventsFunc[event](self, event, ...) Castbar.CastEventsFunc[event](self, event, ...)
end end
function Castbar:CAST_START(unit, spell, icon, value, maxValue, notInterruptible, test) function Castbar:CAST_START(unit, spell, icon, value, maxValue, test)
local castBar = self.frames[unit] local castBar = self.frames[unit]
if (not castBar) then if (not castBar) then
return return
@ -461,36 +397,18 @@ function Castbar:CAST_START(unit, spell, icon, value, maxValue, notInterruptible
castBar.channeling = test == "channel" castBar.channeling = test == "channel"
end end
if notInterruptible then castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a)
castBar.bar:SetStatusBarColor(.8,.8,.8,1)
else
castBar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.castBarColor))
end
castBar.value = value castBar.value = value
castBar.maxValue = maxValue castBar.maxValue = maxValue
castBar.bar:SetMinMaxValues(0, maxValue) castBar.bar:SetMinMaxValues(0, maxValue)
castBar.bar:SetValue(value) castBar.bar:SetValue(value)
castBar.icon:SetAlpha(1)
castBar.icon.texture:SetTexture(icon) castBar.icon.texture:SetTexture(icon)
castBar.spellText:SetText(spell) castBar.spellText:SetText(spell)
castBar.timeText:SetText(maxValue) castBar.timeText:SetText(maxValue)
castBar.bg:Show() castBar.bg:Show()
castBar.backdrop:Show() castBar:Show()
if Gladdy.db.castBarSparkEnabled then
castBar.spark:Show()
end
if notInterruptible then
castBar.shield:Show()
else
castBar.shield:Hide()
end
castBar:SetAlpha(1) castBar:SetAlpha(1)
if Gladdy.db.castBarIconEnabled then
castBar.icon:Show() castBar.icon:Show()
else
castBar.icon:Hide()
end
end end
function Castbar:CAST_STOP(unit, ...) function Castbar:CAST_STOP(unit, ...)
@ -503,16 +421,13 @@ function Castbar:CAST_STOP(unit, ...)
castBar.channeling = nil castBar.channeling = nil
castBar.value = 0 castBar.value = 0
castBar.maxValue = 0 castBar.maxValue = 0
castBar.icon:SetAlpha(0)
castBar.icon.texture:SetTexture("") castBar.icon.texture:SetTexture("")
castBar.spellText:SetText("") castBar.spellText:SetText("")
castBar.timeText:SetText("") castBar.timeText:SetText("")
castBar.bar:SetValue(0) castBar.bar:SetValue(0)
castBar.bg:Hide() castBar.bg:Hide()
castBar.backdrop:Hide() castBar:Hide()
castBar.spark:Hide()
castBar.icon:Hide() castBar.icon:Hide()
castBar.shield:Hide()
else else
castBar.bar:SetStatusBarColor(...) castBar.bar:SetStatusBarColor(...)
end end
@ -587,8 +502,7 @@ function Castbar:Test(unit)
end end
if (spell) then if (spell) then
local nonInterruptable = unit == "arena1" and Gladdy.expansion == "Wrath" self:CAST_START(unit, spell, icon, value, maxValue, event)
self:CAST_START(unit, spell, icon, value, maxValue, nonInterruptable, event)
end end
else else
self:CAST_STOP(unit) self:CAST_STOP(unit)
@ -643,7 +557,6 @@ function Castbar:GetOptions()
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 4, order = 4,
disabled = function() return not Gladdy.db.castBarEnabled end,
args = { args = {
barFrame = { barFrame = {
type = "group", type = "group",
@ -661,7 +574,7 @@ function Castbar:GetOptions()
desc = L["Height of the bar"], desc = L["Height of the bar"],
order = 3, order = 3,
min = 0, min = 0,
max = 200, max = 50,
step = 1, step = 1,
width = "full", width = "full",
}), }),
@ -671,7 +584,7 @@ function Castbar:GetOptions()
desc = L["Width of the bars"], desc = L["Width of the bars"],
order = 4, order = 4,
min = 0, min = 0,
max = 600, max = 300,
step = 1, step = 1,
width = "full", width = "full",
}), }),
@ -738,22 +651,9 @@ function Castbar:GetOptions()
args = { args = {
headerSize = { headerSize = {
type = "header", type = "header",
name = L["Icon"], name = L["Icon Size"],
order = 1, order = 1,
}, },
castBarIconEnabled = option({
type = "toggle",
name = L["Icon Enabled"],
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({ castBarIconSize = option({
type = "range", type = "range",
name = L["Icon size"], name = L["Icon size"],
@ -840,12 +740,6 @@ function Castbar:GetOptions()
max = 20, max = 20,
width = "full", width = "full",
}), }),
castBarFontOutline = option({
type = "toggle",
name = L["Outline"],
order = 5,
width = "full",
}),
headerFormat = { headerFormat = {
type = "header", type = "header",
name = L["Format"], name = L["Format"],
@ -873,6 +767,15 @@ function Castbar:GetOptions()
name = L["Position"], name = L["Position"],
order = 1, order = 1,
}, },
castBarPos = option({
type = "select",
name = L["Castbar position"],
order = 2,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
},
}),
castBarIconPos = option( { castBarIconPos = option( {
type = "select", type = "select",
name = L["Icon position"], name = L["Icon position"],
@ -907,73 +810,7 @@ function Castbar:GetOptions()
}), }),
} }
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
castBarFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
castBarFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Castbar:LegacySetPosition(castBar, unit, leftMargin, rightMargin)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
castBar:ClearAllPoints()
if Gladdy.db.castBarWidth <= 0 then
castBar:SetWidth(0.1)
end
if Gladdy.db.castBarHeight <= 0 then
castBar:SetHeight(0.1)
end
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.castBarPos == "LEFT") then
local anchor = Gladdy:GetAnchor(unit, "LEFT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
if (Gladdy.db.castBarPos == "RIGHT") then
local anchor = Gladdy:GetAnchor(unit, "RIGHT")
if anchor == Gladdy.buttons[unit].healthBar then
castBar:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
else
castBar:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset)
end
end
return Gladdy.db.newLayout
end

View File

@ -1,29 +1,21 @@
local select, str_gsub = select, string.gsub local select = select
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetSpellInfo = GetSpellInfo local GetSpellInfo = GetSpellInfo
local L = Gladdy.L local L = Gladdy.L
local Classicon = Gladdy:NewModule("Class Icon", 81, { local Classicon = Gladdy:NewModule("Class Icon", 80, {
classIconEnabled = true, classIconPos = "LEFT",
classIconSize = 60 + 20 + 1, classIconSize = 60 + 20 + 1,
classIconWidthFactor = 0.9, classIconWidthFactor = 0.9,
classIconZoomed = false,
classIconBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", classIconBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
classIconBorderColor = { r = 0, g = 0, b = 0, a = 1 }, classIconBorderColor = { r = 0, g = 0, b = 0, a = 1 },
classIconSpecIcon = false, classIconSpecIcon = false,
classIconXOffset = 0,
classIconYOffset = 0,
classIconFrameStrata = "MEDIUM",
classIconFrameLevel = 5,
classIconGroup = false,
classIconGroupDirection = "DOWN"
}) })
local classIconPath = "Interface\\Addons\\Gladdy\\Images\\Classes\\" local classIconPath = "Interface\\Addons\\Gladdy\\Images\\Classes\\"
local classIcons = { local classIcons = {
["DRUID"] = classIconPath .. "inv_misc_monsterclaw_04", ["DRUID"] = classIconPath .. "inv_misc_monsterclaw_04",
["DEATHKNIGHT"] = select(3, GetSpellInfo(49023)), --Might of Mograine
["HUNTER"] = classIconPath .. "inv_weapon_bow_07", ["HUNTER"] = classIconPath .. "inv_weapon_bow_07",
["MAGE"] = classIconPath .. "inv_staff_13", ["MAGE"] = classIconPath .. "inv_staff_13",
["PALADIN"] = classIconPath .. "inv_hammer_01", ["PALADIN"] = classIconPath .. "inv_hammer_01",
@ -41,11 +33,6 @@ local specIcons = {
[L["Feral"]] = select(3, GetSpellInfo(27545)), -- Cat Form [L["Feral"]] = select(3, GetSpellInfo(27545)), -- Cat Form
[L["Restoration"]] = select(3, GetSpellInfo(5185)), -- Healing Touch [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"] = { ["HUNTER"] = {
[L["Beast Mastery"]] = select(3, GetSpellInfo(1515)), -- Tame Beast [L["Beast Mastery"]] = select(3, GetSpellInfo(1515)), -- Tame Beast
[L["Marksmanship"]] = select(3, GetSpellInfo(42243)), -- Volley [L["Marksmanship"]] = select(3, GetSpellInfo(42243)), -- Volley
@ -91,21 +78,9 @@ local specIcons = {
function Classicon:Initialize() function Classicon:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.classIconEnabled then
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("UNIT_SPEC")
end
end
function Classicon:UpdateFrameOnce()
if Gladdy.db.classIconEnabled then
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_SPEC")
else
self:UnregisterAllMessages()
end
end end
function Classicon:CreateFrame(unit) function Classicon:CreateFrame(unit)
@ -116,7 +91,6 @@ function Classicon:CreateFrame(unit)
classIcon.texture = classIcon:CreateTexture(nil, "BACKGROUND") classIcon.texture = classIcon:CreateTexture(nil, "BACKGROUND")
classIcon.texture:SetAllPoints(classIcon) classIcon.texture:SetAllPoints(classIcon)
classIcon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") classIcon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
classIcon.texture.masked = true
classIcon.texture.overlay = classIcon:CreateTexture(nil, "BORDER") classIcon.texture.overlay = classIcon:CreateTexture(nil, "BORDER")
classIcon.texture.overlay:SetAllPoints(classIcon) classIcon.texture.overlay:SetAllPoints(classIcon)
@ -125,6 +99,13 @@ function Classicon:CreateFrame(unit)
classIcon:SetFrameStrata("MEDIUM") classIcon:SetFrameStrata("MEDIUM")
classIcon:SetFrameLevel(2) classIcon:SetFrameLevel(2)
classIcon:ClearAllPoints()
if (Gladdy.db.classIconPos == "RIGHT") then
classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", 2, 2)
else
classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -2, 2)
end
Gladdy.buttons[unit].classIcon = classIcon Gladdy.buttons[unit].classIcon = classIcon
self.frames[unit] = classIcon self.frames[unit] = classIcon
end end
@ -135,73 +116,22 @@ function Classicon:UpdateFrame(unit)
return return
end end
local testAgain = false
classIcon:SetFrameStrata(Gladdy.db.classIconFrameStrata)
classIcon:SetFrameLevel(Gladdy.db.classIconFrameLevel)
classIcon:SetWidth(Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) classIcon:SetWidth(Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor)
classIcon:SetHeight(Gladdy.db.classIconSize) classIcon:SetHeight(Gladdy.db.classIconSize)
if Gladdy.db.classIconZoomed then classIcon:ClearAllPoints()
if classIcon.texture.masked then local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
classIcon.texture:SetMask("") if (Gladdy.db.classIconPos == "LEFT") then
classIcon.texture:SetTexCoord(0.1,0.9,0.1,0.9) classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
classIcon.texture.masked = nil
end
else else
if not classIcon.texture.masked then classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPRIGHT", margin, 0)
classIcon.texture:SetMask("")
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"},
Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor,
Gladdy.db.classIconSize,
0,
0, "classIconEnabled")
end end
classIcon.texture:ClearAllPoints() classIcon.texture:ClearAllPoints()
classIcon.texture:SetAllPoints(classIcon) classIcon.texture:SetAllPoints(classIcon)
classIcon.texture.overlay:SetTexture(Gladdy.db.classIconBorderStyle) classIcon.texture.overlay:SetTexture(Gladdy.db.classIconBorderStyle)
classIcon.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.classIconBorderColor)) classIcon.texture.overlay:SetVertexColor(Gladdy.db.classIconBorderColor.r, Gladdy.db.classIconBorderColor.g, Gladdy.db.classIconBorderColor.b, Gladdy.db.classIconBorderColor.a)
if Gladdy.db.classIconEnabled then
classIcon:Show()
if testAgain then
Classicon:ResetUnit(unit)
Classicon:ENEMY_SPOTTED(unit)
end
else
classIcon:Hide()
end
end end
function Classicon:ENEMY_SPOTTED(unit) function Classicon:ENEMY_SPOTTED(unit)
@ -223,6 +153,10 @@ function Classicon:UNIT_SPEC(unit, spec)
classIcon.texture:SetTexture(specIcons[Gladdy.buttons[unit].class][spec]) classIcon.texture:SetTexture(specIcons[Gladdy.buttons[unit].class][spec])
end end
function Classicon:Test(unit)
self:ENEMY_SPOTTED(unit)
end
function Classicon:ResetUnit(unit) function Classicon:ResetUnit(unit)
local classIcon = self.frames[unit] local classIcon = self.frames[unit]
if (not classIcon) then if (not classIcon) then
@ -239,19 +173,13 @@ function Classicon:GetOptions()
name = L["Class Icon"], name = L["Class Icon"],
order = 2, order = 2,
}, },
classIconEnabled = Gladdy:option({
type = "toggle",
name = L["Class Icon Enabled"],
order = 3,
}),
classIconSpecIcon = { classIconSpecIcon = {
type = "toggle", type = "toggle",
name = L["Show Spec Icon"], name = L["Show Spec Icon"],
desc = L["Shows Spec Icon once spec is detected"], desc = L["Shows Spec Icon once spec is detected"],
order = 4, order = 3,
disabled = function() return not Gladdy.db.classIconEnabled end, get = function(info) return Gladdy.db.classIconSpecIcon end,
get = function() return Gladdy.db.classIconSpecIcon end, set = function(info, value)
set = function(_, value)
Gladdy.db.classIconSpecIcon = value Gladdy.db.classIconSpecIcon = value
if Gladdy.curBracket and Gladdy.curBracket > 0 then if Gladdy.curBracket and Gladdy.curBracket > 0 then
for i=1,Gladdy.curBracket do for i=1,Gladdy.curBracket do
@ -264,56 +192,28 @@ function Classicon:GetOptions()
end end
end end
}, },
classIconGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Class Icon"],
order = 5,
disabled = function() return not Gladdy.db.classIconEnabled end,
}),
classIconGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 6,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.classIconGroup or not Gladdy.db.classIconEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 7, order = 4,
disabled = function() return not Gladdy.db.classIconEnabled end,
args = { args = {
size = { size = {
type = "group", type = "group",
name = L["Icon"], name = L["Icon size"],
order = 1, order = 1,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Icon size"],
order = 1, 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({ classIconSize = Gladdy:option({
type = "range", type = "range",
name = L["Size"], name = L["Icon size"],
min = 3, min = 1,
max = 100, max = 100,
step = .1, step = 1,
order = 3, order = 3,
width = "full", width = "full",
}), }),
@ -331,37 +231,29 @@ function Classicon:GetOptions()
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 3, order = 1,
args = { args = {
headerPosition = { headerPosition = {
type = "header", type = "header",
name = L["Position"], name = L["Position"],
order = 5, order = 5,
}, },
classIconXOffset = Gladdy:option({ classIconPos = Gladdy:option({
type = "range", type = "select",
name = L["Horizontal offset"], name = L["Icon position"],
order = 11, desc = L["This changes positions with trinket"],
min = -800, order = 6,
max = 800, values = {
step = 0.1, ["LEFT"] = L["Left"],
width = "full", ["RIGHT"] = L["Right"],
}), },
classIconYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 12,
min = -800,
max = 800,
step = 0.1,
width = "full",
}), }),
}, },
}, },
border = { border = {
type = "group", type = "group",
name = L["Border"], name = L["Border"],
order = 2, order = 1,
args = { args = {
headerBorder = { headerBorder = {
type = "header", type = "header",
@ -383,55 +275,7 @@ function Classicon:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
classIconFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
classIconFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Classicon:LegacySetPosition(classIcon, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
classIcon:ClearAllPoints()
local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
classIcon:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
else
classIcon:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPRIGHT", margin, 0)
end
end

View File

@ -12,8 +12,8 @@ local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local attributes = { local attributes = {
{ name = L["Target"], button = "1", modifier = "", action = "target", spell = "" }, { name = "Target", button = "1", modifier = "", action = "target", spell = "" },
{ name = L["Focus"], button = "2", modifier = "", action = "focus", spell = "" }, { name = "Focus", button = "2", modifier = "", action = "focus", spell = "" },
} }
for i = 3, 10 do for i = 3, 10 do
tinsert(attributes, { name = L["Action #%d"]:format(i), button = "", modifier = "", action = "disabled", spell = "" }) tinsert(attributes, { name = L["Action #%d"]:format(i), button = "", modifier = "", action = "disabled", spell = "" })
@ -70,7 +70,7 @@ function Clicks:UpdateFrame(unit)
end end
function Clicks:UpdateFrameOnce() function Clicks:UpdateFrameOnce()
for _, v in pairs(Gladdy.buttons) do for k, v in pairs(Gladdy.buttons) do
local left = GetBindingKey(("GLADDYBUTTON%d_LEFT"):format(v.id)) local left = GetBindingKey(("GLADDYBUTTON%d_LEFT"):format(v.id))
local right = GetBindingKey(("GLADDYBUTTON%d_RIGHT"):format(v.id)) local right = GetBindingKey(("GLADDYBUTTON%d_RIGHT"):format(v.id))
local middle = GetBindingKey(("GLADDYBUTTON%d_MIDDLE"):format(v.id)) local middle = GetBindingKey(("GLADDYBUTTON%d_MIDDLE"):format(v.id))
@ -107,7 +107,7 @@ function Clicks:SetupAttributes(unit)
return return
end end
for _, v in pairs(Gladdy.db.attributes) do for k, v in pairs(Gladdy.db.attributes) do
self:SetupAttribute(button, v.button, v.modifier, v.action, v.spell) self:SetupAttribute(button, v.button, v.modifier, v.action, v.spell)
end end
end end

View File

@ -1,6 +1,7 @@
local select = select local select = select
local UnitExists, UnitAffectingCombat, GetSpellInfo = UnitExists, UnitAffectingCombat, GetSpellInfo local UnitExists, UnitAffectingCombat, GetSpellInfo = UnitExists, UnitAffectingCombat, GetSpellInfo
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
@ -10,19 +11,17 @@ local CombatIndicator = Gladdy:NewModule("Combat Indicator", nil, {
ciSize = 20, ciSize = 20,
ciAlpha = 1, ciAlpha = 1,
ciWidthFactor = 1, ciWidthFactor = 1,
ciAnchor = "healthBar",
ciPos = "TOP",
ciXOffset = 0, ciXOffset = 0,
ciYOffset = -31, ciYOffset = -31,
ciBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", ciBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
ciBorderColor = { r = 0, g = 0, b = 0, a = 1 }, ciBorderColor = { r = 0, g = 0, b = 0, a = 1 },
ciFrameStrata = "HIGH",
ciFrameLevel = 5,
}) })
function CombatIndicator:Initialize() function CombatIndicator:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.ciEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
end
self.updateInterval = 0.05 self.updateInterval = 0.05
self.combatIndicatorIcon = select(3, GetSpellInfo(674)) self.combatIndicatorIcon = select(3, GetSpellInfo(674))
end end
@ -39,9 +38,7 @@ function CombatIndicator:CreateFrame(unit)
end end
local ciFrame = CreateFrame("Frame", "GladdyCombatindicator" .. unit, button) local ciFrame = CreateFrame("Frame", "GladdyCombatindicator" .. unit, button)
ciFrame:EnableMouse(false) ciFrame:EnableMouse(false)
ciFrame:SetMovable(true) ciFrame:SetFrameStrata("HIGH")
ciFrame:SetFrameStrata(Gladdy.db.ciFrameStrata)
ciFrame:SetFrameLevel(Gladdy.db.ciFrameLevel)
ciFrame:SetHeight(Gladdy.db.ciSize) ciFrame:SetHeight(Gladdy.db.ciSize)
ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor) ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor)
@ -53,36 +50,25 @@ function CombatIndicator:CreateFrame(unit)
ciFrame.border = ciFrame:CreateTexture(nil, "OVERLAY") ciFrame.border = ciFrame:CreateTexture(nil, "OVERLAY")
ciFrame.border:SetAllPoints(ciFrame) ciFrame.border:SetAllPoints(ciFrame)
ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle) ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle)
ciFrame.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.ciBorderColor)) ciFrame.border:SetVertexColor(Gladdy.db.ciBorderColor.r, Gladdy.db.ciBorderColor.g, Gladdy.db.ciBorderColor.b, Gladdy.db.ciBorderColor.a)
self.frames[unit] = ciFrame self.frames[unit] = ciFrame
button.ciFrame = ciFrame button.ciFrame = ciFrame
end end
function CombatIndicator:UpdateFrameOnce()
if Gladdy.db.ciEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function CombatIndicator:UpdateFrame(unit) function CombatIndicator:UpdateFrame(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
local ciFrame = self.frames[unit] local ciFrame = self.frames[unit]
if (not button or not ciFrame) then if (not button or not ciFrame) then
return return
end end
ciFrame:SetFrameStrata(Gladdy.db.ciFrameStrata)
ciFrame:SetFrameLevel(Gladdy.db.ciFrameLevel)
ciFrame:SetHeight(Gladdy.db.ciSize) ciFrame:SetHeight(Gladdy.db.ciSize)
ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor) ciFrame:SetWidth(Gladdy.db.ciSize * Gladdy.db.ciWidthFactor)
ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle) ciFrame.border:SetTexture(Gladdy.db.ciBorderStyle)
ciFrame.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.ciBorderColor)) ciFrame.border:SetVertexColor(Gladdy.db.ciBorderColor.r, Gladdy.db.ciBorderColor.g, Gladdy.db.ciBorderColor.b, Gladdy.db.ciBorderColor.a)
Gladdy:SetPosition(ciFrame, unit, "ciXOffset", "ciYOffset", CombatIndicator:LegacySetPosition(ciFrame, unit), CombatIndicator) ciFrame:ClearAllPoints()
ciFrame:SetPoint(ANCHORS[Gladdy.db.ciPos], Gladdy.buttons[unit][Gladdy.db.ciAnchor], Gladdy.db.ciPos, Gladdy.db.ciXOffset, Gladdy.db.ciYOffset)
ciFrame:SetAlpha(Gladdy.db.ciAlpha) ciFrame:SetAlpha(Gladdy.db.ciAlpha)
@ -91,12 +77,6 @@ function CombatIndicator:UpdateFrame(unit)
else else
ciFrame:Show() ciFrame:Show()
end end
if (unit == "arena1") then
Gladdy:CreateMover(ciFrame, "ciXOffset", "ciYOffset", L["Combat Indicator"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.ciSize * Gladdy.db.ciWidthFactor, Gladdy.db.ciSize,
0, 0, "ciEnabled")
end
end end
function CombatIndicator:Test() function CombatIndicator:Test()
@ -143,7 +123,6 @@ function CombatIndicator:GetOptions()
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 4, order = 4,
disabled = function() return not Gladdy.db.ciEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -187,13 +166,37 @@ function CombatIndicator:GetOptions()
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 3, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Position"], name = L["Position"],
order = 4, order = 4,
}, },
ciAnchor = Gladdy:option({
type = "select",
name = L["Anchor"],
desc = L["This changes the anchor of the ci icon"],
order = 20,
values = {
["trinket"] = L["Trinket"],
["classIcon"] = L["Class Icon"],
["healthBar"] = L["Health Bar"],
["powerBar"] = L["Power Bar"],
},
}),
ciPos = Gladdy:option({
type = "select",
name = L["Position"],
desc = L["This changes position relative to its anchor of the ci icon"],
order = 21,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
},
}),
ciXOffset = Gladdy:option({ ciXOffset = Gladdy:option({
type = "range", type = "range",
name = L["Horizontal offset"], name = L["Horizontal offset"],
@ -217,7 +220,7 @@ function CombatIndicator:GetOptions()
border = { border = {
type = "group", type = "group",
name = L["Border"], name = L["Border"],
order = 2, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -239,56 +242,7 @@ function CombatIndicator:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 5,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
ciFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
ciFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function CombatIndicator:LegacySetPosition(ciFrame, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
-- LEGACY options
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
local ciAnchor = Gladdy.db.ciAnchor or Gladdy.legacy.ciAnchor
local ciPos = Gladdy.db.ciPos
ciFrame:ClearAllPoints()
ciFrame:SetPoint(ANCHORS[ciPos], Gladdy.buttons[unit][ciAnchor], ciPos, Gladdy.db.ciXOffset, Gladdy.db.ciYOffset)
return Gladdy.db.newLayout
end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
local type, pairs, str_match = type, pairs, string.match local type, pairs = type, pairs
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local AceSerializer = LibStub("AceSerializer-3.0") local AceSerializer = LibStub("AceSerializer-3.0")
@ -6,17 +6,12 @@ local L = Gladdy.L
local AceGUI = LibStub("AceGUI-3.0") local AceGUI = LibStub("AceGUI-3.0")
local LibDeflate = LibStub:GetLibrary("LibDeflate") local LibDeflate = LibStub:GetLibrary("LibDeflate")
local function table_copy(t)
local function table_copy(t, str)
local t2 = {}; local t2 = {};
if str == nil then
str = "Gladdy.db"
end
for k,v in pairs(t) do for k,v in pairs(t) do
if type(v) == "table" then if type(v) == "table" then
t2[k] = table_copy(v, str .. "." .. k); t2[k] = table_copy(v);
else else
t2[k] = v; t2[k] = v;
end end
end end
@ -24,7 +19,6 @@ local function table_copy(t, str)
end end
local ExportImport = Gladdy:NewModule("Export Import", nil, { local ExportImport = Gladdy:NewModule("Export Import", nil, {
expansion = Gladdy.expansion,
}) })
local export = AceGUI:Create("Frame") local export = AceGUI:Create("Frame")
@ -73,7 +67,6 @@ importButton:SetCallback("OnClick", function(widget)
Gladdy:Reset() Gladdy:Reset()
Gladdy:HideFrame() Gladdy:HideFrame()
Gladdy:ToggleFrame(3) Gladdy:ToggleFrame(3)
LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
end) end)
import:AddChild(importButton) import:AddChild(importButton)
import.button = importButton import.button = importButton
@ -90,93 +83,32 @@ end)
import:AddChild(importClearButton) import:AddChild(importClearButton)
import.clearButton = importClearButton import.clearButton = importClearButton
local deletedOptions = { -- backwards compatibility local deletedOptions = { --TODO backward compatibility Imports on deleted options
--deleted DR-categories growUp = true
repentance = true,
sleep = true,
impconc = true,
dragonsbreath = true,
freezetrap = true,
--deleted db options
castBarPos = true,
buffsCooldownPos = true,
buffsBuffsCooldownPos = true,
classIconPos = true,
ciAnchor = true,
ciPos = true,
cooldownYPos = true,
cooldownXPos = true,
drCooldownPos = true,
racialAnchor = true,
racialPos = true,
trinketPos = true,
padding = true,
growUp = true,
powerBarFontSize = true,
["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)
local isDeleted
for key, _ in pairs(deletedOptions) do
if str_match(k, key) then
isDeleted = true
Gladdy:Debug("WARN", "found deleted option =", str .. "." .. k)
end
end
if errorFound then
return errorFound, errorMsg
end
if not isDeleted then
return true, msg or str .. "." .. k .. " does not exist"
end
end
function ExportImport:CheckDeserializedOptions(tbl, refTbl, str) function ExportImport:CheckDeserializedOptions(tbl, refTbl, str)
if str == nil and not tbl.version_major_num then if str == nil and not tbl.version_major_num then
return false, "Version conflict: version_major_num not seen" return false, "Version conflict: version_major_num not seen"
end end
if str == nil and tbl.version_major_num > Gladdy.version_major_num then if str == nil and tbl.version_major_num ~= Gladdy.version_major_num then
return false, "Version conflict: Major v" .. tbl.version_major_num .. " ~= v" .. Gladdy.version_major_num return false, "Version conflict: " .. tbl.version_major_num .. " ~= " .. Gladdy.version_major_num
end end
if str == nil then if str == nil then
str = "Gladdy.db" str = "Gladdy.db"
tbl.version_major_num = nil tbl.version_major_num = nil
end end
local res, msg
local errorFound, errorMsg
if refTbl == nil then
return false, str .. "does not exist"
else
for k,v in pairs(tbl) do for k,v in pairs(tbl) do
if refTbl[k] == nil then if refTbl[k] == nil then
errorFound, errorMsg = checkIsDeletedOption(k, str, nil, errorFound, errorMsg) --return false, str .. "." .. k .. " does not exist"
elseif type(v) ~= type(refTbl[k]) then else
errorFound = true if type(v) ~= type(refTbl[k]) then
errorMsg = str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) return false, str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v)
elseif type(v) == "table" then elseif type(v) == "table" then
res, msg = ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k) ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k)
if not res then
errorFound, errorMsg = checkIsDeletedOption(msg, str, msg, errorFound, errorMsg)
end end
end end
end end
end
if errorFound then
--return false, errorMsg
end
return true return true
end end
@ -203,8 +135,8 @@ function ExportImport:GetOptions()
export.eb:HighlightText(0, export.eb.editBox:GetNumLetters()) export.eb:HighlightText(0, export.eb.editBox:GetNumLetters())
export:SetStatusText("Copy this string to share your configuration with others.") export:SetStatusText("Copy this string to share your configuration with others.")
end, end,
name = L["Export"], name = "Export",
desc = L["Export your current profile to share with others or your various accounts."], desc = "Export your current profile to share with others or your various accounts.",
order = 3, order = 3,
}, },
import = { import = {
@ -227,44 +159,21 @@ function ExportImport:GetOptions()
import.deserializedTable = deserialized import.deserializedTable = deserialized
end) end)
end, end,
name = L["Import"], name = "Import",
desc = L["This will overwrite your current profile!"], desc = "This will overwrite your current profile!",
order = 4, order = 4,
}, },
} }
end end
function ExportImport:ApplyImport(t, table, str) function ExportImport:ApplyImport(t, table)
if str == nil then
str = "Gladdy.db"
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 for k,v in pairs(t) do
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 type(v) == "table" then
if (table[k] ~= nil) then ExportImport:ApplyImport(v, table[k])
ExportImport:ApplyImport(v, table[k], str .. "." .. k)
else
Gladdy:Debug("ERROR", "ExportImport:ApplyImport", "failed for", str .. "." .. k)
end
else else
table[k] = v table[k] = v
end end
end end
end
end end
function ExportImport:Decode(str, showError) function ExportImport:Decode(str, showError)

View File

@ -1,6 +1,5 @@
local pairs, ipairs = pairs, ipairs local pairs = pairs
local floor, abs = math.floor, math.abs local floor = math.floor
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 UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost = UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
@ -17,15 +16,6 @@ local Healthbar = Gladdy:NewModule("Health Bar", 100, {
healthBarBorderSize = 9, healthBarBorderSize = 9,
healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
healthBarBgColor = { r = 0, g = 0, b = 0, a = 0.4 }, healthBarBgColor = { r = 0, g = 0, b = 0, a = 0.4 },
healthBarClassColored = true,
healthBarColoredByCurrentHp = false,
healthBarStatusBarColorMax = { r = 0, g = 1, b = 0, a = 1 },
healthBarStatusBarColorMid = { r = 1, g = 1, b = 0, a = 1 },
healthBarStatusBarColorMin = { r = 1, g = 0, b = 0, a = 1 },
healthFrameStrata = "MEDIUM",
healthFrameLevel = 1,
healthBarStealthColor = { r = 0.66, g = 0.66, b = 0.66, a = 1 },
--font
healthBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, healthBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
healthBarNameFontSize = 12, healthBarNameFontSize = 12,
healthBarHealthFontSize = 12, healthBarHealthFontSize = 12,
@ -34,23 +24,12 @@ local Healthbar = Gladdy:NewModule("Health Bar", 100, {
healthActual = false, healthActual = false,
healthMax = true, healthMax = true,
healthPercentage = true, healthPercentage = true,
healthCustomTagsEnabled = false,
healthTextLeft = "[name]",
healthTextRight = "[percent|status]",
healthTextLeftOutline = false,
healthTextRightOutline = false,
healthTextLeftVOffset = 0,
healthTextLeftHOffset = 5,
healthTextRightVOffset = 0,
healthTextRightHOffset = -5,
}) })
function Healthbar:Initialize() function Healthbar:Initialize()
self.frames = {} self.frames = {}
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("ENEMY_STEALTH")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DESTROYED")
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_DEATH")
end end
@ -60,66 +39,74 @@ function Healthbar:CreateFrame(unit)
local healthBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local healthBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
healthBar:EnableMouse(false) healthBar:EnableMouse(false)
healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"), healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle),
edgeSize = Gladdy.db.healthBarBorderSize }) edgeSize = Gladdy.db.healthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.healthBarBorderColor)) healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a)
healthBar:SetFrameStrata(Gladdy.db.healthFrameStrata) healthBar:SetFrameLevel(1)
healthBar:SetFrameLevel(Gladdy.db.healthFrameLevel)
healthBar.hp = CreateFrame("StatusBar", nil, healthBar) healthBar.hp = CreateFrame("StatusBar", nil, healthBar)
healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture))
healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetMinMaxValues(0, 100)
healthBar.hp:SetFrameStrata(Gladdy.db.healthFrameStrata) healthBar.hp:SetFrameLevel(0)
healthBar.hp:SetFrameLevel(Gladdy.db.healthFrameLevel - 1)
healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND")
healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture))
healthBar.bg:ClearAllPoints() healthBar.bg:ClearAllPoints()
healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAllPoints(healthBar.hp)
healthBar.bg:SetAlpha(1) healthBar.bg:SetAlpha(1)
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor)) healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a)
healthBar.nameText = healthBar:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall")
if (Gladdy.db.healthBarNameFontSize < 1) then if (Gladdy.db.healthBarNameFontSize < 1) then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE") healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize)
healthBar.nameText:Show() healthBar.nameText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
healthBar.nameText:SetShadowOffset(1, -1) healthBar.nameText:SetShadowOffset(1, -1)
healthBar.nameText:SetShadowColor(0, 0, 0, 1) healthBar.nameText:SetShadowColor(0, 0, 0, 1)
healthBar.nameText:SetJustifyH("CENTER") healthBar.nameText:SetJustifyH("CENTER")
healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset) healthBar.nameText:SetPoint("LEFT", 5, 0)
healthBar.healthText = healthBar:CreateFontString(nil, "OVERLAY") healthBar.healthText = healthBar:CreateFontString(nil, "LOW")
if (Gladdy.db.healthBarHealthFontSize < 1) then if (Gladdy.db.healthBarHealthFontSize < 1) then
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE") healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize)
healthBar.healthText:Hide() healthBar.healthText:Hide()
end end
healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
healthBar.healthText:SetShadowOffset(1, -1) healthBar.healthText:SetShadowOffset(1, -1)
healthBar.healthText:SetShadowColor(0, 0, 0, 1) healthBar.healthText:SetShadowColor(0, 0, 0, 1)
healthBar.healthText:SetJustifyH("CENTER") healthBar.healthText:SetJustifyH("CENTER")
healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset) healthBar.healthText:SetPoint("RIGHT", -5, 0)
healthBar.unit = unit healthBar.unit = unit
self.frames[unit] = healthBar self.frames[unit] = healthBar
button.healthBar = healthBar button.healthBar = healthBar
self:ResetUnit(unit) self:ResetUnit(unit)
healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit) healthBar:RegisterUnitEvent("UNIT_HEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit) healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
healthBar:SetScript("OnEvent", Healthbar.OnEvent) healthBar:SetScript("OnEvent", Healthbar.OnEvent)
end end
function Healthbar.OnEvent(self, event, unit) function Healthbar.OnEvent(self, event, unit)
local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit) and not Gladdy:isFeignDeath(unit) local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit)
if event == "UNIT_HEALTH_FREQUENT" or event == "UNIT_MAXHEALTH" then 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
if isDead then if isDead then
Gladdy:SendMessage("UNIT_DEATH", unit) Gladdy:SendMessage("UNIT_DEATH", unit)
return return
@ -128,116 +115,50 @@ function Healthbar.OnEvent(self, event, unit)
local healthMax = UnitHealthMax(unit) local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax) self.hp:SetMinMaxValues(0, healthMax)
self.hp:SetValue(health) self.hp:SetValue(health)
self.hp.current = health Healthbar:SetHealthText(self, health, healthMax)
self.hp.max = healthMax
Healthbar:SetText(unit, health, healthMax)
Healthbar:SetHealthStatusBarColor(unit, self.hp.current, self.hp.max)
elseif event == "UNIT_NAME_UPDATE" then elseif event == "UNIT_NAME_UPDATE" then
local name = UnitName(unit) local name = UnitName(unit)
Gladdy.buttons[unit].name = name Gladdy.buttons[unit].name = name
Healthbar:SetText(unit, self.hp.current, self.hp.max) if Gladdy.db.healthName and not Gladdy.db.healthNameToArenaId then
self.nameText:SetText(name)
end
end end
if not Gladdy.buttons[unit].class then if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true) Gladdy:SpotEnemy(unit, true)
end end
end end
local function getGradient(start, ending, percentage, factor)
return start * abs(-2 * percentage + 1) + ending * factor
end
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
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) function Healthbar:SetHealthText(healthBar, health, healthMax)
local healthText = "" local healthText
local healthPercentage = health and healthMax and floor(health * 100 / healthMax) local healthPercentage = floor(health * 100 / healthMax)
if health == 0 and UnitExists(healthBar.unit) and UnitIsDeadOrGhost(healthBar.unit) and not Gladdy:isFeignDeath(healthBar.unit) then if health == 0 and UnitExists(healthBar.unit) and UnitIsDeadOrGhost(healthBar.unit) then
self:UNIT_DEATH(healthBar.unit) self:UNIT_DEATH(healthBar.unit)
return return
end end
if (Gladdy.db.healthPercentage and healthPercentage) then
if (Gladdy.db.healthActual) then
healthText = healthMax > 999 and ("%.1fk"):format(health / 1000) or health
end
if (Gladdy.db.healthMax) then
local text = healthMax > 999 and ("%.1fk"):format(healthMax / 1000) or healthMax
if (healthText) then
healthText = ("%s/%s"):format(healthText, text)
else
healthText = text
end
end
if (Gladdy.db.healthPercentage) then
if (healthText) then
healthText = ("%s (%d%%)"):format(healthText, healthPercentage)
else
healthText = ("%d%%"):format(healthPercentage) healthText = ("%d%%"):format(healthPercentage)
end end
healthBar.healthText:SetText(healthText) end
end
function Healthbar:SetText(unit, health, healthMax, status) healthBar.healthText:SetText(healthText)
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 end
function Healthbar:UpdateFrame(unit) function Healthbar:UpdateFrame(unit)
@ -246,50 +167,43 @@ function Healthbar:UpdateFrame(unit)
return return
end end
healthBar:SetFrameStrata(Gladdy.db.healthFrameStrata) local iconSize = Gladdy.db.healthBarHeight + Gladdy.db.powerBarHeight
healthBar:SetFrameLevel(Gladdy.db.healthFrameLevel)
healthBar.hp:SetFrameStrata(Gladdy.db.healthFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.healthFrameLevel - 1)
healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture))
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.healthBarBgColor)) healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a)
healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"), healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle),
edgeSize = Gladdy.db.healthBarBorderSize }) edgeSize = Gladdy.db.healthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.healthBarBorderColor)) healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a)
healthBar:ClearAllPoints() healthBar:ClearAllPoints()
healthBar:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPLEFT", 0, 0) healthBar:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPLEFT", 0, 0)
healthBar:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit], "BOTTOMRIGHT") healthBar:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit], "BOTTOMRIGHT")
healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture))
healthBar.hp:ClearAllPoints() healthBar.hp:ClearAllPoints()
healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset))
healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset))
if (Gladdy.db.healthBarHealthFontSize < 1) then if (Gladdy.db.healthBarHealthFontSize < 1) then
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize, Gladdy.db.healthTextRightOutline and "OUTLINE") healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize)
healthBar.healthText:Show() healthBar.healthText:Show()
end end
if (Gladdy.db.healthBarNameFontSize < 1) then if (Gladdy.db.healthBarNameFontSize < 1) then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize, Gladdy.db.healthTextLeftOutline and "OUTLINE") healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize)
if Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled then if Gladdy.db.healthName then
healthBar.nameText:Show() healthBar.nameText:Show()
else else
healthBar.nameText:Hide() healthBar.nameText:Hide()
end end
end end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.healthBarFontColor)) healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
healthBar.nameText:SetPoint("LEFT", Gladdy.db.healthTextLeftHOffset, Gladdy.db.healthTextLeftVOffset)
healthBar.healthText:SetPoint("RIGHT", Gladdy.db.healthTextRightHOffset, Gladdy.db.healthTextRightVOffset)
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end end
function Healthbar:ResetUnit(unit) function Healthbar:ResetUnit(unit)
@ -302,8 +216,6 @@ function Healthbar:ResetUnit(unit)
healthBar.nameText:SetText("") healthBar.nameText:SetText("")
healthBar.healthText:SetText("") healthBar.healthText:SetText("")
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.hp.current = nil
healthBar.hp.max = nil
end end
function Healthbar:Test(unit) function Healthbar:Test(unit)
@ -313,30 +225,17 @@ function Healthbar:Test(unit)
return return
end end
Gladdy:SendMessage("UNIT_HEALTH", unit, button.health, button.healthMax) self:JOINED_ARENA()
healthBar.hp.current = button.health
healthBar.hp.max = button.healthMax
self:ENEMY_SPOTTED(unit) self:ENEMY_SPOTTED(unit)
self:SetText(unit, button.health, button.healthMax) self:UNIT_HEALTH(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 end
function Healthbar:JOINED_ARENA() function Healthbar:JOINED_ARENA()
if Gladdy.db.healthNameToArenaId and Gladdy.db.healthName then
for i=1,Gladdy.curBracket do for i=1,Gladdy.curBracket do
local unit = "arena" .. i local healthBar = self.frames["arena" .. i]
self:SetText(unit, self.frames[unit].hp.current, self.frames[unit].hp.max) healthBar.nameText:SetText(i)
end
end end
end end
@ -352,23 +251,53 @@ function Healthbar:ENEMY_SPOTTED(unit)
local healthMax = UnitHealthMax(unit) local healthMax = UnitHealthMax(unit)
healthBar.hp:SetMinMaxValues(0, healthMax) healthBar.hp:SetMinMaxValues(0, healthMax)
healthBar.hp:SetValue(health) healthBar.hp:SetValue(health)
healthBar.hp.current = health Healthbar:SetHealthText(healthBar, health, healthMax)
healthBar.hp.max = healthMax end
if 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)
end end
Healthbar:SetText(unit, healthBar.hp.current, healthBar.hp.max)
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max)
end end
function Healthbar:ENEMY_STEALTH(unit, stealth) function Healthbar:UNIT_HEALTH(unit, health, healthMax)
local healthBar = self.frames[unit] local healthBar = self.frames[unit]
local button = Gladdy.buttons[unit] if (not healthBar) then
if (not healthBar or not button) then
return return
end end
if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true)
end
Gladdy:SendMessage("UNIT_HEALTH", unit, health, healthMax)
healthBar.hp.stealth = stealth local healthPercentage = floor(health * 100 / healthMax)
local healthText
Healthbar:SetHealthStatusBarColor(unit, healthBar.hp.current, healthBar.hp.max) if (Gladdy.db.healthActual) then
healthText = healthMax > 999 and ("%.1fk"):format(health / 1000) or health
end
if (Gladdy.db.healthMax) then
local text = healthMax > 999 and ("%.1fk"):format(healthMax / 1000) or healthMax
if (healthText) then
healthText = ("%s/%s"):format(healthText, text)
else
healthText = text
end
end
if (Gladdy.db.healthPercentage) then
if (healthText) then
healthText = ("%s (%d%%)"):format(healthText, healthPercentage)
else
healthText = ("%d%%"):format(healthPercentage)
end
end
healthBar.healthText:SetText(healthText)
healthBar.hp:SetValue(healthPercentage)
end end
function Healthbar:UNIT_DEATH(unit) function Healthbar:UNIT_DEATH(unit)
@ -378,8 +307,7 @@ function Healthbar:UNIT_DEATH(unit)
end end
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.hp.current = 0 healthBar.healthText:SetText(L["DEAD"])
Healthbar:SetText(unit, 0, 100, L["DEAD"])
end end
function Healthbar:UNIT_DESTROYED(unit) function Healthbar:UNIT_DESTROYED(unit)
@ -389,8 +317,8 @@ function Healthbar:UNIT_DESTROYED(unit)
end end
healthBar.hp:SetValue(0) healthBar.hp:SetValue(0)
healthBar.hp.current = 0 healthBar.healthText:SetText(L["LEAVE"])
Healthbar:SetText(unit, 0, 100, L["LEAVE"]) healthBar.nameText:SetText("")
end end
local function option(params) local function option(params)
@ -406,11 +334,9 @@ local function option(params)
if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then
Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2 Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2
end end
if Gladdy.frame.testing then
for i=1,Gladdy.curBracket do for i=1,Gladdy.curBracket do
Healthbar:Test("arena" .. i) Healthbar:Test("arena" .. i)
end end
end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
} }
@ -463,76 +389,19 @@ function Healthbar:GetOptions()
dialogControl = "LSM30_Statusbar", dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar, values = AceGUIWidgetLSMlists.statusbar,
}), }),
},
},
barColor = {
type = "group",
name = L["Bar Color"],
order = 2,
args = {
headerAuras = {
type = "header",
name = L["Color"],
order = 1,
},
healthBarClassColored = Gladdy:option({
type = "toggle",
name = L["Class colored"] .. " " .. L["Health Bar"],
order = 2,
width = "full",
}),
healthBarStealthColor = Gladdy:colorOption({
type = "color",
name = L["Stealth Color"],
order = 3,
hasAlpha = true,
}),
healthBarBgColor = Gladdy:colorOption({ healthBarBgColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Background color"], name = L["Background color"],
desc = L["Color of the status bar background"], desc = L["Color of the status bar background"],
order = 4, order = 5,
hasAlpha = true, hasAlpha = true,
}), }),
headerAuras = {
type = "header",
name = L["Custom Colors"],
order = 10,
},
healthBarColoredByCurrentHp = Gladdy:option({
type = "toggle",
name = L["Enable Custom Colors"],
order = 11,
width = "full",
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMax = Gladdy:colorOption({
type = "color",
name = L["100%"],
order = 12,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMid = Gladdy:colorOption({
type = "color",
name = L["50%"],
order = 13,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
healthBarStatusBarColorMin = Gladdy:colorOption({
type = "color",
name = L["0%"],
order = 14,
hasAlpha = false,
disabled = function() return Gladdy.db.healthBarClassColored end,
}),
}, },
}, },
font = { font = {
type = "group", type = "group",
name = L["Font"], name = L["Font"],
order = 3, order = 2,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -554,28 +423,11 @@ function Healthbar:GetOptions()
order = 12, order = 12,
hasAlpha = true, hasAlpha = true,
}), }),
healthTextLeftOutline = option({
type = "toggle",
name = L["Left Font Outline"],
order = 13,
width = "full",
}),
healthTextRightOutline = option({
type = "toggle",
name = L["Right Font Outline"],
order = 14,
width = "full",
}),
headerSize = {
type = "header",
name = L["Size"],
order = 20,
},
healthBarNameFontSize = option({ healthBarNameFontSize = option({
type = "range", type = "range",
name = L["Name font size"], name = L["Name font size"],
desc = L["Size of the name text"], desc = L["Size of the name text"],
order = 21, order = 13,
step = 0.1, step = 0.1,
min = 0, min = 0,
max = 20, max = 20,
@ -585,59 +437,18 @@ function Healthbar:GetOptions()
type = "range", type = "range",
name = L["Health font size"], name = L["Health font size"],
desc = L["Size of the health text"], desc = L["Size of the health text"],
order = 22, order = 14,
step = 0.1, step = 0.1,
min = 0, min = 0,
max = 20, max = 20,
width = "full", width = "full",
}), }),
headerOffsets = {
type = "header",
name = L["Offsets"],
order = 30,
},
healthTextLeftVOffset = option({
type = "range",
name = L["Left Text Vertical Offset"],
order = 31,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextLeftHOffset = option({
type = "range",
name = L["Left Text Horizontal Offset"],
order = 32,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextRightVOffset = option({
type = "range",
name = L["Right Text Vertical Offset"],
order = 33,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
healthTextRightHOffset = option({
type = "range",
name = L["Right Text Horizontal Offset"],
order = 34,
step = 0.1,
min = -200,
max = 200,
width = "full",
}),
}, },
}, },
border = { border = {
type = "group", type = "group",
name = L["Border"], name = L["Border"],
order = 4, order = 3,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -670,39 +481,10 @@ function Healthbar:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 5,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
healthFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
healthFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
healthValues = { healthValues = {
type = "group", type = "group",
name = L["Health Bar Text"], name = L["Health Bar Text"],
order = 6, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -715,7 +497,6 @@ function Healthbar:GetOptions()
desc = L["Show the units name"], desc = L["Show the units name"],
order = 2, order = 2,
width = "full", width = "full",
disabled = function() return Gladdy.db.healthCustomTagsEnabled end,
}), }),
healthNameToArenaId = option({ healthNameToArenaId = option({
type = "toggle", type = "toggle",
@ -723,7 +504,21 @@ function Healthbar:GetOptions()
desc = L["Show 1-5 as name instead"], desc = L["Show 1-5 as name instead"],
order = 3, order = 3,
width = "full", width = "full",
disabled = function() return not Gladdy.db.healthName or Gladdy.db.healthCustomTagsEnabled end, disabled = function() return not Gladdy.db.healthName end
}),
healthActual = option({
type = "toggle",
name = L["Show the actual health"],
desc = L["Show the actual health on the health bar"],
order = 4,
width = "full",
}),
healthMax = option({
type = "toggle",
name = L["Show max health"],
desc = L["Show max health on the health bar"],
order = 5,
width = "full",
}), }),
healthPercentage = option({ healthPercentage = option({
type = "toggle", type = "toggle",
@ -731,16 +526,7 @@ function Healthbar:GetOptions()
desc = L["Show health percentage on the health bar"], desc = L["Show health percentage on the health bar"],
order = 6, order = 6,
width = "full", 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

@ -13,8 +13,6 @@ local Highlight = Gladdy:NewModule("Highlight", nil, {
targetBorder = true, targetBorder = true,
focusBorder = true, focusBorder = true,
leaderBorder = true, leaderBorder = true,
highlightFrameStrata = "MEDIUM",
highlightFrameLevel = 20,
}) })
function Highlight:Initialize() function Highlight:Initialize()
@ -57,21 +55,18 @@ function Highlight:CreateFrame(unit)
local healthBar = Gladdy.modules["Health Bar"].frames[unit] local healthBar = Gladdy.modules["Health Bar"].frames[unit]
local targetBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local targetBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) targetBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize })
targetBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata) --targetBorder:SetFrameStrata("MEDIUM")
targetBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
targetBorder:Hide() targetBorder:Hide()
local focusBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local focusBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) focusBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize })
focusBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata) --focusBorder:SetFrameStrata("MEDIUM")
focusBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
focusBorder:Hide() focusBorder:Hide()
local leaderBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local leaderBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) leaderBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize })
leaderBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata) --leaderBorder:SetFrameStrata("MEDIUM")
leaderBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
leaderBorder:Hide() leaderBorder:Hide()
local highlight = healthBar:CreateTexture(nil, "OVERLAY") local highlight = healthBar:CreateTexture(nil, "OVERLAY")
@ -101,13 +96,6 @@ function Highlight:UpdateFrame(unit)
local width = Gladdy.db.barWidth + (Gladdy.db.highlightInset and 0 or borderSize * 2) local width = Gladdy.db.barWidth + (Gladdy.db.highlightInset and 0 or borderSize * 2)
local height = hpAndPowerHeight + (Gladdy.db.highlightInset and 0 or borderSize * 2) local height = hpAndPowerHeight + (Gladdy.db.highlightInset and 0 or borderSize * 2)
button.targetBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.targetBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.focusBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.focusBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.leaderBorder:SetFrameStrata(Gladdy.db.highlightFrameStrata)
button.leaderBorder:SetFrameLevel(Gladdy.db.highlightFrameLevel)
button.targetBorder:SetWidth(width) button.targetBorder:SetWidth(width)
button.targetBorder:SetHeight(height) button.targetBorder:SetHeight(height)
button.targetBorder:ClearAllPoints() button.targetBorder:ClearAllPoints()
@ -118,8 +106,8 @@ function Highlight:UpdateFrame(unit)
button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end end
button.targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.targetBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize })
button.targetBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.targetBorderColor)) button.targetBorder:SetBackdropBorderColor(Gladdy.db.targetBorderColor.r, Gladdy.db.targetBorderColor.g, Gladdy.db.targetBorderColor.b, Gladdy.db.targetBorderColor.a)
button.focusBorder:SetWidth(width) button.focusBorder:SetWidth(width)
button.focusBorder:SetHeight(height) button.focusBorder:SetHeight(height)
@ -131,8 +119,8 @@ function Highlight:UpdateFrame(unit)
button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end end
button.focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.focusBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize })
button.focusBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.focusBorderColor)) button.focusBorder:SetBackdropBorderColor(Gladdy.db.focusBorderColor.r, Gladdy.db.focusBorderColor.g, Gladdy.db.focusBorderColor.b, Gladdy.db.focusBorderColor.a)
button.leaderBorder:SetWidth(width) button.leaderBorder:SetWidth(width)
button.leaderBorder:SetHeight(height) button.leaderBorder:SetHeight(height)
@ -144,8 +132,8 @@ function Highlight:UpdateFrame(unit)
button.leaderBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) button.leaderBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end end
button.leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.leaderBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize })
button.leaderBorder:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.leaderBorderColor)) button.leaderBorder:SetBackdropBorderColor(Gladdy.db.leaderBorderColor.r, Gladdy.db.leaderBorderColor.g, Gladdy.db.leaderBorderColor.b, Gladdy.db.leaderBorderColor.a)
if Gladdy.frame.testing then if Gladdy.frame.testing then
Highlight:Test(unit) Highlight:Test(unit)
end end
@ -219,17 +207,42 @@ function Highlight:GetOptions()
desc = L["Show Highlight border inside of frame"], desc = L["Show Highlight border inside of frame"],
order = 3, order = 3,
}), }),
group = { highlightBorderSize = Gladdy:option({
type = "group", type = "range",
childGroups = "tree", name = L["Border size"],
name = L["Frame"], desc = L["Border size"],
order = 3, order = 4,
args = { min = 1,
enabled = { max = 20,
type = "group", step = 1,
name = L["Enabled"], width = "full",
order = 1, }),
args = { highlightBorderStyle = Gladdy:option({
type = "select",
name = L["Border style"],
order = 5,
dialogControl = "LSM30_Border",
values = AceGUIWidgetLSMlists.border,
}),
headerColor = {
type = "header",
name = L["Colors"],
order = 6,
},
targetBorderColor = Gladdy:colorOption({
type = "color",
name = L["Target border color"],
desc = L["Color of the selected targets border"],
order = 7,
hasAlpha = true,
}),
focusBorderColor = Gladdy:colorOption({
type = "color",
name = L["Focus border color"],
desc = L["Color of the focus border"],
order = 8,
hasAlpha = true,
}),
headerEnable = { headerEnable = {
type = "header", type = "header",
name = L["Enabled"], name = L["Enabled"],
@ -256,93 +269,5 @@ function Highlight:GetOptions()
order = 13, order = 13,
width = "full", width = "full",
}), }),
},
},
border = {
type = "group",
name = L["Border"],
order = 2,
args = {
headerHighlight = {
type = "header",
name = L["Border"],
order = 2,
},
highlightBorderSize = Gladdy:option({
type = "range",
name = L["Border size"],
desc = L["Border size"],
order = 4,
min = 1,
max = 20,
step = 1,
width = "full",
}),
highlightBorderStyle = Gladdy:option({
type = "select",
name = L["Border style"],
order = 5,
dialogControl = "LSM30_Border",
values = AceGUIWidgetLSMlists.border,
}),
},
},
color = {
type = "group",
name = L["Color"],
order = 3,
args = {
headerColor = {
type = "header",
name = L["Colors"],
order = 6,
},
targetBorderColor = Gladdy:colorOption({
type = "color",
name = L["Target border color"],
desc = L["Color of the selected targets border"],
order = 7,
hasAlpha = true,
}),
focusBorderColor = Gladdy:colorOption({
type = "color",
name = L["Focus border color"],
desc = L["Color of the focus border"],
order = 8,
hasAlpha = true,
}),
},
},
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
highlightFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
highlightFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
},
},
} }
end end

View File

@ -1,6 +1,6 @@
local string_gsub, floor, pairs = string.gsub, math.floor, pairs local string_gsub, floor, pairs = string.gsub, math.floor, pairs
local CreateFrame, SetPortraitTexture = CreateFrame, SetPortraitTexture local CreateFrame, SetPortraitTexture = CreateFrame, SetPortraitTexture
local UnitHealthMax, UnitHealth, UnitGUID, UnitExists = UnitHealthMax, UnitHealth, UnitGUID, UnitExists local UnitHealthMax, UnitHealth, UnitGUID = UnitHealthMax, UnitHealth, UnitGUID
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
@ -23,48 +23,24 @@ local Pets = Gladdy:NewModule("Pets", nil, {
petHealthPercentage = true, petHealthPercentage = true,
petXOffset = 1, petXOffset = 1,
petYOffset = -62, petYOffset = -62,
petGroup = false,
petMargin = 1,
petFrameStrata = "MEDIUM",
petFrameLevel = 5,
}) })
function Pets:Initialize() function Pets:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.petEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("PET_SPOTTED") self:RegisterMessage("PET_SPOTTED")
self:RegisterMessage("PET_DESTROYED") self:RegisterMessage("PET_DESTROYED")
self:RegisterMessage("PET_STEALTH") self:RegisterMessage("PET_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED") 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")
self:RegisterMessage("UNIT_DEATH")
else
self:UnregisterAllMessages()
end
end end
function Pets:JOINED_ARENA() function Pets:JOINED_ARENA()
for _,v in pairs(self.frames) do for k,v in pairs(self.frames) do
v.healthBar:SetAlpha(0) v.healthBar:SetAlpha(0)
end end
for i=1,Gladdy.curBracket do
if UnitExists("arenapet" .. i) then
Gladdy:SendMessage("PET_SPOTTED", "arenapet" .. i)
end
end
if Gladdy.db.petEnabled then if Gladdy.db.petEnabled then
self:RegisterEvent("UNIT_PET") self:RegisterEvent("UNIT_PET")
self:SetScript("OnEvent", function(_, event, unitId) self:SetScript("OnEvent", function(self, event, unitId)
if event == "UNIT_PET" then if event == "UNIT_PET" then
local unit = Gladdy.guids[UnitGUID(unitId)] local unit = Gladdy.guids[UnitGUID(unitId)]
if unit then if unit then
@ -83,34 +59,27 @@ function Pets:ResetUnit(unitId)
end end
petFrame.healthBar:SetAlpha(0) petFrame.healthBar:SetAlpha(0)
petFrame.healthBar:SetScript("OnUpdate", nil) petFrame.healthBar:SetScript("OnUpdate", nil)
petFrame.healthBar.portrait:SetTexture(nil)
self:UnregisterEvent("UNIT_PET") self:UnregisterEvent("UNIT_PET")
end end
function Pets:PET_SPOTTED(unit) function Pets:PET_SPOTTED(unit)
Gladdy.guids[UnitGUID(unit)] = unit
if Gladdy.db.petEnabled then if Gladdy.db.petEnabled then
self.frames[unit].healthBar:SetAlpha(1) self.frames[unit].healthBar:SetAlpha(1)
self.frames[unit].healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor)) self.frames[unit].healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a)
self.frames[unit].healthBar:SetScript("OnUpdate", function(self) self.frames[unit].healthBar:SetScript("OnUpdate", function(self)
self.hp:SetValue(UnitHealth(self.unit)) self.hp:SetValue(UnitHealth(self.unit))
Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit)) Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit))
end) end)
end end
Gladdy:Print(self.frames[unit].healthBar:GetAlpha())
end end
function Pets:PET_DESTROYED(unit) function Pets:PET_DESTROYED(unit)
if Gladdy.db.petEnabled and self.frames[unit] then if Gladdy.db.petEnabled then
self.frames[unit].healthBar:SetAlpha(0) self.frames[unit].healthBar:SetAlpha(0)
self.frames[unit].healthBar:SetScript("OnUpdate", nil) self.frames[unit].healthBar:SetScript("OnUpdate", nil)
end end
end end
function Pets:UNIT_DEATH(unit)
self:PET_DESTROYED(unit)
end
function Pets:PET_STEALTH(unit) function Pets:PET_STEALTH(unit)
if Gladdy.db.petEnabled then if Gladdy.db.petEnabled then
self.frames[unit].healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1) self.frames[unit].healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1)
@ -134,7 +103,6 @@ function Pets:CheckUnitPet(unitId)
petFrame.healthBar.hp:SetMinMaxValues(0, UnitHealthMax(unit)) petFrame.healthBar.hp:SetMinMaxValues(0, UnitHealthMax(unit))
petFrame.healthBar.hp:SetValue(UnitHealth(unit)) petFrame.healthBar.hp:SetValue(UnitHealth(unit))
Pets:SetHealthText(petFrame.healthBar, UnitHealth(unit), UnitHealthMax(unit)) Pets:SetHealthText(petFrame.healthBar, UnitHealth(unit), UnitHealthMax(unit))
SetPortraitTexture(petFrame.healthBar.portrait, unit)
petFrame.healthBar:SetScript("OnUpdate", function(self) petFrame.healthBar:SetScript("OnUpdate", function(self)
self.hp:SetValue(UnitHealth(self.unit)) self.hp:SetValue(UnitHealth(self.unit))
Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit)) Pets:SetHealthText(self, UnitHealth(unit), UnitHealthMax(unit))
@ -166,7 +134,6 @@ function Pets:CreateFrame(unitId)
return return
end end
local button = CreateFrame("Frame", "GladdyButtonFramePet" .. unit, Gladdy.frame) local button = CreateFrame("Frame", "GladdyButtonFramePet" .. unit, Gladdy.frame)
button:SetMovable(true)
--button:SetAlpha(0) --button:SetAlpha(0)
button:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset) button:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
@ -182,11 +149,10 @@ function Pets:CreateFrame(unitId)
button.secure = secure button.secure = secure
local healthBar = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") local healthBar = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate")
healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"), healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle),
edgeSize = Gladdy.db.petHealthBarBorderSize }) edgeSize = Gladdy.db.petHealthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor)) healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a)
healthBar:SetFrameStrata(Gladdy.db.petFrameStrata) healthBar:SetFrameLevel(1)
healthBar:SetFrameLevel(Gladdy.db.petFrameLevel)
healthBar:SetAllPoints(button) healthBar:SetAllPoints(button)
healthBar:SetAlpha(0) healthBar:SetAlpha(0)
@ -197,47 +163,46 @@ function Pets:CreateFrame(unitId)
healthBar.portrait.border = healthBar:CreateTexture(nil, "OVERLAY") healthBar.portrait.border = healthBar:CreateTexture(nil, "OVERLAY")
healthBar.portrait.border:SetAllPoints(healthBar.portrait) healthBar.portrait.border:SetAllPoints(healthBar.portrait)
healthBar.portrait.border:SetTexture(Gladdy.db.classIconBorderStyle) healthBar.portrait.border:SetTexture(Gladdy.db.classIconBorderStyle)
healthBar.portrait.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor)) healthBar.portrait.border:SetVertexColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a)
healthBar.hp = CreateFrame("StatusBar", nil, healthBar) healthBar.hp = CreateFrame("StatusBar", nil, healthBar)
healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture))
healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor)) healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a)
healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetMinMaxValues(0, 100)
healthBar.hp:SetFrameStrata(Gladdy.db.petFrameStrata) healthBar.hp:SetFrameLevel(0)
healthBar.hp:SetFrameLevel(Gladdy.db.petFrameLevel - 1)
healthBar.hp:SetAllPoints(healthBar) healthBar.hp:SetAllPoints(healthBar)
healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND")
healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture))
healthBar.bg:ClearAllPoints() healthBar.bg:ClearAllPoints()
healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAllPoints(healthBar.hp)
healthBar.bg:SetAlpha(1) healthBar.bg:SetAlpha(1)
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBgColor)) healthBar.bg:SetVertexColor(Gladdy.db.petHealthBarBgColor.r, Gladdy.db.petHealthBarBgColor.g, Gladdy.db.petHealthBarBgColor.b, Gladdy.db.petHealthBarBgColor.a)
healthBar.nameText = healthBar:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall")
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
else else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize)
healthBar.nameText:Show() healthBar.nameText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor)) healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a)
healthBar.nameText:SetShadowOffset(1, -1) healthBar.nameText:SetShadowOffset(1, -1)
healthBar.nameText:SetShadowColor(0, 0, 0, 1) healthBar.nameText:SetShadowColor(0, 0, 0, 1)
healthBar.nameText:SetJustifyH("CENTER") healthBar.nameText:SetJustifyH("CENTER")
healthBar.nameText:SetPoint("LEFT", 5, 0) healthBar.nameText:SetPoint("LEFT", 5, 0)
healthBar.healthText = healthBar:CreateFontString(nil, "OVERLAY") healthBar.healthText = healthBar:CreateFontString(nil, "LOW")
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1)
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize)
healthBar.healthText:Hide() healthBar.healthText:Hide()
end end
healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor)) healthBar.healthText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a)
healthBar.healthText:SetShadowOffset(1, -1) healthBar.healthText:SetShadowOffset(1, -1)
healthBar.healthText:SetShadowColor(0, 0, 0, 1) healthBar.healthText:SetShadowColor(0, 0, 0, 1)
healthBar.healthText:SetJustifyH("CENTER") healthBar.healthText:SetJustifyH("CENTER")
@ -246,7 +211,7 @@ function Pets:CreateFrame(unitId)
healthBar.unit = unit healthBar.unit = unit
button.healthBar = healthBar button.healthBar = healthBar
healthBar:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", unit) healthBar:RegisterUnitEvent("UNIT_HEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit) healthBar:RegisterUnitEvent("UNIT_MAXHEALTH", unit)
healthBar:RegisterUnitEvent("UNIT_PORTRAIT_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_PORTRAIT_UPDATE", unit)
healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit) healthBar:RegisterUnitEvent("UNIT_NAME_UPDATE", unit)
@ -276,11 +241,6 @@ function Pets:UpdateFrame(unitId)
return return
end end
healthBar:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar:SetFrameLevel(Gladdy.db.petFrameLevel)
healthBar.hp:SetFrameStrata(Gladdy.db.petFrameStrata)
healthBar.hp:SetFrameLevel(Gladdy.db.petFrameLevel - 1)
if not Gladdy.db.petEnabled then if not Gladdy.db.petEnabled then
self.frames[unit]:Hide() self.frames[unit]:Hide()
else else
@ -289,22 +249,7 @@ function Pets:UpdateFrame(unitId)
self.frames[unit]:SetWidth(Gladdy.db.petWidth) self.frames[unit]:SetWidth(Gladdy.db.petWidth)
self.frames[unit]:SetHeight(Gladdy.db.petHeight) self.frames[unit]:SetHeight(Gladdy.db.petHeight)
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
Gladdy:SetPosition(self.frames[unit], unitId, "petXOffset", "petYOffset", Pets:LegacySetPosition(unit, unitId), Pets)
if (Gladdy.db.petGroup) then
if (unit == "arenapet1") then
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", Gladdy.buttons[unitId].healthBar, "TOPLEFT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
else
local previousPet = "arenapet" .. string_gsub(unit, "arenapet", "") - 1
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", self.frames[previousPet], "BOTTOMLEFT", 0, - Gladdy.db.petMargin)
end
else
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", Gladdy.buttons[unitId].healthBar, "TOPLEFT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
end
healthBar.portrait:SetHeight(Gladdy.db.petHeight) healthBar.portrait:SetHeight(Gladdy.db.petHeight)
healthBar.portrait:SetWidth(Gladdy.db.petHeight) healthBar.portrait:SetWidth(Gladdy.db.petHeight)
@ -316,37 +261,34 @@ function Pets:UpdateFrame(unitId)
healthBar.portrait.border:Show() healthBar.portrait.border:Show()
end end
healthBar.portrait.border:SetTexture(Gladdy.db.petPortraitBorderStyle) healthBar.portrait.border:SetTexture(Gladdy.db.petPortraitBorderStyle)
healthBar.portrait.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor)) healthBar.portrait.border:SetVertexColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a)
healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture))
healthBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.petHealthBarBgColor)) healthBar.bg:SetVertexColor(Gladdy.db.petHealthBarBgColor.r, Gladdy.db.petHealthBarBgColor.g, Gladdy.db.petHealthBarBgColor.b, Gladdy.db.petHealthBarBgColor.a)
healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"), healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle),
edgeSize = Gladdy.db.petHealthBarBorderSize }) edgeSize = Gladdy.db.petHealthBarBorderSize })
healthBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.petHealthBarBorderColor)) healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a)
healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture))
healthBar.hp:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.petHealthBarColor)) healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a)
healthBar.hp:ClearAllPoints() healthBar.hp:ClearAllPoints()
healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset))
healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset))
if (Gladdy.db.petHealthBarFontSize < 1) then if (Gladdy.db.petHealthBarFontSize < 1) then
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1)
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1)
healthBar.nameText:Hide() healthBar.nameText:Hide()
healthBar.healthText:Hide() healthBar.healthText:Hide()
else else
healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize)
healthBar.nameText:Show() healthBar.nameText:Show()
healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize)
healthBar.healthText:Show() healthBar.healthText:Show()
end end
healthBar.nameText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor)) healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a)
healthBar.healthText:SetTextColor(Gladdy:SetColor(Gladdy.db.petHealthBarFontColor)) healthBar.healthText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a)
if (unit == "arenapet1") then
Gladdy:CreateMover(self.frames[unit], "petXOffset", "petYOffset", L["Pets"], {"TOPLEFT", "TOPLEFT"})
end
end end
function Pets:SetHealthText(healthBar, health, healthMax) function Pets:SetHealthText(healthBar, health, healthMax)
@ -359,7 +301,7 @@ function Pets:SetHealthText(healthBar, health, healthMax)
healthText = ("%d%%"):format(healthPercentage) healthText = ("%d%%"):format(healthPercentage)
end end
else else
healthText = "" healthText = "DEAD"
end end
healthBar.healthText:SetText(healthText) healthBar.healthText:SetText(healthText)
@ -402,17 +344,11 @@ function Pets:GetOptions()
desc = L["Enables Pets module"], desc = L["Enables Pets module"],
order = 3, order = 3,
}), }),
petGroup = option({
type = "toggle",
name = L["Group Pets"],
order = 4,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 3, order = 3,
disabled = function() return not Gladdy.db.petEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -444,23 +380,11 @@ function Pets:GetOptions()
step = 1, step = 1,
width = "full", width = "full",
}), }),
petMargin = option({
type = "range",
name = L["Margin"],
desc = L["Height of the bar"],
order = 6,
disabled = function()
return not Gladdy.db.petGroup
end,
min = 0,
max = 50,
step = .1,
}),
petHealthBarTexture = option({ petHealthBarTexture = option({
type = "select", type = "select",
name = L["Bar texture"], name = L["Bar texture"],
desc = L["Texture of the bar"], desc = L["Texture of the bar"],
order = 7, order = 5,
dialogControl = "LSM30_Statusbar", dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar, values = AceGUIWidgetLSMlists.statusbar,
}), }),
@ -468,14 +392,14 @@ function Pets:GetOptions()
type = "color", type = "color",
name = L["Health color"], name = L["Health color"],
desc = L["Color of the status bar"], desc = L["Color of the status bar"],
order = 8, order = 6,
hasAlpha = true, hasAlpha = true,
}), }),
petHealthBarBgColor = Gladdy:colorOption({ petHealthBarBgColor = Gladdy:colorOption({
type = "color", type = "color",
name = L["Background color"], name = L["Background color"],
desc = L["Color of the status bar background"], desc = L["Color of the status bar background"],
order = 9, order = 7,
hasAlpha = true, hasAlpha = true,
}), }),
}, },
@ -606,39 +530,10 @@ function Pets:GetOptions()
}), }),
} }
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
petFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
petFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
healthValues = { healthValues = {
type = "group", type = "group",
name = L["Health Values"], name = L["Health Values"],
order = 7, order = 6,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -657,30 +552,3 @@ function Pets:GetOptions()
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Pets:LegacySetPosition(unit, unitId)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
if (Gladdy.db.petGroup) then
if (unit == "arenapet1") then
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
else
local previousPet = "arenapet" .. string_gsub(unit, "arenapet", "") - 1
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("TOPLEFT", self.frames[previousPet], "BOTTOMLEFT", 0, - Gladdy.db.petMargin)
end
else
self.frames[unit]:ClearAllPoints()
self.frames[unit]:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
end
return Gladdy.db.newLayout
end

View File

@ -16,46 +16,21 @@ local Powerbar = Gladdy:NewModule("Power Bar", 90, {
powerBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, powerBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 },
powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 }, powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 },
powerBarRaceFontSize = 10, powerBarFontSize = 10,
powerBarPowerFontSize = 10,
powerShowSpec = true, powerShowSpec = true,
powerShowRace = true, powerShowRace = true,
powerActual = true, powerActual = true,
powerMax = true, powerMax = true,
powerPercentage = false, powerPercentage = false,
powerFrameStrata = "MEDIUM",
powerFrameLevel = 1,
powerCustomTagsEnabled = false,
powerTextLeft = "[spec] [race]",
powerTextRight = "[current]/[max]",
powerTextLeftOutline = false,
powerTextRightOutline = false,
powerTextLeftVOffset = 1,
powerTextLeftHOffset = 5,
powerTextRightVOffset = 1,
powerTextRightHOffset = -5,
}) })
function Powerbar:Initialize() function Powerbar:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.powerBarEnabled then
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DESTROYED")
end
end
function Powerbar:UpdateFrameOnce()
if Gladdy.db.powerBarEnabled then
self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("UNIT_SPEC")
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("UNIT_DESTROYED")
else
self:UnregisterAllMessages()
end
end end
function Powerbar:CreateFrame(unit) function Powerbar:CreateFrame(unit)
@ -63,125 +38,65 @@ function Powerbar:CreateFrame(unit)
local powerBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local powerBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate")
powerBar:EnableMouse(false) powerBar:EnableMouse(false)
powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"), powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle),
edgeSize = Gladdy.db.powerBarBorderSize }) edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.powerBarBorderColor)) powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a)
powerBar:SetFrameStrata(Gladdy.db.powerFrameStrata) powerBar:SetFrameLevel(1)
powerBar:SetFrameLevel(Gladdy.db.powerFrameLevel)
powerBar.energy = CreateFrame("StatusBar", nil, powerBar) powerBar.energy = CreateFrame("StatusBar", nil, powerBar)
powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture))
powerBar.energy:SetMinMaxValues(0, 100) powerBar.energy:SetMinMaxValues(0, 100)
powerBar.energy:SetFrameStrata(Gladdy.db.powerFrameStrata) powerBar.energy:SetFrameLevel(0)
powerBar.energy:SetFrameLevel(Gladdy.db.powerFrameLevel - 1)
powerBar.bg = powerBar.energy:CreateTexture(nil, "BACKGROUND") powerBar.bg = powerBar.energy:CreateTexture(nil, "BACKGROUND")
powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture))
powerBar.bg:ClearAllPoints() powerBar.bg:ClearAllPoints()
powerBar.bg:SetAllPoints(powerBar.energy) powerBar.bg:SetAllPoints(powerBar.energy)
powerBar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.powerBarBgColor)) powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a)
powerBar.raceText = powerBar:CreateFontString(nil, "OVERLAY") powerBar.raceText = powerBar:CreateFontString(nil, "LOW")
powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarRaceFontSize, Gladdy.db.powerTextLeftOutline and "OUTLINE") powerBar.raceText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize)
powerBar.raceText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor)) powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
powerBar.raceText:SetShadowOffset(1, -1) powerBar.raceText:SetShadowOffset(1, -1)
powerBar.raceText:SetShadowColor(0, 0, 0, 1) powerBar.raceText:SetShadowColor(0, 0, 0, 1)
powerBar.raceText:SetJustifyH("CENTER") powerBar.raceText:SetJustifyH("CENTER")
powerBar.raceText:SetPoint("LEFT", Gladdy.db.powerTextLeftHOffset, Gladdy.db.powerTextLeftVOffset) powerBar.raceText:SetPoint("LEFT", 5, 1)
powerBar.powerText = powerBar:CreateFontString(nil, "OVERLAY") powerBar.powerText = powerBar:CreateFontString(nil, "LOW")
powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarPowerFontSize, Gladdy.db.powerTextRightOutline and "OUTLINE") powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize)
powerBar.powerText:SetTextColor(Gladdy:SetColor(Gladdy.db.powerBarFontColor)) powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
powerBar.powerText:SetShadowOffset(1, -1) powerBar.powerText:SetShadowOffset(1, -1)
powerBar.powerText:SetShadowColor(0, 0, 0, 1) powerBar.powerText:SetShadowColor(0, 0, 0, 1)
powerBar.powerText:SetJustifyH("CENTER") powerBar.powerText:SetJustifyH("CENTER")
powerBar.powerText:SetPoint("RIGHT", Gladdy.db.powerTextRightHOffset, Gladdy.db.powerTextRightVOffset) powerBar.powerText:SetPoint("RIGHT", -5, 1)
button.powerBar = powerBar button.powerBar = powerBar
self.frames[unit] = powerBar self.frames[unit] = powerBar
self:ResetUnit(unit) self:ResetUnit(unit)
powerBar.unit = unit
powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit) powerBar:RegisterUnitEvent("UNIT_POWER_UPDATE", unit)
powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit) powerBar:RegisterUnitEvent("UNIT_MAXPOWER", unit)
powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit) powerBar:RegisterUnitEvent("UNIT_DISPLAYPOWER", unit)
powerBar:SetScript("OnEvent", Powerbar.OnEvent) powerBar:SetScript("OnEvent", Powerbar.OnEvent)
end end
function Powerbar: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) function Powerbar.OnEvent(powerBar, event, unit)
powerBar.energy.powerType = select(1, UnitPowerType(unit)) if event == "UNIT_POWER_UPDATE" then
powerBar.energy.current, powerBar.energy.max = UnitPower(unit, powerBar.energy.powerType, true), UnitPowerMax(unit, powerBar.energy.powerType, true) Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType) elseif event == "UNIT_MAXPOWER" then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
elseif event == "UNIT_DISPLAYPOWER" then
Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
end
end end
function Powerbar:SetText(unit, power, powerMax, status) function Powerbar:SetPower(powerBar, power, powerMax, powerType)
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 powerPercentage = floor(power * 100 / powerMax)
local powerText local powerText
if (Gladdy.db.powerActual) then if (Gladdy.db.powerActual) then
powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power
end end
if (Gladdy.db.powerMax) then if (Gladdy.db.powerMax) then
local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax
if (powerText) then if (powerText) then
@ -190,6 +105,7 @@ function Powerbar:SetText(unit, power, powerMax, status)
powerText = text powerText = text
end end
end end
if (Gladdy.db.powerPercentage) then if (Gladdy.db.powerPercentage) then
if (powerText) then if (powerText) then
powerText = ("%s (%d%%)"):format(powerText, powerPercentage) powerText = ("%s (%d%%)"):format(powerText, powerPercentage)
@ -197,22 +113,6 @@ function Powerbar:SetText(unit, power, powerMax, status)
powerText = ("%d%%"):format(powerPercentage) powerText = ("%d%%"):format(powerPercentage)
end end
end end
powerBar.powerText:SetText(powerText)
end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if (button.spec and Gladdy.db.powerShowSpec) then
raceText = button.spec .. " " .. raceText
end
powerBar.raceText:SetText(raceText)
end
end
function Powerbar:SetPower(powerBar, unit, power, powerMax, powerType, status)
Powerbar:SetText(unit, power, powerMax, status)
powerBar.energy.current = power
powerBar.energy.max = powerMax
powerBar.energy.powerType = powerType
if (powerType == 1 and powerBar.powerType ~= powerType) then if (powerType == 1 and powerBar.powerType ~= powerType) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1) powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
@ -228,11 +128,51 @@ function Powerbar:SetPower(powerBar, unit, power, powerMax, powerType, status)
powerBar.powerType = powerType powerBar.powerType = powerType
end end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetMinMaxValues(0, powerMax) powerBar.energy:SetMinMaxValues(0, powerMax)
powerBar.energy:SetValue(power) powerBar.energy:SetValue(power)
end 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.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture))
powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a)
powerBar:SetWidth(healthBar:GetWidth())
powerBar:SetHeight(Gladdy.db.powerBarHeight)
powerBar:ClearAllPoints()
powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1)
powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle),
edgeSize = Gladdy.db.powerBarBorderSize })
powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a)
powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.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.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize)
powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize)
powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
end
function Powerbar:ResetUnit(unit) function Powerbar:ResetUnit(unit)
local powerBar = self.frames[unit] local powerBar = self.frames[unit]
if (not powerBar) then if (not powerBar) then
@ -254,14 +194,8 @@ function Powerbar:Test(unit)
return return
end end
powerBar.energy.current = button.power
powerBar.energy.max = button.powerMax
powerBar.energy.powerType = button.powerType
self:ENEMY_SPOTTED(unit) self:ENEMY_SPOTTED(unit)
self:UNIT_POWER(unit, button.power, button.powerMax, button.powerType) self:UNIT_POWER(unit, button.power, button.powerMax, button.powerType)
if unit == "arena1" then
self:UNIT_DEATH(unit)
end
end end
function Powerbar:ENEMY_SPOTTED(unit) function Powerbar:ENEMY_SPOTTED(unit)
@ -271,10 +205,15 @@ function Powerbar:ENEMY_SPOTTED(unit)
return return
end end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if (button.spec and Gladdy.db.powerShowSpec) then
raceText = button.spec .. " " .. raceText
end
powerBar.raceText:SetText(raceText)
if UnitExists(unit) then if UnitExists(unit) then
powerBar.energy.powerType = select(1, UnitPowerType(unit)) Powerbar:SetPower(powerBar, UnitPower(unit, UnitPowerType(unit), true), UnitPowerMax(unit, UnitPowerType(unit), true), UnitPowerType(unit))
powerBar.energy.current, powerBar.energy.max = UnitPower(unit, powerBar.energy.powerType, true), UnitPowerMax(unit, powerBar.energy.powerType, true)
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType)
end end
end end
@ -284,10 +223,13 @@ function Powerbar:UNIT_SPEC(unit, spec)
if (not powerBar or not button) then if (not powerBar or not button) then
return return
end end
local raceText = Gladdy.db.powerShowRace and button.raceLoc or ""
if UnitExists(unit) then if (button.spec and Gladdy.db.powerShowSpec) then
Powerbar:SetPower(powerBar, unit, powerBar.energy.current, powerBar.energy.max, powerBar.energy.powerType) raceText = spec .. " " .. raceText
end end
powerBar.raceText:SetText(raceText)
end end
function Powerbar:UNIT_POWER(unit, power, powerMax, powerType) function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
@ -299,7 +241,44 @@ function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
if not Gladdy.buttons[unit].class then if not Gladdy.buttons[unit].class then
Gladdy:SpotEnemy(unit, true) Gladdy:SpotEnemy(unit, true)
end end
Powerbar:SetPower(powerBar, unit, power, powerMax, powerType)
local powerPercentage = floor(power * 100 / powerMax)
local powerText
if (Gladdy.db.powerActual) then
powerText = powerMax > 999 and ("%.1fk"):format(power / 1000) or power
end
if (Gladdy.db.powerMax) then
local text = powerMax > 999 and ("%.1fk"):format(powerMax / 1000) or powerMax
if (powerText) then
powerText = ("%s/%s"):format(powerText, text)
else
powerText = text
end
end
if (Gladdy.db.powerPercentage) then
if (powerText) then
powerText = ("%s (%d%%)"):format(powerText, powerPercentage)
else
powerText = ("%d%%"):format(powerPercentage)
end
end
if (powerType == 1) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
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)
end end
function Powerbar:UNIT_DEATH(unit) function Powerbar:UNIT_DEATH(unit)
@ -307,7 +286,9 @@ function Powerbar:UNIT_DEATH(unit)
if (not powerBar) then if (not powerBar) then
return return
end end
Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["DEAD"])
powerBar.energy:SetValue(0)
powerBar.powerText:SetText("0%")
end end
function Powerbar:UNIT_DESTROYED(unit) function Powerbar:UNIT_DESTROYED(unit)
@ -315,7 +296,8 @@ function Powerbar:UNIT_DESTROYED(unit)
if (not powerBar) then if (not powerBar) then
return return
end end
Powerbar:SetPower(powerBar, unit, 0, powerBar.energy.max, powerBar.energy.powerType, L["LEAVE"]) powerBar.energy:SetValue(0)
powerBar.powerText:SetText("0%")
end end
local function option(params) local function option(params)
@ -331,11 +313,9 @@ local function option(params)
if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then
Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2 Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2
end end
if Gladdy.frame.testing then
for i=1,Gladdy.curBracket do for i=1,Gladdy.curBracket do
Powerbar:Test("arena" .. i) Powerbar:Test("arena" .. i)
end end
end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
} }
@ -364,7 +344,6 @@ function Powerbar:GetOptions()
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 4, order = 4,
disabled = function() return not Gladdy.db.powerBarEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -428,84 +407,16 @@ function Powerbar:GetOptions()
order = 12, order = 12,
hasAlpha = true, hasAlpha = true,
}), }),
powerTextLeftOutline = option({ powerBarFontSize = option({
type = "toggle", type = "range",
name = L["Left Font Outline"], name = L["Font size"],
desc = L["Size of the text"],
order = 13, order = 13,
width = "full",
}),
powerTextRightOutline = option({
type = "toggle",
name = L["Right Font Outline"],
order = 14,
width = "full",
}),
headerSize = {
type = "header",
name = L["Size"],
order = 20,
},
powerBarRaceFontSize = option({
type = "range",
name = L["Race font size"],
desc = L["Size of the race text"],
order = 21,
step = 0.1, step = 0.1,
min = 0, min = 1,
max = 20, max = 20,
width = "full", 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 = { border = {
@ -544,39 +455,10 @@ function Powerbar:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 4,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
powerFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
powerFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 1,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
powerValues = { powerValues = {
type = "group", type = "group",
name = L["Power Bar Text"], name = L["Power Bar Text"],
order = 5, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
@ -588,44 +470,31 @@ function Powerbar:GetOptions()
name = L["Show race"], name = L["Show race"],
desc = L["Show race"], desc = L["Show race"],
order = 2, order = 2,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerShowSpec= option({ powerShowSpec= option({
type = "toggle", type = "toggle",
name = L["Show spec"], name = L["Show spec"],
desc = L["Show spec"], desc = L["Show spec"],
order = 3, order = 3,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerActual = option({ powerActual = option({
type = "toggle", type = "toggle",
name = L["Show the actual power"], name = L["Show the actual power"],
desc = L["Show the actual power on the power bar"], desc = L["Show the actual power on the power bar"],
order = 4, order = 31,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerMax = option({ powerMax = option({
type = "toggle", type = "toggle",
name = L["Show max power"], name = L["Show max power"],
desc = L["Show max power on the power bar"], desc = L["Show max power on the power bar"],
order = 5, order = 32,
disabled = function() return Gladdy.db.powerCustomTagsEnabled end,
}), }),
powerPercentage = option({ powerPercentage = option({
type = "toggle", type = "toggle",
name = L["Show power percentage"], name = L["Show power percentage"],
desc = L["Show power percentage on the power bar"], desc = L["Show power percentage on the power bar"],
order = 6, order = 33,
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,55 +1,36 @@
local ceil, str_gsub = ceil, string.gsub local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
local GetTime = GetTime local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Racial = Gladdy:NewModule("Racial", 79, { local Racial = Gladdy:NewModule("Racial", nil, {
racialFont = "DorisPP", racialFont = "DorisPP",
racialFontScale = 1, racialFontScale = 1,
racialEnabled = true, racialEnabled = true,
racialSize = 60 + 20 + 1, racialSize = 60 + 20 + 1,
racialWidthFactor = 0.9, racialWidthFactor = 0.9,
racialIconZoomed = false, racialAnchor = "trinket",
racialPos = "RIGHT",
racialXOffset = 0, racialXOffset = 0,
racialYOffset = 0, racialYOffset = 0,
racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
racialBorderColor = { r = 0, g = 0, b = 0, a = 1 }, racialBorderColor = { r = 0, g = 0, b = 0, a = 1 },
racialDisableCircle = false, racialDisableCircle = false,
racialCooldownAlpha = 1, racialCooldownAlpha = 1,
racialCooldownNumberAlpha = 1,
racialFrameStrata = "MEDIUM",
racialFrameLevel = 5,
racialGroup = false,
racialGroupDirection = "DOWN",
}) })
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
function Racial:Initialize() function Racial:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.racialEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("ENEMY_SPOTTED")
self:RegisterMessage("RACIAL_USED") 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 end
local function iconTimer(self,elapsed) local function iconTimer(self,elapsed)
@ -64,20 +45,20 @@ local function iconTimer(self,elapsed)
local timeLeft = ceil(self.timeLeft) local timeLeft = ceil(self.timeLeft)
if timeLeft >= 60 then if timeLeft >= 60 then
self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.racialCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 1, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 60 and timeLeft >= 30 then elseif timeLeft < 60 and timeLeft >= 30 then
self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.racialCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 1, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 30 and timeLeft >= 11 then elseif timeLeft < 30 and timeLeft >= 11 then
self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.racialCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0.7, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 10 and timeLeft >= 5 then elseif timeLeft < 10 and timeLeft >= 5 then
self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.racialCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0.7, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then elseif timeLeft < 5 and timeLeft > 0 then
self.cooldownFont:SetTextColor(1, 0, 0, Gladdy.db.racialCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
end end
Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true) Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true)
end end
@ -86,39 +67,28 @@ end
function Racial:CreateFrame(unit) function Racial:CreateFrame(unit)
local racial = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit]) local racial = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit])
racial:EnableMouse(false) racial:EnableMouse(false)
racial:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial:SetFrameLevel(Gladdy.db.racialFrameLevel)
racial.texture = racial:CreateTexture(nil, "BACKGROUND") racial.texture = racial:CreateTexture(nil, "BACKGROUND")
racial.texture:SetAllPoints(racial) racial.texture:SetAllPoints(racial)
racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
racial.texture.masked = true
--racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02") --racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate") racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate")
racial.cooldown.noCooldownCount = true --Gladdy.db.racialDisableOmniCC racial.cooldown.noCooldownCount = true --Gladdy.db.racialDisableOmniCC
racial.cooldown:SetHideCountdownNumbers(true) racial.cooldown:SetHideCountdownNumbers(true)
racial.cooldown:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldown:SetFrameLevel(Gladdy.db.racialFrameLevel + 1)
racial.cooldownFrame = CreateFrame("Frame", nil, racial) racial.cooldownFrame = CreateFrame("Frame", nil, racial)
racial.cooldownFrame:ClearAllPoints() racial.cooldownFrame:ClearAllPoints()
racial.cooldownFrame:SetPoint("TOPLEFT", racial, "TOPLEFT") racial.cooldownFrame:SetPoint("TOPLEFT", racial, "TOPLEFT")
racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT") racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT")
racial.cooldownFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldownFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 2)
racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY") racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY")
racial.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), 20, "OUTLINE") racial.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), 20, "OUTLINE")
--trinket.cooldownFont:SetAllPoints(trinket.cooldown) --trinket.cooldownFont:SetAllPoints(trinket.cooldown)
racial.cooldownFont:SetJustifyH("CENTER") racial.cooldownFont:SetJustifyH("CENTER")
racial.cooldownFont:SetPoint("CENTER") racial.cooldownFont:SetPoint("CENTER")
racial.borderFrame = CreateFrame("Frame", nil, racial) racial.borderFrame = CreateFrame("Frame", nil, racial)
racial.borderFrame:SetAllPoints(racial) racial.borderFrame:SetAllPoints(racial)
racial.borderFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.borderFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 3)
racial.texture.overlay = racial.borderFrame:CreateTexture(nil, "OVERLAY") racial.texture.overlay = racial.borderFrame:CreateTexture(nil, "OVERLAY")
racial.texture.overlay:SetAllPoints(racial) racial.texture.overlay:SetAllPoints(racial)
racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle)
@ -135,27 +105,12 @@ function Racial:UpdateFrame(unit)
return return
end end
local testAgain = false
local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize
racial:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial:SetFrameLevel(Gladdy.db.racialFrameLevel)
racial.cooldown:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldown:SetFrameLevel(Gladdy.db.racialFrameLevel + 1)
racial.cooldownFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.cooldownFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 2)
racial.borderFrame:SetFrameStrata(Gladdy.db.racialFrameStrata)
racial.borderFrame:SetFrameLevel(Gladdy.db.racialFrameLevel + 3)
racial:SetWidth(width) racial:SetWidth(width)
racial:SetHeight(height) racial:SetHeight(height)
if Gladdy.db.racialIconZoomed then
racial.cooldown:SetWidth(width)
racial.cooldown:SetHeight(height)
else
racial.cooldown:SetWidth(width - width/16) racial.cooldown:SetWidth(width - width/16)
racial.cooldown:SetHeight(height - height/16) racial.cooldown:SetHeight(height - height/16)
end
racial.cooldown:ClearAllPoints() racial.cooldown:ClearAllPoints()
racial.cooldown:SetPoint("CENTER", racial, "CENTER") racial.cooldown:SetPoint("CENTER", racial, "CENTER")
racial.cooldown.noCooldownCount = true -- Gladdy.db.racialDisableOmniCC racial.cooldown.noCooldownCount = true -- Gladdy.db.racialDisableOmniCC
@ -165,64 +120,30 @@ function Racial:UpdateFrame(unit)
racial.texture:SetAllPoints(racial) racial.texture:SetAllPoints(racial)
racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle)
racial.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.racialBorderColor)) racial.texture.overlay:SetVertexColor(Gladdy.db.racialBorderColor.r, Gladdy.db.racialBorderColor.g, Gladdy.db.racialBorderColor.b, Gladdy.db.racialBorderColor.a)
if Gladdy.db.racialIconZoomed then racial:ClearAllPoints()
if racial.texture.masked then local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
racial.texture:SetMask("") local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor]
racial.texture:SetTexCoord(0.1,0.9,0.1,0.9) if (Gladdy.db.racialPos == "RIGHT") then
racial.texture.masked = nil racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
end elseif (Gladdy.db.racialPos == "LEFT") then
else racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, -Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
if not racial.texture.masked then elseif (Gladdy.db.racialPos == "TOP") then
racial.texture:SetMask("") racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, Gladdy.db.padding + Gladdy.db.racialYOffset)
racial.texture:SetTexCoord(0,1,0,1) elseif (Gladdy.db.racialPos == "BOTTOM") then
racial.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, -Gladdy.db.padding + Gladdy.db.racialYOffset)
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"},
Gladdy.db.racialSize * Gladdy.db.racialWidthFactor,
Gladdy.db.racialSize,
0, 0, "racialEnabled")
end end
if (Gladdy.db.racialEnabled == false) then if (Gladdy.db.racialEnabled == false) then
racial:Hide() racial:Hide()
else else
racial:Show() racial:Show()
if testAgain then
Racial:ResetUnit(unit)
Racial:Test(unit)
end
end end
end end
function Racial:JOINED_ARENA() function Racial:JOINED_ARENA()
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE")
self:SetScript("OnEvent", function(self, event, ...) self:SetScript("OnEvent", function(self, event, ...)
if self[event] then if self[event] then
self[event](self, ...) self[event](self, ...)
@ -230,34 +151,13 @@ function Racial:JOINED_ARENA()
end) end)
end end
function Racial:RACIAL_USED(unit, expirationTime, spellName) function Racial:RACIAL_USED(unit)
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 racial = self.frames[unit]
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
if (not racial or not button or not button.race) then if (not racial or not button or not button.race) then
return return
end end
if button.race == "Scourge" then Racial:Used(unit, GetTime(), Gladdy:Racials()[button.race].duration)
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 end
function Racial:Used(unit, startTime, duration) function Racial:Used(unit, startTime, duration)
@ -267,14 +167,14 @@ function Racial:Used(unit, startTime, duration)
end end
if not racial.active then if not racial.active then
racial.timeLeft = duration racial.timeLeft = duration
if not Gladdy.db.racialDisableCircle then racial.cooldown:SetCooldown(startTime, duration) end if not Gladdy.db.trinketDisableCircle then racial.cooldown:SetCooldown(startTime, duration) end
racial.active = true racial.active = true
end end
end end
function Racial:ENEMY_SPOTTED(unit) function Racial:ENEMY_SPOTTED(unit)
local racial = self.frames[unit] local racial = self.frames[unit]
if (not racial or not Gladdy.buttons[unit].race) then if (not racial) then
return return
end end
racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture) racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture)
@ -294,8 +194,8 @@ end
function Racial:Test(unit) function Racial:Test(unit)
Racial:ENEMY_SPOTTED(unit) Racial:ENEMY_SPOTTED(unit)
if (unit == "arena2" or unit == "arena3") then if (unit == "arena1" or unit == "arena3") then
Gladdy:SendMessage("RACIAL_USED", unit) Racial:Used(unit, GetTime(), Gladdy:Racials()[Gladdy.buttons[unit].race].duration)
end end
end end
@ -312,57 +212,29 @@ function Racial:GetOptions()
desc = L["Enable racial icon"], desc = L["Enable racial icon"],
order = 3, order = 3,
}), }),
racialGroup = Gladdy:option({
type = "toggle",
name = L["Group"] .. " " .. L["Racial"],
order = 4,
disabled = function() return not Gladdy.db.racialEnabled end,
}),
racialGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 5,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.racialGroup or not Gladdy.db.racialEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 6, order = 4,
disabled = function() return not Gladdy.db.racialEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
name = L["Icon"], name = L["Size"],
order = 1, order = 1,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Size"],
order = 1, 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({ racialSize = Gladdy:option({
type = "range", type = "range",
name = L["Icon size"], name = L["Icon size"],
min = 5, min = 5,
max = 100, max = 100,
step = 1, step = 1,
order = 3, order = 2,
width = "full", width = "full",
}), }),
racialWidthFactor = Gladdy:option({ racialWidthFactor = Gladdy:option({
@ -371,7 +243,7 @@ function Racial:GetOptions()
min = 0.5, min = 0.5,
max = 2, max = 2,
step = 0.05, step = 0.05,
order = 4, order = 3,
width = "full", width = "full",
}), }),
}, },
@ -401,15 +273,6 @@ function Racial:GetOptions()
order = 8, order = 8,
width = "full", width = "full",
}), }),
racialCooldownNumberAlpha = Gladdy:option({
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 9,
width = "full",
}),
}, },
}, },
font = { font = {
@ -445,13 +308,37 @@ function Racial:GetOptions()
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 5, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon position"], name = L["Icon position"],
order = 4, order = 4,
}, },
racialAnchor = Gladdy:option({
type = "select",
name = L["Anchor"],
desc = L["This changes the anchor of the racial icon"],
order = 20,
values = {
["trinket"] = L["Trinket"],
["classIcon"] = L["Class Icon"],
["healthBar"] = L["Health Bar"],
["powerBar"] = L["Power Bar"],
},
}),
racialPos = Gladdy:option({
type = "select",
name = L["Icon position"],
desc = L["This changes position relative to its anchor of the racial icon"],
order = 21,
values = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
["TOP"] = L["Top"],
["BOTTOM"] = L["Bottom"],
},
}),
racialXOffset = Gladdy:option({ racialXOffset = Gladdy:option({
type = "range", type = "range",
name = L["Horizontal offset"], name = L["Horizontal offset"],
@ -497,62 +384,7 @@ function Racial:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
racialFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
racialFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Racial:LegacySetPosition(racial, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"}
racial:ClearAllPoints()
local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor]
if (Gladdy.db.racialPos == "RIGHT") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "LEFT") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, -Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "TOP") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, Gladdy.db.padding + Gladdy.db.racialYOffset)
elseif (Gladdy.db.racialPos == "BOTTOM") then
racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, -Gladdy.db.padding + Gladdy.db.racialYOffset)
end
return Gladdy.db.newLayout
end

View File

@ -17,7 +17,6 @@ local LibStub = LibStub
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local LSR = LibStub("SpellRange-1.0") local LSR = LibStub("SpellRange-1.0")
local L = Gladdy.L local L = Gladdy.L
local HealthBar = Gladdy.modules["Health Bar"]
local classSpells = { local classSpells = {
["MAGE"] = 118, ["MAGE"] = 118,
@ -53,20 +52,12 @@ local RangeCheck = Gladdy:NewModule("Range Check", nil, {
}) })
function RangeCheck:Initialize() function RangeCheck:Initialize()
if Gladdy.db.rangeCheckEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
end self:RegisterMessage("ENEMY_STEALTH")
self:RegisterMessage("ENEMY_SPOTTED")
self.playerClass = select(2, UnitClass("player")) self.playerClass = select(2, UnitClass("player"))
end end
function RangeCheck:UpdateFrameOnce()
if Gladdy.db.rangeCheckEnabled then
self:RegisterMessage("JOINED_ARENA")
else
self:UnregisterAllMessages()
end
end
function RangeCheck:Reset() function RangeCheck:Reset()
self.test = nil self.test = nil
end end
@ -75,6 +66,7 @@ function RangeCheck:ResetUnit(unit)
local button = Gladdy.buttons[unit] local button = Gladdy.buttons[unit]
self:CancelTimer(button) self:CancelTimer(button)
self:SetColor(button, 1) self:SetColor(button, 1)
button.classColors = {}
end end
function RangeCheck:Test(unit) function RangeCheck:Test(unit)
@ -82,10 +74,11 @@ function RangeCheck:Test(unit)
if not button then if not button then
return return
end end
self:ENEMY_SPOTTED(unit)
self.test = true self.test = true
button.lastState = 0 button.lastState = 0
if Gladdy.db.rangeCheckEnabled then if Gladdy.db.rangeCheckEnabled then
if unit == "arena2" or unit == "arena4" then if unit == "arena1" then
--button.unit = "target" --button.unit = "target"
--self:CreateTimer(button) --self:CreateTimer(button)
self:SetRangeAlpha(button, nil) self:SetRangeAlpha(button, nil)
@ -108,12 +101,18 @@ function RangeCheck:SetColor(button, oorFac)
return return
end end
if Gladdy.db.rangeCheckHealthBar then if not button.classColors.r then
button.healthBar.hp.oorFactor = oorFac if button.class then
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max) button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
else else
button.healthBar.hp.oorFactor = 1 button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
HealthBar:SetHealthStatusBarColor(button.unit, button.healthBar.hp.current, button.healthBar.hp.max) end
end
if Gladdy.db.rangeCheckHealthBar then
button.healthBar.hp:SetStatusBarColor(button.classColors.r/oorFac, button.classColors.g/oorFac, button.classColors.b/oorFac, 1)
else
button.healthBar.hp:SetStatusBarColor(button.classColors.r, button.classColors.g, button.classColors.b, 1)
end end
if Gladdy.db.rangeCheckHealthBarText then if Gladdy.db.rangeCheckHealthBarText then
@ -178,17 +177,46 @@ function RangeCheck:JOINED_ARENA()
end end
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) function RangeCheck.CheckRange(self)
local button = self.parent local button = self.parent
local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min
if (not UnitIsConnected(button.unit) or not UnitInPhase(button.unit)) then if( not UnitIsConnected(button.unit) or not UnitInPhase(button.unit) ) then
RangeCheck:SetRangeAlpha(button, false) RangeCheck:SetRangeAlpha(button, false)
elseif (spell) then elseif( spell ) then
RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1) RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1)
-- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally -- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally
elseif (UnitInRaid(button.unit) or UnitInParty(button.unit)) then elseif( UnitInRaid(button.unit) or UnitInParty(button.unit) ) then
RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player")) RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player"))
-- Nope, fall back to interaction :( -- Nope, fall back to interaction :(
else else
@ -240,7 +268,6 @@ function RangeCheck:GetOptions()
childGroups = "tree", childGroups = "tree",
name = L["General"], name = L["General"],
order = 5, order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
@ -313,7 +340,6 @@ function RangeCheck:GetOptions()
childGroups = "tree", childGroups = "tree",
name = L["Spells"], name = L["Spells"],
order = 5, order = 5,
disabled = function() return not Gladdy.db.rangeCheckEnabled end,
args = RangeCheck:GetSpells(), args = RangeCheck:GetSpells(),
}, },
} }
@ -323,7 +349,7 @@ function RangeCheck:GetSpells()
local group = { local group = {
description = { description = {
type = "description", type = "description",
name = L["Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066."], name = "Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066.",
order = 1, order = 1,
}, },
} }
@ -337,7 +363,7 @@ function RangeCheck:GetSpells()
args = { args = {
headerMin = { headerMin = {
type = "header", type = "header",
name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
or "nil", or "nil",
order = 1, order = 1,
}, },
@ -357,7 +383,9 @@ function RangeCheck:GetSpells()
end, end,
set = function(_, value) set = function(_, value)
Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value) Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value)
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) --Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.min.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
-- or "nil"
Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
or "nil" or "nil"
end end
}, },

View File

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

View File

@ -1,41 +1,103 @@
local select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs = select, pairs, tremove, tinsert, format, strsplit, tonumber, ipairs local select, pairs, string_lower, tremove, tinsert, format, string_gsub, ipairs = select, pairs, string.lower, tremove, tinsert, format, string.gsub, ipairs
local UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID = UnitExists, UnitIsUnit, UnitIsEnemy, UnitGUID local UnitExists, UnitIsUnit, UnitName, UnitIsEnemy = UnitExists, UnitIsUnit, UnitName, UnitIsEnemy
local C_NamePlate = C_NamePlate local C_NamePlate = C_NamePlate
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local GetSpellInfo, CreateFrame = GetSpellInfo, CreateFrame local GetSpellInfo, CreateFrame, GetCVar = GetSpellInfo, CreateFrame, GetCVar
local totemData, npcIdToTotemData = Gladdy:GetTotemData()
--------------------------------------------------- ---------------------------------------------------
-- Option Helpers -- Constants
--------------------------------------------------- ---------------------------------------------------
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 function GetTotemColorDefaultOptions()
local defaultDB = {} local defaultDB = {}
local options = {} local options = {}
local indexedList = {} local indexedList = {}
for k,v in pairs(totemData) do for k,v in pairs(totemData) do
tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture}) tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture, enabled = v.enabled})
end end
table.sort(indexedList, function (a, b) table.sort(indexedList, function (a, b)
return a.name < b.name return a.name < b.name
end) end)
for i=1,#indexedList do for i=1,#indexedList do
defaultDB["totem" .. indexedList[i].id] = {color = indexedList[i].color, enabled = true, alpha = 0.6, customText = ""} defaultDB["totem" .. indexedList[i].id] = {color = indexedList[i].color, enabled = indexedList[i].enabled, alpha = 0.6, customText = ""}
options["npTotemsHideDisabledTotems"] = {
order = 1,
name = L["Hide Disabled Totem Plates"],
desc = L["Hide Disabled Totem Plates"],
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.npTotemsHideDisabledTotems end,
set = function(_, value)
Gladdy.dbi.profile.npTotemsHideDisabledTotems = value
Gladdy:UpdateFrame()
end
}
options["totem" .. indexedList[i].id] = { options["totem" .. indexedList[i].id] = {
order = i+1, order = i+1,
name = select(1, GetSpellInfo(indexedList[i].id)), name = select(1, GetSpellInfo(indexedList[i].id)),
@ -55,8 +117,8 @@ local function GetTotemColorDefaultOptions()
desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))), desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
type = "toggle", type = "toggle",
width = "full", width = "full",
get = function() return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end, get = function(info) return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end,
set = function(_, value) set = function(info, value)
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled = value Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end end
@ -68,13 +130,15 @@ local function GetTotemColorDefaultOptions()
order = 3, order = 3,
hasAlpha = true, hasAlpha = true,
width = "full", width = "full",
get = function() get = function(info)
local key = info.arg or info[#info]
return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.a Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.a
end, end,
set = function(_, r, g, b, a) set = function(info, r, g, b, a)
local key = info.arg or info[#info]
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g,
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b,
@ -90,10 +154,10 @@ local function GetTotemColorDefaultOptions()
max = 1, max = 1,
step = 0.1, step = 0.1,
width = "full", width = "full",
get = function() get = function(info)
return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha
end, end,
set = function(_, value) set = function(info, value)
Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha = value Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha = value
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end end
@ -103,8 +167,8 @@ local function GetTotemColorDefaultOptions()
name = L["Custom totem name"], name = L["Custom totem name"],
order = 5, order = 5,
width = "full", width = "full",
get = function() return Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText end, get = function(info) return Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText end,
set = function(_, value) Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end set = function(info, value) Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end
}, },
} }
} }
@ -112,13 +176,26 @@ local function GetTotemColorDefaultOptions()
return defaultDB, options, indexedList return defaultDB, options, indexedList
end end
local function GetTotemOptions()
local indexedList = select(3, GetTotemColorDefaultOptions())
local colorList = {}
for i=1, #indexedList do
tinsert(colorList, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id])
end
return colorList
end
function Gladdy:GetTotemColors()
return GetTotemColorDefaultOptions()
end
--------------------------------------------------- ---------------------------------------------------
-- Core -- Core
--------------------------------------------------- ---------------------------------------------------
local TotemPlates = Gladdy:NewModule("Totem Plates", 2, { local TotemPlates = Gladdy:NewModule("Totem Plates", nil, {
npTotems = true, npTotems = true,
npTotemsShowFriendly = true, npTotemsShowFriendly = true,
npTotemsShowEnemy = true, npTotemsShowEnemy = true,
@ -132,10 +209,12 @@ local TotemPlates = Gladdy:NewModule("Totem Plates", 2, {
npTotemPlatesAlpha = 0.6, npTotemPlatesAlpha = 0.6,
npTotemPlatesAlphaAlways = false, npTotemPlatesAlphaAlways = false,
npTotemPlatesAlphaAlwaysTargeted = false, npTotemPlatesAlphaAlwaysTargeted = false,
npTotemColors = select(1, GetTotemColorDefaultOptions()), npTotemColors = select(1, GetTotemColorDefaultOptions())
npTotemsHideDisabledTotems = false,
}) })
LibStub("AceHook-3.0"):Embed(TotemPlates)
LibStub("AceTimer-3.0"):Embed(TotemPlates)
function TotemPlates.OnEvent(self, event, ...) function TotemPlates.OnEvent(self, event, ...)
TotemPlates[event](self, ...) TotemPlates[event](self, ...)
end end
@ -144,18 +223,19 @@ function TotemPlates:Initialize()
self.numChildren = 0 self.numChildren = 0
self.activeTotemNameplates = {} self.activeTotemNameplates = {}
self.totemPlateCache = {} self.totemPlateCache = {}
if Gladdy.db.npTotems then
self:RegisterEvent("PLAYER_ENTERING_WORLD") self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED") self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED") self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("PLAYER_TARGET_CHANGED") self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", TotemPlates.OnEvent) self:SetScript("OnEvent", TotemPlates.OnEvent)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then
SetCVar("nameplateShowEnemyTotems", true); --GetCVar("nameplateShowEnemyTotems")
--SetCVar("nameplateShowEnemyTotems", true);
end end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then
SetCVar("nameplateShowFriendlyTotems", true); --GetCVar("nameplateShowFriendlyTotems")
--SetCVar("nameplateShowFriendlyTotems", true);
end end
self.addon = "Blizzard" self.addon = "Blizzard"
if (IsAddOnLoaded("Plater")) then if (IsAddOnLoaded("Plater")) then
@ -179,69 +259,17 @@ function TotemPlates:Initialize()
end end
end end
---------------------------------------------------
-- Events
---------------------------------------------------
function TotemPlates:PLAYER_ENTERING_WORLD() function TotemPlates:PLAYER_ENTERING_WORLD()
self.numChildren = 0 self.numChildren = 0
self.activeTotemNameplates = {} self.activeTotemNameplates = {}
end end
function TotemPlates:PLAYER_TARGET_CHANGED() function TotemPlates:Reset()
for k,nameplate in pairs(self.activeTotemNameplates) do --self:CancelAllTimers()
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, k) --self:UnhookAll()
end
end end
function TotemPlates:NAME_PLATE_UNIT_ADDED(unitID)
self:OnUnitEvent(unitID)
end
function TotemPlates:NAME_PLATE_UNIT_REMOVED(unitID)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID)
self.activeTotemNameplates[unitID] = nil
if nameplate.gladdyTotemFrame then
nameplate.gladdyTotemFrame:Hide()
nameplate.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
nameplate.gladdyTotemFrame = nil
end
if (self.addon == "ElvUI") then
self:ToggleAddon(nameplate, true)
end
end
---------------------------------------------------
-- Gladdy Call
---------------------------------------------------
function TotemPlates:UpdateFrameOnce() function TotemPlates:UpdateFrameOnce()
if Gladdy.db.npTotems then
self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:SetScript("OnEvent", TotemPlates.OnEvent)
else
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
self:UnregisterEvent("NAME_PLATE_UNIT_ADDED")
self:UnregisterEvent("NAME_PLATE_UNIT_REMOVED")
self:UnregisterEvent("PLAYER_TARGET_CHANGED")
self:SetScript("OnEvent", nil)
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowEnemy then
SetCVar("nameplateShowEnemyTotems", true);
end
if Gladdy.db.npTotems and Gladdy.db.npTotemsShowFriendly then
SetCVar("nameplateShowFriendlyTotems", true);
end
for k,nameplate in pairs(self.activeTotemNameplates) do for k,nameplate in pairs(self.activeTotemNameplates) do
local totemDataEntry = nameplate.gladdyTotemFrame.totemDataEntry local totemDataEntry = nameplate.gladdyTotemFrame.totemDataEntry
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
@ -252,7 +280,7 @@ function TotemPlates:UpdateFrameOnce()
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b, Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a) Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE")
nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "") nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
self:SetTotemAlpha(nameplate.gladdyTotemFrame, k) self:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
@ -278,24 +306,12 @@ function TotemPlates:UpdateFrameOnce()
nameplate.gladdyTotemFrame:Hide() nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true) self:ToggleAddon(nameplate, true)
end end
if Gladdy.db.npTotems and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then
nameplate.gladdyTotemFrame:Show()
self:ToggleAddon(nameplate)
end
if Gladdy.db.npTotems and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate, true)
end
if Gladdy.db.npTotems and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled and Gladdy.db.npTotemsHideDisabledTotems then
nameplate.gladdyTotemFrame:Hide()
self:ToggleAddon(nameplate)
end
end end
for _,gladdyTotemFrame in ipairs(self.totemPlateCache) do for _,gladdyTotemFrame in ipairs(self.totemPlateCache) do
gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize) gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle) gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE")
gladdyTotemFrame.totemName:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) gladdyTotemFrame.totemName:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
end end
end end
@ -308,7 +324,6 @@ end
function TotemPlates:CreateTotemFrame(nameplate) function TotemPlates:CreateTotemFrame(nameplate)
nameplate.gladdyTotemFrame = CreateFrame("Frame") nameplate.gladdyTotemFrame = CreateFrame("Frame")
nameplate.gladdyTotemFrame:SetFrameLevel(1)
nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true) nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true)
nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize) nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
@ -323,7 +338,7 @@ function TotemPlates:CreateTotemFrame(nameplate)
nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT") nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle) nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY") nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY")
nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE")
nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
nameplate.gladdyTotemFrame.selectionHighlight = nameplate.gladdyTotemFrame:CreateTexture(nil, "OVERLAY") nameplate.gladdyTotemFrame.selectionHighlight = nameplate.gladdyTotemFrame:CreateTexture(nil, "OVERLAY")
nameplate.gladdyTotemFrame.selectionHighlight:SetTexture("Interface/TargetingFrame/UI-TargetingFrame-BarFill") nameplate.gladdyTotemFrame.selectionHighlight:SetTexture("Interface/TargetingFrame/UI-TargetingFrame-BarFill")
@ -369,44 +384,34 @@ function TotemPlates:GetAddonFrame(nameplate)
end end
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) function TotemPlates:ToggleAddon(nameplate, show)
local addonFrames = { self:GetAddonFrame(nameplate) } local addonFrames = { self:GetAddonFrame(nameplate) }
if addonFrames and #addonFrames > 0 then if addonFrames and #addonFrames > 0 then
if show then if show then
for _, frame in ipairs(addonFrames) do for i,v in ipairs(addonFrames) do
if frame.UpdateAllElements then v:Show()
Gladdy:Debug("INFO", "TotemPlates:ToggleAddon - NAME_PLATE_UNIT_ADDED - nameplate.unitFrame:UpdateAllElements")
frame:Show()
frame:UpdateAllElements("NAME_PLATE_UNIT_ADDED")
else
Gladdy:Debug("INFO", "TotemPlates:ToggleAddon - NAME_PLATE_UNIT_ADDED - Show")
frame:Show()
end
end end
else else
for _, frame in ipairs(addonFrames) do for i,v in ipairs(addonFrames) do
if frame.UpdateAllElements then v:Hide()
Gladdy:Debug("INFO", "TotemPlates:ToggleAddon - NAME_PLATE_UNIT_REMOVED - nameplate.unitFrame:UpdateAllElements")
frame:UpdateAllElements("NAME_PLATE_UNIT_REMOVED")
frame:Hide()
else
Gladdy:Debug("INFO", "TotemPlates:ToggleAddon - NAME_PLATE_UNIT_REMOVED - Hide")
frame:Hide()
end
end end
end end
end end
end end
function TotemPlates.OnUpdate(self) function TotemPlates.OnUpdate(self)
if (UnitIsUnit("mouseover", self.unitID) or UnitIsUnit("target", self.unitID)) and Gladdy.db.npTotemColors["totem" .. self.totemDataEntry.id].alpha > 0 then if (UnitIsUnit("mouseover", self.unitID) or UnitIsUnit("target", self.unitID)) then
self.selectionHighlight:SetAlpha(.25) self.selectionHighlight:SetAlpha(.25)
else else
self.selectionHighlight:SetAlpha(0) self.selectionHighlight:SetAlpha(0)
end end
if (TotemPlates.addon == "Plater" or TotemPlates.addon == "Tukui") and self.parent and self.parent.unitFrame then if (TotemPlates.addon == "Plater" or TotemPlates.addon == "Tukui" or TotemPlates.addon == "ElvUI") and self.parent and self.parent.unitFrame then
self.parent.unitFrame:Hide() self.parent.unitFrame:Hide()
end end
end end
@ -429,14 +434,12 @@ function TotemPlates:OnUnitEvent(unitID)
self:ToggleAddon(nameplate, true) self:ToggleAddon(nameplate, true)
return return
end end
local npcType, _, _, _, _, npcId = strsplit("-", UnitGUID(unitID)) local nameplateName = UnitName(unitID)
if npcType ~= "Creature" then local totemName = string_gsub(nameplateName, "^%s+", "") --trim
return totemName = string_gsub(totemName, "%s+$", "") --trim
end totemName = string_gsub(totemName, "%s+[I,V,X]+$", "") --trim rank
local totemDataEntry = npcIdToTotemData[tonumber(npcId)] totemName = string_lower(totemName)
if not totemDataEntry then local totemDataEntry = localizedTotemData["default"][totemName] or localizedTotemData["frFR"][totemName] or localizedTotemData["ruRU"][totemName]
return
end
if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates
if #self.totemPlateCache > 0 then if #self.totemPlateCache > 0 then
nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache) nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
@ -458,19 +461,32 @@ function TotemPlates:OnUnitEvent(unitID)
nameplate.gladdyTotemFrame.parent = nameplate nameplate.gladdyTotemFrame.parent = nameplate
nameplate.gladdyTotemFrame:Show() nameplate.gladdyTotemFrame:Show()
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID) TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID)
self:ToggleAddon(nameplate, false) self:ToggleAddon(nameplate)
self.activeTotemNameplates[unitID] = nameplate self.activeTotemNameplates[unitID] = nameplate
elseif totemDataEntry and not Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled and Gladdy.db.npTotemsHideDisabledTotems then 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 if nameplate.gladdyTotemFrame then
nameplate.gladdyTotemFrame:Hide() nameplate.gladdyTotemFrame:Hide()
nameplate.gladdyTotemFrame:SetParent(nil) nameplate.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame) tinsert(self.totemPlateCache, nameplate.gladdyTotemFrame)
nameplate.gladdyTotemFrame = nil nameplate.gladdyTotemFrame = nil
end end
self:ToggleAddon(nameplate, false)
else
self:ToggleAddon(nameplate, true)
end
end end
function TotemPlates:SetTotemAlpha(gladdyTotemFrame, unitID) function TotemPlates:SetTotemAlpha(gladdyTotemFrame, unitID)
@ -497,65 +513,6 @@ end
--------------------------------------------------- ---------------------------------------------------
-- Test
---------------------------------------------------
function TotemPlates:TestOnce()
if not self.testFrame then
self.testFrame = CreateFrame("Frame", nil, UIParent)
self.testFrame:SetWidth(1)
self.testFrame:SetHeight(32)
self.testFrame:SetPoint("CENTER", UIParent, "CENTER", 0, -140)
self.testFrame:SetIgnoreParentScale(true)
end
local totemDataEntry = npcIdToTotemData[5913]
self.testFrame:Show()
if not self.testFrame.gladdyTotemFrame then
if #self.totemPlateCache > 0 then
self.testFrame.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
else
self:CreateTotemFrame(self.testFrame)
self.testFrame.gladdyTotemFrame:SetScript("OnHide", nil)
self.testFrame.gladdyTotemFrame:SetScript("OnUpdate", nil)
end
end
if Gladdy.db.npTotems then
self.testFrame.gladdyTotemFrame.unitID = "player"
self.testFrame.gladdyTotemFrame.totemDataEntry = totemDataEntry
self.testFrame.gladdyTotemFrame.parent = self.testFrame
self.testFrame.gladdyTotemFrame:SetParent(self.testFrame)
self.testFrame.gladdyTotemFrame:ClearAllPoints()
self.testFrame.gladdyTotemFrame:SetPoint("CENTER", self.testFrame, "CENTER", 0, 0)
self.testFrame.gladdyTotemFrame.totemIcon:SetTexture(totemDataEntry.texture)
self.testFrame.gladdyTotemFrame.totemBorder:SetVertexColor(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.r,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.g,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
self.testFrame.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
self.testFrame.gladdyTotemFrame.parent = self.testFrame
self.testFrame.gladdyTotemFrame:Show()
self.activeTotemNameplates["player"] = self.testFrame
else
self.testFrame.gladdyTotemFrame:Hide()
end
end
function TotemPlates:Reset()
if self.testFrame then
if self.testFrame.gladdyTotemFrame then
self.testFrame.gladdyTotemFrame:Hide()
self.testFrame.gladdyTotemFrame:SetParent(nil)
tinsert(self.totemPlateCache, self.testFrame.gladdyTotemFrame)
self.testFrame.gladdyTotemFrame = nil
end
self.testFrame:Hide()
self.activeTotemNameplates["player"] = nil
end
end
---------------------------------------------------
-- Interface options -- Interface options
--------------------------------------------------- ---------------------------------------------------
@ -570,23 +527,21 @@ function TotemPlates:GetOptions()
npTotems = Gladdy:option({ npTotems = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Enabled"], name = L["Enabled"],
desc = L["Turns totem icons instead of nameplates on or off."], desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"],
order = 3, order = 3,
width = 0.9, width = 0.9,
}), }),
npTotemsShowFriendly = Gladdy:option({ npTotemsShowFriendly = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Show friendly"], name = L["Show friendly"],
desc = L["Turns totem icons instead of nameplates on or off."], desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"],
disabled = function() return not Gladdy.db.npTotems end,
order = 4, order = 4,
width = 0.65, width = 0.65,
}), }),
npTotemsShowEnemy = Gladdy:option({ npTotemsShowEnemy = Gladdy:option({
type = "toggle", type = "toggle",
name = L["Show enemy"], name = L["Show enemy"],
desc = L["Turns totem icons instead of nameplates on or off."], desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"],
disabled = function() return not Gladdy.db.npTotems end,
order = 5, order = 5,
width = 0.6, width = 0.6,
}), }),
@ -594,7 +549,6 @@ function TotemPlates:GetOptions()
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
disabled = function() return not Gladdy.db.npTotems end,
order = 4, order = 4,
args = { args = {
icon = { icon = {
@ -711,23 +665,19 @@ function TotemPlates:GetOptions()
step = 0.1, step = 0.1,
width = "full", width = "full",
order = 23, order = 23,
get = function() get = function(info)
local alpha, i = nil, 1 local alphas = GetTotemOptions()
for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do for i=2, #alphas do
if i == 1 then if alphas[i].alpha ~= alphas[1].alpha then
alpha = v.alpha
i = i + 1
else
if v.alpha ~= alpha then
return "" return ""
end end
end end
end return alphas[1].alpha
return alpha
end, end,
set = function(_, value) set = function(info, value)
for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do local alphas = GetTotemOptions()
v.alpha = value for i=1, #alphas do
alphas[i].alpha = value
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -755,27 +705,23 @@ function TotemPlates:GetOptions()
name = L["All totem border color"], name = L["All totem border color"],
order = 42, order = 42,
hasAlpha = true, hasAlpha = true,
get = function() get = function(info)
local color local colors = GetTotemOptions()
local i = 1 local color = colors[1].color
for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do for i=2, #colors do
if i == 1 then if colors[i].r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r then
color = v.color
i = i + 1
else
if v.color.r ~= color.r or v.color.g ~= color.g or v.color.b ~= color.b or v.color.a ~= color.a then
return 0, 0, 0, 0 return 0, 0, 0, 0
end end
end end
end
return color.r, color.g, color.b, color.a return color.r, color.g, color.b, color.a
end, end,
set = function(_, r, g, b, a) set = function(info, r, g, b, a)
for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do local colors = GetTotemOptions()
v.color.r = r for i=1, #colors do
v.color.g = g colors[i].color.r = r
v.color.b = b colors[i].color.g = g
v.color.a = a colors[i].color.b = b
colors[i].color.a = a
end end
Gladdy:UpdateFrame() Gladdy:UpdateFrame()
end, end,
@ -789,8 +735,7 @@ function TotemPlates:GetOptions()
name = L["Customize Totems"], name = L["Customize Totems"],
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
disabled = function() return not Gladdy.db.npTotems end, args = select(2, Gladdy:GetTotemColors())
args = select(2, GetTotemColorDefaultOptions())
}, },
} }
end end

View File

@ -1,782 +0,0 @@
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, str_gsub = ceil, string.gsub local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber
local C_PvP = C_PvP local C_PvP = C_PvP
local CreateFrame = CreateFrame local CreateFrame = CreateFrame
@ -6,50 +6,24 @@ local GetTime = GetTime
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L local L = Gladdy.L
local Trinket = Gladdy:NewModule("Trinket", 80, { local Trinket = Gladdy:NewModule("Trinket", nil, {
trinketFont = "DorisPP", trinketFont = "DorisPP",
trinketFontScale = 1, trinketFontScale = 1,
trinketFontEnabled = true,
trinketEnabled = true, trinketEnabled = true,
trinketSize = 60 + 20 + 1, trinketSize = 60 + 20 + 1,
trinketWidthFactor = 0.9, trinketWidthFactor = 0.9,
trinketIconZoomed = false, trinketPos = "RIGHT",
trinketBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", trinketBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp",
trinketBorderColor = { r = 0, g = 0, b = 0, a = 1 }, trinketBorderColor = { r = 0, g = 0, b = 0, a = 1 },
trinketDisableCircle = false, trinketDisableCircle = false,
trinketCooldownAlpha = 1, trinketCooldownAlpha = 1,
trinketCooldownNumberAlpha = 1,
trinketXOffset = 0,
trinketYOffset = 0,
trinketFrameStrata = "MEDIUM",
trinketFrameLevel = 5,
trinketColored = false,
trinketColoredCd = { r = 1, g = 0, b = 0, a = 1 },
trinketColoredNoCd = { r = 0, g = 1, b = 0, a = 1 },
trinketGroup = false,
trinketGroupDirection = "DOWN",
}) })
LibStub("AceComm-3.0"):Embed(Trinket)
function Trinket:Initialize() function Trinket:Initialize()
self.frames = {} self.frames = {}
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA")
self:RegisterMessage("TRINKET_USED")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("RACIAL_USED")
end
end
end
function Trinket:UpdateFrameOnce()
if Gladdy.db.trinketEnabled then
self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("JOINED_ARENA")
if Gladdy.expansion == "Wrath" then
self:RegisterMessage("RACIAL_USED")
end
else
self:UnregisterAllMessages()
end
end end
local function iconTimer(self, elapsed) local function iconTimer(self, elapsed)
@ -58,9 +32,6 @@ local function iconTimer(self, elapsed)
self.active = false self.active = false
self.cooldown:Clear() self.cooldown:Clear()
Gladdy:SendMessage("TRINKET_READY", self.unit) Gladdy:SendMessage("TRINKET_READY", self.unit)
if Gladdy.db.trinketColored then
self:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredNoCd))
end
else else
self.timeLeft = self.timeLeft - elapsed self.timeLeft = self.timeLeft - elapsed
end end
@ -68,66 +39,50 @@ local function iconTimer(self, elapsed)
local timeLeft = ceil(self.timeLeft) local timeLeft = ceil(self.timeLeft)
if timeLeft >= 60 then if timeLeft >= 60 then
self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.trinketCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 1, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 60 and timeLeft >= 30 then elseif timeLeft < 60 and timeLeft >= 30 then
self.cooldownFont:SetTextColor(1, 1, 0, Gladdy.db.trinketCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 1, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 30 and timeLeft >= 11 then elseif timeLeft < 30 and timeLeft >= 11 then
self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.trinketCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0.7, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft <= 10 and timeLeft >= 5 then elseif timeLeft <= 10 and timeLeft >= 5 then
self.cooldownFont:SetTextColor(1, 0.7, 0, Gladdy.db.trinketCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0.7, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then elseif timeLeft < 5 and timeLeft > 0 then
self.cooldownFont:SetTextColor(1, 0, 0, Gladdy.db.trinketCooldownNumberAlpha) self.cooldownFont:SetTextColor(1, 0, 0)
self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
end end
if Gladdy.db.trinketFontEnabled then
Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true) Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true)
else
self.cooldownFont:SetText("")
end
end end
end end
function Trinket:CreateFrame(unit) function Trinket:CreateFrame(unit)
local trinket = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") local trinket = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit])
trinket:SetBackdrop({bgFile = "Interface\\AddOns\\Gladdy\\Images\\trinket" })
trinket:EnableMouse(false) trinket:EnableMouse(false)
trinket:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket:SetFrameLevel(Gladdy.db.trinketFrameLevel)
trinket.texture = trinket:CreateTexture(nil, "BACKGROUND") trinket.texture = trinket:CreateTexture(nil, "BACKGROUND")
trinket.texture:SetAllPoints(trinket) trinket.texture:SetAllPoints(trinket)
trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02") trinket.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02")
trinket.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") trinket.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
trinket.texture.masked = true
trinket.cooldown = CreateFrame("Cooldown", nil, trinket, "CooldownFrameTemplate") trinket.cooldown = CreateFrame("Cooldown", nil, trinket, "CooldownFrameTemplate")
trinket.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC trinket.cooldown.noCooldownCount = true --Gladdy.db.trinketDisableOmniCC
trinket.cooldown:SetHideCountdownNumbers(true) trinket.cooldown:SetHideCountdownNumbers(true)
trinket.cooldown:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldown:SetFrameLevel(Gladdy.db.trinketFrameLevel + 1)
trinket.cooldownFrame = CreateFrame("Frame", nil, trinket) trinket.cooldownFrame = CreateFrame("Frame", nil, trinket)
trinket.cooldownFrame:ClearAllPoints() trinket.cooldownFrame:ClearAllPoints()
trinket.cooldownFrame:SetPoint("TOPLEFT", trinket, "TOPLEFT") trinket.cooldownFrame:SetPoint("TOPLEFT", trinket, "TOPLEFT")
trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", trinket, "BOTTOMRIGHT") trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", trinket, "BOTTOMRIGHT")
trinket.cooldownFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldownFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 2)
trinket.cooldownFont = trinket.cooldownFrame:CreateFontString(nil, "OVERLAY") trinket.cooldownFont = trinket.cooldownFrame:CreateFontString(nil, "OVERLAY")
trinket.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), 20, "OUTLINE") trinket.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), 20, "OUTLINE")
--trinket.cooldownFont:SetAllPoints(trinket.cooldown) --trinket.cooldownFont:SetAllPoints(trinket.cooldown)
trinket.cooldownFont:SetJustifyH("CENTER") trinket.cooldownFont:SetJustifyH("CENTER")
trinket.cooldownFont:SetPoint("CENTER") trinket.cooldownFont:SetPoint("CENTER")
trinket.borderFrame = CreateFrame("Frame", nil, trinket) trinket.borderFrame = CreateFrame("Frame", nil, trinket)
trinket.borderFrame:SetAllPoints(trinket) trinket.borderFrame:SetAllPoints(trinket)
trinket.borderFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.borderFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 3)
trinket.texture.overlay = trinket.borderFrame:CreateTexture(nil, "OVERLAY") trinket.texture.overlay = trinket.borderFrame:CreateTexture(nil, "OVERLAY")
trinket.texture.overlay:SetAllPoints(trinket) trinket.texture.overlay:SetAllPoints(trinket)
trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle) trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle)
@ -146,29 +101,12 @@ function Trinket:UpdateFrame(unit)
return return
end end
local testAgain = false
local width, height = Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor, Gladdy.db.trinketSize local width, height = Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor, Gladdy.db.trinketSize
trinket:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket:SetFrameLevel(Gladdy.db.trinketFrameLevel)
trinket.cooldown:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldown:SetFrameLevel(Gladdy.db.trinketFrameLevel + 1)
trinket.cooldownFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.cooldownFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 2)
trinket.borderFrame:SetFrameStrata(Gladdy.db.trinketFrameStrata)
trinket.borderFrame:SetFrameLevel(Gladdy.db.trinketFrameLevel + 3)
trinket:SetWidth(width) trinket:SetWidth(width)
trinket:SetHeight(height) trinket:SetHeight(height)
if Gladdy.db.trinketIconZoomed then
trinket.cooldown:SetWidth(width)
trinket.cooldown:SetHeight(height)
else
trinket.cooldown:SetWidth(width - width/16) trinket.cooldown:SetWidth(width - width/16)
trinket.cooldown:SetHeight(height - height/16) trinket.cooldown:SetHeight(height - height/16)
end
trinket.cooldown:ClearAllPoints() trinket.cooldown:ClearAllPoints()
trinket.cooldown:SetPoint("CENTER", trinket, "CENTER") trinket.cooldown:SetPoint("CENTER", trinket, "CENTER")
trinket.cooldown.noCooldownCount = true -- Gladdy.db.trinketDisableOmniCC trinket.cooldown.noCooldownCount = true -- Gladdy.db.trinketDisableOmniCC
@ -178,81 +116,28 @@ function Trinket:UpdateFrame(unit)
trinket.texture:SetAllPoints(trinket) trinket.texture:SetAllPoints(trinket)
trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle) trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle)
trinket.texture.overlay:SetVertexColor(Gladdy:SetColor(Gladdy.db.trinketBorderColor)) trinket.texture.overlay:SetVertexColor(Gladdy.db.trinketBorderColor.r, Gladdy.db.trinketBorderColor.g, Gladdy.db.trinketBorderColor.b, Gladdy.db.trinketBorderColor.a)
if Gladdy.db.trinketIconZoomed then trinket:ClearAllPoints()
if trinket.texture.masked then local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
trinket.texture:SetMask("") if (Gladdy.db.classIconPos == "LEFT") then
trinket.texture:SetTexCoord(0.1,0.9,0.1,0.9) if (Gladdy.db.trinketPos == "RIGHT") then
trinket.texture.masked = nil trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", margin, 0)
else
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].classIcon, "TOPLEFT", -Gladdy.db.padding, 0)
end end
else else
if not trinket.texture.masked then if (Gladdy.db.trinketPos == "RIGHT") then
trinket.texture:SetMask("") trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].classIcon, "TOPRIGHT", Gladdy.db.padding, 0)
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 else
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredNoCd)) trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
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
end end
if (unit == "arena1") then if (Gladdy.db.trinketEnabled == false) then
Gladdy:CreateMover(trinket,"trinketXOffset", "trinketYOffset", L["Trinket"],
{"TOPLEFT", "TOPLEFT"},
Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor,
Gladdy.db.trinketSize,
0,
0, "trinketEnabled")
end
trinket.cooldown:SetAlpha(Gladdy.db.trinketCooldownAlpha)
if Gladdy.db.trinketDisableCircle then
trinket.cooldown:Hide()
else
trinket.cooldown:Show()
end
if (not Gladdy.db.trinketEnabled) then
trinket:Hide() trinket:Hide()
else else
trinket:Show() trinket:Show()
if testAgain then
Trinket:ResetUnit(unit)
Trinket:Test(unit)
end
end end
end end
@ -267,7 +152,6 @@ function Trinket:ResetUnit(unit)
return return
end end
trinket.itemID = nil
trinket.timeLeft = nil trinket.timeLeft = nil
trinket.active = false trinket.active = false
trinket.cooldown:Clear() trinket.cooldown:Clear()
@ -279,14 +163,13 @@ function Trinket:Test(unit)
if (not trinket) then if (not trinket) then
return return
end end
if (unit == "arena1" or unit == "arena2") then if (unit == "arena2" or unit == "arena3") then
Gladdy:SendMessage("TRINKET_USED", unit) self:Used(unit, GetTime() * 1000, 120000)
end end
end end
function Trinket:JOINED_ARENA() function Trinket:JOINED_ARENA()
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE") self:RegisterEvent("ARENA_COOLDOWNS_UPDATE")
self:RegisterEvent("ARENA_CROWD_CONTROL_SPELL_UPDATE")
self:SetScript("OnEvent", function(self, event, ...) self:SetScript("OnEvent", function(self, event, ...)
if self[event] then if self[event] then
self[event](self, ...) self[event](self, ...)
@ -294,52 +177,13 @@ function Trinket:JOINED_ARENA()
end) end)
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() function Trinket:ARENA_COOLDOWNS_UPDATE()
for i=1, Gladdy.curBracket do for i=1, Gladdy.curBracket do
local unitID = "arena" .. i local unit = "arena" .. i
local spellID, itemID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unitID) local spellID, itemID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unit);
if (spellID) then 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 if (startTime ~= 0 and duration ~= 0) then
self:Used(unitID, startTime, duration) self:Used(unit, startTime, duration)
end end
end end
end end
@ -347,17 +191,15 @@ end
function Trinket:Used(unit, startTime, duration) function Trinket:Used(unit, startTime, duration)
local trinket = self.frames[unit] local trinket = self.frames[unit]
if (not trinket or not Gladdy.db.trinketEnabled) then if (not trinket) then
return return
end end
--if not trinket.active then if not trinket.active then
trinket.timeLeft = (startTime/1000.0 + duration/1000.0) - GetTime() trinket.timeLeft = (startTime/1000.0 + duration/1000.0) - GetTime()
if not Gladdy.db.trinketDisableCircle then trinket.cooldown:SetCooldown(startTime/1000.0, duration/1000.0) end if not Gladdy.db.trinketDisableCircle then trinket.cooldown:SetCooldown(startTime/1000.0, duration/1000.0) end
trinket.active = true trinket.active = true
if Gladdy.db.trinketColored then Gladdy:SendMessage("TRINKET_USED", unit)
trinket:SetBackdropColor(Gladdy:SetColor(Gladdy.db.trinketColoredCd))
end end
--end
end end
function Trinket:GetOptions() function Trinket:GetOptions()
@ -373,73 +215,22 @@ function Trinket:GetOptions()
desc = L["Enable trinket icon"], desc = L["Enable trinket icon"],
order = 3, order = 3,
}), }),
trinketColored = Gladdy:option({
type = "toggle",
name = L["Colored trinket"],
desc = L["Shows a solid colored icon when off/off CD."],
order = 4,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketColoredCd = Gladdy:colorOption({
type = "color",
name = L["Colored trinket CD"],
desc = L["Color of the border"],
order = 5,
hasAlpha = true,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketColoredNoCd = Gladdy:colorOption({
type = "color",
name = L["Colored trinket No CD"],
desc = L["Color of the border"],
order = 6,
hasAlpha = true,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketGroup = Gladdy:option({
type = "toggle",
name = L["Group Class Icons"],
order = 7,
disabled = function() return not Gladdy.db.trinketEnabled end,
}),
trinketGroupDirection = Gladdy:option({
type = "select",
name = L["Group direction"],
order = 8,
values = {
["RIGHT"] = L["Right"],
["LEFT"] = L["Left"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
},
disabled = function()
return not Gladdy.db.trinketGroup or not Gladdy.db.trinketEnabled
end,
}),
group = { group = {
type = "group", type = "group",
childGroups = "tree", childGroups = "tree",
name = L["Frame"], name = L["Frame"],
order = 5, order = 4,
disabled = function() return not Gladdy.db.trinketEnabled end,
args = { args = {
general = { general = {
type = "group", type = "group",
name = L["Icon"], name = L["Size"],
order = 1, order = 1,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon"], name = L["Size"],
order = 1, 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({ trinketSize = Gladdy:option({
type = "range", type = "range",
name = L["Size"], name = L["Size"],
@ -485,15 +276,6 @@ function Trinket:GetOptions()
order = 8, order = 8,
width = "full", width = "full",
}), }),
trinketCooldownNumberAlpha = Gladdy:option({
type = "range",
name = L["Cooldown number alpha"],
min = 0,
max = 1,
step = 0.1,
order = 9,
width = "full",
}),
}, },
}, },
font = { font = {
@ -504,19 +286,13 @@ function Trinket:GetOptions()
header = { header = {
type = "header", type = "header",
name = L["Font"], name = L["Font"],
order = 1, order = 4,
}, },
trinketFontEnabled = Gladdy:option({
type = "toggle",
name = L["Font Enabled"],
order = 2,
width = "full",
}),
trinketFont = Gladdy:option({ trinketFont = Gladdy:option({
type = "select", type = "select",
name = L["Font"], name = L["Font"],
desc = L["Font of the cooldown"], desc = L["Font of the cooldown"],
order = 3, order = 11,
dialogControl = "LSM30_Font", dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font, values = AceGUIWidgetLSMlists.font,
}), }),
@ -524,7 +300,7 @@ function Trinket:GetOptions()
type = "range", type = "range",
name = L["Font scale"], name = L["Font scale"],
desc = L["Scale of the font"], desc = L["Scale of the font"],
order = 4, order = 12,
min = 0.1, min = 0.1,
max = 2, max = 2,
step = 0.1, step = 0.1,
@ -535,30 +311,22 @@ function Trinket:GetOptions()
position = { position = {
type = "group", type = "group",
name = L["Position"], name = L["Position"],
order = 5, order = 4,
args = { args = {
header = { header = {
type = "header", type = "header",
name = L["Icon position"], name = L["Icon position"],
order = 4, order = 4,
}, },
trinketXOffset = Gladdy:option({ trinketPos = Gladdy:option({
type = "range", type = "select",
name = L["Horizontal offset"], name = L["Icon position"],
order = 23, desc = L["This changes positions of the trinket"],
min = -800, order = 21,
max = 800, values = {
step = 0.1, ["LEFT"] = L["Left"],
width = "full", ["RIGHT"] = L["Right"],
}), },
trinketYOffset = Gladdy:option({
type = "range",
name = L["Vertical offset"],
order = 24,
min = -800,
max = 800,
step = 0.1,
width = "full",
}), }),
}, },
}, },
@ -587,63 +355,7 @@ function Trinket:GetOptions()
}), }),
}, },
}, },
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
trinketFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
trinketFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
}, },
}, },
} }
end end
---------------------------
-- LAGACY HANDLER
---------------------------
function Trinket:LegacySetPosition(trinket, unit)
if Gladdy.db.newLayout then
return Gladdy.db.newLayout
end
trinket:ClearAllPoints()
local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding
if (Gladdy.db.classIconPos == "LEFT") then
if (Gladdy.db.trinketPos == "RIGHT") then
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].healthBar, "TOPRIGHT", margin, 0)
else
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].classIcon, "TOPLEFT", -Gladdy.db.padding, 0)
end
else
if (Gladdy.db.trinketPos == "RIGHT") then
trinket:SetPoint("TOPLEFT", Gladdy.buttons[unit].classIcon, "TOPRIGHT", Gladdy.db.padding, 0)
else
trinket:SetPoint("TOPRIGHT", Gladdy.buttons[unit].healthBar, "TOPLEFT", -margin, 0)
end
end
end

View File

@ -1,11 +1,11 @@
local tonumber, tostring, str_format = tonumber, tostring, string.format local str_match, tonumber, tostring = string.match, tonumber, tostring
local UnitName = UnitName local UnitName = UnitName
local IsInGroup, IsInRaid = IsInGroup, IsInRaid local IsInGroup, IsInRaid = IsInGroup, IsInRaid
local LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE local LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE
local Gladdy = LibStub("Gladdy") local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local VersionCheck = Gladdy:NewModule("VersionCheck", 1, { local VersionCheck = Gladdy:NewModule("VersionCheck", 1, {
}) })
LibStub("AceComm-3.0"):Embed(VersionCheck) LibStub("AceComm-3.0"):Embed(VersionCheck)
@ -24,11 +24,11 @@ end
function VersionCheck:JOINED_ARENA() function VersionCheck:JOINED_ARENA()
self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived) self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived)
if IsInRaid(LE_PARTY_CATEGORY_HOME) then if IsInRaid(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "RAID", self.playerName) self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", self.playerName)
elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) or IsInRaid(LE_PARTY_CATEGORY_INSTANCE) then elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) or IsInRaid(LE_PARTY_CATEGORY_INSTANCE) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "INSTANCE_CHAT", self.playerName) self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "INSTANCE_CHAT", self.playerName)
elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then
self:SendCommMessage("GladdyVCheck", str_format("%.2f", Gladdy.version_num), "PARTY", self.playerName) self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "PARTY", self.playerName)
end end
end end
@ -41,9 +41,9 @@ end
function VersionCheck.OnCommReceived(prefix, message, distribution, sender) function VersionCheck.OnCommReceived(prefix, message, distribution, sender)
if sender ~= VersionCheck.playerName then if sender ~= VersionCheck.playerName then
local addonVersion = str_format("%.2f", Gladdy.version_num) local addonVersion = Gladdy.version_num
local message_num = tonumber(message) or 0 message = tonumber(message)
if message and message_num <= Gladdy.version_num then if message and message <= Gladdy.version_num then
--Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date") --Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date")
else else
Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"") Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"")

Some files were not shown because too many files have changed in this diff Show More