diff --git a/Bindings.xml b/Bindings.xml
new file mode 100644
index 0000000..3a4fbdd
--- /dev/null
+++ b/Bindings.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Constants.lua b/Constants.lua
index 7182471..e5826a2 100644
--- a/Constants.lua
+++ b/Constants.lua
@@ -1,914 +1,1088 @@
local tbl_sort, select = table.sort, select
local GetSpellInfo = GetSpellInfo
+local GetLocale = GetLocale
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
-function Gladdy:GetSpecBuffs()
- return {
- -- DRUID
- [GetSpellInfo(45283)] = L["Restoration"], -- Natural Perfection
- [GetSpellInfo(16880)] = L["Restoration"], -- Nature's Grace; 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(16188)] = L["Restoration"], -- Nature's Swiftness
-
- -- HUNTER
- [GetSpellInfo(34692)] = L["Beast Mastery"], -- The Beast Within
- [GetSpellInfo(20895)] = L["Beast Mastery"], -- Spirit Bond
- [GetSpellInfo(34455)] = L["Beast Mastery"], -- Ferocious Inspiration
- [GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
-
- -- MAGE
- [GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier
- [GetSpellInfo(11129)] = L["Fire"], -- Combustion
- [GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power
- [GetSpellInfo(12043)] = L["Arcane"], -- Presence of Mind
- [GetSpellInfo(12472)] = L["Frost"], -- Icy Veins
-
- -- PALADIN
- [GetSpellInfo(31836)] = L["Holy"], -- Light's Grace
- [GetSpellInfo(31842)] = L["Holy"], -- Divine Illumination
- [GetSpellInfo(20216)] = L["Holy"], -- Divine Favor
- [GetSpellInfo(20375)] = L["Retribution"], -- Seal of Command
- [GetSpellInfo(20049)] = L["Retribution"], -- Vengeance
- [GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura
-
- -- PRIEST
- [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
- [GetSpellInfo(45234)] = L["Discipline"], -- Focused Will
- [GetSpellInfo(27811)] = L["Discipline"], -- Blessed Recovery
- [GetSpellInfo(33142)] = L["Holy"], -- Blessed Resilience
- [GetSpellInfo(14752)] = L["Discipline"], -- Divine Spirit
- [GetSpellInfo(27681)] = L["Discipline"], -- Prayer of Spirit
- [GetSpellInfo(10060)] = L["Discipline"], -- Power Infusion
- [GetSpellInfo(33206)] = L["Discipline"], -- Pain Suppression
- [GetSpellInfo(14893)] = L["Discipline"], -- Inspiration
-
- -- ROGUE
- [GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep
- [GetSpellInfo(44373)] = L["Subtlety"], -- Shadowstep Speed
- [GetSpellInfo(36563)] = L["Subtlety"], -- Shadowstep DMG
- [GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike
- [GetSpellInfo(31233)] = L["Assassination"], -- Find Weakness
-
- --Shaman
- [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
- [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
- [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
-
- -- WARLOCK
- [GetSpellInfo(19028)] = L["Demonology"], -- Soul Link
- [GetSpellInfo(23759)] = L["Demonology"], -- Master Demonologist
- [GetSpellInfo(30302)] = L["Destruction"], -- Nether Protection
- [GetSpellInfo(34935)] = L["Destruction"], -- Backlash
-
- -- WARRIOR
- [GetSpellInfo(29838)] = L["Arms"], -- Second Wind
- [GetSpellInfo(12292)] = L["Arms"], -- Death Wish
-
- }
-end
-
-function Gladdy:GetSpecSpells()
- return {
- -- DRUID
- [GetSpellInfo(33831)] = L["Balance"], -- Force of Nature
- [GetSpellInfo(33983)] = L["Feral"], -- Mangle (Cat)
- [GetSpellInfo(33987)] = L["Feral"], -- Mangle (Bear)
- [GetSpellInfo(18562)] = L["Restoration"], -- Swiftmend
- [GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
-
- -- HUNTER
- [GetSpellInfo(19577)] = L["Beast Mastery"], -- Intimidation
- [GetSpellInfo(34490)] = L["Marksmanship"], -- Silencing Shot
- [GetSpellInfo(27068)] = L["Survival"], -- Wyvern Sting
- [GetSpellInfo(19306)] = L["Survival"], -- Counterattack
- [GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
-
- -- MAGE
- [GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power
- [GetSpellInfo(33043)] = L["Fire"], -- Dragon's Breath
- [GetSpellInfo(33933)] = L["Fire"], -- Blast Wave
- [GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier
- [GetSpellInfo(31687)] = L["Frost"], -- Summon Water Elemental
- [GetSpellInfo(12472)] = L["Frost"], -- Icy Veins
- [GetSpellInfo(11958)] = L["Frost"], -- Cold Snap
-
- -- PALADIN
- [GetSpellInfo(33072)] = L["Holy"], -- Holy Shock
- [GetSpellInfo(20216)] = L["Holy"], -- Divine Favor
- [GetSpellInfo(31842)] = L["Holy"], -- Divine Illumination
- [GetSpellInfo(32700)] = L["Protection"], -- Avenger's Shield
- [GetSpellInfo(27170)] = L["Retribution"], -- Seal of Command
- [GetSpellInfo(35395)] = L["Retribution"], -- Crusader Strike
- [GetSpellInfo(20066)] = L["Retribution"], -- Repentance
- [GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura
-
- -- PRIEST
- [GetSpellInfo(10060)] = L["Discipline"], -- Power Infusion
- [GetSpellInfo(33206)] = L["Discipline"], -- Pain Suppression
- [GetSpellInfo(14752)] = L["Discipline"], -- Divine Spirit
- [GetSpellInfo(33143)] = L["Holy"], -- Blessed Resilience
- [GetSpellInfo(34861)] = L["Holy"], -- Circle of Healing
- [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
- [GetSpellInfo(34917)] = L["Shadow"], -- Vampiric Touch
-
- -- ROGUE
- [GetSpellInfo(34413)] = L["Assassination"], -- Mutilate
- [GetSpellInfo(14177)] = L["Assassination"], -- Cold Blood
- [GetSpellInfo(13750)] = L["Combat"], -- Adrenaline Rush
- [GetSpellInfo(14185)] = L["Subtlety"], -- Preparation
- [GetSpellInfo(16511)] = L["Subtlety"], -- Hemorrhage
- [GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep
- [GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike
- [GetSpellInfo(14183)] = L["Subtlety"], -- Premeditation
-
- -- SHAMAN
- [GetSpellInfo(16166)] = L["Elemental"], -- Elemental Mastery
- [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
- [GetSpellInfo(17364)] = L["Enhancement"], -- Stormstrike
- [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
- [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
- --[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
-
- -- WARLOCK
- [GetSpellInfo(30405)] = L["Affliction"], -- Unstable Affliction
- --[GetSpellInfo(30911)] = L["Affliction"], -- Siphon Life
- [GetSpellInfo(30414)] = L["Destruction"], -- Shadowfury
-
- -- WARRIOR
- [GetSpellInfo(30330)] = L["Arms"], -- Mortal Strike
- [GetSpellInfo(12292)] = L["Arms"], -- Death Wish
- [GetSpellInfo(30335)] = L["Fury"], -- Bloodthirst
- [GetSpellInfo(12809)] = L["Protection"], -- Concussion Blow
- [GetSpellInfo(30022)] = L["Protection"], -- Devastation
- }
-end
-
-function Gladdy:GetImportantAuras()
- return {
- -- Cyclone
- [GetSpellInfo(33786)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 6,
- priority = 40,
- spellID = 33786,
- },
- -- Hibernate
- [GetSpellInfo(18658)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- magic = true,
- spellID = 18658,
- },
- -- Entangling Roots
- [GetSpellInfo(26989)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 30,
- onDamage = true,
- magic = true,
- root = true,
- spellID = 26989,
- },
- -- Feral Charge
- [GetSpellInfo(16979)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 30,
- root = true,
- spellID = 16979,
- },
- -- Bash
- [GetSpellInfo(8983)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 30,
- spellID = 8983,
- },
- -- Pounce
- [GetSpellInfo(9005)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 40,
- spellID = 9005,
- },
- -- Maim
- [GetSpellInfo(22570)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 6,
- priority = 40,
- incapacite = true,
- spellID = 22570,
- },
- -- Innervate
- [GetSpellInfo(29166)] = {
- track = AURA_TYPE_BUFF,
- duration = 20,
- priority = 10,
- spellID = 29166,
- },
- -- Imp Starfire Stun
- [GetSpellInfo(16922)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 40,
- spellSchool = "physical",
- spellID = 16922,
- },
-
-
- -- Freezing Trap Effect
- [GetSpellInfo(14309)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- magic = true,
- spellID = 14309,
- },
- -- Wyvern Sting
- [GetSpellInfo(19386)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- poison = true,
- sleep = true,
- spellID = 19386,
- },
- -- Scatter Shot
- [GetSpellInfo(19503)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 40,
- onDamage = true,
- spellID = 19503,
- },
- -- Silencing Shot
- [GetSpellInfo(34490)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 15,
- magic = true,
- spellID = 34490,
- },
- -- Intimidation
- [GetSpellInfo(19577)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 40,
- spellID = 19577,
- },
- -- The Beast Within
- [GetSpellInfo(34692)] = {
- track = AURA_TYPE_BUFF,
- duration = 18,
- priority = 20,
- spellID = 34692,
- },
-
-
- -- Polymorph
- [GetSpellInfo(12826)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- magic = true,
- spellID = 12826,
- },
- -- Dragon's Breath
- [GetSpellInfo(31661)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 40,
- onDamage = true,
- magic = true,
- spellID = 31661,
- },
- -- Frost Nova
- [GetSpellInfo(27088)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 30,
- onDamage = true,
- magic = true,
- root = true,
- spellID = 27088,
- },
- -- Freeze (Water Elemental)
- [GetSpellInfo(33395)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 30,
- onDamage = true,
- magic = true,
- root = true,
- spellID = 33395,
- },
- -- Counterspell - Silence
- [GetSpellInfo(18469)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 15,
- magic = true,
- spellID = 18469,
- },
- -- Ice Block
- [GetSpellInfo(45438)] = {
- track = AURA_TYPE_BUFF,
- duration = 10,
- priority = 20,
- spellID = 45438,
- },
- -- Impact
- [GetSpellInfo(12355)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 40,
- spellID = 12355,
- },
-
- -- Hammer of Justice
- [GetSpellInfo(10308)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 6,
- priority = 40,
- magic = true,
- spellID = 10308,
- },
- -- Repentance
- [GetSpellInfo(20066)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 6,
- priority = 40,
- onDamage = true,
- magic = true,
- incapacite = true,
- spellID = 20066,
- },
- -- Blessing of Protection
- [GetSpellInfo(10278)] = {
- track = AURA_TYPE_BUFF,
- duration = 10,
- priority = 10,
- spellID = 10278,
- },
- -- Blessing of Freedom
- [GetSpellInfo(1044)] = {
- track = AURA_TYPE_BUFF,
- duration = 14,
- priority = 10,
- spellID = 1044,
- },
- -- Blessing of Sacrifice
- [GetSpellInfo(6940)] = {
- track = AURA_TYPE_BUFF,
- duration = 30,
- priority = 12,
- spellID = 6940,
- },
- -- Divine Shield
- [GetSpellInfo(642)] = {
- track = AURA_TYPE_BUFF,
- duration = 12,
- priority = 20,
- spellID = 642,
- },
-
-
- -- Psychic Scream
- [GetSpellInfo(8122)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 40,
- onDamage = true,
- fear = true,
- magic = true,
- spellID = 8122,
- },
- -- Chastise
- [GetSpellInfo(44047)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 30,
- root = true,
- spellID = 44047,
- },
- -- Mind Control
- [GetSpellInfo(605)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- magic = true,
- spellID = 605,
- },
- -- Silence
- [GetSpellInfo(15487)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 5,
- priority = 15,
- magic = true,
- spellID = 15487,
- },
- -- Pain Suppression
- [GetSpellInfo(33206)] = {
- track = AURA_TYPE_BUFF,
- duration = 8,
- priority = 10,
- spellID = 33206,
- },
-
-
- -- Sap
- [GetSpellInfo(6770)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- incapacite = true,
- spellID = 6770,
- },
- -- Blind
- [GetSpellInfo(2094)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- spellID = 2094,
- },
- -- Cheap Shot
- [GetSpellInfo(1833)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 40,
- spellID = 1833,
- },
- -- Kidney Shot
- [GetSpellInfo(8643)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 6,
- priority = 40,
- spellID = 8643,
- },
- -- Gouge
- [GetSpellInfo(1776)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 4,
- priority = 40,
- onDamage = true,
- incapacite = true,
- spellID = 1776,
- },
- -- Kick - Silence
- [GetSpellInfo(18425)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 15,
- spellID = 18425,
- },
- -- Garrote - Silence
- [GetSpellInfo(1330)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 15,
- spellID = 1330,
- },
- -- Cloak of Shadows
- [GetSpellInfo(31224)] = {
- track = AURA_TYPE_BUFF,
- duration = 5,
- priority = 20,
- spellID = 31224,
- },
-
-
- -- Fear
- [GetSpellInfo(5782)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- fear = true,
- magic = true,
- spellID = 5782,
- },
- -- Death Coil
- [GetSpellInfo(27223)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 40,
- spellID = 27223,
- },
- -- Shadowfury
- [GetSpellInfo(30283)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 40,
- magic = true,
- spellID = 30283,
- },
- -- Seduction (Succubus)
- [GetSpellInfo(6358)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 10,
- priority = 40,
- onDamage = true,
- fear = true,
- magic = true,
- spellID = 6358,
- },
- -- Howl of Terror
- [GetSpellInfo(5484)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 40,
- onDamage = true,
- fear = true,
- magic = true,
- spellID = 5484,
- texture = select(3, GetSpellInfo(5484))
- },
- -- Spell Lock (Felhunter)
- [GetSpellInfo(24259)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 15,
- magic = true,
- spellID = 24259,
- },
- -- Unstable Affliction Silence
- ["Unstable Affliction Silence"] = { -- GetSpellInfo returns "Unstable Affliction"
- track = AURA_TYPE_DEBUFF,
- duration = 5,
- priority = 15,
- magic = true,
- spellID = 31117,
- },
-
-
- -- Intimidating Shout
- [GetSpellInfo(5246)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 8,
- priority = 15,
- onDamage = true,
- fear = true,
- spellID = 5246,
- },
- -- Concussion Blow
- [GetSpellInfo(12809)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 5,
- priority = 40,
- spellID = 12809,
- },
- -- Intercept Stun
- [GetSpellInfo(25274)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 40,
- spellID = 25274,
- },
- -- Spell Reflection
- [GetSpellInfo(23920)] = {
- track = AURA_TYPE_BUFF,
- duration = 5,
- priority = 50,
- spellID = 23920,
- },
- -- Shield Bash - Silenced
- [GetSpellInfo(18498)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 3,
- priority = 15,
- spellSchool = "magic",
- spellID = 18498,
- },
- -- Death Wish
- [GetSpellInfo(12292)] = {
- track = AURA_TYPE_BUFF,
- duration = 3,
- priority = 15,
- spellSchool = "magic",
- spellID = 12292,
- },
-
- -- Grounding Totem Effect
- [GetSpellInfo(8178)] = {
- track = AURA_TYPE_BUFF,
- duration = 0,
- priority = 20,
- spellID = 8178
- },
- --Intervene
- [GetSpellInfo(3411)] = {
- track = AURA_TYPE_BUFF,
- duration = 10,
- priority = 10,
- spellSchool = "physical",
- spellID = 3411,
- },
-
-
- -- War Stomp
- [GetSpellInfo(20549)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 40,
- spellID = 20549,
- },
- -- Arcane Torrent
- [GetSpellInfo(28730)] = {
- track = AURA_TYPE_DEBUFF,
- duration = 2,
- priority = 15,
- magic = true,
- spellID = 28730,
- },
- }
-end
-
Gladdy.CLASSES = {"MAGE", "PRIEST", "DRUID", "SHAMAN", "PALADIN", "WARLOCK", "WARRIOR", "HUNTER", "ROGUE"}
tbl_sort(Gladdy.CLASSES)
Gladdy.RACES = {"Scourge", "BloodElf", "Tauren", "Orc", "Troll", "NightElf", "Draenei", "Human", "Gnome", "Dwarf"}
tbl_sort(Gladdy.RACES)
-function Gladdy:GetCooldownList()
- return {
- -- Spell Name Cooldown[, Spec]
- -- Mage
- ["MAGE"] = {
- [1953] = 15, -- Blink
- --[122] = 22, -- Frost Nova
- --[12051] = 480, --Evocation
- [2139] = 24, -- Counterspell
- [45438] = { cd = 300, [L["Frost"]] = 240, }, -- Ice Block
- [12472] = { cd = 180, spec = L["Frost"], }, -- Icy Veins
- [31687] = { cd = 180, spec = L["Frost"], }, -- Summon Water Elemental
- [12043] = { cd = 180, spec = L["Arcane"], }, -- Presence of Mind
- [11129] = { cd = 180, spec = L["Fire"] }, -- Combustion
- [120] = { cd = 10,
- sharedCD = {
- [31661] = true, -- Cone of Cold
- }, spec = L["Fire"] }, -- Dragon's Breath
- [31661] = { cd = 20,
- sharedCD = {
- [120] = true, -- Cone of Cold
- }, spec = L["Fire"] }, -- Dragon's Breath
- [12042] = { cd = 180, spec = L["Arcane"], }, -- Arcane Power
- [11958] = { cd = 384, spec = L["Frost"], -- Coldsnap
- resetCD = {
- [12472] = true,
- [45438] = true,
- [31687] = true,
- },
- },
- },
+local specBuffs = {
+ -- DRUID
+ [GetSpellInfo(45283)] = L["Restoration"], -- Natural Perfection
+ [GetSpellInfo(16880)] = L["Restoration"], -- Nature's Grace; 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(16188)] = L["Restoration"], -- Nature's Swiftness
- -- Priest
- ["PRIEST"] = {
- [10890] = { cd = 27, [L["Shadow"]] = 23, }, -- Psychic Scream
- [15487] = { cd = 45, spec = L["Shadow"], }, -- Silence
- [10060] = { cd = 180, spec = L["Discipline"], }, -- Power Infusion
- [33206] = { cd = 120, spec = L["Discipline"], }, -- Pain Suppression
- [34433] = 300, -- Shadowfiend
- },
+ -- HUNTER
+ [GetSpellInfo(34692)] = L["Beast Mastery"], -- The Beast Within
+ [GetSpellInfo(20895)] = L["Beast Mastery"], -- Spirit Bond
+ [GetSpellInfo(34455)] = L["Beast Mastery"], -- Ferocious Inspiration
+ [GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
- -- Druid
- ["DRUID"] = {
- [22812] = 60, -- Barkskin
- [29166] = 360, -- Innervate
- [8983] = 60, -- Bash
- [16689] = 60, -- Natures Grasp
- [17116] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness
- [33831] = { cd = 180, spec = L["Balance"], }, -- Force of Nature
- },
+ -- MAGE
+ [GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier
+ [GetSpellInfo(11129)] = L["Fire"], -- Combustion
+ [GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power
+ [GetSpellInfo(12043)] = L["Arcane"], -- Presence of Mind
+ [GetSpellInfo(12472)] = L["Frost"], -- Icy Veins
- -- Shaman
- ["SHAMAN"] = {
- [8042] = { cd = 6, -- Earth Shock
- sharedCD = {
- [8056] = true, -- Frost Shock
- [8050] = true, -- Flame Shock
- },
- },
- [30823] = { cd = 120, spec = L["Enhancement"], }, -- Shamanistic Rage
- [16166] = { cd = 180, spec = L["Elemental"], }, -- Elemental Mastery
- [16188] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness
- [16190] = { cd = 300, spec = L["Restoration"], }, -- Mana Tide Totem
- },
+ -- PALADIN
+ [GetSpellInfo(31836)] = L["Holy"], -- Light's Grace
+ [GetSpellInfo(31842)] = L["Holy"], -- Divine Illumination
+ [GetSpellInfo(20216)] = L["Holy"], -- Divine Favor
+ [GetSpellInfo(20375)] = L["Retribution"], -- Seal of Command
+ [GetSpellInfo(20049)] = L["Retribution"], -- Vengeance
+ [GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura
- -- Paladin
- ["PALADIN"] = {
- [10278] = 180, -- Blessing of Protection
- [1044] = 25, -- Blessing of Freedom
- [10308] = { cd = 60, [L["Retribution"]] = 40, }, -- Hammer of Justice
- [642] = { cd = 300, -- Divine Shield
- sharedCD = {
- cd = 60, -- no actual shared CD but debuff
- [31884] = true,
- },
- },
- [31884] = { cd = 180, spec = L["Retribution"], -- Avenging Wrath
- sharedCD = {
- cd = 60,
- [642] = true,
- },
- },
- [20066] = { cd = 60, spec = L["Retribution"], }, -- Repentance
- [31842] = { cd = 180, spec = L["Holy"], }, -- Divine Illumination
- [31935] = { cd = 30, spec = L["Protection"], }, -- Avengers Shield
+ -- PRIEST
+ [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
+ [GetSpellInfo(45234)] = L["Discipline"], -- Focused Will
+ [GetSpellInfo(27811)] = L["Discipline"], -- Blessed Recovery
+ [GetSpellInfo(33142)] = L["Holy"], -- Blessed Resilience
+ [GetSpellInfo(14752)] = L["Discipline"], -- Divine Spirit
+ [GetSpellInfo(27681)] = L["Discipline"], -- Prayer of Spirit
+ [GetSpellInfo(10060)] = L["Discipline"], -- Power Infusion
+ [GetSpellInfo(33206)] = L["Discipline"], -- Pain Suppression
+ [GetSpellInfo(14893)] = L["Discipline"], -- Inspiration
- },
+ -- ROGUE
+ [GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep
+ [GetSpellInfo(44373)] = L["Subtlety"], -- Shadowstep Speed
+ [GetSpellInfo(36563)] = L["Subtlety"], -- Shadowstep DMG
+ [GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike
+ [GetSpellInfo(31233)] = L["Assassination"], -- Find Weakness
- -- Warlock
- ["WARLOCK"] = {
- [17928] = 40, -- Howl of Terror
- [27223] = 120, -- Death Coil
- --[19647] = { cd = 24 }, -- Spell Lock; how will I handle pet spells?
- [30414] = { cd = 20, spec = L["Destruction"], }, -- Shadowfury
- [17877] = { cd = 15, spec = L["Destruction"], }, -- Shadowburn
- [18708] = { cd = 900, spec = L["Demonology"], }, -- Feldom
- },
+ --Shaman
+ [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
+ [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
+ [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
- -- Warrior
- ["WARRIOR"] = {
- --[[6552] = { cd = 10, -- Pummel
- sharedCD = {
- [72] = true,
- },
- },
- [72] = { cd = 12, -- Shield Bash
- sharedCD = {
- [6552] = true,
- },
- }, ]]
- --[23920] = 10, -- Spell Reflection
- [3411] = 30, -- Intervene
- [676] = 60, -- Disarm
- [5246] = 180, -- Intimidating Shout
- --[2565] = 60, -- Shield Block
- [12292] = { cd = 180, spec = L["Arms"], }, -- Death Wish
- [12975] = { cd = 180, spec = L["Protection"], }, -- Last Stand
- [12809] = { cd = 30, spec = L["Protection"], }, -- Concussion Blow
+ -- WARLOCK
+ [GetSpellInfo(19028)] = L["Demonology"], -- Soul Link
+ [GetSpellInfo(23759)] = L["Demonology"], -- Master Demonologist
+ [GetSpellInfo(30302)] = L["Destruction"], -- Nether Protection
+ [GetSpellInfo(34935)] = L["Destruction"], -- Backlash
- },
+ -- WARRIOR
+ [GetSpellInfo(29838)] = L["Arms"], -- Second Wind
+ [GetSpellInfo(12292)] = L["Arms"], -- Death Wish
- -- Hunter
- ["HUNTER"] = {
- [19503] = 30, -- Scatter Shot
- [19263] = 300, -- Deterrence; not on BM but can't do 2 specs
- [14311] = { cd = 30, -- Freezing Trap
- sharedCD = {
- [13809] = true, -- Frost Trap
- [34600] = true, -- Snake Trap
- },
- },
- [13809] = { cd = 30, -- Frost Trap
- sharedCD = {
- [14311] = true, -- Freezing Trap
- [34600] = true, -- Snake Trap
- },
- },
- [34600] = { cd = 30, -- Snake Trap
- sharedCD = {
- [14311] = true, -- Freezing Trap
- [13809] = true, -- Frost Trap
- },
- },
- [34490] = { cd = 20, spec = L["Marksmanship"], }, -- Silencing Shot
- [19386] = { cd = 60, spec = L["Survival"], }, -- Wyvern Sting
- [19577] = { cd = 60, spec = L["Beast Mastery"], }, -- Intimidation
- [38373] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within
- },
-
- -- Rogue
- ["ROGUE"] = {
- [1766] = 10, -- Kick
- [8643] = 20, -- Kidney Shot
- [31224] = 60, -- Cloak of Shadow
- [26889] = { cd = 300, [L["Subtlety"]] = 180, }, -- Vanish
- [2094] = { cd = 180, [L["Subtlety"]] = 90, }, -- Blind
- [11305] = { cd = 300, [L["Combat"]] = 180, }, -- Sprint
- [26669] = { cd = 300, [L["Combat"]] = 180, }, -- Evasion
- [14177] = { cd = 180, spec = L["Assassination"], }, -- Cold Blood
- [13750] = { cd = 300, spec = L["Combat"], }, -- Adrenaline Rush
- [13877] = { cd = 120, spec = L["Combat"], }, -- Blade Flurry
- [36554] = { cd = 30, spec = L["Subtlety"], }, -- Shadowstep
- [14185] = { cd = 600, spec = L["Subtlety"], -- Preparation
- resetCD = {
- [26669] = true,
- [11305] = true,
- [26889] = true,
- [14177] = true,
- [36554] = true,
- },
- },
- },
- ["Scourge"] = {
-
- },
- ["BloodElf"] = {
-
- },
- ["Tauren"] = {
-
- },
- ["Orc"] = {
-
- },
- ["Troll"] = {
-
- },
- ["NightElf"] = {
- [2651] = { cd = 180, spec = L["Discipline"], }, -- Elune's Grace
- [10797] = { cd = 30, spec = L["Discipline"], }, -- Star Shards
- },
- ["Draenei"] = {
- [32548] = { cd = 300, spec = L["Discipline"], }, -- Hymn of Hope
- },
- ["Human"] = {
- [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
- },
- ["Gnome"] = {
- },
- ["Dwarf"] = {
- [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
- },
- }
+}
+function Gladdy:GetSpecBuffs()
+ return specBuffs
end
+local specSpells = {
+ -- DRUID
+ [GetSpellInfo(33831)] = L["Balance"], -- Force of Nature
+ [GetSpellInfo(33983)] = L["Feral"], -- Mangle (Cat)
+ [GetSpellInfo(33987)] = L["Feral"], -- Mangle (Bear)
+ [GetSpellInfo(18562)] = L["Restoration"], -- Swiftmend
+ [GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
+
+ -- HUNTER
+ [GetSpellInfo(19577)] = L["Beast Mastery"], -- Intimidation
+ [GetSpellInfo(34490)] = L["Marksmanship"], -- Silencing Shot
+ [GetSpellInfo(27068)] = L["Survival"], -- Wyvern Sting
+ [GetSpellInfo(19306)] = L["Survival"], -- Counterattack
+ [GetSpellInfo(27066)] = L["Marksmanship"], -- Trueshot Aura
+
+ -- MAGE
+ [GetSpellInfo(12042)] = L["Arcane"], -- Arcane Power
+ [GetSpellInfo(33043)] = L["Fire"], -- Dragon's Breath
+ [GetSpellInfo(33933)] = L["Fire"], -- Blast Wave
+ [GetSpellInfo(33405)] = L["Frost"], -- Ice Barrier
+ [GetSpellInfo(31687)] = L["Frost"], -- Summon Water Elemental
+ [GetSpellInfo(12472)] = L["Frost"], -- Icy Veins
+ [GetSpellInfo(11958)] = L["Frost"], -- Cold Snap
+
+ -- PALADIN
+ [GetSpellInfo(33072)] = L["Holy"], -- Holy Shock
+ [GetSpellInfo(20216)] = L["Holy"], -- Divine Favor
+ [GetSpellInfo(31842)] = L["Holy"], -- Divine Illumination
+ [GetSpellInfo(32700)] = L["Protection"], -- Avenger's Shield
+ [GetSpellInfo(27170)] = L["Retribution"], -- Seal of Command
+ [GetSpellInfo(35395)] = L["Retribution"], -- Crusader Strike
+ [GetSpellInfo(20066)] = L["Retribution"], -- Repentance
+ [GetSpellInfo(20218)] = L["Retribution"], -- Sanctity Aura
+
+ -- PRIEST
+ [GetSpellInfo(10060)] = L["Discipline"], -- Power Infusion
+ [GetSpellInfo(33206)] = L["Discipline"], -- Pain Suppression
+ [GetSpellInfo(14752)] = L["Discipline"], -- Divine Spirit
+ [GetSpellInfo(33143)] = L["Holy"], -- Blessed Resilience
+ [GetSpellInfo(34861)] = L["Holy"], -- Circle of Healing
+ [GetSpellInfo(15473)] = L["Shadow"], -- Shadowform
+ [GetSpellInfo(34917)] = L["Shadow"], -- Vampiric Touch
+
+ -- ROGUE
+ [GetSpellInfo(34413)] = L["Assassination"], -- Mutilate
+ [GetSpellInfo(14177)] = L["Assassination"], -- Cold Blood
+ [GetSpellInfo(13750)] = L["Combat"], -- Adrenaline Rush
+ [GetSpellInfo(14185)] = L["Subtlety"], -- Preparation
+ [GetSpellInfo(16511)] = L["Subtlety"], -- Hemorrhage
+ [GetSpellInfo(36554)] = L["Subtlety"], -- Shadowstep
+ [GetSpellInfo(14278)] = L["Subtlety"], -- Ghostly Strike
+ [GetSpellInfo(14183)] = L["Subtlety"], -- Premeditation
+
+ -- SHAMAN
+ [GetSpellInfo(16166)] = L["Elemental"], -- Elemental Mastery
+ [GetSpellInfo(30823)] = L["Enhancement"], -- Shamanistic Rage
+ [GetSpellInfo(17364)] = L["Enhancement"], -- Stormstrike
+ [GetSpellInfo(16190)] = L["Restoration"], -- Mana Tide Totem
+ [GetSpellInfo(32594)] = L["Restoration"], -- Earth Shield
+ --[GetSpellInfo(16188)] = L["Restoration"], -- Nature's Swiftness
+
+ -- WARLOCK
+ [GetSpellInfo(30405)] = L["Affliction"], -- Unstable Affliction
+ --[GetSpellInfo(30911)] = L["Affliction"], -- Siphon Life
+ [GetSpellInfo(30414)] = L["Destruction"], -- Shadowfury
+
+ -- WARRIOR
+ [GetSpellInfo(30330)] = L["Arms"], -- Mortal Strike
+ [GetSpellInfo(12292)] = L["Arms"], -- Death Wish
+ [GetSpellInfo(30335)] = L["Fury"], -- Bloodthirst
+ [GetSpellInfo(12809)] = L["Protection"], -- Concussion Blow
+ [GetSpellInfo(30022)] = L["Protection"], -- Devastation
+}
+function Gladdy:GetSpecSpells()
+ return specSpells
+end
+
+local importantAuras = {
+ -- Cyclone
+ [GetSpellInfo(33786)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 6,
+ priority = 40,
+ spellID = 33786,
+ },
+ -- Hibernate
+ [GetSpellInfo(18658)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ magic = true,
+ spellID = 18658,
+ },
+ -- Entangling Roots
+ [GetSpellInfo(26989)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 30,
+ onDamage = true,
+ magic = true,
+ root = true,
+ spellID = 26989,
+ },
+ -- Feral Charge
+ [GetSpellInfo(16979)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 30,
+ root = true,
+ spellID = 16979,
+ },
+ -- Bash
+ [GetSpellInfo(8983)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 30,
+ spellID = 8983,
+ },
+ -- Pounce
+ [GetSpellInfo(9005)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellID = 9005,
+ },
+ -- Maim
+ [GetSpellInfo(22570)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 6,
+ priority = 40,
+ incapacite = true,
+ spellID = 22570,
+ },
+ -- Innervate
+ [GetSpellInfo(29166)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 20,
+ priority = 10,
+ spellID = 29166,
+ },
+ -- Imp Starfire Stun
+ [GetSpellInfo(16922)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellSchool = "physical",
+ spellID = 16922,
+ },
+
+
+ -- Freezing Trap Effect
+ [GetSpellInfo(14309)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ magic = true,
+ spellID = 14309,
+ },
+ -- Wyvern Sting
+ [GetSpellInfo(19386)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ poison = true,
+ sleep = true,
+ spellID = 19386,
+ },
+ -- Scatter Shot
+ [GetSpellInfo(19503)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 40,
+ onDamage = true,
+ spellID = 19503,
+ },
+ -- Silencing Shot
+ [GetSpellInfo(34490)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 15,
+ magic = true,
+ spellID = 34490,
+ },
+ -- Intimidation
+ [GetSpellInfo(19577)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 40,
+ spellID = 19577,
+ },
+ -- The Beast Within
+ [GetSpellInfo(34692)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 18,
+ priority = 20,
+ spellID = 34692,
+ },
+
+
+ -- Polymorph
+ [GetSpellInfo(12826)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ magic = true,
+ spellID = 12826,
+ },
+ -- Dragon's Breath
+ [GetSpellInfo(31661)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ onDamage = true,
+ magic = true,
+ spellID = 31661,
+ },
+ -- Frost Nova
+ [GetSpellInfo(27088)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 30,
+ onDamage = true,
+ magic = true,
+ root = true,
+ spellID = 27088,
+ },
+ -- Freeze (Water Elemental)
+ [GetSpellInfo(33395)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 30,
+ onDamage = true,
+ magic = true,
+ root = true,
+ spellID = 33395,
+ },
+ -- Counterspell - Silence
+ [GetSpellInfo(18469)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 15,
+ magic = true,
+ spellID = 18469,
+ },
+ -- Ice Block
+ [GetSpellInfo(45438)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 10,
+ priority = 20,
+ spellID = 45438,
+ },
+ -- Impact
+ [GetSpellInfo(12355)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 40,
+ spellID = 12355,
+ },
+
+ -- Hammer of Justice
+ [GetSpellInfo(10308)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 6,
+ priority = 40,
+ magic = true,
+ spellID = 10308,
+ },
+ -- Repentance
+ [GetSpellInfo(20066)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 6,
+ priority = 40,
+ onDamage = true,
+ magic = true,
+ incapacite = true,
+ spellID = 20066,
+ },
+ -- Blessing of Protection
+ [GetSpellInfo(10278)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 10,
+ priority = 10,
+ spellID = 10278,
+ },
+ -- Blessing of Freedom
+ [GetSpellInfo(1044)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 14,
+ priority = 10,
+ spellID = 1044,
+ },
+ -- Blessing of Sacrifice
+ [GetSpellInfo(6940)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 30,
+ priority = 12,
+ spellID = 6940,
+ },
+ -- Divine Shield
+ [GetSpellInfo(642)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 12,
+ priority = 20,
+ spellID = 642,
+ },
+
+
+ -- Psychic Scream
+ [GetSpellInfo(8122)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 40,
+ onDamage = true,
+ fear = true,
+ magic = true,
+ spellID = 8122,
+ },
+ -- Chastise
+ [GetSpellInfo(44047)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 30,
+ root = true,
+ spellID = 44047,
+ },
+ -- Mind Control
+ [GetSpellInfo(605)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ magic = true,
+ spellID = 605,
+ },
+ --Blackout Stun 15269
+ [GetSpellInfo(15269)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellSchool = "magic",
+ spellID = 15269,
+ },
+ -- Silence
+ [GetSpellInfo(15487)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 5,
+ priority = 15,
+ magic = true,
+ spellID = 15487,
+ },
+ -- Pain Suppression
+ [GetSpellInfo(33206)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 8,
+ priority = 10,
+ spellID = 33206,
+ },
+
+
+ -- Sap
+ [GetSpellInfo(6770)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ incapacite = true,
+ spellID = 6770,
+ },
+ -- Blind
+ [GetSpellInfo(2094)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ spellID = 2094,
+ },
+ -- Cheap Shot
+ [GetSpellInfo(1833)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 40,
+ spellID = 1833,
+ },
+ -- Kidney Shot
+ [GetSpellInfo(8643)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 6,
+ priority = 40,
+ spellID = 8643,
+ },
+ -- Gouge
+ [GetSpellInfo(1776)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 40,
+ onDamage = true,
+ incapacite = true,
+ spellID = 1776,
+ },
+ -- Kick - Silence
+ [GetSpellInfo(18425)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 15,
+ spellID = 18425,
+ },
+ -- Garrote - Silence
+ [GetSpellInfo(1330)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 15,
+ spellID = 1330,
+ },
+ -- Cloak of Shadows
+ [GetSpellInfo(31224)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 5,
+ priority = 20,
+ spellID = 31224,
+ },
+
+
+ -- Fear
+ [GetSpellInfo(5782)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ fear = true,
+ magic = true,
+ spellID = 5782,
+ },
+ -- Death Coil
+ [GetSpellInfo(27223)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellID = 27223,
+ },
+ -- Shadowfury
+ [GetSpellInfo(30283)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 40,
+ magic = true,
+ spellID = 30283,
+ },
+ -- Seduction (Succubus)
+ [GetSpellInfo(6358)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 10,
+ priority = 40,
+ onDamage = true,
+ fear = true,
+ magic = true,
+ spellID = 6358,
+ },
+ -- Howl of Terror
+ [GetSpellInfo(5484)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 40,
+ onDamage = true,
+ fear = true,
+ magic = true,
+ spellID = 5484,
+ texture = select(3, GetSpellInfo(5484))
+ },
+ -- Spell Lock (Felhunter)
+ [GetSpellInfo(24259)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 15,
+ magic = true,
+ spellID = 24259,
+ },
+ -- Unstable Affliction Silence
+ ["Unstable Affliction Silence"] = { -- GetSpellInfo returns "Unstable Affliction"
+ track = AURA_TYPE_DEBUFF,
+ altName = select(1, GetSpellInfo(31117)) .. " Silence",
+ duration = 5,
+ priority = 15,
+ magic = true,
+ spellID = 31117,
+ },
+
+
+ -- Intimidating Shout
+ [GetSpellInfo(5246)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 8,
+ priority = 15,
+ onDamage = true,
+ fear = true,
+ spellID = 5246,
+ },
+ -- Concussion Blow
+ [GetSpellInfo(12809)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 5,
+ priority = 40,
+ spellID = 12809,
+ },
+ -- Intercept Stun
+ [GetSpellInfo(25274)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellID = 25274,
+ texture = select(3, GetSpellInfo(25272))
+ },
+ -- Charge Stun
+ [GetSpellInfo(7922)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 1,
+ priority = 40,
+ spellID = 7922,
+ texture = select(3, GetSpellInfo(100))
+ },
+ -- Spell Reflection
+ [GetSpellInfo(23920)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 5,
+ priority = 50,
+ spellID = 23920,
+ },
+ -- Shield Bash - Silenced
+ [GetSpellInfo(18498)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 15,
+ spellSchool = "magic",
+ spellID = 18498,
+ },
+ -- Death Wish
+ [GetSpellInfo(12292)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 3,
+ priority = 15,
+ spellSchool = "magic",
+ spellID = 12292,
+ },
+
+ -- Grounding Totem Effect
+ [GetSpellInfo(8178)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 0,
+ priority = 20,
+ spellID = 8178
+ },
+ --Intervene
+ [GetSpellInfo(3411)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 10,
+ priority = 10,
+ spellSchool = "physical",
+ spellID = 3411,
+ },
+ --Improved Hamstring
+ [GetSpellInfo(23694)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 5,
+ priority = 40,
+ spellSchool = "physical",
+ spellID = 23694,
+ },
+
+ -- Mace Stun Effect
+ [GetSpellInfo(5530)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 3,
+ priority = 40,
+ spellSchool = "physical",
+ texture = select(3, GetSpellInfo(12284)),
+ spellID = 5530,
+ },
+
+ -- Storm Herald Stun effect
+ [GetSpellInfo(34510)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 4,
+ priority = 40,
+ spellSchool = "physical",
+ spellID = 34510,
+ },
+
+ -- War Stomp
+ [GetSpellInfo(20549)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 40,
+ spellID = 20549,
+ },
+ -- Arcane Torrent
+ [GetSpellInfo(28730)] = {
+ track = AURA_TYPE_DEBUFF,
+ duration = 2,
+ priority = 15,
+ magic = true,
+ spellID = 28730,
+ },
+ -- Shadowsight Buff
+ [GetSpellInfo(34709)] = {
+ track = AURA_TYPE_BUFF,
+ duration = 15,
+ priority = 15,
+ magic = true,
+ spellID = 34709,
+ },
+}
+function Gladdy:GetImportantAuras()
+ return importantAuras
+end
+
+local interrupts = {
+ [GetSpellInfo(19675)] = {duration = 4, spellID = 19675, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(19675)), priority = 15}, -- Feral Charge Effect (Druid)
+ [GetSpellInfo(2139)] = {duration = 8, spellID = 2139, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(2139)), priority = 15}, -- Counterspell (Mage)
+ [GetSpellInfo(1766)] = {duration = 5, spellID = 1766, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(1766)), priority = 15}, -- Kick (Rogue)
+ [GetSpellInfo(6552)] = {duration = 4, spellID = 6552, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(6552)), priority = 15}, -- Pummel (Warrior)
+ [GetSpellInfo(72)] = {duration = 6, spellID = 72, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(72)), priority = 15}, -- Shield Bash (Warrior)
+ [GetSpellInfo(8042)] = {duration = 2, spellID = 8042, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(8042)), priority = 15}, -- Earth Shock (Shaman)
+ [GetSpellInfo(19244)] = {duration = 5, spellID = 19244, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(19244)), priority = 15}, -- Spell Lock (Warlock
+ [GetSpellInfo(32747)] = {duration = 3, spellID = 32747, track = AURA_TYPE_DEBUFF, texture = select(3, GetSpellInfo(32747)), priority = 15}, -- Deadly Throw Interrupt
+}
+function Gladdy:GetInterrupts()
+ return interrupts
+end
+
+local auraTypeColor = {}
+auraTypeColor["none"] = { r = 0.80, g = 0, b = 0 , a = 1}
+auraTypeColor["magic"] = { r = 0.20, g = 0.60, b = 1.00, a = 1}
+auraTypeColor["curse"] = { r = 0.60, g = 0.00, b = 1.00, a = 1 }
+auraTypeColor["disease"] = { r = 0.60, g = 0.40, b = 0, a = 1 }
+auraTypeColor["poison"] = { r = 0.00, g = 0.60, b = 0, a = 1 }
+auraTypeColor["immune"] = { r = 1.00, g = 0.02, b = 0.99, a = 1 }
+auraTypeColor["form"] = auraTypeColor["none"]
+auraTypeColor["aura"] = auraTypeColor["none"]
+auraTypeColor[""] = auraTypeColor["none"]
+
+function Gladdy:GetAuraTypeColor()
+ return auraTypeColor
+end
+
+local spellSchoolColors = {}
+spellSchoolColors[1] = {r = 1, g = 1, b = 0, a = 1, type = "Physical"} --- "physical" 255, 255, 0
+spellSchoolColors[2] = {r = 1, g = 0.901, b = 0.501, a = 1, type = "Holy"} ---"holy" -- 255, 230, 128
+spellSchoolColors[4] = {r = 1, g = 0.501, b = 0, a = 1, type = "Fire"} ---"fire" -- 255, 128, 0
+spellSchoolColors[8] = {r = 0.302, g = 1, b = 0.302, a = 1, type = "Nature"} ---"nature" -- 77, 255, 77
+spellSchoolColors[16] = {r = 0.501, g = 1, b = 1, a = 1, type = "Frost"} ---"frost" -- 128, 255, 255
+spellSchoolColors[32] = {r = 0.501, g = 0.501, b = 1, a = 1, type = "Shadow"} ---"shadow" --128, 128, 255
+spellSchoolColors[64] = {r = 1, g = 0.501, b = 1, a = 1, type = "Arcane"} ---"arcane" -- 255, 128, 255
+spellSchoolColors["unknown"] = {r = 0, g = 0, b = 0, a = 1, type = "Unknown"} ---"unknown spell school"
+
+function Gladdy:GetSpellSchoolColors()
+ return spellSchoolColors
+end
+
+local cooldownList = {
+ -- Spell Name Cooldown[, Spec]
+ -- Mage
+ ["MAGE"] = {
+ [1953] = 15, -- Blink
+ --[122] = 22, -- Frost Nova
+ --[12051] = 480, --Evocation
+ [2139] = 24, -- Counterspell
+ [45438] = { cd = 300, [L["Frost"]] = 240, }, -- Ice Block
+ [12472] = { cd = 180, spec = L["Frost"], }, -- Icy Veins
+ [31687] = { cd = 180, spec = L["Frost"], }, -- Summon Water Elemental
+ [12043] = { cd = 180, spec = L["Arcane"], }, -- Presence of Mind
+ [11129] = { cd = 180, spec = L["Fire"] }, -- Combustion
+ [120] = { cd = 10,
+ sharedCD = {
+ [31661] = true, -- Cone of Cold
+ }, spec = L["Fire"] }, -- Dragon's Breath
+ [31661] = { cd = 20,
+ sharedCD = {
+ [120] = true, -- Cone of Cold
+ }, spec = L["Fire"] }, -- Dragon's Breath
+ [12042] = { cd = 180, spec = L["Arcane"], }, -- Arcane Power
+ [11958] = { cd = 384, spec = L["Frost"], -- Coldsnap
+ resetCD = {
+ [12472] = true,
+ [45438] = true,
+ [31687] = true,
+ },
+ },
+ },
+
+ -- Priest
+ ["PRIEST"] = {
+ [10890] = { cd = 27, [L["Shadow"]] = 23, }, -- Psychic Scream
+ [15487] = { cd = 45, spec = L["Shadow"], }, -- Silence
+ [10060] = { cd = 180, spec = L["Discipline"], }, -- Power Infusion
+ [33206] = { cd = 120, spec = L["Discipline"], }, -- Pain Suppression
+ [34433] = 300, -- Shadowfiend
+ },
+
+ -- Druid
+ ["DRUID"] = {
+ [22812] = 60, -- Barkskin
+ [29166] = 360, -- Innervate
+ [8983] = 60, -- Bash
+ [16689] = 60, -- Natures Grasp
+ [18562] = { cd = 15, spec = L["Restoration"], }, -- Swiftmend
+ [17116] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness
+ [33831] = { cd = 180, spec = L["Balance"], }, -- Force of Nature
+ },
+
+ -- Shaman
+ ["SHAMAN"] = {
+ [8042] = { cd = 6, -- Earth Shock
+ sharedCD = {
+ [8056] = true, -- Frost Shock
+ [8050] = true, -- Flame Shock
+ },
+ },
+ [30823] = { cd = 120, spec = L["Enhancement"], }, -- Shamanistic Rage
+ [16166] = { cd = 180, spec = L["Elemental"], }, -- Elemental Mastery
+ [16188] = { cd = 180, spec = L["Restoration"], }, -- Natures Swiftness
+ [16190] = { cd = 300, spec = L["Restoration"], }, -- Mana Tide Totem
+ },
+
+ -- Paladin
+ ["PALADIN"] = {
+ [10278] = 180, -- Blessing of Protection
+ [1044] = 25, -- Blessing of Freedom
+ [10308] = { cd = 60, [L["Retribution"]] = 40, }, -- Hammer of Justice
+ [642] = { cd = 300, -- Divine Shield
+ sharedCD = {
+ cd = 60, -- no actual shared CD but debuff
+ [31884] = true,
+ },
+ },
+ [31884] = { cd = 180, spec = L["Retribution"], -- Avenging Wrath
+ sharedCD = {
+ cd = 60,
+ [642] = true,
+ },
+ },
+ [20066] = { cd = 60, spec = L["Retribution"], }, -- Repentance
+ [31842] = { cd = 180, spec = L["Holy"], }, -- Divine Illumination
+ [31935] = { cd = 30, spec = L["Protection"], }, -- Avengers Shield
+
+ },
+
+ -- Warlock
+ ["WARLOCK"] = {
+ [17928] = 40, -- Howl of Terror
+ [27223] = 120, -- Death Coil
+ --[19647] = { cd = 24 }, -- Spell Lock; how will I handle pet spells?
+ [30414] = { cd = 20, spec = L["Destruction"], }, -- Shadowfury
+ [17877] = { cd = 15, spec = L["Destruction"], }, -- Shadowburn
+ [18708] = { cd = 900, spec = L["Demonology"], }, -- Feldom
+ },
+
+ -- Warrior
+ ["WARRIOR"] = {
+ --[[6552] = { cd = 10, -- Pummel
+ sharedCD = {
+ [72] = true,
+ },
+ },
+ [72] = { cd = 12, -- Shield Bash
+ sharedCD = {
+ [6552] = true,
+ },
+ }, ]]
+ --[23920] = 10, -- Spell Reflection
+ [3411] = 30, -- Intervene
+ [676] = 60, -- Disarm
+ [5246] = 180, -- Intimidating Shout
+ [18499] = 30, -- Berserker Rage
+ --[2565] = 60, -- Shield Block
+ [12292] = { cd = 180, spec = L["Arms"], }, -- Death Wish
+ [12975] = { cd = 180, spec = L["Protection"], }, -- Last Stand
+ [12809] = { cd = 30, spec = L["Protection"], }, -- Concussion Blow
+
+ },
+
+ -- Hunter
+ ["HUNTER"] = {
+ [19503] = 30, -- Scatter Shot
+ [19263] = 300, -- Deterrence; not on BM but can't do 2 specs
+ [14311] = { cd = 30, -- Freezing Trap
+ sharedCD = {
+ [13809] = true, -- Frost Trap
+ [34600] = true, -- Snake Trap
+ },
+ },
+ [13809] = { cd = 30, -- Frost Trap
+ sharedCD = {
+ [14311] = true, -- Freezing Trap
+ [34600] = true, -- Snake Trap
+ },
+ },
+ [34600] = { cd = 30, -- Snake Trap
+ sharedCD = {
+ [14311] = true, -- Freezing Trap
+ [13809] = true, -- Frost Trap
+ },
+ },
+ [34490] = { cd = 20, spec = L["Marksmanship"], }, -- Silencing Shot
+ [19386] = { cd = 60, spec = L["Survival"], }, -- Wyvern Sting
+ [19577] = { cd = 60, spec = L["Beast Mastery"], }, -- Intimidation
+ [38373] = { cd = 120, spec = L["Beast Mastery"], }, -- The Beast Within
+ },
+
+ -- Rogue
+ ["ROGUE"] = {
+ [1766] = 10, -- Kick
+ [8643] = 20, -- Kidney Shot
+ [31224] = 60, -- Cloak of Shadow
+ [26889] = { cd = 300, [L["Subtlety"]] = 180, }, -- Vanish
+ [2094] = { cd = 180, [L["Subtlety"]] = 90, }, -- Blind
+ [11305] = { cd = 300, [L["Combat"]] = 180, }, -- Sprint
+ [26669] = { cd = 300, [L["Combat"]] = 180, }, -- Evasion
+ [14177] = { cd = 180, spec = L["Assassination"], }, -- Cold Blood
+ [13750] = { cd = 300, spec = L["Combat"], }, -- Adrenaline Rush
+ [13877] = { cd = 120, spec = L["Combat"], }, -- Blade Flurry
+ [36554] = { cd = 30, spec = L["Subtlety"], }, -- Shadowstep
+ [14185] = { cd = 600, spec = L["Subtlety"], -- Preparation
+ resetCD = {
+ [26669] = true,
+ [11305] = true,
+ [26889] = true,
+ [14177] = true,
+ [36554] = true,
+ },
+ },
+ },
+ ["Scourge"] = {
+
+ },
+ ["BloodElf"] = {
+
+ },
+ ["Tauren"] = {
+
+ },
+ ["Orc"] = {
+
+ },
+ ["Troll"] = {
+
+ },
+ ["NightElf"] = {
+ [2651] = { cd = 180, spec = L["Discipline"], }, -- Elune's Grace
+ [10797] = { cd = 30, spec = L["Discipline"], }, -- Star Shards
+ },
+ ["Draenei"] = {
+ [32548] = { cd = 300, spec = L["Discipline"], }, -- Hymn of Hope
+ },
+ ["Human"] = {
+ [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
+ },
+ ["Gnome"] = {
+ },
+ ["Dwarf"] = {
+ [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer
+ },
+}
+function Gladdy:GetCooldownList()
+ return cooldownList
+end
+
+local racials = {
+ ["Scourge"] = {
+ [7744] = true, -- Will of the Forsaken
+ duration = 120,
+ spellName = select(1, GetSpellInfo(7744)),
+ texture = select(3, GetSpellInfo(7744))
+ },
+ ["BloodElf"] = {
+ [28730] = true, -- Arcane Torrent
+ duration = 120,
+ spellName = select(1, GetSpellInfo(28730)),
+ texture = select(3, GetSpellInfo(28730))
+ },
+ ["Tauren"] = {
+ [20549] = true, -- War Stomp
+ duration = 120,
+ spellName = select(1, GetSpellInfo(20549)),
+ texture = select(3, GetSpellInfo(20549))
+ },
+ ["Orc"] = {
+ [20572] = true,
+ [33697] = true,
+ [33702] = true,
+ duration = 120,
+ spellName = select(1, GetSpellInfo(20572)),
+ texture = select(3, GetSpellInfo(20572))
+ },
+ ["Troll"] = {
+ [20554] = true,
+ [26296] = true,
+ [26297] = true,
+ duration = 180,
+ spellName = select(1, GetSpellInfo(20554)),
+ texture = select(3, GetSpellInfo(20554))
+ },
+ ["NightElf"] = {
+ [20580] = true,
+ duration = 10,
+ spellName = select(1, GetSpellInfo(20580)),
+ texture = select(3, GetSpellInfo(20580))
+ },
+ ["Draenei"] = {
+ [28880] = true,
+ duration = 180,
+ spellName = select(1, GetSpellInfo(28880)),
+ texture = select(3, GetSpellInfo(28880))
+ },
+ ["Human"] = {
+ [20600] = true, -- Perception
+ duration = 180,
+ spellName = select(1, GetSpellInfo(20600)),
+ texture = select(3, GetSpellInfo(20600))
+ },
+ ["Gnome"] = {
+ [20589] = true, -- Escape Artist
+ duration = 105,
+ spellName = select(1, GetSpellInfo(20589)),
+ texture = select(3, GetSpellInfo(20589))
+ },
+ ["Dwarf"] = {
+ [20594] = true, -- Stoneform
+ duration = 180,
+ spellName = select(1, GetSpellInfo(20594)),
+ texture = select(3, GetSpellInfo(20594))
+ },
+}
function Gladdy:Racials()
- return {
- ["Scourge"] = {
- [7744] = true, -- Will of the Forsaken
- duration = 120,
- spellName = select(1, GetSpellInfo(7744)),
- texture = select(3, GetSpellInfo(7744))
- },
- ["BloodElf"] = {
- [28730] = true, -- Arcane Torrent
- duration = 120,
- spellName = select(1, GetSpellInfo(28730)),
- texture = select(3, GetSpellInfo(28730))
- },
- ["Tauren"] = {
- [20549] = true, -- War Stomp
- duration = 120,
- spellName = select(1, GetSpellInfo(20549)),
- texture = select(3, GetSpellInfo(20549))
- },
- ["Orc"] = {
- [20572] = true,
- [33697] = true,
- [33702] = true,
- duration = 120,
- spellName = select(1, GetSpellInfo(20572)),
- texture = select(3, GetSpellInfo(20572))
- },
- ["Troll"] = {
- [20554] = true,
- [26296] = true,
- [26297] = true,
- duration = 180,
- spellName = select(1, GetSpellInfo(20554)),
- texture = select(3, GetSpellInfo(20554))
- },
- ["NightElf"] = {
- [20580] = true,
- duration = 10,
- spellName = select(1, GetSpellInfo(20580)),
- texture = select(3, GetSpellInfo(20580))
- },
- ["Draenei"] = {
- [28880] = true,
- duration = 180,
- spellName = select(1, GetSpellInfo(28880)),
- texture = select(3, GetSpellInfo(28880))
- },
- ["Human"] = {
- [20600] = true, -- Perception
- duration = 180,
- spellName = select(1, GetSpellInfo(20600)),
- texture = select(3, GetSpellInfo(20600))
- },
- ["Gnome"] = {
- [20589] = true, -- Escape Artist
- duration = 105,
- spellName = select(1, GetSpellInfo(20589)),
- texture = select(3, GetSpellInfo(20589))
- },
- ["Dwarf"] = {
- [20594] = true, -- Stoneform
- duration = 180,
- spellName = select(1, GetSpellInfo(20594)),
- texture = select(3, GetSpellInfo(20594))
- },
- }
-end
\ No newline at end of file
+ return racials
+end
+
+local arenaTimer = {
+ ["default"] = {
+ [61] = "One minute until the Arena battle begins!",
+ [31] = "Thirty seconds until the Arena battle begins!",
+ [16] = "Fifteen seconds until the Arena battle begins!",
+ [0] = "The Arena battle has begun!",
+ },
+ ["esES"] = {
+ [61] = "¡Un minuto hasta que dé comienzo la batalla en arena!",
+ [31] = "¡Treinta segundos hasta que comience la batalla en arena!",
+ [16] = "¡Quince segundos hasta que comience la batalla en arena!",
+ [0] = "¡La batalla en arena ha comenzado!",
+ },
+ ["ptBR"] = {
+ [61] = "Um minuto até a batalha na Arena começar!",
+ [31] = "Trinta segundos até a batalha na Arena começar!",
+ [16] = "Quinze segundos até a batalha na Arena começar!",
+ [0] = "A batalha na Arena começou!",
+ },
+ ["deDE"] = {
+ [61] = "Noch eine Minute bis der Arenakampf beginnt!",
+ [31] = "Noch dreißig Sekunden bis der Arenakampf beginnt!",
+ [16] = "Noch fünfzehn Sekunden bis der Arenakampf beginnt!",
+ [0] = "Der Arenakampf hat begonnen!",
+ },
+ ["frFR"] = {
+ [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"]
+
+function Gladdy:GetArenaTimer()
+ if arenaTimer[GetLocale()] then
+ return arenaTimer[GetLocale()]
+ else
+ return arenaTimer["default"]
+ end
+end
+
diff --git a/EventListener.lua b/EventListener.lua
index 4a70816..2f73d8d 100644
--- a/EventListener.lua
+++ b/EventListener.lua
@@ -1,7 +1,6 @@
local select, string_gsub, tostring = select, string.gsub, tostring
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
-local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
local AURA_TYPE_BUFF = AURA_TYPE_BUFF
@@ -34,7 +33,6 @@ function EventListener:JOINED_ARENA()
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
self:SetScript("OnEvent", EventListener.OnEvent)
- Gladdy:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", UnitName("player"))
end
function EventListener:Reset()
@@ -76,21 +74,10 @@ end
function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
-- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool
- local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName = CombatLogGetCurrentEventInfo()
+ local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo()
local srcUnit = Gladdy.guids[sourceGUID]
local destUnit = Gladdy.guids[destGUID]
- if Gladdy.specSpells[spellName] and srcUnit then
- --Gladdy:Print(eventType, spellName, Gladdy.specSpells[spellName], srcUnit)
- end
- if (eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
- if destUnit then
- --Gladdy:Print(eventType, "destUnit", destUnit)
- elseif srcUnit then
- --Gladdy:Print(eventType, "srcUnit", srcUnit)
- end
- end
-
if destUnit then
-- diminish tracker
if (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then
@@ -104,26 +91,32 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
if not Gladdy.buttons[destUnit].class then
Gladdy:SpotEnemy(destUnit, true)
end
+ --interrupt detection
+ if eventType == "SPELL_INTERRUPT" then
+ Gladdy:SendMessage("SPELL_INTERRUPT", destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
+ end
end
if srcUnit then
- local unitRace = Gladdy.buttons[srcUnit].race
- -- cooldown tracker
- if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then
- local unitClass
- local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank
- if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
- if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
- unitClass = Gladdy.buttons[srcUnit].class
- else
- unitClass = Gladdy.buttons[srcUnit].race
+ if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED") then
+ local unitRace = Gladdy.buttons[srcUnit].race
+ -- cooldown tracker
+ if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then
+ local unitClass
+ local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank
+ if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
+ if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
+ unitClass = Gladdy.buttons[srcUnit].class
+ else
+ unitClass = Gladdy.buttons[srcUnit].race
+ end
+ Cooldowns:CooldownUsed(srcUnit, unitClass, spellId, spellName)
+ Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
- Cooldowns:CooldownUsed(srcUnit, unitClass, spellId, spellName)
- Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
- end
- if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
- Gladdy:SendMessage("RACIAL_USED", srcUnit)
+ if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
+ Gladdy:SendMessage("RACIAL_USED", srcUnit)
+ end
end
if not Gladdy.buttons[srcUnit].class then
@@ -143,12 +136,11 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
if button or pet then
if updateReason == "seen" then
-- ENEMY_SPOTTED
- if button and not button.class then
- Gladdy:SpotEnemy(unit, true)
- end
- if button and button.stealthed then
- local class = Gladdy.buttons[unit].class
- button.healthBar.hp:SetStatusBarColor(RAID_CLASS_COLORS[class].r, RAID_CLASS_COLORS[class].g, RAID_CLASS_COLORS[class].b, 1)
+ if button then
+ Gladdy:SendMessage("ENEMY_STEALTH", unit, false)
+ if not button.class then
+ Gladdy:SpotEnemy(unit, true)
+ end
end
if pet then
Gladdy:SendMessage("PET_SPOTTED", unit)
@@ -156,9 +148,7 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
elseif updateReason == "unseen" then
-- STEALTH
if button then
- Gladdy:SendMessage("ENEMY_STEALTH", unit)
- button.healthBar.hp:SetStatusBarColor(0.66, 0.66, 0.66, 1)
- button.stealthed = true
+ Gladdy:SendMessage("ENEMY_STEALTH", unit, true)
end
if pet then
Gladdy:SendMessage("PET_STEALTH", unit)
@@ -213,7 +203,7 @@ function EventListener:UNIT_AURA(unit)
end
if not button.spec and Gladdy.specBuffs[spellName] then
local unitPet = string_gsub(unit, "%d$", "pet%1")
- if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
+ if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end
end
@@ -252,7 +242,3 @@ function EventListener:UNIT_SPELLCAST_SUCCEEDED(unit)
end
end
end
-
-function EventListener:GetOptions()
- return nil
-end
diff --git a/Frame.lua b/Frame.lua
index 0b65d81..d09d1f6 100644
--- a/Frame.lua
+++ b/Frame.lua
@@ -26,6 +26,8 @@ Gladdy.BUTTON_DEFAULTS = {
damaged = 0,
click = false,
stealthed = false,
+ classColors = {},
+ lastState = 0,
}
function Gladdy:CreateFrame()
@@ -107,12 +109,17 @@ end
function Gladdy:UpdateFrame()
+ if (InCombatLockdown()) then
+ return
+ end
+
if (not self.frame) then
self:CreateFrame()
end
local teamSize = self.curBracket or 0
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 leftSize = 0
local rightSize = 0
--Trinket + Racial
@@ -140,9 +147,9 @@ function Gladdy:UpdateFrame()
rightSize = rightSize + self.db.highlightBorderSize
end
- local margin = self.db.powerBarHeight + 1
+ local margin = powerBarHeight
local width = self.db.barWidth + leftSize + rightSize
- local height = (self.db.healthBarHeight + self.db.powerBarHeight + 1) * teamSize
+ local height = (self.db.healthBarHeight + powerBarHeight) * teamSize
+ (self.db.highlightInset and 0 or self.db.highlightBorderSize * 2 * teamSize)
+ self.db.bottomMargin * (teamSize - 1)
@@ -173,7 +180,7 @@ function Gladdy:UpdateFrame()
-- GrowDirection
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 + self.db.powerBarHeight + 1
+ height = self.db.healthBarHeight + powerBarHeight
end
self.frame:SetScale(self.db.frameScale)
@@ -214,13 +221,13 @@ function Gladdy:UpdateFrame()
button:SetWidth(self.db.barWidth)
button:SetHeight(self.db.healthBarHeight)
button.secure:SetWidth(self.db.barWidth)
- button.secure:SetHeight(self.db.healthBarHeight + self.db.powerBarHeight + 1)
+ button.secure:SetHeight(self.db.healthBarHeight + powerBarHeight)
button:ClearAllPoints()
button.secure:ClearAllPoints()
if (self.db.growDirection == "TOP") then
if (i == 1) then
- button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", leftSize, self.db.powerBarHeight + 1)
+ button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", leftSize, powerBarHeight)
button.secure:SetPoint("TOPLEFT", button.powerBar, "TOPLEFT")
else
button:SetPoint("BOTTOMLEFT", self.buttons["arena" .. (i - 1)], "TOPLEFT", 0, margin + self.db.bottomMargin)
@@ -254,7 +261,7 @@ function Gladdy:UpdateFrame()
for _, v in self:IterModules() do
- self:Call(v, "UpdateFrame", button.unit)
+ self:Call(v, "UpdateFrame", "arena" .. i)
end
end
for _, v in self:IterModules() do
@@ -271,7 +278,6 @@ end
function Gladdy:ToggleFrame(i)
self:Reset()
-
if (self.frame and self.frame:IsShown() and i == self.curBracket) then
self:HideFrame()
else
@@ -287,6 +293,8 @@ function Gladdy:ToggleFrame(i)
self:CreateButton(o)
end
end
+ self:Reset()
+ self.curBracket = i
self:UpdateFrame()
self:Test()
self.frame:Show()
@@ -305,28 +313,38 @@ function Gladdy:CreateButton(i)
--button.texture:SetAllPoints(button)
--button.texture:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
- local secure = CreateFrame("Button", "GladdyButton" .. i, button, "SecureActionButtonTemplate")
+ local secure = CreateFrame("Button", "GladdyButton" .. i, button, "SecureActionButtonTemplate, SecureHandlerEnterLeaveTemplate")
secure:RegisterForClicks("AnyUp")
- secure:RegisterForClicks("AnyUp")
- secure:SetAttribute("*type1", "target")
- secure:SetAttribute("*type2", "focus")
+ secure:RegisterForClicks("AnyDown")
+
+ secure:SetAttribute("target", "arena" .. i)
+ secure:SetAttribute("focus", "arena" .. i)
secure:SetAttribute("unit", "arena" .. i)
+
+ --[[
+ secure:SetAttribute("target", i == 1 and "player" or "focus")
+ secure:SetAttribute("focus", i == 1 and "player" or "focus")
+ secure:SetAttribute("unit", i == 1 and "player" or "focus")
+ --]]
+
--secure.texture = secure:CreateTexture(nil, "OVERLAY")
--secure.texture:SetAllPoints(secure)
--secure.texture:SetTexture("Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp")
button.id = i
+ --button.unit = i == 1 and "player" or "focus"
button.unit = "arena" .. i
button.secure = secure
- self:ResetButton(button.unit)
+ self:ResetButton("arena" .. i)
- self.buttons[button.unit] = button
+ self.buttons["arena" .. i] = button
for _, v in self:IterModules() do
- self:Call(v, "CreateFrame", button.unit)
+ self:Call(v, "CreateFrame", "arena" .. i)
end
+ self:ResetButton("arena" .. i)
end
function Gladdy:GetAnchor(unit, position)
diff --git a/Gladdy.lua b/Gladdy.lua
index eb939c8..706511e 100644
--- a/Gladdy.lua
+++ b/Gladdy.lua
@@ -25,7 +25,7 @@ local MAJOR, MINOR = "Gladdy", 4
local Gladdy = LibStub:NewLibrary(MAJOR, MINOR)
local L
Gladdy.version_major_num = 1
-Gladdy.version_minor_num = 0.12
+Gladdy.version_minor_num = 0.13
Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num
Gladdy.version_releaseType = RELEASE_TYPES.beta
Gladdy.version = PREFIX .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType
@@ -200,6 +200,7 @@ function Gladdy:OnInitialize()
self.LSM:Register("border", "Gladdy Tooltip round", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_round_selfmade")
self.LSM:Register("border", "Gladdy Tooltip squared", "Interface\\AddOns\\Gladdy\\Images\\UI-Tooltip-Border_square_selfmade")
self.LSM:Register("font", "DorisPP", "Interface\\AddOns\\Gladdy\\Images\\DorisPP.TTF")
+ self.LSM:Register("border", "Square Full White", "Interface\\AddOns\\Gladdy\\Images\\Square_FullWhite.tga")
L = self.L
@@ -227,6 +228,9 @@ function Gladdy:OnInitialize()
self:Call(v, "Initialize") -- B.E > A.E :D
end
self:DeleteUnknownOptions(self.db, self.defaults.profile)
+ if Gladdy.db.hideBlizzard == "always" then
+ SetCVar("showArenaEnemyFrames", 0)
+ end
end
function Gladdy:OnProfileChanged()
@@ -266,6 +270,7 @@ function Gladdy:OnEnable()
self:HideFrame()
self:ToggleFrame(3)
+ self.showConfig = true
end
end
@@ -285,7 +290,7 @@ end
---------------------------
function Gladdy:Test()
- Gladdy.frame.testing = true
+ self.frame.testing = true
for i = 1, self.curBracket do
local unit = "arena" .. i
if (not self.buttons[unit]) then
@@ -312,6 +317,10 @@ end
---------------------------
function Gladdy:PLAYER_ENTERING_WORLD()
+ if self.showConfig then
+ LibStub("AceConfigDialog-3.0"):Open("Gladdy", nil, LibStub("AceConfigDialog-3.0"):SelectGroup("Gladdy", "XiconProfiles"))
+ self.showConfig = nil
+ end
local instance = select(2, IsInInstance())
if (instance ~= "arena" and self.frame and self.frame:IsVisible() and not self.frame.testing) then
self:Reset()
@@ -355,6 +364,9 @@ function Gladdy:Reset()
for unit in pairs(self.buttons) do
self:ResetUnit(unit)
end
+ if Gladdy.db.hideBlizzard == "never" or Gladdy.db.hideBlizzard == "arena" then
+ SetCVar("showArenaEnemyFrames", 1)
+ end
end
function Gladdy:ResetUnit(unit)
@@ -381,7 +393,7 @@ function Gladdy:ResetButton(unit)
button[k1] = nil
elseif (type(v1) == "number") then
button[k1] = 0
- elseif (type(v1) == "array") then
+ elseif (type(v1) == "table") then
button[k1] = {}
elseif (type(v1) == "boolean") then
button[k1] = false
@@ -412,4 +424,7 @@ function Gladdy:JoinedArena()
for i=1, self.curBracket do
self.buttons["arena" .. i]:SetAlpha(1)
end
+ if Gladdy.db.hideBlizzard == "arena" or Gladdy.db.hideBlizzard == "always" then
+ SetCVar("showArenaEnemyFrames", 0)
+ end
end
diff --git a/Gladdy.toc b/Gladdy.toc
index 0ccc396..b368b1c 100644
--- a/Gladdy.toc
+++ b/Gladdy.toc
@@ -1,6 +1,6 @@
## Interface: 20501
## Title: Gladdy - TBC
-## Version: 1.12-Beta
+## Version: 1.13-Beta
## Notes: The most powerful arena AddOn for WoW 2.5.1
## Author: XiconQoo, DnB_Junkee, Knall
## X-Email: contact me on discord Knall#1751
@@ -22,6 +22,7 @@ Modules\Powerbar.lua
Modules\Auras.lua
Modules\Castbar.lua
Modules\Classicon.lua
+Modules\Clicks.lua
Modules\Diminishings.lua
Modules\Highlight.lua
Modules\TotemPlates.lua
@@ -35,4 +36,6 @@ Modules\XiconProfiles.lua
Modules\Pets.lua
Modules\ExportImport.lua
Modules\CombatIndicator.lua
+Modules\RangeCheck.lua
+Modules\ShadowsightTimer.lua
EventListener.lua
diff --git a/Images/BasicProfiles/Blizz1.blp b/Images/BasicProfiles/Blizz1.blp
index a1a85bb..c971bef 100644
Binary files a/Images/BasicProfiles/Blizz1.blp and b/Images/BasicProfiles/Blizz1.blp differ
diff --git a/Images/BasicProfiles/Classic1.blp b/Images/BasicProfiles/Classic1.blp
index ebdec55..ab4713b 100644
Binary files a/Images/BasicProfiles/Classic1.blp and b/Images/BasicProfiles/Classic1.blp differ
diff --git a/Images/BasicProfiles/Classic2.blp b/Images/BasicProfiles/Classic2.blp
new file mode 100644
index 0000000..55f9712
Binary files /dev/null and b/Images/BasicProfiles/Classic2.blp differ
diff --git a/Images/BasicProfiles/Klimp1.blp b/Images/BasicProfiles/Klimp1.blp
index 053836c..67815f2 100644
Binary files a/Images/BasicProfiles/Klimp1.blp and b/Images/BasicProfiles/Klimp1.blp differ
diff --git a/Images/BasicProfiles/Knall1.blp b/Images/BasicProfiles/Knall1.blp
index 25c9301..6150347 100644
Binary files a/Images/BasicProfiles/Knall1.blp and b/Images/BasicProfiles/Knall1.blp differ
diff --git a/Images/Square_FullWhite.tga b/Images/Square_FullWhite.tga
new file mode 100644
index 0000000..15e2be4
Binary files /dev/null and b/Images/Square_FullWhite.tga differ
diff --git a/ImportStrings.lua b/ImportStrings.lua
index 62bdfaa..204c2a4 100644
--- a/ImportStrings.lua
+++ b/ImportStrings.lua
@@ -5,7 +5,11 @@ function Gladdy:GetKlimpProfile()
end
function Gladdy:GetClassicProfile()
- return "4XzRBT3CBBJe)t05bVF8Nrn1PzMgxF1UZ1BMmkLwI2MxKe9rsDPU)r)SFlWUGVKOPCSYmrIMayXI9f(TlGwYxE7YBwxTOSADE1puUPSk8ISLxXxEZDXpFi(zv4ZML3SQSCZ6YVTBIbCPwj9gf3ZeoJK7ClV)FOvbImvlvt1cmz3T)(7Rxe(4DBE6rCowLv3SiBsgMfzywKHzbASg6eYYenyx4GwZwvKTzul807rIFtZZBYxEZh31KxDF2Q8p)U1R)LD1F(dBYwV(5p)XTzpKx)zSVFPQC)U15R)YDBEkmNVVOo7Un5)qr1kGg31X2p0JLV0kyARHXuoM06CEsKaIrJrXmmo8ELxlfSqlYOyCIwQMQfqe0uvS7R5nhWt4I9h3fE76LlwEZJ5zBAEeyZRY2MFz5UMBk(RCqUiwEZUNUTSjF71BYAYrTX728TSNRVnR6H8gy43rQRBES8BVBFv27ZJ)z38CDz9YB(1p(HFkAW9Vkw384LzRAkJwwDt9T5)zZ(kqU)PIDfBZ2uuhvIrUzvgW4Gc03zY(Qus1)39zvjL0Jfp84g4)nTSEYCiYP)8pE5T9yRFk(WqzsN5zAKFOQ8BVVOkFvtr5UH04tz)zqedYXQ8TLX1ZYBEFzvr91xdgdbj2e2m)7FbMH8MLx9pKkSN)miuEF(9z730eSKmwll8DENM8PQcG0npV8kv0lq4SYP7dxh6dxi16zOdNjzU56JtjMMo4Cj5gdFw6y0ZnxsUqOMSpcQpCUDg(r4bgA6(G8JxZKZXZALB25YYCtVUKiDmERFU(iCSP7dP3nE3C0bccPMJosP0pToL4hRDArijEKZAf68UPfYjg2pTohNiqnmxxukMAAvvsel8I5CByQPNQwlh70tfYooJAwJlHtmNe2bS8C6sL5fwuOpdxjN12IZe2PTJXvUqlSZPieq4IPNlkEHs5NZYryfIzfHoyXpNc1P8VW6c7Jx6MtvyyZfnvluVqqhnfiywfQq6ftlC04uzDZrgjGzyUyGsaNYSRB5SHTvaKVP7dAcAuZzKke6z34ZZMvlibCNZz344VGPoXnm2lSfsY8toZm1KGv0HV9JB3UFxEyyDOCVW7rGUxWe9aNJagqSfxwv8x)9F8p3NTUkRj7V)JBVLi9V3INai2tLFlV668Qv57AaOsDW1ArDWOHngX2)lVQgq58LTz)NYQVSB)24BxxnK85niYPEtbSOZ2TdWlVkFl8Q6WkJGO(R5zRFoWd1pLVk8D(U8TXxqD43QrPgIPk0W68aaXNYQar4nv517Ri4x1H(TomS6UrC7JqxEeaRL0AJf2xwwTDOOUFcfqQdnKmlIjmcF8kUbe9BYQR)4QYjtmYOnEyBaaaLs74sDpe9hVLQPAPPllSwLe4Dgrg(wbfpwCmquCyYGD2BhKPquON4ZPTibdKOHvyjWs2EiXGDNb9xqMEnW2f7W5EmhgY1yofwVX89lAsA9WA51jBoHEFF5Q9tk37VII9gLkOus2M80qxS(SBSNxQTH8mDaYiM3ZSH8dbCFDUOhlR6lHHyG9vdBjA0wHJmodz6leqEhwhGcqZnqQjTg0t0s1uTKCPOuKar(USFaIp0emDWvPqBsghJYCAvrx(rqQa3CFfK7kLPiV)y6Ex0CO3OyhAvv3lR4vfJd91L4xNEG7tt2KP2swGOX9aDEFFLuUKX4IiMMfbWwwVn8GeGEOXhcPqfEG5O(etiyrklKWdCjd7SIh7RbGOhEVX4I9e0SGpBCSmfsKiw1Wdwh9qaGBKggWfnoZox8nCj1fPtAPrhWfH9rfjCeJtKkopdNBo9Gxlr6QK4GH34WPMZXb5GCLcp4yQw2m(GGl948esaCrkdUit5XXG5Rfjh2IuaYfKxyMilim6OyjMrrCSwnYBrSTXjmKbq8bLn(GewSOCNBiPSsIsxyPrZueUA4bMIJuwXDACkDOOh6SZrnrcAH3Qr2iPiTEb2ho0io7bqAlO8KwKGDSiHPAbcCkU8fgY0rscrdQILgTgLzgJbNhrGB7TXY4OUdk)dzbZOyh0MG(GNY72T6rWSVZMpeSQNVuNNZyVKgW55R5RtLn62GopPlitFqvOr21jqJaPb1B2KvNok)cfvl2UpzttFdzAevuEMKe0cEu0GQ2yYtHXX5OW16XxO5YK1asV08LMqYixMCIuEuTlcXzJFZXhKKfOJm51cKsglAmiH96XoekIYIei3WBixcWKfTzDKfkWCy7dT6LcIjH4SKFgAu58c0A1APfHvfNkxAU1cYSWlrJnyUXLHYOqMrdWsIVr79X(Q4edJPiapOr7Cksd3BqJBllzEIw0GOLcbbz3g7reZEC24ONgAEsfOkqzTmjvXPQ1jW7OiuHs(ehc5jPfJcncodw6fm8bVIJu1HsYa1r5bWx4d(KdABSrjzBAqHo4YzP1cgtgCPJdvNuFGXm2rd(GLIrftmfEqH(QqR4mzitqoSqAnMJK0WLKfHthNuDYsriXj3PP9f04CbgzXVjng2kiTXy4u0Di4l5BKeYcSJwgke447Tw6l0Lb21yyOuH1tM6k6bEA)koUgXe)rssXUH)HInLmfrg)BRanIjhEi2anab5wrbCJjFgNEbraK)IfeAbLhC41EY7Hgh0BYHLItBqBqlNeksdUjiNmRbNeCMKss2ImKLI37j6a7B0kqI(DHOSf)EVSRsi1of4FmC4eOiw84nGqYpaOHYJbnR3KN)0OumVVeaggIOhYxQi89vGaN5rI1uTPUz)UtzmAVjIwRA36tEiodonpMHjwn3amH93Gb816tP3GwoIWVEvwdGO)0gdhXCUUOoi221CkdYWSi07vNuV5Qy1BUppR6u6FydNOGTS8K4gnGINueVIHiIdj)PqscqY3N0O84OGm2EasP(UQ8mixTtyGksiVp7u6ToexniVQYZ)RCakWjzcRDY4XewS9j4nNKIP1C85vBk3DsIadpYBnyc2hEKHRkozhxQigDP3c4NUUScwVfnV10ttPDho)TldM1R38Cyn98YlbOIq0oyxdLM5nW(vqIFQ2muta4crtEOQ8B)2tHvFmO07w1SpBtGk9p2QdQm0XoG1dZQKwA4kbs(hgutXt)9FqRIoSNH57USQuzbGWu9sHAW5NAuonGKcIRc)daf078tpRvBbfuedfaP0Q0Fv6RbNr8HhEyVJDmTLWrpm0JiAJguMHQjkTuwl)3J(jrnKXDWCV(68QFUyxOAceJ1dYE3bO3JaXonkt8nLba8HHSQ4yhQ8jAgmov8FyFvD(rQEsQcpM2k80Lmoa)HMxYe(UXjT3p5MGF90vOkjRo44z7RhoXY80k2MkyrV(2xx2hUaPndL88RNWu(NG)pdsooKUjG4pc6h8)bb0M8mqg)YbV4DbVgRxU(XNRlwbY2jd5HfFRjuG2fhwFdmAXLa8Bi9zVgsecIp5nPcmv20uU9tzvpuSdZ1KcEotXTxmS2oWUxGbC7F7gqMufHUqo(ET8QCRhegowewGhoL9eI6NhFLMqTfAECc0G5yxP3HC)6vL4(x9cY8PNVclD)kMScT9lggo8Bl2MhRvEwZ4ykTmbF02dh)YrKUfg9JKnOeBhECfhUpGKbj9gkQPdsNtOA3ha3l6b67EvWVNRBA)ptW3kv1XWsDqC2(Zhqf1X3GhvMHBptpz1jg3BD1pLT5(tiWqF)2ExtKOg972UTjEpEMXQLeIPWth9cbnoY4jez5PuS4OLiy9v18smH9GISpQWQdtOAwb)HReCBLuOIdH8rn0ZTaR87X2IiHVBWoQxTFZMti2avtSfPkIbzKJzzkcjvhEacBUmMBjMDSWH1iWiP6rjDESGxMundsfOYIJuqLr8Wkcd4CqAlPY26muc1ynHS4aXe3TuvoiQZOco6XkuaPaJ1yqt18rJf7slXKYLmfLvoG7IkPQfjL1qf5sHfyUTY2yw3CfwJZWjuK4ASmeWaXYBGsmTaliKuAXrepr3afcx7qKNWe4t15f7VaGyoSMXkdXHKSwYPYQQfynHG8lnuLIPA1gK2Pcet181svDbsuef7sBQwikrQwiujFHrtv5elDMacZfNX2s(YDyPsvWUOTlFSG)urBiXihPTblp2r2vhmHZZgH3k54P6J4QDFiYTZnmgsywiVZjm0V0Q0sgx70YqPaLUwK4d8TdtXrOWfQrmLQ3yIyJoCtRpSpVUopEWKjiFbMF0bd1hItzrD5UJklml7DdtpreDrY)(N3LTTyf29fTXs6VfDlkrKZsBVPapoUZ4tPSKwdNWmpaKXlGE6GayzT3KZVBCIFk7HIvhd)EsgErScdRkIIGB)LRhO6p(DXe3XgcmHX6d58(RW2D901hnZP(hh9ji1QBYA2xFxAJKeoKUDg(oaloihWwM)MW1DOJ5BH8iGGDDEAJZ)QBdPhN8aCX12LwRL5dbDumiENX3DTSNOLQPAPjTz3GCsib7ymP9Vo1hYugPxc5Al1sje122pj9J3s1uTGq66G9dH4pi9SUBOWaT3rylLWzc3P2Wj9zn2ES1XBPAQw6GjHhQCyAAc)P0Ix)PvZxZOSEas6kvvdriUMZSNfkfsoCccDHxqESu85tGCasf8YKDgym8M)92jKtQpleYO8NhcXz6ZeL0s8kX(MjKtiop2tc6g4Em7jDYCI2aqpp5a3DJ8SWyo(Km2RJq6WbAEoiKq7zNNWboUAkH0fPDD9DBWndXch5X5GR00V9G3mHCAUyQLhegShTUWBMNCsT3FE4lU9mTaHeGolesc51nLO61rj866mLnLzGrvql4MNKGH15XXXr)OnEZeIRFZBn00V6p3w(UWLy7JXFwuTfg7if4FA84dQkXBgOzpSqZImU9NzLzexC4v2jIJA8R7Ymeq1MonTr1KjvQM(NA1pgVRVlw2vm)(fPpXH4Dz0YzoakialvgUTkHt(r1(Z6lDjKi(B54lN75roo60pg8BOC41hSfNEZYL))BOyvch"
+ return "4XzTC19CBJRR)pM7ZBg(nPEmPTPnZTTj340z3Zm74TY2kX6u)rosY3UPp0)2pGeG6dBjhRMn7d1kIKGGGGGa4h0oLp9UPtwuCX2IfzfVz7QTf(xKo9Z8PtMf(3hc)BH)FRGFt38q2BwMn)B3S97zfxKwCx2Fxn9cO37U)(Yl8)Z5RECjsH5PLvqxgI6Sa1zbQZ8uFb0PTRwS97BiAWoZnDs5Yu4vL5pSS6U81zf)boM055PR2R)847XPCs1tRYMo5Qnvzf3Nop7ppFXIR3u(NVFv6Ifp9NxTo9HSY)e77FvSD3Mfzl(RzRE0ZjVnVmD2QS3KxmhOXSPtE0VGpFE1U0v(1Bvr(MVLvDq3()ZkkZ3U5VwN(V3w8xB2ToWvLvPv7kNfLfxdIPSQPF2e533TXtLfEcNUzdWjZZwNTPQ0lVOz62S0fp5NHYhZM7)nBt26WlOo8LsKalZsxvT03WISsqQ(yAr1tWeLvUROiBEfWDL((TWpSYMrC3sOllb550plcBh4RHnWpNUo7YTBQMK)Jmy5iMozZJ3TTkB9nRsRYWn8Zx990NkVlT4HSkGpMrAetwU97NVRi9TzH)miiZQ(qKYEQoDYB3wKxEZntNC)257krrKNVqzZ)kkTQ31VzB50j3E17)qq593ZxuT8Y05vBdAPETiGREaOzwq(vUkl7r)dznc573wmp7Q5B34zOC)VFMlnSKW6EEvXQYQDBoLXOtmYWbJnlo5H4m40SmTy9PmaJGz8d4BLNsVfIeNV3LZtRa9(tBmCDyvSiV0l2G9KtyqgMnytyX8tQ3CL2377ZsloL(l48WYOy72tIB0oLJ2igXqeHHK9iSKtHZCN0OsWrTOi9b4K0SISu402jmqfjK3LEk9wNyr5vrw2pYQkspjvyTtQ8JkF9JWBoPnMA1XNMVA7Mtsey4bEliec2fMNcg)aR1j1gJ61MFX0lnkHZySwMu6KwJD69)givG7bgQLzd1cm7P1gwo(vm8MRywcxJSYFvsTfQ4vibJkF8DxExWcvWOcmsg7WlGOLlVLfs0GwxBKn3igNI3xS97VnNSbxpz0fPTUcyE(jFL588Z3mFj0RgEb6s355IRV7UR)uWODr26T7B0nif3)AS551MD)nHQJL5JZvOjHcVkdkkKqFslavQ3axRv5fd47fAtBzuZa4jTF)FuZg8UxD4D8yxbC9(NY3KVoDvU)UoCCnS5vRxVd1PBy2Zssq(9mMOppBUnChtqiG(VGYRllY)Xp)6)3Uu4GFv6p)6D3rt3(3)m7a2EOBl9Zb1w4E45KEIxwCd4Is(gu5DE((ZrSNDo9zibuq9oigBwu3HhldEfu0H5649xzlTq6K8ZS6Bn4l3I3N1V26zUUI56nYWkFvAzqfyq7gAtsI2YzsL2bgTAz3O)wMnulvnsVAvCodpg8l42y5)zhODtUnsBMOOm47M)pLwPBpZQPr)BH9m4Gv121b)ON45TN7mFfrwUMZSVc01XTViYEwIGoF53h2J4sMfCM5fq9bzAW3TxbY6a1M)5jRrL8Aqwot)QqxTmr9kqwNq8Iu0gGScL7fXTNPJQVKHlDB9xPbC4)fq9b1FFzm9q7Cg7RHcHqNWEnmP54QxKW9moT1LuFXEnP9rR8ci9qcyR8vXUJg8G8fq2ZGBgAF3BIPToSg8a6fq8HV34vruWDVgBCsim5xKiEiBWMx4nrNXnDuI97LUUkYVghPDCZRX9YqmV)ZYTqhB5wEt0wr3y)1DEB5rJSieMMpBwq4bz(Lr4f3KbHhVPcOj6z9(EUVVlY(uHn8ceDrU1y(1xmXOk9cPtiVUKiTjMpPQTV6Vn7(0DRQGWlwTk4x7h(YNV7D36FAD(giwoldZwZVF(T3E11TAGj0HSLCZ5F883E1NRBaCkNfgXNo)9VR5TivU52RE3K7QFRuiTje1)41V5)TUbT1fi(BV9lx92MUlTUq(YU963)LgAlnADi3it(W5F682CIIRqfRhBLt7duaq1JwB4x0vkhufVuBvoM0bUGWssaFDHyoujDdC9GqCUegIXkeovIZOTchfcde2JgCrYcN)zcRMBGnL6WEgOLzd1s1H5X42Sv3SnFtfC65nVlSF2dFINWQtu9E5oy125FJsuur66SMmJ007M3fuSBLwb2HNpAh)zNSZ0gqGiScp0wgAfmT1WyEXV15s8RAvqgAmkMb0pHWat0sbRvOJ93YSHAPkUU2pC8L9jZu7f4)VWr6oys0oM)JNPRWr62z7PDk07WteNY8uNYotiCCuch0s8r1NwfZw1II93HUOVCGubYjqXiM1FyGoMM5hdeZAI1)GqKOtcVbIdi8cPbcZaEacx24)vQ1(F8BRH2taNd99p(RsO5(hsyYqh9jn2fiqGEoorxWQsya2e8fAUm0nQDEsC(ItOqH)nlorj8aJj8hOd)YXhKkKqoj2rTaPKb0arkivyhaEfx0ACKCEOJCJMhwdcNfjfWCy74FMOzH)gSbsKwImLemWewLjIabGG2PfHvfMkxCU1ctcTozgAUXLHc0YXUOTixaEgg6RItmmAmfEq7cnyCeT8bwapyzKme2odpibXoUKfMqpsymCPR4sKtf4KkIIBTmkvXPsWyMWdjoukZ5CloehUO1c8xUw5cT4mkl9cg(qIIJu1Hssp1r5bWx4djj4AGBDwCqss30GcDHrAP1IaFrInmuDC7duMXoAWhS4aHPcL5kwyYHwXzYqQGGLLKAL5ajnCjPr40Hjvh1uesCYDACeGkeUvyX9cAhdBfK2HrlbtH4AJtNnIczb2rldfcC89wl9dEKrBjfcwcj0SjKQUIEaC0nmrmoUgfGgtcrsdPNXrLzHssKbpNiScujMoWd2gObiOJvQKWdgPoEsLiaYFAfUxgCaW)6e60dnoO30bwUlS8nOoOLtcfPj0UKtQ1WHeCMKss2ImKLtQkeD4cvTajCURQXUC3RQUe0evs48lytqP0qay4LlrxgoLCPtGIxB921mzdLNuniQnkieeWsKK7C01GpmylZgQLECyOnefTUm6yzhoMA)2ofdozCZ2c4kI8QFH7e7lHRbyMV0JC5IvpfyV8)O1vEZZjih8c3ITF)lp69wVX923eZ(CRK(3HZqgbwxWQUk)XF(vIjM2tbr4N(ECJ65iuuGg4(MaCobF3BC(OJdrgLtdxmbQPW)b2yB5q0)O5sh5vcVmVn)jRYsHvmbJ)SoajeDg8m50AuUg1UFxpIYBPr22FhkSqwn71cCVOG(tP)TFlVe8O)J5B8avr6STOztbP0IaHoTNFWH3DyjJevd2lQHSQgeyG719OsUi7Iv5)4hPfGQqaTS2QwxdRQOVv(SsslQgiZ8k277d6ZPWr7kKhG2gbZWlJtxNSkuhinvYr7nNoNmXvIVgv(2jq2)E6Lqynj(7E8Oue85bcWs2At5e8mE)GoUz5tL5GI5ZfyELVCAUGmHdQp(NNTTQA76pblxFSKQ9ws96RCteqkrq42U4F2vKgvGBcCQT0CWBm8rgfxHbSSEwyXz9yd5e3FPf573LvwMfWUKuNAxAo1WS1(LXv4jSpT4iiV2wNmI4j4vBG8FeIxNYyHFc8voWEPG6XIC4KB1t4owiyf4W87U4lxEPFIbNXpiRUndbCO6WHGEZoQzrQSS9ZdBVZs9CeYzYOMdmWJtyoAT4Tm3WZISx5viQMrYyg9ixly8HJAiE3(g1aWqpg1qGqp2hZINBJhCND4fIGDWgpga0O2fXqLgjBzm7NP9NBxmeE64gsiKTXTwcrWoQzrOf2rQRaXMzhEw6vVxQ4dlW4hUpcld3iNcbtRg5Apep9Ogr4E0Xnc5ynq6sCdRPmWsFSh31hI87ZmcfeK2WAJ9Yw(yr3h4ONXSTAyUQpTKqG0NWe0XmFYWwthYaHyKB6HeQnQrivMJiR6XsxiG(rnfHK6nQriHy8h(AH(3ZnJFwc5WyuBjHSDmQjbZZ0OMeotypIQYHBjy6rhfBHjnCudjKZ1rTqewFs5g1KiKjIH3t09CXRsZhPTuPuCqboDC5Rp5XJAka3GoIML4GzqPvhuaAh9uOrnQdTGxahuXypZsiKu4rncjtCKlqgWE1r007zDabwEeN)6BRtjhPtwvDZoYjuWYZE2ciUUKMBd(eFVy6gikQyYi7M5ijdCRZdFPd8wtOQZCegKzmyZz1bg7d66WVeN6qYXazJKvzDsW7)KyYL6KRS28bqDv)Pefxz(VkfVeVBc7IqVTO4dPRU)eIYmSfLT4IiqvGNnyYFHlirGlycmh5AnMSzk51E0MWxWWK6BKiUrwkz1jMyQ9Jaxzvy(NnemkcbHwc47n1hJdtnTpN51zChZjDIIYrpM7BCacghXzrWzoIwUeKVuoeKbH2HCKI6k4lwG2AjHjIYstVKiHpcLlcERBXgy4i8KkINcXOc)NrrG)WCMN4q5NwerTrG8JGjraxmgIOgoIuGGRnelBrm9SryKurqf4iatquZi8nOvTWdGuePciQImjcKaisQLs0MkH7IncuIcbGZpZHzmjM6)q3n0Eotr4pGqOzrefjAACemrieNcRbziyUWoaUcGKJLqW9bCic(LJW5ZQiiquIi4JorSR4QIfH30GRBeIjjJjj8ojqqesr4bhIHdhH0aukjUKJOAfXottq3jIOPOnecTafrMszif4ecOmGDrffrezmMOwIHZkebgkGLwdH6JXf32XvTvgrpuHi9fHxJWbu6iuxucAPLGBWsbbFJJXrrbcBhHtOq5q0CI8abYLurBiCgJOhtqW(4sWnMeKhfGQkQ4jueMymoQ4H3WhgTdxha3HaDzirPbLoKYcmBiGRgcZndHGMisMKiusTsS7yYkEhmr2p9MDm)DqM8AbgtB4DqgP1BEmcGdlA)L(wid19eCTsr1XsoPT1m2bbSNnp1h(XtmfRDmkJJdCXtlbWBZlZslZ6LVI3RfkyOIqXDCq(Vp8d5PnCcrSJA9UffFE3QvNqAxJziToL48weKUkZD4c6n7k2B5W7KTAtlDPb4IlTkTe0ODAPh6Eztnh1jbVE(4aqgrX2dTUG(SaCH1C(bFTku5K0xzv1fqZ)506VzBE52n9UNBAdU6jMlAeGNN2KUoFo2D4mXttVeUnmX6uq0EAwI3U59)gCtrDwU73TR9Xv9FfMWzrSsjmDK1cUA1dbyXUL3p3T9Cpurx18522sa8P0hYN3NssC9FwO25MNhuCV76B6SP3sBE5(5z3hICpFhpXVeCIkXEhkZRAac9fhB8K7HFRr)ckbDaeSUinN4)gPV4qFJrkpjO48ZVEjCk9NF93xMxLfmewJmJWsYZgJklhS89q1KlTwlC7o4wHIb3QysAqEFGwMnul1wI6GugDoz)ZwfT(E3pKPmYejeeRulLW9Y22q92FlZgQLA3UjGV2huWMkXDOYmK3uMHit3a9yJ2upLyWF0(lZSvbx2)zR9RgJGp9yUccxftv4JKNGfngM17lA5RyDvgvxDr(IKb7m5SyS8qoWpEUiwZyHyI9puxCrKlKqqcmQSMCK33sQl(pVvA0XssJtoxhRjnWj)ekgco9qcwqpGjiQk0G3GoyyJLPKZI(74yQA2KQno05WAh(XyGdmvcRBjObodI8KqtL9w0VMOpF1vle48evSFrh3IXau7oL)B5fL78O7Zkj5kEmSG66asgQr3qFOcXb85MQCNOZKqtKGweRRlzCJ0MiixUIrre9HZf93lwZz1Hvq(WXteMyeqKqKcvdlO4aVyOkSlu(svDpCCcX4h1QR)0nn752ZHLxzWC5b3Zw76ay(lwpl75Uvm(40kGiZ2vf()rcFoaJrPV8U91H)gFK1tW)F5W0jR3Ui)(8ScFlWaQ8zEaMSukjei40t9wn7Hix6)UH7NgIgAe(6I9Kq2djop0PF(1)hz)0PHmlqp3w4PK6yusngkPpgL0JHsMJrjZyOK9yuYogk5ogLCJHsjhJsjJHsyoxhIu(eXDY0QQLFvD(KQPRhWQ23cMvHR9GRGLEWg91kL3VB8AQ4hypDOB6(FSY)6URu7DYvBkXVn721Z27c))3Ll8UOv7gs10P)3)Iv9L9b"
+end
+
+function Gladdy:GetClassicProfileNoPet()
+ return "4XzVCT1CBJRK(hZ(8XfUrqWhTCItCTtS9A5utovnLMqjrBXn6IxkQnJZd53(PB0niPejLfhpoVmwHeOrFdD)1naNjYj3pz80Dp8W2r4)5QzBwFB6855RFCY1s(n4dhN)JSjxR0nh85lFArQFyZs3wokTy0MI5zfxSz5McKSPtU0QDcHZjKoNvjCYjp8VImtgxm5sNmXe7IucJwQ1Xg8nrtg)yVVzAFVPCY45WIUz58nFFnZtIZCtgVDrk8OT5pUO8(8vzfFbEoZ)Dn8I0z5PljzyC5ZlZMm(Q1LzfpKol7poF(8BwV9p(Wsq588FC1Q0hZ2(h0y)ZIn7wppB(FoD5tiR8U8TPtxMDrEXmGgtNm(PnFpR48zL7sxoz0KXLf5R)wwzRH9)NvSnFZ6)Cv6)7MI)C9UvEvlXvhWVvp)9RrAmhj7S8)9nGKLvo56)Lc0XlYsxwUaSkxNUk7YnRljtOunz86NUFtz2QBxMwMrwXZx(90N3EFAXJzLa5MYQPXl289Z3vK(Um))eF(cqDUevPxTgxRrHf62SIzzRlb9c(S0sqkNUdip4iCT3jB7tzlxozmS6a)mzmTwtgVAZ88hYZkW3atOCZ6jJbXlDwzo(ZsAyGqP6GixUz2UTDtdvnnEWpkGe6oiX5(b9ZV(FP7Mo1KzozWMJuYCmkzgcLIogLIgcLShJs2HqP4JrP4Hqj3XOKBiuk5yukziuskogPG3E60QmSp82nGB4Dx9HpEpgb43ZNxU4sy8qCqCVA1wX7Z(RYDfWY9P815RsxMV1h8YV7CwkegaIeLufHOv4u)(EiOQqyItsIeAPvyT(GQAFOZEEZ0(EtjhCcyTpMHBQHLW2ypoUHViD9JzxSiB23(yqmWD4pLv6ftuFgIQ(lHHRuMe7SFKT6KtHiMFOyZ3FxErgB8(T3F591cDJWNCmrpZJbTgxI)tDS27cNvpW0qkdqrbXvk3ScTQOdYS9f8P(0np6)Vf4)17V4jRmskIFdORtg)Qi7zjkIYNHwHdiUwelSVgQ3ltNiEliRth9gqwRj5TGSsr0BcDJ0jM3aY6uQxLJwpKvzCVkU9SOG7lr6ZIA6)QTw9RH696)(6y6(SC243chcvuI4TiKMtAEvk3ZKSPlXtAztslILVgs3Ncow)Me3jsQEnK9miZqdkFwITPpCusYRH49N34nrviDVfgoTkX9QuX9fd2(kZeDgcEQHtmAlD77i)wSL2jTVf5LLr)dNaTeX62aJ42gWVECFyAJU5(7V5tEuzfzR24ripz872uKV92BHfbRjTvz2zLvvadzNOY(6es6bCN0lYeM7dHUNwaI)fqb(LiysUlir2jh0ZegbAINlQWj3hE4)r79XHD54UmOAK81LWsDX7V((3F3KwGZVA1QDRZoW3fcSq(UcvTwPwk)svZfGjW97HSkxwK)JF(1)NDPZlslt)5xV)(ai9pL(xOTDAR53xdiO6nWcQQSKc03IGY3zZPo0GfgmYB9z2L1cyBoj4EtIyDpv0g099ln4R5fxaZ6rWP03MJXBxML90b7yEytXSmKXrrlh)71sTvKG7igpRSy52YDRpL5eLy9L)uSE(jpfNLwMfPfRoLjyvcmzZ4VT9ugTccd7DaNLwwMvCAZrsfXb1qJQnW95eMKfZ)JtA2jnAPXVV4HS0Itz8kP0lgfB2CsCtKZ4ydXaMIYpLSNWwKTEw2jnReAwW2Qh3SE70ISuOC7tyIgwjVl9ugDusmPVkYY(rwzr6j5ch5G9dWSYx9e8KtYWu5o(8SLBwFsQaRmMrWVxxB9DBHQK)WqBxUHC17on0zEl3I9JpZ96LATle(cwKY8N(5x3()TdI(phy4LPB9r5)L0FJqaSQipyhPWeEV2otpl)xd)xNBOrFzslcDlkrung(rkBek2Cow0zOUNt35ZgG(eZl6m(Fdzc7u9lz7BmNbPjzNbstgAFu35yKhMJjC6ip28KrIvIOyuj6e6yNlP(KrSwJWkKWZnjrALOH1O73mTV3u2ut(UShs3TSCm23tFS6p(zp6a4xRYxJqMeuGWF)87U7QBA8cHkYhi62Z)TZF3vxx9cPql8Z4tN)H3x)uIk3E3vVF89vpvR0Xjm1)TBU4)U6frXopXF3DF(Q3vpCqN4tfD3nF4Z10wBJI8HDg)XZ)05n5eJ0qbkc2MoB1kNT3FUgVFD2QNrNTMwtVh7LrXOvbIZBejjIyuBAa0rPRxdoPZYwbbXPwesygVllD(ZOl62NYMH)nZt6Pvd4ZBPyCuGhVZCgYopLwu(mMwy7Ucg67wCCZXPTTEg3VagYciSaAm8PC7bZNQgZxBCO0UrBaHvhqQ)nqjXUjO4zJBvv4tf5WeaM(AJafV0zFdOX7h95lVe5lLRDn11trg1XuKkD0HLz8cRI2eloSk4oxLQ1W7OoO1qcPS7NT6usGnqU(xfDN6lv0qvXsNnAGYIsBB1eWxykwXaTjkHOvrOVWuC2wDm6Lm8sLQFbrjAz41sP8W(u(I(JUJ4C1dBH5)g0uKyIZboLiJBOYsKYoqzbc1hpqFfPnjU)vPt)EaIA)kmzB7iigUbUeq6vZaL9OOJe8QBrpoEGo9qT7dmaPlX1VNspI(q3Uh1UV7VWmmga(3WylyZBYHTT7fcBB6NR6YlbczFs5f2lmFs)rt7laHAGgDhi6dBgAJ9i6QoI05HrnOLiozWmLw36mQEjBUD4RIX0QlSVGjXQhAkrWUFKiJDB3fQ4J4Q02Kit0Ub6OqWEh0uIuM(Nrp4uuQbM7rPtu9BtI6iXRjsoWyPATQ1XlFC9RtpqXaGbDeplvRvWezAD8)hDxO1mOnTakGwNx)licjIHImtluhjbspXRoINEhYHkP9jqCCtNrpqqwLydQsxLXxtgzZQyQFMV6(gxdor7Me08qhQlo(EQqnS0mUA9Qg9c10ewSEVxpnlWYF4Z71w5)gTByVg3uZM32O4wuaM37rm8pAlD2tAiPeTrl3m7BKICw(5RNTayHAvcYCnu11hKWHkrVLoBE4kgccHtarugHrCJtIXFaahGe74tCq2KrHkAGFeJHyH)I1qocZcA9ZuLaLwGJp8xazGe)rIq7hi22xNNaE65tqJZtcbv8poHEqKu7hg)EkKoUEHfeJ(I)BryHsKEgtHTnW)xj9dTHieg0AKhAorjBSZruqBObGfEokuBi(ePFGsBK0ldGdjrkG5O3t)tFjfiLumtA1etPncV2ZLO8eWJA1leXg)s5cRTVEbsofwETjXWyneZefftCrusIFSgjZWuYl4hro)lSoMw4fza(rSG1HG50)dnO2jrg7a4io4MF1KAItv0IQcQBeH(iVwLwkQStCQosl7l4Zpfhj0rk6Vu5tJ8LDgZpqq)iXijQ6injsDsFa8f9JKesgGaJX0K0SVPLu6kRoMLff9GKy)uJcMpWzMgOL(rmnrcjc8dJWV4WBPvYYUGsqqQCM9K0k1ShHlYVOrbpfLMwCxendWfImfXKTGTy0BbTTF2AyFpjBsEVrqjRObgliLGKEECm)hAldKcJCiejSsloHD1n8pKw)i0cjjJeqDIKw2ptsoZkJMjdTpbaRqoX8gEi2apbfVTcrloIXa6xEftaI)8L2mIbiJpoH39WZdgnVHv68IVL8bJLSsrB9Vxlz3AytcTsaAy)4PntG2JDvy6ivMkfIFFxzDV93)6CFj4jA0W(xiMGXeLy5qYHgt(l5yKNxFuNo(a29rK)LKG5W(z28ATZQQFj8XZGckbmxAnehhCWfAf27xZeSDQ3UPaYvLx(3iD(ENEqZMqFjEiOZxw3h6gxJ(P1dfFnEdj(8t7FJCViCYunaUCIhQvBqfEEODxJFjcfmqEJv9z)CcNlsn8P9ozeJ1boM6yrcuYLWfoLd0wRK2yneVsJ1WinnT1gHesPhPLqQB4H12ATsfdzjIG6laBUO15S1)LyyzwkOai1qJU53eY5zAe8tBin(bU)TlU6ESWNkMOsD144mdm1Ns)l0SUfCh(T81z4NUabHkqZPn)Oxo88qpO1((N166YmlV5Dzam813qdaabEjWNNnAz(p(rAXC(EW00R5gqycsmI4LLLgFRqOaMx)BwPWWhJRL1UUipvoHNORe9zIWMQd03nftgS5Oautivhf(w5yuxcfLLdcgZrXzqvso)HGsldGR8tmMt3KydjNdqpJzetwgiKsX4DGOo8ySok5cM1RkNjLvjXWzzPSx0eGKuesjfKjLPfeWYptJJGjazNioYWdnXryyJ0mQgtmV8AMeyx1X)DKjMEHGMbsQaIiMrv4vzWZFuwVehP)IubCxkIFGyNeKjaVdlSskxVsgzzwoMqLhhacAcWcKeernmcsw8vI7)bOfjQaQQatsqbavsLwInQmYP4auhdbHgxz)kMesE7hULT5cdJGGabht1eW006yGEurkQylXqWArdaawqKdcGjdCibF1Xi1JnmigJku(GtfgkjvIqbkwsUjqIAHqZvSWWyaiF(F4iuyscuc4uYCPKWLgq)gXGVvb8qrwUglGIetzSSdCcd1fyxYrrfW2kuvAmAvJu0ybifwg3M1fm7KuhRd4)new9aazgjV2X4Mmkw0sidSwXaWCcjPkiG3msFLXr4Xc8adtfsHZWKfcMEcfdCZLqgMeIhvGRk54PmmQwHKC8OUs5NTJKdG7iOQwwvAjTd7SaRgvYKLrnBzmWQazsyWG)1KlbKYyEjna2m23InaSHUkw6h2LTDBMp5)HDX42fpVnhYbTxurr7R7qjEoZJQV7hdc1YEnHy6MYYnR(eeN1FNaQVeG4Py)ToR0VUrmGgcyHgdcXxgYfw3(M9X6niE9dl3SDlFpz(vHADXats5ZRXFLv1FLxn)0XQU7pnFyqxDc3MX5h5kzwLvD)VutpQt(IA2eWZXxn)Tqy6l(Dwv9HK1SbzQd0C9WUHIFEC)VNybyhWlLHd2GQmv3AgVdpD)vDe3sBaAILiO8TIg4KiVVaHHAJG4mwiCnxcwt8Wn5eG(M2B6Q9kWp6wuLs)l(J)1dA7JPlF4emLpvJFC6(ORgY2I9k8GjIVcl8EYLwgStOlw7pX4Mc)j4o8u4Qzj2RCPM1YrmqJNSFjUVCTg7vIdHKSAJuBbyEb4tvuEK7)9zX1ACQhVTqJEyOxyazPBZ6KAbxrB12Jrh7ElEI7QdrfQaYIHkdv(XAbhkTxVB5Yt4QUZAXwJ8YyaNew9lumveIMI3DHnuqaz)K(9CrqUY4QAY2JIi)8ghZTsUBDVVzN7UU2xnRoOFxb3KdU27ns3UjF7M1DolB9gG59KiOLbLki751PRYNrdF0Evx2DeXdzQl2vCGBOCpaa2U6SY)2)(qkLUxOMj2pH0A1b8UFZ5yzIxnVR9nFk9X8zDXUbv4z(7b4SC)UK7V529CRAS1zXHXZXtEUJVs5WHKu5Y0GgnRpS5NAW2Y0YDBNgcXeEJTY883aAYEWO8b8Wo)mgVRGJANIKO8yFeVF(1lHD0)8R)(I8YSk1rqSRoDR6aEl(L(LNqbm)shFPghU5SOX)R14noarLc(oWU4tXCq3eQVuYZlETwZd3D180jd(JD0lZV0WtS5Tp9faU1x4ns72UXk79)wbShCmEhAIM3O1n69sWaoQHwmEq6AstoPvBT9TwHUMb(kI4JkrltOtFJUWCJAuYE1X1uDmn4PnqdMRzp0N9wTtrQch(M)40XFuDknCL8AdFgha4oUjiAEiANM7pr1z7j5ECeoCpPG7Wa9bcsRe1viJHpop4juDEXHZ7XftLD6eMk2KpKrQg9Q(UqhFUNPse7FwEqn5epPI4ZpmuEzO07QJDbQHLp10q9ZHwXuvvlu4lDUAGbG1YWEAjlA8kfoqfT)ov7hdFIgkRJpcKqn9WRyfTkCaz6GHmorXv(gAMtOuAxOS7WH3v1DhUuAzIYgAefRe5oMrxaCpVy5JQ0FoqHKQh(jce8mP71nuMTZc6yG64rDIDj2u9)4FcNGnhOFYHF2h)9JsCyeOgTMTX3OikmZYRILxozY)5)uvaqQ"
end
function Gladdy:GetKnallProfile()
@@ -13,5 +17,5 @@ function Gladdy:GetKnallProfile()
end
function Gladdy:GetBlizzardProfile()
- return "4XzVB12KBBJd(xuZW3F5JXj1TzM2K9Q3oT3mDCRST2D1vVw7jjFPB)q)TFGeGsYYsBSACZhsSSmjaiii5Zda31813UE1UQfLv7YREt5(YQWlYw)E(6vvRxAywTsPemj3BDk967(kTA9Q7N8x2m1V0SE12YY97k)4HVikBZX7UREr4)E9(NEa1X2S6MfztoyTkNtkDGS8kUwYcYsg1)e)YMP(LMGp9n0WTt)vzBlY2p17rZAvZZ7ZxV6DhAYRUlBB(V86D7(WH6F5B2NTB3Z)Y7Em7(86FbB7VwvE8WU8D)6M9pf04BlQZ2Sp)nfvBbzSPBaFFVb7sTKRekR2l0mVs1nyEplmyd)Fv4)HbrtvXHFpV5m5Ig8xFi82DRxSE1d5z7BEau17ZEmFz5HMvf)zom2Gb3HNUTSj)XB2N1KJZfVE)hZEU(2SQ7ZBGUVHMSw9q5hF9XQS3Mh)ANEUPSE9QfF42B)W3VE1tLFeCsqt)bW5eAtRQVn)pAowb(Uf7l(Z)mRA3F9B)qwb8)WVf8orZAB2(8OppfZ)33F)qX9pSh(xt7iinZEIb3AFFB8HEohr)O0uF)MQYp(2IQ8TnfLhwV6hE338T326eJtJ1H5XMWxLwPl8LTddL7Mj3qZKzyWg7vM1RYBN3AibX1CM9Qijh3(Yc6vPyTx5fFAXj0E21zi64E21rqoP(QiiJYFDeKq5utiOxPtEDYPR)0ItdBLDvSlNqCDcQKmlZCvKKJRKJlio5O8KJI)PfgNPVsZGAJ96iiP0yMyaotj54MRKlNz5xfbj1E)vrqWEuxPTc4URZqZPHddMyfS30xwVc2N(tkoTvEDgGsH3nLHnpjXntV)lmMCdx9z(0IecSUolAGPXRZgEaaWpxlc(P7pfbqchbabOk)XYimM1REBzvr9n3ackGyAi(SNYB(3FaavK3S(9FLYIT67kQBEB(Dzh33eSnJfxf0P9vpvvaIT551VhqfcG)Y2(7GM(6f)4YLbdt4O4Qr7cxpsx4cPwppTWzs8i)z0fNsmTwg1WKW2B85QfJEMgMKleQj7IORlDDGZTZBKi80o1J3LZ1HWYCtpoKJo09AMCEdDUw5M5iHlCm)80IqlSt7Gh3WmE70Az0HVuXNowzmpSX7MPkemTAMJDiQ3p9844EyRD6qLXvICUl5DE30Hktm29ZCoutiEV8Ea8CvthooEqVq4fxYyVBNl10w1iHjoJAMlQem2lSwF8jqHtmZU4Gr(86HuzEbx1i7Zje65E6JXREHirXiBZjeZ09Q0k50ROgB7ALYpZLhCNCMwfSo3m9wdJReMW(cBnC(aH7LUzgLiLs)0h6o6kkTq9cNun6abIRMzSOq6ftpNOpFSRTUzQcdBMyAKs78DVc28owhWanZWeJAwlAnY5I)XZMTNIjEHJpMy7QxiwFKHbxjNlmda)JD6tpgRlnPC71LR5394JhpKhKcslatcMNy(WeuAiGEUT4Zn3KabGV9YYl6uPNTl9RTmjybl7Nk218WYSTnLyst(F5v1apLF9XS)tz1VE44JX3Ij987Z(JUm0EtE128dnGjhE3UQFUNyBtL67oeE1IEzn9epX7lbh4zo2LLvpEQBTFESFLRVl9F4QoSDFwD972w(LPghPcQ0odXjQEFUHpuDdcunhme2SMYugVx4AxR7YSnebgdvGVjnb)FhHujVnSRomxFx52J1t6WCAbqR2ZKgMXzfTfLHythTGDvbF(nWWQ4aABdJrcfw4tfJ0Rp)9DDX6teZ2FS0aXsGGMh6BGt)xLvb7J8gOxnHzp89cTjTGJAOQZlfQ3XxFi)XNJB8qAON)gggzhoacCB(JWAmScbyTB(H8SDphwXv)u(2q3ZJYztBd(XAC)mCfxCTzEn4nEkRc2CBvvE9XkkzeXzRDHUv31JBFaAYdqGyCZ2gY(OL(rx6p3LkI0qCqsm2wqobyGCxv2J5D1PPR9DVlk124jP(8P76E1MkApNU7tAHZphRudvJfutd3FB4grr7mMp9EHTb1STONoPLe9I5Td2Qffu4OJ9Wmu(ifLK1lonLfP4ozV(W2hGw1zAHjLEkVROsdhmXtPY3LQWgOhhdqeTiGy06THhaspamIWBCaYRWlKaY7Wd2aer4ZqgDweGnzI9u4bwmH2N(eWHWdpalzJnKlfCxuar5fzxe6hhGchFThFHMlJnJ(DesAqFjfgqpg(olPippAycMfTeghFqQqbfGAh(ulqjzSohkbPcBqiVrls0rcVHhBi3O5XXGWzrrbgh(74xJ5djijbzKgjAusfl69CEruarg3XbHvfvLlPBTW4PXjZq6ghgkJcngT2IwH27JTvXjdgbucpODXFW4izfkKa8GLr(qy6m(GeC74qwyITicnlQnUeTubQurYDhQM9IOxfvfs(m0vh6LJ5Qk2fhoO1c8tm3plImCT0ly4dEfhLQd9KbPJ(dWUWh8ECmaW6SyNKuSPbD6cJ0sJfb(cVn2vDA6dcMXgAWhSyhrMuWdkwu5WVIAYqHGCyG0gmhfPjC6vSjoDuP6uKIqIk3PXEaHq4uHfNlOzm8xbVDS3WHyyVTCATrYjlWgAzOtGJV3APpWLmakumGG5jNM1tH6k6bUj2cjJJJrKwaksdfNXXGzHssIbxNamMXGyAbpS3a1bbTSkW2DbreiQEbja0(IPLzbXOk8ApT6H6h0AAbl3fh(gmg0YjNI0e)DjNcRHfjOMaUMX2JlMaVhfQqYHluToK46UM2J36omnDU5lVtlRBNwact3rxCPoSPF)SW3hyCa115xSJw4G9pNjD4ZiNP9fb1yFqflRkYpSB)ZurdA5mmpKFjGEkhw9IF8PO86Ht5cK1UQH(ZeaNoNeEI3R32CmBF)ZXdt9B6SJaIGDv)RJacMZ8MDt0VY2BG0BojUtNOZ(Fz(t1nznhR3KcRsdbBp)zpShliX2ne6hq1HMJCSJf2aiRcru1Gu)UIdHyBk4PhcGUlFuFjeBv)r4(YaAGqhi9Lc3xAdCKLWjWAy)KWrBqWtki98W8HXUV5yvD(iZ2j02MHU8PMJ6hQLGlhNRhOWVp7(ITJPWq51IQeVRjuqvA8NmHZQF2UQ3FC)(jJC6SQwx6fmc6pt3N87ZRx6aKlHDLTm4yqMlCLSGDkx9hRFVt7ELfGKXa2pmMKQ3xe)2uBwObWlbWzSWXIwv8(DzWnlcvWZ6a4pXzxxVRXMh2lNb4ouCJYah5b)IESKyCZdpxxaRh)uCPAcCiwC6Mk9rqdg0MYMMYh)(SQ7loaBWk0T7z3nhblYcml6bPnTjXsLfofcSwhCAreyh4ZmJPWxEAS)9C70DKp96k(3NryKq(lmFz4aEfJbWBjGHJ0nGH7OZNXlbWdZC36ORHyLgI(l6hf2MlH4ogF3xV82U1lxqW9UQtwyHBNCBXJ5XSZK1Kez)PNKXy6P(Eh4oy7MbxmouCTjoQFSLmQMBkRa6ofnFUtFTWgU)eidHtpIzWJMQcFwHF2DW4j6U74J3c8mlV)uMFdpb(07SPvWIHakG(aeR7ApM)8yzmQiCpmP1FNCUW3MT)Uly6SVL8YnN1B4gZYXFFhD3CwYK3SEKBi5j3UssZHSv87xYsGEPiQjEbu7iW3PP2GWZqnEsEipp1P0jo02jNFqzFvE(gboa)TrWuALg4JO1DBeehnlnAjS3SYcFi9A8q5y0gM5IrofBImIqPbyrkjaWXbiWAHJ4dZei)dTwq4Rj6UCczpdjmbMtSJwIiG3KOnLskGL4YAikQcbXevg2Sd)jhc7pWhPLndI33Ri(piVcSda9bKdRa44qYc4Bh7PYHe4aEdOfPOM6Dy2f0sIVjSvkQEjjIWv1i8DnCYcogXEeevIRkzOcNch(EKpI3H(pTiXiwG2dG(gjZcmrPblhzHjGtTit2I5lXMOORse24i59WuoowI1Nm(a4frPaUQKrIK0axsRxIMujoT2ejufMCJGMJA0NOvfBUHMZzkIBhMEclMTgsMghrbhtFKWAqdc0f2aGYhkoMNsLcyHyIfCuouSkIEPsKsSJtKAkoQyPuhzWXnsFxciHOCjrembY4XhCi)yosxeckjRKJzmiLxcnLwerIPQ2qz)cKiAuWkn0k9usiaZfduePSoWeTEmuRAb2wP0Aig1gxAAhh1wzkZmkmlkPuxq5yr6igTkbn084eSuquJbSIORatjcLdgHYHmLt2aLabPIMq4mgjpMGOu784eJhTrbeQIbEcfLVbghd8WIrg7TdhhG1HjrWqUsd6DOGfqByYSmu(mmu2jejX4jA6dbyc7ILNnG9qIWMQp)HUTR7sUEi)XTCUXxzzdpnEijRZo2yPwd7V5mgaXfePbtqr0Wre0q8Ha4xQbSNoHl93oXa(WbT)pmjEstFZX8668y247Fs4WKbF2rdNbRVSOgqvnMt30Dm)UjqAEg8buPpFi7XITyZx0JRebXU)rL9PPEcS21eIYnNprVzSmC3H(52YxhkZY721prbJKIMIOUV9d3CY03OgucWka)(eipOjj6f7DIzfVwRjiXdtMqRl4KZNJV5QGCnKLNvuPFgIwgL8Q)7XSQ8)63wcuE)RF7NEOOjVFzpga7DcuNXjJoV6dttbJnUaqmmJXiz4uCvV)AP(YSklnVhI6gMLS4K)YqPi4GqG9lHn6rc8(WcMHg)UQ3aOfVVSQipc9QEFE(tHh6DZcURSABEikke5we(mudvMhHA3uTVU54HlPpAaow03Ey3f3fNbvZdzyr1)uDWeoza6WVxFjTgoSiMEG6Tznq88L1ho9xuhSfviDLnxsNmH)QdcDA7f1AaZvO13LNvDjTpu7QOJTS8ISgTt5OjIz0LyoRQYFkK7WdBZVOE5XETRk7(Yd1BQYZAE4s6OICYhZUKwRdLOj4VQYZ)ZCGoXffcRDY4QQIhFcEZfnX0go(829LhUixGHhTTMbBJ(p9of0MvdVhc9tc(6bPDmDyuCvaEDfJqNOQDbQalGkEx1x0dBFBf3AR0wOGryJjW9PsLCgVlUiv)04LAk8qBH2ii)aPogvIphXwssnr6KerM2YZYjYqP6ZcKY8eNpo9GhlULuPOkYcVbbeAtLSZzr8PoMQ1mP6eJG5BjOHx49Or5zNwowa8oAtcnvc4eo0eg92kNbGDPcFNaAN4S1c)fqiJLgfMaiVSssuNs04ARjgqEHkkLIkkfWrIQIvc8F4mcIFyQgNY0eP1liiYjwFjm3Ue(8u9xBPbsyU5EHjXyLCIe1APrJa4fgdvT5yP8AgnXS9ZTrV70tkS9K0DC(nliUwB4R7aJdqqsRuhKsLUBuXPq6p768m8LP1r4rWgfW1cyjfkMBKohCeSlHwiDLjiZC9WlQ1NbiRb4b6DRwoXH95QNTfTORAwV()FZX8M7"
+ return "4XzVC1TCBJRK(jACH)b4L2X2jU2eBVwo1KPQP0eAjglUrwYlj9MXZf5zFBGUb)N5io2jNlgRqc0OrJgD)1aF8SKV82LlU7PV8LYt8)NlwTF31PRxNV7(LxYxUOCt669FRm)(nv3M)qwXnzBVEF(Uk4vV5SlV9SBA35J3(4M0q3wLwwDsAXj7lwNv8M9B3x4hg8D3T8CJHPf2eLwQSgRWU8l)MwUCX9t(MIPEt1YfRHby)wql31m(9v7pT8CRuXsukJJP1mfJ57pdKC6Q80TdLa(CCcSO65TzlxCXUQSIVKUk7ppE96R2v(NVDlyPE(pV4H07Zk)tST)vX(N2ToB9FD32h962P5LP3Tn7n5fRazC3YfpU)BzfhVQ6P0T()zvr(UVMvnOz44F2o)txV8KLl()YkkZ3V7VEi9)zFXFT7PhcQ5JzvVllDB1gWA)Um)8D5LgyAT7XB3xL9W1BtRYW1LJ3(T0NlVnT4(SkqI3rlCl2S)Bh)ur6PzH)zqdBjtYaK)pzWWDKg03GaMCHfwDmWce8hzIwjRxydM0LN7ScLrWuALori066fXnGQV1R(xSRmRYpFrdW17lxU4KRU92R(G3A(75RR2CE6QkyC9Iew7Hj497lYZk9ks52SSh9)iRXW9L9fRY8(1(5wU)VxYLgwcZpURQk2ww90UdPp6etqxl2T(G7IZGdZM0IhoKoaghJVdFT8qATqK48TUCvAf4BEy9HtBBYl9MTDvhsNmmlp0PvhuR5kTV1FjlT4qAVGZdtJI97piTr7uoAHygDre6s2JWuoD3QSdQxjyVwxKE)(DL3vKLwT5q6OImYpLEiTwNyr7vrw2)KvvKEqUWANu57v(dpcp5GwyQDhFE1297oitGHh0TGr4897QGq7BZO9EV0OJROOU)XvqKhyx)LCBRibyuWD3N9MnzR(ADejVMg7ymSDWXxyfcP)TCMnX6)HKNi14pmgE4hmh1gHJLe(Hw5cnMZLmSXkEOTgRj8CJXfAPq44cSVmfkKeTf7R1r)GPuOmmqgMWi7CHNWLutKoPL6T0zO2OccwdbhrP4sy4yZPFKOLOCvsSZWtC4qZ5yNCww4joMQwnd)qWLj44iebDrKatkuPsW(asJHY1IVrka7cQlmtqfegDWSiGSOyFTAu3ycl2uiCenYkB4hsyYI2DUHSYkjADHPgnskfohLmfhLSI704q6qtp0yNJEfzOf(9mb1iUqAteyB4WlXr3hm1BrsCsu1z4yc5FKH2AitvIWqUosYiAWLyPrRrBMXyWXr412Qg))rYcYSALsjyGdO1Pcz5ui8MXFtXuVXNzSj9U)hH9Gy6yrBSxXTcVTy)3onViBvfawy5IBU4TV7wc0biJw4jq5(H0)Ms5hsTgcsaAAxHeZ)cGkkYEyFioWYfNcPpkV(AyE7Hp0h)cHaSER9VjTn7B)Ly46Jb8S2r6w9u5ekH))c4vyOWDAHgIpZGmGGhSOgVsxeZ4cc4yaofn)ByN6I0cia7BGGEv(5n1oTjkGgv4IhE4jmICTIWokjb1LJycV6CzihCyTKw3iRmUGaU3qZkRsREQ8Ui0TO93sd5NQxqutJsSbaA96hRlUWBZ(7QNkGW(NSn)F(N0I1F)Z3KMd)xFeACK6JvZ7M8(8YQtZ(s6tBdzTnwlRxsOhlYb)QQNxEPI5rhNU6RGR2zN8XZp3p5foRC6UW1J0fUqcanN1OGHbMxxGy4tpkJQyywPzokg9mvmmQ)uDr00LMoWH8WZAMGjuMSldhdbKRA65HC0PEif1SM6yU9zntqCbZAueqzPtBGhxXmj2PhLrN(bujZXcBsCZCiemTAMZDWRpz61XXTWw70UkJpiY5ULpKWFMZ9KzUgc(wZShkftnT744o9bivhWCVjYLAATAe3KaoNznlqquZQlWMkXm7ca1E6594X5uMFGPAK4CcHEUzFmjQFGNOyKWC(ssM1qGqtNX0aXpFaUiT31kNPwb7ZnthAy8bjuwWmCfX6HMLAjLYKPt6o6oQqnwZBIa(vZ0xuitetVMOho31w3mhcdBMyAKs78nV(cOMXsOaWant3eFfyZWB3iNl(Ne2STumXpi9XeHR(b(6JmnGYGNlmd8WgMtxQAk46tHZrLkgCvSCeViwx8PUq8BQytL4pW3Aru)C(WQxoFpE8Mn1U0uefu(s406Ot6(xsTFR2MwgQm7xYO1Ckv3IZrF9t(YDEXhqw(Ve9VvvKnhTWi3caopq1(7F(wWXOk)XV)5GkxxmzqxdhixL)FkTdsNLIxYc7iOmyOo8Q9p4RMC5cVVw)IX74hH(0bXY1Cw)DdVgY1XhSjBwI9iadcwYoETvDeUKzhepDwsFsLEacGxfX6K9JC(AiwJAqo7xdXYz6FkYvlhuzWRHyDcXlYrBcXkgwvYSeRpI)90FlW)2Y)vAm9tmolPpP)7ltPNALZy)z4qaqCgC4qVgY1Xhuk2Se7r0bxEus9zfwlA)139ce9ug4HNf3RHyDAEFmHZsShbzgAJ(iX02hwN0h41Se(05n(Pyk4UFglCsrYG6nEnKlEFvVa5Ee30Xj2Vw666i)ZylTB4Xx(AiwU(vobAvRRd6Y0hYAHyJVSgPE7BdaVpI2m6Pp0Dp5pMEyrO7T6Z)EWSX7GkstfUCOYCAEzwAz2y6ZrksJc8Jiimp3vUb0Hw3esu4(AUqt11zfR8x5)9zHkMiLOLLJngw3FYCwAkAvjAOvvtrf0fMaA52TbG1V7JHMa)6H8DWC1Yq(t87hFZnxCvRxWe6a)fU(43F8PxCz9lW73aEXho(TN18uukxFZfNT426NkfsBcj93F1B(VQFr4mlGNF6nF8ItBAE4ygGhFZvV9JnYgVhv4XlE3XF442AI)sFdE2fHlCQX597F(eWFUzj7hFLtFPa2p0qoHgH18SGZwD5T(75SV7xzR7ie8jUEFbutDEv8Pn01IUGpvCG6FxxBgJ)uIEx42lDdvKKD33Yz9CTKRekRorO90DJroJJeoPPi52hoqhne1B)zl04nEDRLdVDI0IGBS)yasbj)(Zo)wFSNwMZMlmTVTkCSfzRJeq7wpdgImlGiYHqKOXlFhGnhEG0GSqWg5qHoWgaTLiRqsKHg0FvcK9cjmjrBabpCr)irfch3SVFWEGqhSj4d0CzKBdO8IJxCajkBiJucrLGKyqa16H)LJ)qs8PWre4qlqjzSi1gKmjY(HWfjEs88P9pHi4HrJuNq4i(wakh((UC4a2XsIwsKyqHuKWLiqUxyT0KWQcdLlo2AbrYHejsDcySXPHYOqLrRTOwaaPcTvXjfg36d)qJS2G4ndpXGu1WYIKTa5NbyAjc14eMqlcNvxy04iVrqYwqxHRxYAz0QIdvnLosCeFB8xEzOleVq0IEe9Xzuw6bm8hjkokvhAj9shThGEH)ijs3KAM(ijFtdA0fgPLMlidJej2qx1XLpWzgBOb)HLyCt4O1HFOqMNaVfhjd5cYHjsTZCqKgUK8iC6WGQJEkcjo4onXYjnowGtw4V0kg(wWAJmsI4Qe3YP9grJSaBOLHgbo(CRL(dULrBTDjgeKXJC1v0p4r2xXX5iEoXOijMib)p0SPKr(fH)BRaDIPn8qSbQdcABfrFOWjdhgEbjau)c3t3j0rS7FCcT7H6h0AAdlX6id6dA5KrrAqkDXj3AytcossjzBrfYsSxkHKdxOQniH9Dv1blJCTbcjuNE7xcUdA8F7tzLLzLELRFkWpKEF(Qo4VILvAi8xHK((t3CiPPtRjs8uZgBcS(WGyjkUrza3yqZ04SXtTdRdcdkb)DWXPE2OHaF(a7m)wklMsRbeyl8D3nC601u(AEOPuIYabQp3tK21BF2RbXN7nUeAHHyA8eS6Jp2LHJVjMoUEE0LArdtb7hI(in(XNrBSeHWkFJFOhluJGAJNaXDpk6HwvBmKevyZ51NerlT)MaIPwy27O5nG7ofA1(7xUyBwk8ASrT61a4GD5Nwd4EQ9DVbeu3)q6F7TXLGp07Z35r0rw(waxA(8cAlHqRAxO129Eqm(o0600NICzTSlRYBrrUrkp7npv0REiEN6ZmDnUxbZ(i0QWT3KpaUvlc87vx)E22tKOTz4hUqRIKoWjxTv6aCqAV41(kPiZ5Ihtl(6bmK)neJXa1DR8FJbaaiTXhVasHalKx(02TtPjSEADRLGR38CzoufX)PQKbaZiI4826)D7RGQ8)ay19178BcB3P0OqKJUeNRSqwnisPdY(eakctftnK5tIaMHqMysiHJWoYeyUAToYixcAiNYcYqWfGfk0rlL0mXeHyebqBjCFdObTKtCKfGHGPi95URZ8J5gtuewbmhSI4HlhX7ja8aKSCe1HvoeSdKJf1if10ehIexljSzqQaC4LKii2nd46SrY86IIkIRJuubX4AtcM7oXH2pTiIEKOYme3hb(bO2OjlXBzbSIqQSfRTWgHZQIGBIergAboxI8owbO)rqtEtvujjAqtuu3RT0IkH)ZgbSrmu3pYHrmjcbj0CdTMtCrNBrO8wSYgsMr(y7WsTewdQqWyHnaGhHIJLqLDaAiccN4In4AqqXuIyrqorSP4SIflZYGZBeQRKXKuDxrQJlrYB7qSKeJ1bNssl5i66igEnvcHiIQtBOkfbjIkLIy0nGC3gvx0rrerOZe1wmCubqtObwAne6tJlUSJZARmwfJcR4icZNQhr6i0FQiR4tWfyPGGr6yC0uGLpq1RiuoevzuhiW2sfTGWzrQ6Zee8txcUWeP3o4QsuuN4Fp4cHoE1uHh80X5bODiGBdzkjQWtol10(3qy)nesErumjeK2y(dFc3MZAPltV)3FghHBr)hGNCmSHTo9)ZbZleA0a1nk8HRC1iH3mZuz1hwsN8PHZPMq5ngaJ)i8q84qOO(Ta1jIFunlJ5EZBG7fV7))92U2aN6aPBqcywDAVj(mcWzq9NMt7t1s6v12NBwSEMEWiT4OEKKkNGUE8JcRg1yl6EATRl(VFkTOAmw6hpvyBZsuNtXTZHIzfSGtcSLfkXaYJHW7hdwl6x4pCDVc06dfa1N3LU9lhayguknFLNTx7)xVE2fUCF8TJF0LVuFOhBDZbnMMB3FS)7A4I19Xf(JnnS6I2o06vg(bkGyEJ75gwckOnTSe4PZoakBnUukGvyB8WVLMoF8PDcySS(6vM40JRdxGRtww3cgpBx2dphAhU4nsGnnarZbfYlsGKLqoMMcLHuCcOKnaKRZjCS6cLPavnUA)KRaog5)a2paRkT4pMuFeN8BORcsmcQ795L73n6EEtJ306jIFpqdcI)0N3L(q(kS5N0P(8wPUqdyuFp3QchiH0Pbqas8BAMp8kC(d)ry4zLKdqLPTqpcFTqGI88YZDEOrkguqcKgYJfcWXRIkvFVZ1fT)QB6)To26JSpp4GE7vx3zvVDEOn9)2W9jhh5JQmEy(TlcRTs0j3qJgq2Vw(9Di53liSt869aVKvE52p1dk5f)Vq6HSV)5ZHc7((N)9n5vWdt3Tde1QShG8iip0qD6giDy4eAkjzMf2e2CPoFSeNdOrlSs4ROZxMw1ZGzlR8PckJyjMna6wztpUDd0Kn(Z3XNap6Z1yT28l9kgXqFFAepP(NiqrR)V6GFYHm2CyF)y9pQHqq0Z9xTchemGPfaJhc8bqRhSrmUt(iBp)2oHZB2e0oQn1Y(3zE7BnEzVZjPBWd0w2C9GnjvQxj6)D3n8(WcEJ9FCtgfW9nEmH9sMgVMX267bGTT(WgBpNJZp02BuqHqqjm(BLiuRfy7DXP7X7wTbgJOMVSp9BFbXb65iSSZPOUkpoY1(vHhg3XvTC5))Oi6pdb"
end
\ No newline at end of file
diff --git a/Libs/LibSpellRange-1.0/LibSpellRange-1.0.lua b/Libs/LibSpellRange-1.0/LibSpellRange-1.0.lua
new file mode 100644
index 0000000..56f7b72
--- /dev/null
+++ b/Libs/LibSpellRange-1.0/LibSpellRange-1.0.lua
@@ -0,0 +1,232 @@
+--- = Background =
+-- Blizzard's IsSpellInRange API has always been very limited - you either must have the name of the spell, or its spell book ID. Checking directly by spellID is simply not possible.
+-- Now, in Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work - instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
+-- = Usage =
+-- **LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
+-- * Allows ranged checking based on both spell name and spellID.
+-- * Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
+--
+-- @class file
+-- @name LibSpellRange-1.0.lua
+
+local major = "SpellRange-1.0"
+local minor = 15
+
+assert(LibStub, format("%s requires LibStub.", major))
+
+local Lib = LibStub:NewLibrary(major, minor)
+if not Lib then return end
+
+local tonumber = _G.tonumber
+local strlower = _G.strlower
+local wipe = _G.wipe
+local type = _G.type
+
+local GetSpellTabInfo = _G.GetSpellTabInfo
+local GetNumSpellTabs = _G.GetNumSpellTabs
+local GetSpellBookItemInfo = _G.GetSpellBookItemInfo
+local GetSpellBookItemName = _G.GetSpellBookItemName
+local GetSpellLink = _G.GetSpellLink
+local GetSpellInfo = _G.GetSpellInfo
+
+local IsSpellInRange = _G.IsSpellInRange
+local SpellHasRange = _G.SpellHasRange
+
+-- isNumber is basically a tonumber cache for maximum efficiency
+Lib.isNumber = Lib.isNumber or setmetatable({}, {
+ __mode = "kv",
+ __index = function(t, i)
+ local o = tonumber(i) or false
+ t[i] = o
+ return o
+end})
+local isNumber = Lib.isNumber
+
+-- strlower cache for maximum efficiency
+Lib.strlowerCache = Lib.strlowerCache or setmetatable(
+{}, {
+ __index = function(t, i)
+ if not i then return end
+ local o
+ if type(i) == "number" then
+ o = i
+ else
+ o = strlower(i)
+ end
+ t[i] = o
+ return o
+ end,
+}) local strlowerCache = Lib.strlowerCache
+
+-- Matches lowercase player spell names to their spellBookID
+Lib.spellsByName_spell = Lib.spellsByName_spell or {}
+local spellsByName_spell = Lib.spellsByName_spell
+
+-- Matches player spellIDs to their spellBookID
+Lib.spellsByID_spell = Lib.spellsByID_spell or {}
+local spellsByID_spell = Lib.spellsByID_spell
+
+-- Matches lowercase pet spell names to their spellBookID
+Lib.spellsByName_pet = Lib.spellsByName_pet or {}
+local spellsByName_pet = Lib.spellsByName_pet
+
+-- Matches pet spellIDs to their spellBookID
+Lib.spellsByID_pet = Lib.spellsByID_pet or {}
+local spellsByID_pet = Lib.spellsByID_pet
+
+-- Updates spellsByName and spellsByID
+local function UpdateBook(bookType)
+ local max = 0
+ for i = 1, GetNumSpellTabs() do
+ local _, _, offs, numspells, _, specId = GetSpellTabInfo(i)
+ if specId == 0 then
+ max = offs + numspells
+ end
+ end
+
+ local spellsByName = Lib["spellsByName_" .. bookType]
+ local spellsByID = Lib["spellsByID_" .. bookType]
+
+ wipe(spellsByName)
+ wipe(spellsByID)
+
+ for spellBookID = 1, max do
+ local type, baseSpellID = GetSpellBookItemInfo(spellBookID, bookType)
+
+ if type == "SPELL" or type == "PETACTION" then
+ local currentSpellName = GetSpellBookItemName(spellBookID, bookType)
+ local link = GetSpellLink(currentSpellName)
+ local currentSpellID = tonumber(link and link:gsub("|", "||"):match("spell:(%d+)"))
+
+ -- For each entry we add to a table,
+ -- only add it if there isn't anything there already.
+ -- This prevents weird passives from overwriting real, legit spells.
+ -- For example, in WoW 7.3.5 the ret paladin mastery
+ -- was coming back with a base spell named "Judgement",
+ -- which was overwriting the real "Judgement".
+ -- Passives usually come last in the spellbook,
+ -- so this should work just fine as a workaround.
+ -- This issue with "Judgement" is gone in BFA because the mastery changed.
+
+ if currentSpellName and not spellsByName[strlower(currentSpellName)] then
+ spellsByName[strlower(currentSpellName)] = spellBookID
+ end
+ if currentSpellID and not spellsByID[currentSpellID] then
+ spellsByID[currentSpellID] = spellBookID
+ end
+
+ if type == "SPELL" then
+ -- PETACTION (pet abilities) don't return a spellID for baseSpellID,
+ -- so base spells only work for proper player spells.
+ local baseSpellName = GetSpellInfo(baseSpellID)
+ if baseSpellName and not spellsByName[strlower(baseSpellName)] then
+ spellsByName[strlower(baseSpellName)] = spellBookID
+ end
+ if baseSpellID and not spellsByID[baseSpellID] then
+ spellsByID[baseSpellID] = spellBookID
+ end
+ end
+ end
+ end
+end
+
+-- Handles updating spellsByName and spellsByID
+if not Lib.updaterFrame then
+ Lib.updaterFrame = CreateFrame("Frame")
+end
+Lib.updaterFrame:UnregisterAllEvents()
+Lib.updaterFrame:RegisterEvent("SPELLS_CHANGED")
+
+local function UpdateSpells()
+ UpdateBook("spell")
+ UpdateBook("pet")
+end
+
+Lib.updaterFrame:SetScript("OnEvent", UpdateSpells)
+UpdateSpells()
+
+--- Improved spell range checking function.
+-- @name SpellRange.IsSpellInRange
+-- @paramsig spell, unit
+-- @param spell Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
+-- @param unit UnitID of the spell that you wish to check the range on.
+-- @return Exact same returns as http://wowprogramming.com/docs/api/IsSpellInRange
+-- @usage
+-- -- Check spell range by spell name on unit "target"
+-- local SpellRange = LibStub("SpellRange-1.0")
+-- local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
+--
+-- -- Check spell range by spellID on unit "mouseover"
+-- local SpellRange = LibStub("SpellRange-1.0")
+-- local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
+function Lib.IsSpellInRange(spellInput, unit)
+ if isNumber[spellInput] then
+ local spell = spellsByID_spell[spellInput]
+ if spell then
+ return IsSpellInRange(spell, "spell", unit)
+ else
+ local spell = spellsByID_pet[spellInput]
+ if spell then
+ return IsSpellInRange(spell, "pet", unit)
+ end
+ end
+ else
+ local spellInput = strlowerCache[spellInput]
+
+ local spell = spellsByName_spell[spellInput]
+ if spell then
+ return IsSpellInRange(spell, "spell", unit)
+ else
+ local spell = spellsByName_pet[spellInput]
+ if spell then
+ return IsSpellInRange(spell, "pet", unit)
+ end
+ end
+
+ return IsSpellInRange(spellInput, unit)
+ end
+
+end
+
+
+--- Improved SpellHasRange.
+-- @name SpellRange.SpellHasRange
+-- @paramsig spell
+-- @param spell Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
+-- @return Exact same returns as http://wowprogramming.com/docs/api/SpellHasRange
+-- @usage
+-- -- Check if a spell has a range by spell name
+-- local SpellRange = LibStub("SpellRange-1.0")
+-- local hasRange = SpellRange.SpellHasRange("Stormstrike")
+--
+-- -- Check if a spell has a range by spellID
+-- local SpellRange = LibStub("SpellRange-1.0")
+-- local hasRange = SpellRange.SpellHasRange(17364)
+function Lib.SpellHasRange(spellInput)
+ if isNumber[spellInput] then
+ local spell = spellsByID_spell[spellInput]
+ if spell then
+ return SpellHasRange(spell, "spell")
+ else
+ local spell = spellsByID_pet[spellInput]
+ if spell then
+ return SpellHasRange(spell, "pet")
+ end
+ end
+ else
+ local spellInput = strlowerCache[spellInput]
+
+ local spell = spellsByName_spell[spellInput]
+ if spell then
+ return SpellHasRange(spell, "spell")
+ else
+ local spell = spellsByName_pet[spellInput]
+ if spell then
+ return SpellHasRange(spell, "pet")
+ end
+ end
+
+ return SpellHasRange(spellInput)
+ end
+
+end
diff --git a/Libs/LibSpellRange-1.0/README.md b/Libs/LibSpellRange-1.0/README.md
new file mode 100644
index 0000000..992f4ed
--- /dev/null
+++ b/Libs/LibSpellRange-1.0/README.md
@@ -0,0 +1,61 @@
+# LibSpellRange-1.0
+
+## Background
+
+Blizzard's `IsSpellInRange` API has always been very limited - you either must have the name of the spell,
+or its spell book ID. Checking directly by spellID is simply not possible.
+Now, since Mists of Pandaria, Blizzard changed the way that many talents and specialization spells work -
+instead of giving you a new spell when leaned, they replace existing spells. These replacement spells do
+not work with Blizzard's IsSpellInRange function whatsoever; this limitation is what prompted the creation of this lib.
+
+## Usage
+
+**LibSpellRange-1.0** exposes an enhanced version of IsSpellInRange that:
+
+* Allows ranged checking based on both spell name and spellID.
+* Works correctly with replacement spells that will not work using Blizzard's IsSpellInRange method alone.
+
+### `SpellRange.IsSpellInRange(spell, unit)` - Improved `IsSpellInRange`
+
+#### Parameters
+
+- `spell` - Name or spellID of a spell that you wish to check the range of. The spell must be a spell that you have in your spellbook or your pet's spellbook.
+- `unit` - UnitID of the spell that you wish to check the range on.
+
+#### Return value
+
+Exact same returns as [the built-in `IsSpellInRange`](http://wowprogramming.com/docs/api/IsSpellInRange.html)
+
+#### Usage
+
+``` lua
+-- Check spell range by spell name on unit "target"
+local SpellRange = LibStub("SpellRange-1.0")
+local inRange = SpellRange.IsSpellInRange("Stormstrike", "target")
+
+-- Check spell range by spellID on unit "mouseover"
+local SpellRange = LibStub("SpellRange-1.0")
+local inRange = SpellRange.IsSpellInRange(17364, "mouseover")
+```
+
+### `SpellRange.SpellHasRange(spell)` - Improved `SpellHasRange`
+
+#### Parameters
+
+- `spell` - Name or spellID of a spell that you wish to check for a range. The spell must be a spell that you have in your spellbook or your pet's spellbook.
+
+#### Return value
+
+Exact same returns as [the built-in `SpellHasRange`](http://wowprogramming.com/docs/api/SpellHasRange.html)
+
+#### Usage
+
+``` lua
+-- Check if a spell has a range by spell name
+local SpellRange = LibStub("SpellRange-1.0")
+local hasRange = SpellRange.SpellHasRange("Stormstrike")
+
+-- Check if a spell has a range by spellID
+local SpellRange = LibStub("SpellRange-1.0")
+local hasRange = SpellRange.SpellHasRange(17364)
+```
diff --git a/Libs/LibSpellRange-1.0/lib.xml b/Libs/LibSpellRange-1.0/lib.xml
new file mode 100644
index 0000000..1214c3c
--- /dev/null
+++ b/Libs/LibSpellRange-1.0/lib.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Modules/Announcements.lua b/Modules/Announcements.lua
index a61ab7f..eaa14cb 100644
--- a/Modules/Announcements.lua
+++ b/Modules/Announcements.lua
@@ -47,6 +47,7 @@ function Announcements:Initialize()
self:RegisterMessage("UNIT_HEALTH")
self:RegisterMessage("TRINKET_USED")
self:RegisterMessage("TRINKET_READY")
+ self:RegisterMessage("SHADOWSIGHT")
end
function Announcements:Reset()
@@ -148,6 +149,10 @@ function Announcements:CheckDrink(unit, aura)
end
end
+function Announcements:SHADOWSIGHT(msg)
+ self:Send(msg, 2)
+end
+
function Announcements:Send(msg, throttle, color)
if (throttle and throttle > 0) then
if (not self.throttled[msg]) then
diff --git a/Modules/ArenaCountDown.lua b/Modules/ArenaCountDown.lua
index 489cc2c..8a38b5e 100644
--- a/Modules/ArenaCountDown.lua
+++ b/Modules/ArenaCountDown.lua
@@ -15,11 +15,7 @@ function ACDFrame:OnEvent(event, ...)
end
function ACDFrame:Initialize()
- if ACDFrame.locales[GetLocale()] then
- self.locale = ACDFrame.locales[GetLocale()]
- else
- self.locale = ACDFrame.locales["default"]
- end
+ self.locale = Gladdy:GetArenaTimer()
self.hidden = false
self.countdown = -1
self.texturePath = "Interface\\AddOns\\Gladdy\\Images\\Countdown\\";
@@ -178,69 +174,7 @@ function ACDFrame:GetOptions()
min = 64,
max = 512,
step = 16,
+ width = "full",
}),
}
end
-
-ACDFrame.locales = {
- ["default"] = {
- [61] = "One minute until the Arena battle begins!",
- [31] = "Thirty seconds until the Arena battle begins!",
- [16] = "Fifteen seconds until the Arena battle begins!",
- [0] = "The Arena battle has begun!",
- },
- ["esES"] = {
- [61] = "¡Un minuto hasta que dé comienzo la batalla en arena!",
- [31] = "¡Treinta segundos hasta que comience la batalla en arena!",
- [16] = "¡Quince segundos hasta que comience la batalla en arena!",
- [0] = "¡La batalla en arena ha comenzado!",
- },
- ["ptBR"] = {
- [61] = "Um minuto até a batalha na Arena começar!",
- [31] = "Trinta segundos até a batalha na Arena começar!",
- [16] = "Quinze segundos até a batalha na Arena começar!",
- [0] = "A batalha na Arena começou!",
- },
- ["deDE"] = {
- [61] = "Noch eine Minute bis der Arenakampf beginnt!",
- [31] = "Noch dreißig Sekunden bis der Arenakampf beginnt!",
- [16] = "Noch fünfzehn Sekunden bis der Arenakampf beginnt!",
- [0] = "Der Arenakampf hat begonnen!",
- },
- ["frFR"] = {
- [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] = "競技場戰鬥開始了!",
- },
-}
-
-ACDFrame.locales["esMX"] = ACDFrame.locales["esES"]
-ACDFrame.locales["ptPT"] = ACDFrame.locales["ptBR"]
diff --git a/Modules/Auras.lua b/Modules/Auras.lua
index 1f5c687..73bd710 100644
--- a/Modules/Auras.lua
+++ b/Modules/Auras.lua
@@ -18,6 +18,16 @@ local function defaultSpells(auraType)
end
return spells
end
+local function defaultInterrupts()
+ local spells = {}
+ for k,v in pairs(Gladdy:GetInterrupts()) do
+ spells[tostring(v.spellID)] = {}
+ spells[tostring(v.spellID)].enabled = true
+ spells[tostring(v.spellID)].priority = v.priority
+ end
+ return spells
+end
+
local Auras = Gladdy:NewModule("Auras", nil, {
auraFont = "DorisPP",
auraFontSizeScale = 1,
@@ -27,7 +37,10 @@ local Auras = Gladdy:NewModule("Auras", nil, {
auraDebuffBorderColor = { r = 0, g = 1, b = 0, a = 1 },
auraDisableCircle = false,
auraCooldownAlpha = 1,
- auraListDefault = defaultSpells()
+ auraListDefault = defaultSpells(),
+ auraListInterrupts = defaultInterrupts(),
+ auraInterruptColorsEnabled = true,
+ auraInterruptColors = Gladdy:GetSpellSchoolColors()
})
function Auras:Initialize()
@@ -39,6 +52,7 @@ function Auras:Initialize()
self:RegisterMessage("UNIT_DEATH")
self:RegisterMessage("AURA_GAIN")
self:RegisterMessage("AURA_FADE")
+ self:RegisterMessage("SPELL_INTERRUPT")
end
function Auras:CreateFrame(unit)
@@ -83,16 +97,92 @@ function Auras:CreateFrame(unit)
auraFrame:SetScript("OnUpdate", function(self, elapsed)
if (self.active) then
+ if (self.interruptFrame.priority and self.priority < self.interruptFrame.priority) then
+ self:SetAlpha(0.01)
+ else
+ self:SetAlpha(1)
+ end
if (self.timeLeft <= 0) then
Auras:AURA_FADE(self.unit, self.track)
else
self.timeLeft = self.timeLeft - elapsed
self.text:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0)
end
+ else
+ self:SetAlpha(0.01)
end
end)
+ Gladdy.buttons[unit].aura = auraFrame
self.frames[unit] = auraFrame
+ self:CreateInterrupt(unit)
+ self:ResetUnit(unit)
+end
+
+function Auras:CreateInterrupt(unit)
+ local interruptFrame = CreateFrame("Frame", nil, Gladdy.modules["Class Icon"].frames[unit])
+ interruptFrame:EnableMouse(false)
+ interruptFrame:SetFrameStrata("MEDIUM")
+ interruptFrame:SetFrameLevel(3)
+
+ interruptFrame.cooldown = CreateFrame("Cooldown", nil, interruptFrame, "CooldownFrameTemplate")
+ interruptFrame.cooldown.noCooldownCount = true
+ interruptFrame.cooldown:SetFrameStrata("MEDIUM")
+ interruptFrame.cooldown:SetFrameLevel(4)
+ interruptFrame.cooldown:SetReverse(true)
+ interruptFrame.cooldown:SetHideCountdownNumbers(true)
+
+ interruptFrame.cooldownFrame = CreateFrame("Frame", nil, interruptFrame)
+ interruptFrame.cooldownFrame:ClearAllPoints()
+ interruptFrame.cooldownFrame:SetAllPoints(interruptFrame)
+ interruptFrame.cooldownFrame:SetFrameStrata("MEDIUM")
+ interruptFrame.cooldownFrame:SetFrameLevel(5)
+
+ interruptFrame.icon = interruptFrame:CreateTexture(nil, "BACKGROUND")
+ interruptFrame.icon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
+ interruptFrame.icon:SetAllPoints(interruptFrame)
+
+ interruptFrame.icon.overlay = interruptFrame.cooldownFrame:CreateTexture(nil, "OVERLAY")
+ interruptFrame.icon.overlay:SetAllPoints(interruptFrame)
+ interruptFrame.icon.overlay:SetTexture(Gladdy.db.buttonBorderStyle)
+
+ local classIcon = Gladdy.modules["Class Icon"].frames[unit]
+ interruptFrame:ClearAllPoints()
+ interruptFrame:SetAllPoints(classIcon)
+
+ interruptFrame.text = interruptFrame.cooldownFrame:CreateFontString(nil, "OVERLAY")
+ interruptFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), 10, "OUTLINE")
+ interruptFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a)
+ --auraFrame.text:SetShadowOffset(1, -1)
+ --auraFrame.text:SetShadowColor(0, 0, 0, 1)
+ interruptFrame.text:SetJustifyH("CENTER")
+ interruptFrame.text:SetPoint("CENTER")
+ interruptFrame.unit = unit
+
+ interruptFrame:SetScript("OnUpdate", function(self, elapsed)
+ if (self.active) then
+ if (Auras.frames[self.unit].priority and self.priority <= Auras.frames[self.unit].priority) then
+ self:SetAlpha(0.01)
+ else
+ self:SetAlpha(1)
+ end
+ if (self.timeLeft <= 0) then
+ self.active = false
+ self.priority = nil
+ self.spellSchool = nil
+ self.cooldown:SetCooldown(GetTime(), 0)
+ self:SetAlpha(0.01)
+ else
+ self.timeLeft = self.timeLeft - elapsed
+ self.text:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0)
+ end
+ else
+ self:SetAlpha(0.01)
+ end
+ end)
+
+ Gladdy.buttons[unit].interruptFrame = interruptFrame
+ self.frames[unit].interruptFrame = interruptFrame
self:ResetUnit(unit)
end
@@ -125,10 +215,48 @@ function Auras:UpdateFrame(unit)
else
auraFrame.icon.overlay:SetVertexColor(0, 0, 0, 1)
end
- auraFrame.icon.overlay:Hide()
+ if not auraFrame.active then
+ auraFrame.icon.overlay:Hide()
+ end
if Gladdy.db.auraDisableCircle then
auraFrame.cooldown:SetAlpha(0)
end
+ self:UpdateInterruptFrame(unit)
+end
+
+function Auras:UpdateInterruptFrame(unit)
+ local interruptFrame = self.frames[unit] and self.frames[unit].interruptFrame
+ if (not interruptFrame) then
+ return
+ end
+
+ local width, height = Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor, Gladdy.db.classIconSize
+
+ interruptFrame:SetWidth(width)
+ interruptFrame:SetHeight(height)
+ interruptFrame:SetAllPoints(Gladdy.modules["Class Icon"].frames[unit])
+
+ interruptFrame.cooldown:SetWidth(width - width/16)
+ interruptFrame.cooldown:SetHeight(height - height/16)
+ interruptFrame.cooldown:ClearAllPoints()
+ interruptFrame.cooldown:SetPoint("CENTER", interruptFrame, "CENTER")
+ interruptFrame.cooldown:SetAlpha(Gladdy.db.auraCooldownAlpha)
+
+ interruptFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE")
+ interruptFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a)
+
+ interruptFrame.icon.overlay:SetTexture(Gladdy.db.auraBorderStyle)
+ if interruptFrame.spellSchool then
+ interruptFrame.icon.overlay:SetVertexColor(self:GetInterruptColor(interruptFrame.spellSchool))
+ else
+ interruptFrame.icon.overlay:SetVertexColor(0, 0, 0, 1)
+ end
+ if not interruptFrame.active then
+ interruptFrame.icon.overlay:Hide()
+ end
+ if Gladdy.db.auraDisableCircle then
+ interruptFrame.cooldown:SetAlpha(0)
+ end
end
function Auras:ResetUnit(unit)
@@ -141,15 +269,17 @@ function Auras:Test(unit)
local spellName, _, icon
if (unit == "arena1") then
- spellName, _, icon = GetSpellInfo(12826)
+ spellName, _, icon = GetSpellInfo(7922)
self:AURA_FADE(unit, AURA_TYPE_BUFF)
self:AURA_FADE(unit, AURA_TYPE_DEBUFF)
- self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 12826, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration)
+ self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 7922, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration)
+ self:SPELL_INTERRUPT(unit,19244, select(1, GetSpellInfo(19244)), "physical", 25396, select(1, GetSpellInfo(25396)), 64)
elseif (unit == "arena2") then
spellName, _, icon = GetSpellInfo(6770)
self:AURA_FADE(unit, AURA_TYPE_BUFF)
self:AURA_FADE(unit,AURA_TYPE_DEBUFF)
self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 6770, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration)
+ self:SPELL_INTERRUPT(unit,19244, select(1, GetSpellInfo(19244)), "physical", 25396, select(1, GetSpellInfo(25396)), 64)
elseif (unit == "arena3") then
spellName, _, icon = GetSpellInfo(31224)
self:AURA_FADE(unit, AURA_TYPE_BUFF)
@@ -173,6 +303,10 @@ function Auras:AURA_GAIN(unit, auraType, spellID, spellName, icon, duration, exp
return
end
+ if spellID == 31117 then
+ spellName = "Unstable Affliction Silence"
+ end
+
if not self.auras[spellName] then
return
end
@@ -189,7 +323,7 @@ function Auras:AURA_GAIN(unit, auraType, spellID, spellName, icon, duration, exp
auraFrame.name = spellName
auraFrame.timeLeft = expirationTime - GetTime()
auraFrame.priority = Gladdy.db.auraListDefault[tostring(self.auras[spellName].spellID)].priority
- auraFrame.icon:SetTexture(icon)
+ auraFrame.icon:SetTexture(Gladdy:GetImportantAuras()[GetSpellInfo(self.auras[spellName].spellID)] and Gladdy:GetImportantAuras()[GetSpellInfo(self.auras[spellName].spellID)].texture or icon)
auraFrame.track = auraType
auraFrame.active = true
auraFrame.icon.overlay:Show()
@@ -215,7 +349,7 @@ function Auras:AURA_FADE(unit, auraType)
if auraFrame.active then
auraFrame.cooldown:SetCooldown(GetTime(), 0)
end
- auraFrame.cooldown:Hide()
+ --auraFrame.cooldown:Hide()
auraFrame.active = false
auraFrame.name = nil
auraFrame.timeLeft = 0
@@ -224,11 +358,123 @@ function Auras:AURA_FADE(unit, auraType)
auraFrame.endTime = nil
auraFrame.icon:SetTexture("")
auraFrame.text:SetText("")
- auraFrame.icon.overlay:Hide()
- auraFrame.cooldownFrame:Hide()
+ --auraFrame.icon.overlay:Hide()
+ --auraFrame.cooldownFrame:Hide()
+end
+
+function Auras:GetInterruptColor(extraSpellSchool)
+ if not Gladdy.db.auraInterruptColorsEnabled then
+ return Gladdy.db.auraDebuffBorderColor.r, Gladdy.db.auraDebuffBorderColor.g, Gladdy.db.auraDebuffBorderColor.b, Gladdy.db.auraDebuffBorderColor.a
+ else
+ local color = Gladdy.db.auraInterruptColors[extraSpellSchool] or Gladdy.db.auraInterruptColors["unknown"]
+ return color.r, color.g, color.b, color.a
+ end
+end
+
+function Auras:SPELL_INTERRUPT(unit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
+ local auraFrame = self.frames[unit]
+ local interruptFrame = auraFrame and auraFrame.interruptFrame
+ local button = Gladdy.buttons[unit]
+ if (not interruptFrame) then
+ return
+ end
+ if not Gladdy.db.auraListInterrupts[tostring(Gladdy:GetInterrupts()[spellName].spellID)] or not Gladdy.db.auraListInterrupts[tostring(Gladdy:GetInterrupts()[spellName].spellID)].enabled then
+ return
+ end
+ if (interruptFrame.priority and interruptFrame.priority > Gladdy.db.auraListInterrupts[tostring(Gladdy:GetInterrupts()[spellName].spellID)].priority) then
+ return
+ end
+ local multiplier = ((button.spec == L["Restoration"] and button.class == "SHAMAN") or (button.spec == L["Holy"] and button.class == "PALADIN")) and 0.7 or 1
+
+ local duration = Gladdy:GetInterrupts()[spellName].duration * multiplier
+
+ interruptFrame.startTime = GetTime()
+ interruptFrame.endTime = GetTime() + duration
+ interruptFrame.name = spellName
+ interruptFrame.timeLeft = duration
+ interruptFrame.priority = Gladdy.db.auraListInterrupts[tostring(Gladdy:GetInterrupts()[spellName].spellID)].priority
+ interruptFrame.icon:SetTexture(Gladdy:GetInterrupts()[spellName].texture)
+ interruptFrame.spellSchool = extraSpellSchool
+ interruptFrame.active = true
+ interruptFrame.icon.overlay:Show()
+ interruptFrame.cooldownFrame:Show()
+
+ interruptFrame.icon.overlay:SetVertexColor(self:GetInterruptColor(extraSpellSchool))
+
+ if not Gladdy.db.auraDisableCircle then
+ interruptFrame.cooldown:Show()
+ interruptFrame.cooldown:SetCooldown(interruptFrame.startTime, duration)
+ end
+ --interruptFrame:SetAlpha(1)
end
function Auras:GetOptions()
+ local borderArgs = {
+ headerAuras = {
+ type = "header",
+ name = L["Border"],
+ order = 2,
+ },
+ auraBorderStyle = Gladdy:option({
+ type = "select",
+ name = L["Border style"],
+ order = 9,
+ values = Gladdy:GetIconStyles(),
+ }),
+ auraBuffBorderColor = Gladdy:colorOption({
+ type = "color",
+ name = L["Buff color"],
+ desc = L["Color of the text"],
+ order = 10,
+ hasAlpha = true,
+ width = "0.8",
+ }),
+ auraDebuffBorderColor = Gladdy:colorOption({
+ type = "color",
+ name = L["Debuff color"],
+ desc = L["Color of the text"],
+ order = 11,
+ hasAlpha = true,
+ width = "0.8",
+ }),
+ headerColors = {
+ type = "header",
+ name = L["Interrupt Spells School Colors"],
+ order = 12,
+ },
+ auraInterruptColorsEnabled = Gladdy:option({
+ type = "toggle",
+ name = L["Enable Interrupt Spell School Colors"],
+ width = "full",
+ desc = L["Will use Debuff Color if disabled"],
+ order = 13,
+ }),
+ }
+ local list = {}
+ for k,v in pairs(Gladdy:GetSpellSchoolColors()) do
+ tinsert(list, { key = k, val = v})
+ end
+ tbl_sort(list, function(a, b) return a.val.type < b.val.type end)
+ for i,v in ipairs(list) do
+ borderArgs["auraSpellSchool" .. v.key] = {
+ type = "color",
+ name = v.val.type,
+ order = i + 13,
+ hasAlpha = true,
+ width = "0.8",
+ set = function(info, r, g, b, a)
+ Gladdy.db.auraInterruptColors[v.key].r = r
+ Gladdy.db.auraInterruptColors[v.key].g = g
+ Gladdy.db.auraInterruptColors[v.key].b = b
+ Gladdy.db.auraInterruptColors[v.key].a = a
+ end,
+ get = function()
+ local color = Gladdy.db.auraInterruptColors[v.key]
+ return color.r, color.g, color.b, color.a
+ end
+ }
+ end
+
return {
header = {
type = "header",
@@ -264,6 +510,7 @@ function Auras:GetOptions()
max = 1,
step = 0.1,
order = 4,
+ width = "full",
}),
}
},
@@ -293,6 +540,7 @@ function Auras:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
auraFontColor = Gladdy:colorOption({
type = "color",
@@ -307,35 +555,7 @@ function Auras:GetOptions()
type = "group",
name = L["Border"],
order = 3,
- args = {
- headerAuras = {
- type = "header",
- name = L["Border"],
- order = 2,
- },
- auraBorderStyle = Gladdy:option({
- type = "select",
- name = L["Border style"],
- order = 9,
- values = Gladdy:GetIconStyles(),
- }),
- auraBuffBorderColor = Gladdy:colorOption({
- type = "color",
- name = L["Buff color"],
- desc = L["Color of the text"],
- order = 10,
- hasAlpha = true,
- width = "0.8",
- }),
- auraDebuffBorderColor = Gladdy:colorOption({
- type = "color",
- name = L["Debuff color"],
- desc = L["Color of the text"],
- order = 11,
- hasAlpha = true,
- width = "0.8",
- }),
- }
+ args = borderArgs
}
}
},
@@ -352,6 +572,13 @@ function Auras:GetOptions()
name = "Buffs",
order = 5,
args = Auras:GetAuraOptions(AURA_TYPE_BUFF)
+ },
+ interruptList = {
+ type = "group",
+ childGroups = "tree",
+ name = "Interrupts",
+ order = 6,
+ args = Auras:GetInterruptOptions()
}
}
end
@@ -387,19 +614,22 @@ function Auras:GetAuraOptions(auraType)
tinsert(auras, v.spellID)
end
end
- tbl_sort(auras)
+ tbl_sort(auras, function(a, b) return GetSpellInfo(a) < GetSpellInfo(b) end)
for i,k in ipairs(auras) do
options[tostring(k)] = {
type = "group",
- name = GetSpellInfo(k),
+ name = Gladdy:GetImportantAuras()["Unstable Affliction Silence"]
+ and Gladdy:GetImportantAuras()["Unstable Affliction Silence"].spellID == k
+ and Gladdy:GetImportantAuras()["Unstable Affliction Silence"].altName
+ or GetSpellInfo(k),
order = i+2,
- icon = select(3, GetSpellInfo(k)),
+ icon = Gladdy:GetImportantAuras()[GetSpellInfo(k)] and Gladdy:GetImportantAuras()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)),
args = {
enabled = {
order = 1,
name = L["Enabled"],
type = "toggle",
- image = select(3, GetSpellInfo(k)),
+ image = Gladdy:GetImportantAuras()[GetSpellInfo(k)] and Gladdy:GetImportantAuras()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)),
width = "2",
set = function(info, value)
Gladdy.db.auraListDefault[tostring(k)].enabled = value
@@ -422,6 +652,82 @@ function Auras:GetAuraOptions(auraType)
set = function(info, value)
Gladdy.db.auraListDefault[tostring(k)].priority = value
end,
+ width = "full",
+ }
+ }
+ }
+ end
+ return options
+end
+
+function Auras:GetInterruptOptions()
+ local options = {
+ ckeckAll = {
+ order = 1,
+ width = "0.7",
+ name = L["Check All"],
+ type = "execute",
+ func = function(info)
+ for k,v in pairs(defaultInterrupts()) do
+ Gladdy.db.auraListInterrupts[k].enabled = true
+ end
+ end,
+ },
+ uncheckAll = {
+ order = 2,
+ width = "0.7",
+ name = L["Uncheck All"],
+ type = "execute",
+ func = function(info)
+ for k,v in pairs(defaultInterrupts()) do
+ Gladdy.db.auraListInterrupts[k].enabled = false
+ end
+ end,
+ },
+ }
+ local auras = {}
+ for k,v in pairs(Gladdy:GetInterrupts()) do
+ tinsert(auras, v.spellID)
+ end
+ tbl_sort(auras, function(a, b) return GetSpellInfo(a) < GetSpellInfo(b) end)
+ for i,k in ipairs(auras) do
+ options[tostring(k)] = {
+ type = "group",
+ name = Gladdy:GetInterrupts()["Unstable Affliction Silence"]
+ and Gladdy:GetInterrupts()["Unstable Affliction Silence"].spellID == k
+ and Gladdy:GetInterrupts()["Unstable Affliction Silence"].altName
+ or GetSpellInfo(k),
+ order = i+2,
+ icon = Gladdy:GetInterrupts()[GetSpellInfo(k)] and Gladdy:GetInterrupts()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)),
+ args = {
+ enabled = {
+ order = 1,
+ name = L["Enabled"],
+ type = "toggle",
+ image = Gladdy:GetInterrupts()[GetSpellInfo(k)] and Gladdy:GetInterrupts()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)),
+ width = "2",
+ set = function(info, value)
+ Gladdy.db.auraListInterrupts[tostring(k)].enabled = value
+ end,
+ get = function(info)
+ return Gladdy.db.auraListInterrupts[tostring(k)].enabled
+ end
+ },
+ priority = {
+ order = 2,
+ name = L["Priority"],
+ type = "range",
+ min = 0,
+ max = 50,
+ width = "2",
+ step = 1,
+ get = function(info)
+ return Gladdy.db.auraListInterrupts[tostring(k)].priority
+ end,
+ set = function(info, value)
+ Gladdy.db.auraListInterrupts[tostring(k)].priority = value
+ end,
+ width = "full",
}
}
}
diff --git a/Modules/BuffsDebuffs.lua b/Modules/BuffsDebuffs.lua
index a96d230..76672f7 100644
--- a/Modules/BuffsDebuffs.lua
+++ b/Modules/BuffsDebuffs.lua
@@ -2,20 +2,9 @@ local GetSpellInfo = GetSpellInfo
local CreateFrame = CreateFrame
local GetTime = GetTime
local select, lower, ceil, tremove, tinsert, pairs, ipairs, tostring = select, string.lower, ceil, tremove, tinsert, pairs, ipairs, tostring
-local auraTypeColor = { }
local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF
local auraTypes = {AURA_TYPE_BUFF, AURA_TYPE_DEBUFF}
-auraTypeColor["none"] = { r = 0.80, g = 0, b = 0 , a = 1}
-auraTypeColor["magic"] = { r = 0.20, g = 0.60, b = 1.00, a = 1}
-auraTypeColor["curse"] = { r = 0.60, g = 0.00, b = 1.00, a = 1 }
-auraTypeColor["disease"] = { r = 0.60, g = 0.40, b = 0, a = 1 }
-auraTypeColor["poison"] = { r = 0.00, g = 0.60, b = 0, a = 1 }
-auraTypeColor["immune"] = { r = 1.00, g = 0.02, b = 0.99, a = 1 }
-auraTypeColor["form"] = auraTypeColor["none"]
-auraTypeColor["aura"] = auraTypeColor["none"]
-auraTypeColor[""] = auraTypeColor["none"]
-
---------------------------
-- Module init
---------------------------
@@ -55,14 +44,14 @@ local BuffsDebuffs = Gladdy:NewModule("Buffs and Debuffs", nil, {
buffsBorderColorsEnabled = true,
trackedDebuffs = defaultTrackedDebuffs,
trackedBuffs = defaultTrackedBuffs,
- buffsBorderColorCurse = auraTypeColor["curse"],
- buffsBorderColorMagic = auraTypeColor["magic"],
- buffsBorderColorPoison = auraTypeColor["poison"],
- buffsBorderColorPhysical = auraTypeColor["none"],
- buffsBorderColorImmune = auraTypeColor["immune"],
- buffsBorderColorDisease = auraTypeColor["disease"],
- buffsBorderColorForm = auraTypeColor["form"],
- buffsBorderColorAura = auraTypeColor["aura"]
+ buffsBorderColorCurse = Gladdy:GetAuraTypeColor()["curse"],
+ buffsBorderColorMagic = Gladdy:GetAuraTypeColor()["magic"],
+ buffsBorderColorPoison = Gladdy:GetAuraTypeColor()["poison"],
+ buffsBorderColorPhysical = Gladdy:GetAuraTypeColor()["none"],
+ buffsBorderColorImmune = Gladdy:GetAuraTypeColor()["immune"],
+ buffsBorderColorDisease = Gladdy:GetAuraTypeColor()["disease"],
+ buffsBorderColorForm = Gladdy:GetAuraTypeColor()["form"],
+ buffsBorderColorAura = Gladdy:GetAuraTypeColor()["aura"]
})
local spellSchoolToOptionValueTable
@@ -148,21 +137,24 @@ function BuffsDebuffs:Test(unit)
if unit == "arena1" or unit == "arena3" then
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF)
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF)
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 1943, select(1, GetSpellInfo(1943)), select(3, GetSpellInfo(1943)), 10, GetTime() + 10, 1, "physical")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 18647, select(1, GetSpellInfo(18647)), select(3, GetSpellInfo(18647)), 10, GetTime() + 10, 1, "immune")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 27218, select(1, GetSpellInfo(27218)), select(3, GetSpellInfo(27218)), 24, GetTime() + 20, 1, "curse")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 27216, select(1, GetSpellInfo(27216)), select(3, GetSpellInfo(27216)), 18, GetTime() + 18, 1, "magic")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 27189, select(1, GetSpellInfo(27189)), select(3, GetSpellInfo(27189)), 12, GetTime() + 12, 5, "poison")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 33076, select(1, GetSpellInfo(33076)), select(3, GetSpellInfo(33076)), 20, GetTime() + 20, 1, "magic")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 26980, select(1, GetSpellInfo(26980)), select(3, GetSpellInfo(26980)), 20, GetTime() + 20, 5, "magic")
- elseif unit == "arena2" then
+
+ BuffsDebuffs:AddOrRefreshAura(unit, 1943, AURA_TYPE_DEBUFF, 12, 12, 1, "physical", select(3, GetSpellInfo(1943)), 1)
+ BuffsDebuffs:AddOrRefreshAura(unit, 18647, AURA_TYPE_DEBUFF, 10, 10, 1, "immune", select(3, GetSpellInfo(18647)), 2)
+ BuffsDebuffs:AddOrRefreshAura(unit, 27218, AURA_TYPE_DEBUFF, 9, 9, 1, "curse", select(3, GetSpellInfo(27218)), 3)
+ BuffsDebuffs:AddOrRefreshAura(unit, 27216, AURA_TYPE_DEBUFF, 9, 9, 1, "magic", select(3, GetSpellInfo(27216)), 4)
+ BuffsDebuffs:AddOrRefreshAura(unit, 27189, AURA_TYPE_DEBUFF, 9, 9, 5, "poison", select(3, GetSpellInfo(27189)), 5)
+
+ BuffsDebuffs:AddOrRefreshAura(unit, 33076, AURA_TYPE_BUFF, 15, 15, 1, "magic", select(3, GetSpellInfo(33076)), 1)
+ BuffsDebuffs:AddOrRefreshAura(unit, 26980, AURA_TYPE_BUFF, 12, 12, 5, "magic", select(3, GetSpellInfo(26980)), 2)
+ else
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_DEBUFF)
BuffsDebuffs:AURA_FADE(unit, AURA_TYPE_BUFF)
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 1943, select(1, GetSpellInfo(1943)), select(3, GetSpellInfo(1943)), 10, GetTime() + 10, 1, "physical")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_DEBUFF, 1, select(1, GetSpellInfo(1)), select(3, GetSpellInfo(1)), 20, GetTime() + 20, 5, "poison")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 27009, select(1, GetSpellInfo(27009)), select(3, GetSpellInfo(27009)), 20, GetTime() + 15, 1, "magic")
- BuffsDebuffs:AURA_GAIN(unit, AURA_TYPE_BUFF, 11426, select(1, GetSpellInfo(11426)), select(3, GetSpellInfo(11426)), 10, GetTime() + 10, 1, "magic")
+ BuffsDebuffs:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 12, 12, 1, "poison", select(3, GetSpellInfo(1943)), 1)
+ BuffsDebuffs:AddOrRefreshAura(unit, 1, AURA_TYPE_BUFF, 10, 10, 2, "magic", select(3, GetSpellInfo(1)), 2)
+
+ BuffsDebuffs:AddOrRefreshAura(unit, 5, AURA_TYPE_DEBUFF, 12, 12, 3, "physical", select(3, GetSpellInfo(27009)), 1)
+ BuffsDebuffs:AddOrRefreshAura(unit, 5, AURA_TYPE_DEBUFF, 11, 11, 4, "disease", select(3, GetSpellInfo(11426)), 2)
end
end
end
@@ -280,6 +272,7 @@ function BuffsDebuffs:UpdateFrame(unit)
self.frames[unit].debuffFrame:ClearAllPoints()
--DEBUFFS
+ 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
if Gladdy.db.buffsCooldownPos == "TOP" then
@@ -298,9 +291,9 @@ function BuffsDebuffs:UpdateFrame(unit)
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsCooldownGrowDirection == "LEFT" then
- self.frames[unit].debuffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].powerBar, "BOTTOMRIGHT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin)
+ 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].powerBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin)
+ 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
@@ -342,9 +335,9 @@ function BuffsDebuffs:UpdateFrame(unit)
verticalMargin = verticalMargin + Gladdy.db.cooldownSize
end
if Gladdy.db.buffsBuffsCooldownGrowDirection == "LEFT" then
- self.frames[unit].buffFrame:SetPoint("TOPLEFT", Gladdy.buttons[unit].powerBar, "BOTTOMRIGHT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin)
+ 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].powerBar, "BOTTOMLEFT", Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset -verticalMargin)
+ 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
@@ -662,6 +655,7 @@ function BuffsDebuffs:GetOptions()
min = 5,
max = 50,
step = 1,
+ width = "full",
}),
buffsBuffsWidthFactor = Gladdy:option({
type = "range",
@@ -671,6 +665,7 @@ function BuffsDebuffs:GetOptions()
min = 0.5,
max = 2,
step = 0.05,
+ width = "full",
}),
buffsBuffsIconPadding = Gladdy:option({
type = "range",
@@ -680,6 +675,7 @@ function BuffsDebuffs:GetOptions()
min = 0,
max = 10,
step = 0.1,
+ width = "full",
}),
},
},
@@ -722,6 +718,7 @@ function BuffsDebuffs:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
buffsBuffsYOffset = Gladdy:option({
type = "range",
@@ -730,6 +727,7 @@ function BuffsDebuffs:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
@@ -750,6 +748,7 @@ function BuffsDebuffs:GetOptions()
min = 0,
max = 1,
step = 0.05,
+ width = "full",
}),
}
}
@@ -778,6 +777,7 @@ function BuffsDebuffs:GetOptions()
min = 5,
max = 50,
step = 1,
+ width = "full",
}),
buffsWidthFactor = Gladdy:option({
type = "range",
@@ -787,6 +787,7 @@ function BuffsDebuffs:GetOptions()
min = 0.5,
max = 2,
step = 0.05,
+ width = "full",
}),
buffsIconPadding = Gladdy:option({
type = "range",
@@ -796,6 +797,7 @@ function BuffsDebuffs:GetOptions()
min = 0,
max = 10,
step = 0.1,
+ width = "full",
}),
},
},
@@ -838,6 +840,7 @@ function BuffsDebuffs:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
buffsYOffset = Gladdy:option({
type = "range",
@@ -846,6 +849,7 @@ function BuffsDebuffs:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
@@ -866,6 +870,7 @@ function BuffsDebuffs:GetOptions()
min = 0,
max = 1,
step = 0.05,
+ width = "full",
}),
}
}
@@ -894,6 +899,7 @@ function BuffsDebuffs:GetOptions()
max = 1,
step = 0.1,
order = 10,
+ width = "full",
}),
},
},
@@ -923,6 +929,7 @@ function BuffsDebuffs:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
buffsDynamicColor = Gladdy:option({
type = "toggle",
diff --git a/Modules/Castbar.lua b/Modules/Castbar.lua
index 824c187..ab5cc60 100644
--- a/Modules/Castbar.lua
+++ b/Modules/Castbar.lua
@@ -19,6 +19,7 @@ local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists
local Castbar = Gladdy:NewModule("Cast Bar", 70, {
+ castBarEnabled = true,
castBarHeight = 20,
castBarWidth = 160,
castBarIconSize = 22,
@@ -439,42 +440,41 @@ end
---------------------------
function Castbar:JOINED_ARENA()
- for i=1, Gladdy.curBracket do
- local unit = "arena" .. i
- local castBar = self.frames[unit]
- castBar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
- castBar:RegisterEvent("UNIT_SPELLCAST_DELAYED")
- castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
- castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
- castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
- castBar:RegisterUnitEvent("UNIT_SPELLCAST_START", unit)
- castBar:RegisterUnitEvent("UNIT_SPELLCAST_STOP", unit)
- castBar:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", unit)
- castBar:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", unit)
- castBar:SetScript("OnEvent", Castbar.OnEvent)
- castBar:SetScript("OnUpdate", Castbar.OnUpdate)
- castBar.fadeOut = nil
- self:CAST_STOP(unit)
- --Castbar.OnEvent(castBar, "PLAYER_ENTERING_WORLD")
+ if Gladdy.db.castBarEnabled then
+ for i=1, Gladdy.curBracket do
+ local unit = "arena" .. i
+ local castBar = self.frames[unit]
+ castBar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
+ castBar:RegisterEvent("UNIT_SPELLCAST_DELAYED")
+ castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
+ castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
+ castBar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
+ castBar:RegisterUnitEvent("UNIT_SPELLCAST_START", unit)
+ castBar:RegisterUnitEvent("UNIT_SPELLCAST_STOP", unit)
+ castBar:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", unit)
+ castBar:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", unit)
+ castBar:SetScript("OnEvent", Castbar.OnEvent)
+ castBar:SetScript("OnUpdate", Castbar.OnUpdate)
+ castBar.fadeOut = nil
+ self:CAST_STOP(unit)
+ --Castbar.OnEvent(castBar, "PLAYER_ENTERING_WORLD")
+ end
end
end
function Castbar:ResetUnit(unit)
local castBar = self.frames[unit]
- castBar:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED")
- castBar:UnregisterEvent("UNIT_SPELLCAST_DELAYED")
- castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START")
- castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
- castBar:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
- castBar:UnregisterEvent("UNIT_SPELLCAST_START")
- castBar:UnregisterEvent("UNIT_SPELLCAST_STOP")
- castBar:UnregisterEvent("UNIT_SPELLCAST_FAILED")
+ castBar:UnregisterAllEvents()
castBar:SetScript("OnEvent", nil)
castBar:SetScript("OnUpdate", nil)
castBar.fadeOut = nil
self:CAST_STOP(unit)
end
+function Castbar:Reset()
+ self.test = nil
+end
+
---------------------------
-- TEST
@@ -482,25 +482,30 @@ end
---------------------------
function Castbar:Test(unit)
- local spell, _, icon, value, maxValue, event, endTime, startTime
+ self.test = true
+ if Gladdy.db.castBarEnabled then
+ local spell, _, icon, value, maxValue, event, endTime, startTime
- if (unit == "arena2") then
- spell, _, icon = GetSpellInfo(27072)
- value, maxValue, event = 0, 40, "cast"
- elseif (unit == "arena1") then
- spell, _, icon = GetSpellInfo(27220)
- endTime = GetTime() * 1000 + 60*1000
- startTime = GetTime() * 1000
- value = (endTime / 1000) - GetTime()
- maxValue = (endTime - startTime) / 1000
- event = "channel"
- elseif (unit == "arena3") then
- spell, _, icon = GetSpellInfo(20770)
- value, maxValue, event = 0, 60, "cast"
- end
+ if (unit == "arena2") then
+ spell, _, icon = GetSpellInfo(27072)
+ value, maxValue, event = 0, 40, "cast"
+ elseif (unit == "arena1") then
+ spell, _, icon = GetSpellInfo(27220)
+ endTime = GetTime() * 1000 + 60*1000
+ startTime = GetTime() * 1000
+ value = (endTime / 1000) - GetTime()
+ maxValue = (endTime - startTime) / 1000
+ event = "channel"
+ else
+ spell, _, icon = GetSpellInfo(20770)
+ value, maxValue, event = 0, 60, "cast"
+ end
- if (spell) then
- self:CAST_START(unit, spell, icon, value, maxValue, event)
+ if (spell) then
+ self:CAST_START(unit, spell, icon, value, maxValue, event)
+ end
+ else
+ self:CAST_STOP(unit)
end
end
@@ -541,11 +546,17 @@ function Castbar:GetOptions()
name = L["Cast Bar"],
order = 2,
},
+ castBarEnabled = option({
+ type = "toggle",
+ name = L["Enabled"],
+ desc = L["If test is running, type \"/gladdy test\" again"],
+ order = 3,
+ }),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
- order = 3,
+ order = 4,
args = {
barFrame = {
type = "group",
@@ -565,6 +576,7 @@ function Castbar:GetOptions()
min = 0,
max = 50,
step = 1,
+ width = "full",
}),
castBarWidth = option({
type = "range",
@@ -574,6 +586,7 @@ function Castbar:GetOptions()
min = 0,
max = 300,
step = 1,
+ width = "full",
}),
headerTexture = {
type = "header",
@@ -614,6 +627,7 @@ function Castbar:GetOptions()
min = 0.5,
max = Gladdy.db.castBarHeight/2,
step = 0.5,
+ width = "full",
}),
castBarBorderStyle = option({
type = "select",
@@ -647,6 +661,7 @@ function Castbar:GetOptions()
min = 0,
max = 100,
step = 1,
+ width = "full",
}),
headerBorder = {
type = "header",
@@ -723,6 +738,7 @@ function Castbar:GetOptions()
order = 4,
min = 1,
max = 20,
+ width = "full",
}),
headerFormat = {
type = "header",
@@ -781,6 +797,7 @@ function Castbar:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
castBarYOffset = option({
type = "range",
@@ -789,6 +806,7 @@ function Castbar:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
}
},
diff --git a/Modules/Classicon.lua b/Modules/Classicon.lua
index a82fe19..7f44842 100644
--- a/Modules/Classicon.lua
+++ b/Modules/Classicon.lua
@@ -215,6 +215,7 @@ function Classicon:GetOptions()
max = 100,
step = 1,
order = 3,
+ width = "full",
}),
classIconWidthFactor = Gladdy:option({
type = "range",
@@ -223,6 +224,7 @@ function Classicon:GetOptions()
max = 2,
step = 0.05,
order = 4,
+ width = "full",
}),
},
},
diff --git a/Modules/Clicks.lua b/Modules/Clicks.lua
new file mode 100644
index 0000000..c729c9e
--- /dev/null
+++ b/Modules/Clicks.lua
@@ -0,0 +1,229 @@
+local tinsert = table.insert
+local pairs = pairs
+local tonumber = tonumber
+local tostring = tostring
+
+local GetBindingKey = GetBindingKey
+local ClearOverrideBindings = ClearOverrideBindings
+local SetOverrideBindingClick = SetOverrideBindingClick
+local MACRO, TARGET, FOCUS, ADDON_DISABLED = MACRO, TARGET, FOCUS, ADDON_DISABLED
+
+local Gladdy = LibStub("Gladdy")
+local L = Gladdy.L
+
+local attributes = {
+ { name = "Target", button = "1", modifier = "", action = "target", spell = "" },
+ { name = "Focus", button = "2", modifier = "", action = "focus", spell = "" },
+}
+for i = 3, 10 do
+ tinsert(attributes, { name = L["Action #%d"]:format(i), button = "", modifier = "", action = "disabled", spell = "" })
+end
+local Clicks = Gladdy:NewModule("Clicks", nil, {
+ attributes = attributes,
+})
+
+BINDING_HEADER_GLADDY = "Gladdy"
+BINDING_NAME_GLADDYBUTTON1_LEFT = L["Left Click Enemy 1"]
+BINDING_NAME_GLADDYBUTTON2_LEFT = L["Left Click Enemy 2"]
+BINDING_NAME_GLADDYBUTTON3_LEFT = L["Left Click Enemy 3"]
+BINDING_NAME_GLADDYBUTTON4_LEFT = L["Left Click Enemy 4"]
+BINDING_NAME_GLADDYBUTTON5_LEFT = L["Left Click Enemy 5"]
+
+BINDING_NAME_GLADDYBUTTON1_RIGHT = L["Right Click Enemy 1"]
+BINDING_NAME_GLADDYBUTTON2_RIGHT = L["Right Click Enemy 2"]
+BINDING_NAME_GLADDYBUTTON3_RIGHT = L["Right Click Enemy 3"]
+BINDING_NAME_GLADDYBUTTON4_RIGHT = L["Right Click Enemy 4"]
+BINDING_NAME_GLADDYBUTTON5_RIGHT = L["Right Click Enemy 5"]
+
+BINDING_NAME_GLADDYBUTTON1_MIDDLE = L["Middle Click Enemy 1"]
+BINDING_NAME_GLADDYBUTTON2_MIDDLE = L["Middle Click Enemy 2"]
+BINDING_NAME_GLADDYBUTTON3_MIDDLE = L["Middle Click Enemy 3"]
+BINDING_NAME_GLADDYBUTTON4_MIDDLE = L["Middle Click Enemy 4"]
+BINDING_NAME_GLADDYBUTTON5_MIDDLE = L["Middle Click Enemy 5"]
+
+BINDING_NAME_GLADDYBUTTON1_BUTTON4 = L["Button4 Click Enemy 1"]
+BINDING_NAME_GLADDYBUTTON2_BUTTON4 = L["Button4 Click Enemy 2"]
+BINDING_NAME_GLADDYBUTTON3_BUTTON4 = L["Button4 Click Enemy 3"]
+BINDING_NAME_GLADDYBUTTON4_BUTTON4 = L["Button4 Click Enemy 4"]
+BINDING_NAME_GLADDYBUTTON5_BUTTON4 = L["Button4 Click Enemy 5"]
+
+BINDING_NAME_GLADDYBUTTON1_BUTTON5 = L["Button5 Click Enemy 1"]
+BINDING_NAME_GLADDYBUTTON2_BUTTON5 = L["Button5 Click Enemy 2"]
+BINDING_NAME_GLADDYBUTTON3_BUTTON5 = L["Button5 Click Enemy 3"]
+BINDING_NAME_GLADDYBUTTON4_BUTTON5 = L["Button5 Click Enemy 4"]
+BINDING_NAME_GLADDYBUTTON5_BUTTON5 = L["Button5 Click Enemy 5"]
+
+function Clicks:Initialise()
+ self:RegisterMessage("JOINED_ARENA")
+end
+
+function Clicks:Reset()
+ --
+end
+
+function Clicks:ResetUnit(unit)
+ local button = Gladdy.buttons[unit]
+ if (not button) then
+ return
+ end
+
+ for k, v in pairs(Gladdy.db.attributes) do
+ button.secure:SetAttribute(v.modifier .. "macrotext" .. v.button, "")
+ end
+end
+
+function Clicks:Test()
+ Clicks:JOINED_ARENA()
+end
+
+function Clicks:JOINED_ARENA()
+ for k, v in pairs(Gladdy.buttons) do
+ local left = GetBindingKey(("GLADDYBUTTON%d_LEFT"):format(v.id))
+ local right = GetBindingKey(("GLADDYBUTTON%d_RIGHT"):format(v.id))
+ local middle = GetBindingKey(("GLADDYBUTTON%d_MIDDLE"):format(v.id))
+ local button4 = GetBindingKey(("GLADDYBUTTON%d_BUTTON4"):format(v.id))
+ local button5 = GetBindingKey(("GLADDYBUTTON%d_BUTTON5"):format(v.id))
+
+ ClearOverrideBindings(v.secure)
+
+ if (left) then
+ SetOverrideBindingClick(v.secure, false, left, v.secure:GetName(), "LeftButton")
+ end
+
+ if (right) then
+ SetOverrideBindingClick(v.secure, false, right, v.secure:GetName(), "RightButton")
+ end
+
+ if (middle) then
+ SetOverrideBindingClick(v.secure, false, middle, v.secure:GetName(), "MiddleButton")
+ end
+
+ if (button4) then
+ SetOverrideBindingClick(v.secure, false, button4, v.secure:GetName(), "Button4")
+ end
+
+ if (button5) then
+ SetOverrideBindingClick(v.secure, false, button5, v.secure:GetName(), "Button5")
+ end
+ end
+end
+
+function Clicks:SetupAttributes(unit)
+ local button = Gladdy.buttons[unit]
+ if (not button) then
+ return
+ end
+
+ for k, v in pairs(Gladdy.db.attributes) do
+ self:SetupAttribute(button, v.button, v.modifier, v.action, v.spell)
+ end
+end
+
+function Clicks:SetupAttribute(button, key, mod, action, spell)
+ local attr = ""
+ local text = ""
+
+ if (action == "macro") then
+ attr = mod .. "macrotext" .. key
+ text = spell:gsub("%*arena%*", button.unit)
+ button.secure:SetAttribute(mod .. "type" .. key, "macro")
+ elseif (action ~= "disabled") then
+ if (action == "target") then
+ attr = mod .. "type" .. key
+ text = "target"
+ elseif (action == "focus") then
+ attr = mod .. "type" .. key
+ text = "focus"
+ elseif (action == "spell") then
+ attr = mod .. "type" .. key
+ text = "spell"
+ button.secure:SetAttribute(mod .. "spell" .. key, spell)
+ end
+ end
+
+ button.secure:SetAttribute(attr, text)
+end
+
+local buttons = { ["1"] = L["Left button"], ["2"] = L["Right button"], ["3"] = L["Middle button"], ["4"] = L["Button 4"], ["5"] = L["Button 5"] }
+local modifiers = { [""] = L["None"], ["ctrl-"] = L["CTRL"], ["shift-"] = L["SHIFT"], ["alt-"] = L["ALT"] }
+local clickValues = { ["macro"] = MACRO, ["target"] = TARGET, ["focus"] = FOCUS, ["spell"] = L["Cast Spell"], ["disabled"] = ADDON_DISABLED }
+
+local function SetupAttributeOption(i)
+ return {
+ type = "group",
+ name = Gladdy.dbi.profile.attributes[i].name,
+ desc = Gladdy.dbi.profile.attributes[i].name,
+ order = i + 1,
+ get = function(info)
+ return Gladdy.dbi.profile.attributes[tonumber(info[#info - 1])][info[#info]]
+ end,
+ set = function(info, value)
+ Gladdy.dbi.profile.attributes[tonumber(info[#info - 1])][info[#info]] = value
+
+ if (info[#info] == "name") then
+ Gladdy.options.args.Clicks.args[info[#info - 1]].name = value
+ end
+
+ Gladdy:UpdateFrame()
+ end,
+ args = {
+ name = {
+ type = "input",
+ name = L["Name"],
+ desc = L["Select the name of the click option"],
+ order = 1,
+ },
+ button = {
+ type = "select",
+ name = L["Button"],
+ desc = L["Select which mouse button to use"],
+ order = 2,
+ values = buttons,
+ },
+ modifier = {
+ type = "select",
+ name = L["Modifier"],
+ desc = L["Select which modifier to use"],
+ order = 3,
+ values = modifiers,
+ },
+ action = {
+ type = "select",
+ name = L["Action"],
+ desc = L["Select what action this mouse button does"],
+ order = 4,
+ values = clickValues,
+ },
+ spell = {
+ type = "input",
+ name = L["Cast Spell / Macro"],
+ desc = L["\n|cff1ac742Cast Spell:|r\n" ..
+ "Type in the spell name.\n" ..
+ "For example:\n" ..
+ "|cff17d1c8Polymorph|r\n" ..
+ "\n" ..
+ "|cff1ac742Macro:|r\n" ..
+ "Use *arena* as placeholder.\n" ..
+ "For example:\n" ..
+ "|cff17d1c8/cast [@*arena*] Blind\n" ..
+ "/run SendChatMessage(\"Blinding \" .. UnitName(\"*arena*\"), \"PARTY\")|r"],
+ order = 5,
+ width = "full",
+ multiline = 10,
+ },
+ },
+ }
+end
+
+function Clicks:GetOptions()
+ local options = {}
+ for i = 1, 10 do
+ options[tostring(i)] = SetupAttributeOption(i)
+ end
+ return options
+end
+
+function Clicks:UpdateFrame(unit)
+ self:SetupAttributes(unit)
+ self:JOINED_ARENA()
+end
\ No newline at end of file
diff --git a/Modules/CombatIndicator.lua b/Modules/CombatIndicator.lua
index 20d015b..b0ec9b4 100644
--- a/Modules/CombatIndicator.lua
+++ b/Modules/CombatIndicator.lua
@@ -141,6 +141,7 @@ function CombatIndicator:GetOptions()
max = 100,
step = 1,
order = 2,
+ width = "full",
}),
ciWidthFactor = Gladdy:option({
type = "range",
@@ -149,6 +150,7 @@ function CombatIndicator:GetOptions()
max = 2,
step = 0.05,
order = 3,
+ width = "full",
}),
ciAlpha = Gladdy:option({
type = "range",
@@ -157,6 +159,7 @@ function CombatIndicator:GetOptions()
max = 1,
step = 0.05,
order = 4,
+ width = "full",
}),
},
},
@@ -201,6 +204,7 @@ function CombatIndicator:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
ciYOffset = Gladdy:option({
type = "range",
@@ -209,6 +213,7 @@ function CombatIndicator:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
diff --git a/Modules/Cooldowns.lua b/Modules/Cooldowns.lua
index 228c8f6..d31c361 100644
--- a/Modules/Cooldowns.lua
+++ b/Modules/Cooldowns.lua
@@ -134,7 +134,7 @@ function Cooldowns:UpdateFrame(unit)
-- Cooldown frame
if (Gladdy.db.cooldown) then
button.spellCooldownFrame:ClearAllPoints()
- local verticalMargin = -(Gladdy.db.powerBarHeight)/2
+ local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local horizontalMargin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize)
if Gladdy.db.cooldownYPos == "TOP" then
if Gladdy.db.cooldownXPos == "RIGHT" then
@@ -144,9 +144,9 @@ function Cooldowns:UpdateFrame(unit)
end
elseif Gladdy.db.cooldownYPos == "BOTTOM" then
if Gladdy.db.cooldownXPos == "RIGHT" then
- button.spellCooldownFrame:SetPoint("TOPRIGHT", button.powerBar, "BOTTOMRIGHT", Gladdy.db.cooldownXOffset, -horizontalMargin + Gladdy.db.cooldownYOffset)
+ button.spellCooldownFrame:SetPoint("TOPRIGHT", button.healthBar, "BOTTOMRIGHT", Gladdy.db.cooldownXOffset, -horizontalMargin + Gladdy.db.cooldownYOffset - powerBarHeight)
else
- button.spellCooldownFrame:SetPoint("TOPLEFT", button.powerBar, "BOTTOMLEFT", Gladdy.db.cooldownXOffset, -horizontalMargin + Gladdy.db.cooldownYOffset)
+ button.spellCooldownFrame:SetPoint("TOPLEFT", button.healthBar, "BOTTOMLEFT", Gladdy.db.cooldownXOffset, -horizontalMargin + Gladdy.db.cooldownYOffset - powerBarHeight)
end
elseif Gladdy.db.cooldownYPos == "LEFT" then
local anchor = Gladdy:GetAnchor(unit, "LEFT")
@@ -238,9 +238,16 @@ end
function Cooldowns:Test(unit)
local button = Gladdy.buttons[unit]
- button.spellCooldownFrame:Show()
- button.lastCooldownSpell = 1
- self:UpdateTestCooldowns(unit)
+ if Gladdy.db.cooldown then
+ button.spellCooldownFrame:Show()
+ button.lastCooldownSpell = 1
+ self:UpdateTestCooldowns(unit)
+ else
+ button.spellCooldownFrame:Hide()
+ button.lastCooldownSpell = 1
+ self:UpdateTestCooldowns(unit)
+ end
+
end
function Cooldowns:UpdateTestCooldowns(unit)
@@ -603,6 +610,7 @@ function Cooldowns:GetOptions()
order = 4,
min = 5,
max = 50,
+ width = "full",
}),
cooldownWidthFactor = Gladdy:option({
type = "range",
@@ -612,6 +620,7 @@ function Cooldowns:GetOptions()
min = 0.5,
max = 2,
step = 0.05,
+ width = "full",
}),
cooldownIconPadding = Gladdy:option({
type = "range",
@@ -621,6 +630,7 @@ function Cooldowns:GetOptions()
min = 0,
max = 10,
step = 0.1,
+ width = "full",
}),
cooldownMaxIconsPerLine = Gladdy:option({
type = "range",
@@ -629,6 +639,7 @@ function Cooldowns:GetOptions()
min = 3,
max = 14,
step = 1,
+ width = "full",
}),
},
},
@@ -655,6 +666,7 @@ function Cooldowns:GetOptions()
max = 1,
step = 0.1,
order = 9,
+ width = "full",
}),
},
},
@@ -684,6 +696,7 @@ function Cooldowns:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
cooldownFontColor = Gladdy:colorOption({
type = "color",
@@ -738,6 +751,7 @@ function Cooldowns:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
cooldownYOffset = Gladdy:option({
type = "range",
@@ -746,6 +760,7 @@ function Cooldowns:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
diff --git a/Modules/Diminishings.lua b/Modules/Diminishings.lua
index 7033786..66a772d 100644
--- a/Modules/Diminishings.lua
+++ b/Modules/Diminishings.lua
@@ -385,8 +385,9 @@ function Diminishings:GetOptions()
desc = L["Size of the DR Icons"],
order = 5,
min = 5,
- max = 50,
+ max = 80,
step = 1,
+ width = "full",
}),
drWidthFactor = Gladdy:option({
type = "range",
@@ -396,6 +397,7 @@ function Diminishings:GetOptions()
min = 0.5,
max = 2,
step = 0.05,
+ width = "full",
}),
drIconPadding = Gladdy:option({
type = "range",
@@ -405,6 +407,7 @@ function Diminishings:GetOptions()
min = 0,
max = 10,
step = 0.1,
+ width = "full",
}),
},
},
@@ -431,6 +434,7 @@ function Diminishings:GetOptions()
max = 1,
step = 0.1,
order = 9,
+ width = "full",
}),
},
},
@@ -467,6 +471,7 @@ function Diminishings:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
}
},
@@ -502,6 +507,7 @@ function Diminishings:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
drYOffset = Gladdy:option({
type = "range",
@@ -510,6 +516,7 @@ function Diminishings:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
diff --git a/Modules/ExportImport.lua b/Modules/ExportImport.lua
index c20281c..fe0d112 100644
--- a/Modules/ExportImport.lua
+++ b/Modules/ExportImport.lua
@@ -21,8 +21,6 @@ end
local ExportImport = Gladdy:NewModule("Export Import", nil, {
})
-
-
local export = AceGUI:Create("Frame")
export:SetWidth(550)
export.sizer_se:Hide()
diff --git a/Modules/Healthbar.lua b/Modules/Healthbar.lua
index b10fa1e..c62f16a 100644
--- a/Modules/Healthbar.lua
+++ b/Modules/Healthbar.lua
@@ -1,6 +1,6 @@
local pairs = pairs
local floor = math.floor
-local UnitHealth, UnitHealthMax, UnitName, UnitExists = UnitHealth, UnitHealthMax, UnitName, UnitExists
+local UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost = UnitHealth, UnitHealthMax, UnitName, UnitExists, UnitIsDeadOrGhost
local CreateFrame = CreateFrame
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
@@ -95,13 +95,22 @@ function Healthbar:CreateFrame(unit)
end
function Healthbar.OnEvent(self, event, unit)
+ local isDead = UnitExists(unit) and UnitIsDeadOrGhost(unit)
if event == "UNIT_HEALTH" then
+ if isDead then
+ Gladdy:SendMessage("UNIT_DEATH", unit)
+ return
+ end
local health = UnitHealth(unit)
local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax)
self.hp:SetValue(UnitHealth(unit))
Healthbar:SetHealthText(self, health, healthMax)
elseif event == "UNIT_MAXHEALTH" then
+ if isDead then
+ Gladdy:SendMessage("UNIT_DEATH", unit)
+ return
+ end
local health = UnitHealth(unit)
local healthMax = UnitHealthMax(unit)
self.hp:SetMinMaxValues(0, healthMax)
@@ -368,6 +377,7 @@ function Healthbar:GetOptions()
min = 10,
max = 100,
step = 1,
+ width = "full",
}),
healthBarTexture = option({
type = "select",
@@ -419,6 +429,7 @@ function Healthbar:GetOptions()
step = 0.1,
min = 0,
max = 20,
+ width = "full",
}),
healthBarHealthFontSize = option({
type = "range",
@@ -428,6 +439,7 @@ function Healthbar:GetOptions()
step = 0.1,
min = 0,
max = 20,
+ width = "full",
}),
},
},
@@ -456,6 +468,7 @@ function Healthbar:GetOptions()
min = 0.5,
max = Gladdy.db.healthBarHeight/2,
step = 0.5,
+ width = "full",
}),
healthBarBorderColor = Gladdy:colorOption({
type = "color",
diff --git a/Modules/Highlight.lua b/Modules/Highlight.lua
index aef2fb8..e48a4c2 100644
--- a/Modules/Highlight.lua
+++ b/Modules/Highlight.lua
@@ -89,18 +89,19 @@ function Highlight:UpdateFrame(unit)
return
end
+ local powerBarHeight = Gladdy.db.powerBarEnabled and (Gladdy.db.powerBarHeight + 1) or 0
local borderSize = Gladdy.db.highlightBorderSize
local borderOffset = borderSize
- local iconSize = Gladdy.db.healthBarHeight + Gladdy.db.powerBarHeight + 1
+ local hpAndPowerHeight = Gladdy.db.healthBarHeight + powerBarHeight
local width = Gladdy.db.barWidth + (Gladdy.db.highlightInset and 0 or borderSize * 2)
- local height = iconSize + (Gladdy.db.highlightInset and 0 or borderSize * 2)
+ local height = hpAndPowerHeight + (Gladdy.db.highlightInset and 0 or borderSize * 2)
button.targetBorder:SetWidth(width)
button.targetBorder:SetHeight(height)
button.targetBorder:ClearAllPoints()
if Gladdy.db.highlightInset then
button.targetBorder:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", -(borderOffset/Gladdy.db.statusbarBorderOffset), (borderOffset/Gladdy.db.statusbarBorderOffset))
- button.targetBorder:SetPoint("BOTTOMRIGHT", button.powerBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
+ button.targetBorder:SetPoint("BOTTOMRIGHT", Gladdy.db.powerBarEnabled and button.powerBar or button.healthBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
else
button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end
@@ -113,7 +114,7 @@ function Highlight:UpdateFrame(unit)
button.focusBorder:ClearAllPoints()
if Gladdy.db.highlightInset then
button.focusBorder:SetPoint("TOPLEFT", button.healthBar, "TOPLEFT", -(borderOffset/Gladdy.db.statusbarBorderOffset), (borderOffset/Gladdy.db.statusbarBorderOffset))
- button.focusBorder:SetPoint("BOTTOMRIGHT", button.powerBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
+ button.focusBorder:SetPoint("BOTTOMRIGHT", Gladdy.db.powerBarEnabled and button.powerBar or button.healthBar, "BOTTOMRIGHT", (borderOffset/Gladdy.db.statusbarBorderOffset), -(borderOffset/Gladdy.db.statusbarBorderOffset))
else
button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize))
end
@@ -156,7 +157,7 @@ function Highlight:Test(unit)
elseif (unit == "arena2") then
self:Toggle(unit, "target", true)
elseif (unit == "arena3") then
- self:Toggle(unit, "leader", true)
+ --self:Toggle(unit, "leader", true)
end
end
@@ -214,6 +215,7 @@ function Highlight:GetOptions()
min = 1,
max = 20,
step = 1,
+ width = "full",
}),
highlightBorderStyle = Gladdy:option({
type = "select",
diff --git a/Modules/Pets.lua b/Modules/Pets.lua
index 7e04763..7ab729f 100644
--- a/Modules/Pets.lua
+++ b/Modules/Pets.lua
@@ -137,9 +137,9 @@ function Pets:CreateFrame(unitId)
--button:SetAlpha(0)
button:SetPoint("LEFT", Gladdy.buttons[unitId].healthBar, "RIGHT", Gladdy.db.petXOffset, Gladdy.db.petYOffset)
- local secure = CreateFrame("Button", "GladdyButton" .. unit, button, "SecureActionButtonTemplate")
- secure:RegisterForClicks("AnyUp")
+ local secure = CreateFrame("Button", "GladdyButton" .. unit, button, "SecureActionButtonTemplate, SecureHandlerEnterLeaveTemplate")
secure:RegisterForClicks("AnyUp")
+ secure:RegisterForClicks("AnyDown")
secure:SetAttribute("*type1", "target")
secure:SetAttribute("*type2", "focus")
secure:SetAttribute("unit", unit)
@@ -156,7 +156,7 @@ function Pets:CreateFrame(unitId)
healthBar:SetAllPoints(button)
healthBar:SetAlpha(0)
- healthBar.portrait = healthBar:CreateTexture(nil, "OVERLAY")
+ healthBar.portrait = healthBar:CreateTexture(nil, "BACKGROUND")
healthBar.portrait:SetPoint("LEFT", healthBar, "RIGHT")
healthBar.portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9)
SetPortraitTexture(healthBar.portrait, "player")
@@ -368,6 +368,7 @@ function Pets:GetOptions()
min = 10,
max = 100,
step = 1,
+ width = "full",
}),
petWidth = option({
type = "range",
@@ -377,6 +378,7 @@ function Pets:GetOptions()
min = 10,
max = 300,
step = 1,
+ width = "full",
}),
petHealthBarTexture = option({
type = "select",
@@ -458,6 +460,7 @@ function Pets:GetOptions()
order = 13,
min = 0,
max = 20,
+ width = "full",
}),
},
},
@@ -486,6 +489,7 @@ function Pets:GetOptions()
min = 0.5,
max = Gladdy.db.petHeight/2,
step = 0.5,
+ width = "full",
}),
petHealthBarBorderColor = Gladdy:colorOption({
type = "color",
@@ -513,6 +517,7 @@ function Pets:GetOptions()
min = -600,
max = 600,
step = 0.1,
+ width = "full",
}),
petYOffset = Gladdy:option({
type = "range",
@@ -521,6 +526,7 @@ function Pets:GetOptions()
min = -600,
max = 600,
step = 0.1,
+ width = "full",
}),
}
},
diff --git a/Modules/Powerbar.lua b/Modules/Powerbar.lua
index c6c98cf..01b608c 100644
--- a/Modules/Powerbar.lua
+++ b/Modules/Powerbar.lua
@@ -7,6 +7,7 @@ local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local AceGUIWidgetLSMlists = AceGUIWidgetLSMlists
local Powerbar = Gladdy:NewModule("Power Bar", 90, {
+ powerBarEnabled = true,
powerBarFont = "DorisPP",
powerBarHeight = 20,
powerBarTexture = "Smooth",
@@ -113,17 +114,24 @@ function Powerbar:SetPower(powerBar, power, powerMax, powerType)
end
end
- if (powerType == 1) then
+ if (powerType == 1 and powerBar.powerType ~= powerType) then
powerBar.energy:SetStatusBarColor(1, 0, 0, 1)
- elseif (powerType == 3) then
+ powerBar.powerColor = {r = 1, g = 0, b = 0}
+ powerBar.powerType = powerType
+ elseif (powerType == 3 and powerBar.powerType ~= powerType) then
powerBar.energy:SetStatusBarColor(1, 1, 0, 1)
- else
+ powerBar.powerColor = {r = 1, g = 1, b = 0}
+ powerBar.powerType = powerType
+ elseif powerBar.powerType ~= powerType then
powerBar.energy:SetStatusBarColor(.18, .44, .75, 1)
+ powerBar.powerColor = {r = .18, g = .44, b = .75}
+ powerBar.powerType = powerType
end
powerBar.powerText:SetText(powerText)
powerBar.energy:SetMinMaxValues(0, powerMax)
powerBar.energy:SetValue(power)
+
end
function Powerbar:UpdateFrame(unit)
@@ -135,6 +143,12 @@ function Powerbar:UpdateFrame(unit)
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)
@@ -169,6 +183,8 @@ function Powerbar:ResetUnit(unit)
powerBar.raceText:SetText("")
powerBar.powerText:SetText("")
powerBar.energy:SetValue(0)
+ powerBar.powerType = ""
+ powerBar.powerColor = {r = 1, g = 1, b = 1}
end
function Powerbar:Test(unit)
@@ -252,10 +268,13 @@ function Powerbar:UNIT_POWER(unit, power, powerMax, powerType)
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)
@@ -315,11 +334,16 @@ function Powerbar:GetOptions()
name = L["Power Bar"],
order = 2,
},
+ powerBarEnabled = Gladdy:option({
+ type = "toggle",
+ name = L["Enabled"],
+ order = 3,
+ }),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
- order = 3,
+ order = 4,
args = {
general = {
type = "group",
@@ -339,6 +363,7 @@ function Powerbar:GetOptions()
min = 0,
max = 50,
step = 1,
+ width = "full",
}),
powerBarTexture = option({
type = "select",
@@ -390,6 +415,7 @@ function Powerbar:GetOptions()
step = 0.1,
min = 1,
max = 20,
+ width = "full",
}),
},
},
@@ -418,6 +444,7 @@ function Powerbar:GetOptions()
min = 0.5,
max = Gladdy.db.powerBarHeight/2,
step = 0.5,
+ width = "full",
}),
powerBarBorderColor = Gladdy:colorOption({
type = "color",
diff --git a/Modules/Racial.lua b/Modules/Racial.lua
index b5e1f27..7172c88 100644
--- a/Modules/Racial.lua
+++ b/Modules/Racial.lua
@@ -62,12 +62,12 @@ local function iconTimer(self,elapsed)
elseif timeLeft <= 10 and timeLeft >= 5 then
-- between 10s and 5s (orange)
self.cooldownFont:SetTextColor(1, 0.7, 0)
- self.cooldownFont:SetFormattedText("%.1f", timeLeft)
+ self.cooldownFont:SetFormattedText("%.1f", self.timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then
-- between 5s and 1s (red)
self.cooldownFont:SetTextColor(1, 0, 0)
- self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0)
+ self.cooldownFont:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE")
else
self.cooldownFont:SetText("")
@@ -246,6 +246,7 @@ function Racial:GetOptions()
max = 100,
step = 1,
order = 2,
+ width = "full",
}),
racialWidthFactor = Gladdy:option({
type = "range",
@@ -254,6 +255,7 @@ function Racial:GetOptions()
max = 2,
step = 0.05,
order = 3,
+ width = "full",
}),
},
},
@@ -280,6 +282,7 @@ function Racial:GetOptions()
max = 1,
step = 0.1,
order = 8,
+ width = "full",
}),
},
},
@@ -309,6 +312,7 @@ function Racial:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
},
},
@@ -353,6 +357,7 @@ function Racial:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
racialYOffset = Gladdy:option({
type = "range",
@@ -361,6 +366,7 @@ function Racial:GetOptions()
min = -400,
max = 400,
step = 0.1,
+ width = "full",
}),
},
},
diff --git a/Modules/RangeCheck.lua b/Modules/RangeCheck.lua
new file mode 100644
index 0000000..8a0b26b
--- /dev/null
+++ b/Modules/RangeCheck.lua
@@ -0,0 +1,415 @@
+local UnitIsConnected = UnitIsConnected
+local UnitInPhase = UnitInPhase
+local UnitInRaid = UnitInRaid
+local UnitInParty = UnitInParty
+local UnitInRange = UnitInRange
+local CheckInteractDistance = CheckInteractDistance
+local C_Timer = C_Timer
+local UnitIsUnit = UnitIsUnit
+local UnitClass = UnitClass
+local GetSpellInfo = GetSpellInfo
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
+local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
+local select, ipairs, type, tonumber, tostring, format = select, ipairs, type, tonumber, tostring, format
+
+local LibStub = LibStub
+local Gladdy = LibStub("Gladdy")
+local LSR = LibStub("SpellRange-1.0")
+local L = Gladdy.L
+
+local classSpells = {
+ ["MAGE"] = 118,
+ ["PRIEST"] = 32379,
+ ["DRUID"] = 33786,
+ ["SHAMAN"] = 10414,
+ ["PALADIN"] = 10308,
+ ["WARLOCK"] = 5782,
+ ["WARRIOR"] = 20252,
+ ["HUNTER"] = 27018,
+ ["ROGUE"] = 36554,
+}
+
+local function defaultSpells()
+ local defaults = {}
+ for _,class in ipairs(Gladdy.CLASSES) do
+ defaults[class] = { min = classSpells[class] }
+ end
+ return defaults
+end
+
+local RangeCheck = Gladdy:NewModule("Range Check", nil, {
+ rangeCheckEnabled = true,
+ rangeCheckDefaultSpells = defaultSpells(),
+ rangeCheckOorFactor = 1.5,
+ rangeCheckHealthBar = true,
+ rangeCheckHealthBarText = true,
+ rangeCheckPowerBar = true,
+ rangeCheckPowerBarText = true,
+ rangeCheckClassIcon = false,
+ rangeCheckTrinket = false,
+ rangeCheckRacial = false,
+})
+
+function RangeCheck:Initialize()
+ self:RegisterMessage("JOINED_ARENA")
+ self:RegisterMessage("ENEMY_STEALTH")
+ self:RegisterMessage("ENEMY_SPOTTED")
+ self.playerClass = select(2, UnitClass("player"))
+end
+
+function RangeCheck:Reset()
+ self.test = nil
+end
+
+function RangeCheck:ResetUnit(unit)
+ local button = Gladdy.buttons[unit]
+ self:CancelTimer(button)
+ self:SetColor(button, 1)
+ button.classColors = {}
+end
+
+function RangeCheck:Test(unit)
+ local button = Gladdy.buttons[unit]
+ if not button then
+ return
+ end
+ self:ENEMY_SPOTTED(unit)
+ self.test = true
+ button.lastState = 0
+ if Gladdy.db.rangeCheckEnabled then
+ if unit == "arena1" then
+ --button.unit = "target"
+ --self:CreateTimer(button)
+ self:SetRangeAlpha(button, nil)
+ else
+ self:SetRangeAlpha(button, true)
+ end
+ else
+ self:SetRangeAlpha(button, true)
+ end
+end
+
+function RangeCheck:UpdateFrame(unit)
+ if self.test then
+ self:Test(unit)
+ end
+end
+
+function RangeCheck:SetColor(button, oorFac)
+ if button.lastState == oorFac then
+ return
+ end
+
+ if not button.classColors.r then
+ if button.class then
+ button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
+ else
+ button.classColors = { r = 0.66, g = 0.66, b = 0.66 }
+ end
+ end
+
+ if Gladdy.db.rangeCheckHealthBar then
+ button.healthBar.hp:SetStatusBarColor(button.classColors.r/oorFac, button.classColors.g/oorFac, button.classColors.b/oorFac, 1)
+ else
+ button.healthBar.hp:SetStatusBarColor(button.classColors.r, button.classColors.g, button.classColors.b, 1)
+ end
+
+ if Gladdy.db.rangeCheckHealthBarText then
+ button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
+ button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r/oorFac, Gladdy.db.healthBarFontColor.g/oorFac, Gladdy.db.healthBarFontColor.b/oorFac, Gladdy.db.healthBarFontColor.a)
+ else
+ button.healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
+ button.healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a)
+ end
+
+ if Gladdy.db.rangeCheckPowerBar then
+ button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r/oorFac, button.powerBar.powerColor.g/oorFac, button.powerBar.powerColor.b/oorFac, 1)
+ else
+ button.powerBar.energy:SetStatusBarColor(button.powerBar.powerColor.r, button.powerBar.powerColor.g, button.powerBar.powerColor.b, 1)
+ end
+
+ if Gladdy.db.rangeCheckPowerBarText then
+ button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
+ button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r/oorFac, Gladdy.db.powerBarFontColor.g/oorFac, Gladdy.db.powerBarFontColor.b/oorFac, Gladdy.db.powerBarFontColor.a)
+ else
+ button.powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
+ button.powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a)
+ end
+
+ if Gladdy.db.rangeCheckTrinket then
+ button.trinket.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
+ else
+ button.trinket.texture:SetVertexColor(1, 1, 1)
+ end
+ if Gladdy.db.rangeCheckClassIcon then
+ button.classIcon.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
+ button.aura.icon:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
+ else
+ button.classIcon.texture:SetVertexColor(1, 1, 1)
+ button.aura.icon:SetVertexColor(1, 1, 1)
+ end
+ if Gladdy.db.rangeCheckRacial then
+ button.racial.texture:SetVertexColor(1/oorFac, 1/oorFac, 1/oorFac)
+ else
+ button.racial.texture:SetVertexColor(1, 1, 1)
+ end
+ button.lastState = oorFac
+end
+
+function RangeCheck:SetRangeAlpha(button, inRange)
+ local oorFac = Gladdy.db.rangeCheckOorFactor
+ if inRange then
+ RangeCheck:SetColor(button, 1)
+ else
+ RangeCheck:SetColor(button, oorFac)
+ end
+end
+
+function RangeCheck:JOINED_ARENA()
+ self.test = nil
+ if Gladdy.db.rangeCheckEnabled then
+ for i = 1, Gladdy.curBracket do
+ local button = Gladdy.buttons["arena"..i]
+ --if i == 1 then button.unit = "focus" end
+ self:CreateTimer(button)
+ end
+ end
+end
+
+function RangeCheck: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 }
+ 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 }
+ end
+ end
+end
+
+function RangeCheck:ENEMY_SPOTTED(unit)
+ local button = Gladdy.buttons[unit]
+ if (not button) then
+ return
+ end
+ button.classColors = { r = RAID_CLASS_COLORS[button.class].r, g = RAID_CLASS_COLORS[button.class].g, b = RAID_CLASS_COLORS[button.class].b }
+end
+
+function RangeCheck.CheckRange(self)
+ local button = self.parent
+
+ local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min
+
+ if( not UnitIsConnected(button.unit) or not UnitInPhase(button.unit) ) then
+ RangeCheck:SetRangeAlpha(button, false)
+ elseif( spell ) then
+ RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1)
+ -- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally
+ elseif( UnitInRaid(button.unit) or UnitInParty(button.unit) ) then
+ RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player"))
+ -- Nope, fall back to interaction :(
+ else
+ RangeCheck:SetRangeAlpha(button, CheckInteractDistance(button.unit, 4))
+ end
+end
+
+function RangeCheck:CreateTimer(frame)
+ if not frame.range then
+ frame.range = C_Timer.NewTicker(0.05, RangeCheck.CheckRange)
+ frame.range.parent = frame
+ end
+end
+
+function RangeCheck:CancelTimer(frame)
+ if frame.range then
+ frame.range:Cancel()
+ frame.range = nil
+ end
+end
+
+function RangeCheck:ForceUpdate(frame)
+ if( UnitIsUnit(frame.unit, "player") ) then
+ frame.healthBar:SetAlpha(1)
+ frame.powerBar:SetAlpha(1)
+ self:CancelTimer(frame)
+ else
+ self:CreateTimer(frame)
+ self.CheckRange(frame.parent)
+ end
+end
+
+function RangeCheck:GetOptions()
+ return {
+ header = {
+ type = "header",
+ name = L["Range Check"],
+ order = 2,
+ },
+
+ rangeCheckEnabled = Gladdy:option({
+ type = "toggle",
+ name = L["Enabled"],
+ desc = L["Enable racial icon"],
+ order = 3,
+ }),
+ group = {
+ type = "group",
+ childGroups = "tree",
+ name = L["General"],
+ order = 5,
+ args = {
+ general = {
+ type = "group",
+ name = L["General"],
+ order = 1,
+ args = {
+ header = {
+ type = "header",
+ name = L["General"],
+ order = 1,
+ },
+ rangeCheckOorFactor = Gladdy:option({
+ type = "range",
+ name = L["Out of Range Darkening Level"],
+ desc = L["Higher is darker"],
+ min = 1.1,
+ max = 5,
+ step = 0.1,
+ width = "full",
+ order = 2,
+ }),
+ rangeCheckHealthBar = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Health Bar"],
+ width = "full",
+ order = 3,
+ }),
+ rangeCheckHealthBarText = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Health Bar Text"],
+ width = "full",
+ order = 4,
+ }),
+ rangeCheckPowerBar = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Power Bar"],
+ width = "full",
+ order = 5,
+ }),
+ rangeCheckPowerBarText = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Power Bar Text"],
+ width = "full",
+ order = 6,
+ }),
+ rangeCheckClassIcon = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Class Icon"],
+ width = "full",
+ order = 7,
+ }),
+ rangeCheckTrinket = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Trinket"],
+ width = "full",
+ order = 8,
+ }),
+ rangeCheckRacial = Gladdy:option({
+ type = "toggle",
+ name = L["Fade"] .. " " .. L["Racial"],
+ width = "full",
+ order = 9,
+ }),
+ },
+ },
+ },
+ },
+ oorSpells = {
+ type = "group",
+ childGroups = "tree",
+ name = L["Spells"],
+ order = 5,
+ args = RangeCheck:GetSpells(),
+ },
+ }
+end
+
+function RangeCheck:GetSpells()
+ local group = {
+ description = {
+ type = "description",
+ 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,
+ },
+ }
+ for i,class in ipairs(Gladdy.CLASSES) do
+ group[class] = {
+ type = "group",
+ name = LOCALIZED_CLASS_NAMES_MALE[class],
+ order = i + 1,
+ icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes",
+ iconCoords = CLASS_ICON_TCOORDS[class],
+ args = {
+ headerMin = {
+ type = "header",
+ name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %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",
+ order = 1,
+ },
+ min = {
+ type = "input",
+ name = "Spell ID", --format("|T%s:20|t %s", select(3, GetSpellInfo(k)), select(1, GetSpellInfo(k)))
+ order = 2,
+ width = "full",
+ pattern = "%d+",
+ validate = function(_, value)
+ LibStub("AceConfigRegistry-3.0"):NotifyChange("Gladdy")
+ return type(tonumber(value)) == "number"
+ end,
+ --image = select(3, GetSpellInfo(defaultSpells()[class].min)),
+ get = function(_)
+ return tostring(Gladdy.db.rangeCheckDefaultSpells[class].min)
+ end,
+ set = function(_, value)
+ Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value)
+ --Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.min.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)))
+ -- or "nil"
+ Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %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"
+ end
+ },
+ --[[headerMax = {
+ type = "header",
+ name = L["Max"],
+ order = 3,
+ },
+ max = {
+ type = "input",
+ name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
+ or "nil",
+ order = 4,
+ width = "full",
+ pattern = "%d+",
+ validate = function(_, value)
+ return type(tonumber(value)) == "number"
+ end,
+ --image = select(3, GetSpellInfo(defaultSpells()[class].max)),
+ get = function(_)
+ return tostring(Gladdy.db.rangeCheckDefaultSpells[class].max)
+ end,
+ set = function(_, value)
+ Gladdy.db.rangeCheckDefaultSpells[class].max = tonumber(value)
+ Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.max.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].max)))
+ or "nil"
+ end
+ }--]]
+ }
+ }
+ end
+ return group
+end
\ No newline at end of file
diff --git a/Modules/ShadowsightTimer.lua b/Modules/ShadowsightTimer.lua
new file mode 100644
index 0000000..8d95511
--- /dev/null
+++ b/Modules/ShadowsightTimer.lua
@@ -0,0 +1,169 @@
+local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs
+local CreateFrame = CreateFrame
+
+local Gladdy = LibStub("Gladdy")
+local L = Gladdy.L
+local ShadowsightTimer = Gladdy:NewModule("Shadowsight Timer", nil, {
+ shadowsightTimerEnabled = true,
+ shadowsightTimerScale = 1,
+ shadowsightTimerRelPoint1 = "CENTER",
+ shadowsightTimerRelPoint2 = "CENTER",
+ shadowsightTimerX = 0,
+ shadowsightTimerY = 0,
+ shadowsightAnnounce = true,
+})
+
+function ShadowsightTimer:OnEvent(event, ...)
+ self[event](self, ...)
+end
+
+function ShadowsightTimer:Initialize()
+ self.locale = Gladdy:GetArenaTimer()
+ self:RegisterMessage("JOINED_ARENA")
+ self:CreateTimerFrame()
+end
+
+function ShadowsightTimer:JOINED_ARENA()
+ self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
+ self:SetScript("OnEvent", ShadowsightTimer.OnEvent)
+ self.timerFrame.font:SetText("1:30")
+ self.timerFrame.font:SetTextColor(1, 0.8, 0)
+ self.timerFrame:Show()
+end
+
+function ShadowsightTimer:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
+ for k,v in pairs(self.locale) do
+ if str_find(msg, v) then
+ if k == 0 then
+ self:Start()
+ end
+ end
+ end
+end
+
+function ShadowsightTimer:Test()
+ if Gladdy.db.shadowsightTimerEnabled then
+ self.timerFrame:Show()
+ self:Start()
+ end
+end
+
+function ShadowsightTimer:Reset()
+ self.timerFrame:Hide()
+ self.timerFrame:SetScript("OnUpdate", nil)
+ self.timerFrame.font:SetTextColor(1, 0.8, 0)
+end
+
+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}
+ }
+
+ self.timerFrame:SetBackdrop(backdrop)
+ self.timerFrame:SetBackdropColor(0,0,0,0.8)
+ self.timerFrame:SetHeight(17)
+ self.timerFrame:SetWidth(35)
+
+ self.timerFrame:SetMovable(true)
+ self.timerFrame:EnableMouse(true)
+
+ 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:UpdateFrame()
+ 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 = 92
+ self.timerFrame.timeSinceLastUpdate = 0
+ self.timerFrame:SetScript("OnUpdate", ShadowsightTimer.OnUpdate)
+end
+
+function ShadowsightTimer.OnUpdate(self, elapsed)
+ self.timeSinceLastUpdate = self.timeSinceLastUpdate + elapsed;
+ self.endTime = self.endTime - elapsed
+
+ if (self.timeSinceLastUpdate > 0.1) then
+ self.font:SetFormattedText(floor(self.endTime / 60) .. ":" .. "%02d", self.endTime - floor(self.endTime / 60) * 60)
+ self.timeSinceLastUpdate = 0;
+ if floor(self.endTime) == 15 and Gladdy.db.shadowsightAnnounce then
+ Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up in %ds"]:format(15))
+ end
+ end
+ if self.endTime <= 0 then
+ if Gladdy.db.shadowsightAnnounce then
+ Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up!"])
+ end
+ self:SetScript("OnUpdate", nil)
+ self.font:SetText("0:00")
+ self.font:SetTextColor(0, 1, 0)
+ end
+end
+
+function ShadowsightTimer:GetOptions()
+ return {
+ headerArenaCountdown = {
+ type = "header",
+ name = L["Shadowsight Timer"],
+ order = 2,
+ },
+ shadowsightTimerEnabled = Gladdy:option({
+ type = "toggle",
+ name = L["Enabled"],
+ --desc = L["Turns countdown before the start of an arena match on/off."],
+ order = 3,
+ width = "full",
+ }),
+ shadowsightAnnounce = Gladdy:option({
+ type = "toggle",
+ name = L["Announce"],
+ --desc = L["Turns countdown before the start of an arena match on/off."],
+ order = 4,
+ width = "full",
+ }),
+ shadowsightTimerScale = Gladdy:option({
+ type = "range",
+ name = L["Scale"],
+ order = 5,
+ min = 0.1,
+ max = 5,
+ step = 0.1,
+ width = "full",
+ }),
+ }
+end
\ No newline at end of file
diff --git a/Modules/TotemPlates.lua b/Modules/TotemPlates.lua
index 95c9358..90ad86a 100644
--- a/Modules/TotemPlates.lua
+++ b/Modules/TotemPlates.lua
@@ -236,12 +236,26 @@ function TotemPlates:Initialize()
--GetCVar("nameplateShowFriendlyTotems")
--SetCVar("nameplateShowFriendlyTotems", true);
end
-
- --NeatPlates
- --ELVUI
- --Plater
- --KUI
- --threatplates
+ self.addon = "Blizzard"
+ if (IsAddOnLoaded("Plater")) then
+ self.addon = "Plater"
+ elseif (IsAddOnLoaded("Kui_Nameplates")) then
+ self.addon = "Kui_Nameplates"
+ elseif (IsAddOnLoaded("NeatPlates")) then
+ self.addon = "NeatPlates"
+ elseif (IsAddOnLoaded("TidyPlates_ThreatPlates")) then
+ self.addon = "TidyPlates_ThreatPlates"
+ elseif (IsAddOnLoaded("Tukui")) then
+ local _, C, _ = Tukui:unpack()
+ if C.NamePlates.Enable then
+ self.addon = "Tukui"
+ end
+ elseif (IsAddOnLoaded("ElvUI")) then
+ local E = unpack(ElvUI)
+ if E.private.nameplates.enable then
+ self.addon = "ElvUI"
+ end
+ end
end
function TotemPlates:PLAYER_ENTERING_WORLD()
@@ -268,8 +282,7 @@ function TotemPlates:UpdateFrameOnce()
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 "")
self:SetTotemAlpha(nameplate.gladdyTotemFrame, k)
- nameplate.UnitFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
- nameplate.UnitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
+ self:ToggleAddon(nameplate)
end
for i,gladdyTotemFrame in ipairs(self.totemPlateCache) do
gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
@@ -282,6 +295,44 @@ end
---------------------------------------------------
+-- TotemPlates Frame
+
+---------------------------------------------------
+
+function TotemPlates:CreateTotemFrame(nameplate)
+ nameplate.gladdyTotemFrame = CreateFrame("Frame")
+ nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true)
+ nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
+ nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
+ nameplate.gladdyTotemFrame.totemIcon = nameplate.gladdyTotemFrame:CreateTexture(nil, "BACKGROUND")
+ nameplate.gladdyTotemFrame.totemIcon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
+ nameplate.gladdyTotemFrame.totemIcon:ClearAllPoints()
+ nameplate.gladdyTotemFrame.totemIcon:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
+ nameplate.gladdyTotemFrame.totemIcon:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
+ nameplate.gladdyTotemFrame.totemBorder = nameplate.gladdyTotemFrame:CreateTexture(nil, "BORDER")
+ nameplate.gladdyTotemFrame.totemBorder:ClearAllPoints()
+ nameplate.gladdyTotemFrame.totemBorder:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
+ nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
+ nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
+ nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY")
+ nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.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.selectionHighlight = nameplate.gladdyTotemFrame:CreateTexture(nil, "OVERLAY")
+ nameplate.gladdyTotemFrame.selectionHighlight:SetTexture("Interface/TargetingFrame/UI-TargetingFrame-BarFill")
+ nameplate.gladdyTotemFrame.selectionHighlight:SetAlpha(0)
+ nameplate.gladdyTotemFrame.selectionHighlight:SetBlendMode("ADD")
+ nameplate.gladdyTotemFrame.selectionHighlight:SetIgnoreParentAlpha(true)
+ nameplate.gladdyTotemFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
+ nameplate.gladdyTotemFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
+ nameplate.gladdyTotemFrame:SetScript('OnUpdate', TotemPlates.OnUpdate)
+ nameplate.gladdyTotemFrame:SetScript("OnHide", function(self)
+ self.parent = nil
+ self:SetParent(nil)
+ end)
+end
+
+---------------------------------------------------
+
-- Nameplate functions
---------------------------------------------------
@@ -292,6 +343,36 @@ function TotemPlates:PLAYER_TARGET_CHANGED()
end
end
+function TotemPlates:ToggleAddon(nameplate)
+ if self.addon == "Blizzard" then
+ nameplate.UnitFrame:Hide()
+ elseif self.addon == "Plater" then
+ nameplate.unitFrame:Hide()
+ elseif self.addon == "Kui_Nameplates" then
+ nameplate.kui:Hide()
+ elseif self.addon == "NeatPlates" then
+ nameplate.extended:Hide()
+ nameplate.carrier:Hide()
+ elseif self.addon == "TidyPlates_ThreatPlates" then
+ nameplate.TPFrame:Hide()
+ elseif self.addon == "Tukui" or self.addon == "ElvUI" then
+ if nameplate.unitFrame then
+ nameplate.unitFrame:Hide()
+ end
+ end
+end
+
+function TotemPlates.OnUpdate(self)
+ if (UnitIsUnit("mouseover", self.unitID) or UnitIsUnit("target", self.unitID)) then
+ self.selectionHighlight:SetAlpha(.25)
+ else
+ self.selectionHighlight:SetAlpha(0)
+ end
+ if (TotemPlates.addon == "Tukui" or TotemPlates.addon == "ElvUI") and self.parent and self.parent.unitFrame then
+ self.parent.unitFrame:Hide()
+ end
+end
+
function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
local unitID = ...
local isEnemy = UnitIsEnemy("player", unitID)
@@ -309,28 +390,12 @@ function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitID)
local totemDataEntry = localizedTotemData["default"][totemName] or localizedTotemData["frFR"][totemName] or localizedTotemData["ruRU"][totemName]
if totemDataEntry and Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].enabled then-- modify this nameplates
-
if #self.totemPlateCache > 0 then
nameplate.gladdyTotemFrame = tremove(self.totemPlateCache, #self.totemPlateCache)
else
- nameplate.gladdyTotemFrame = CreateFrame("Frame", nil)
- nameplate.gladdyTotemFrame:SetIgnoreParentAlpha(true)
- nameplate.gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor)
- nameplate.gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize)
- nameplate.gladdyTotemFrame.totemIcon = nameplate.gladdyTotemFrame:CreateTexture(nil, "BACKGROUND")
- nameplate.gladdyTotemFrame.totemIcon:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask")
- nameplate.gladdyTotemFrame.totemIcon:ClearAllPoints()
- nameplate.gladdyTotemFrame.totemIcon:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
- nameplate.gladdyTotemFrame.totemIcon:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
- nameplate.gladdyTotemFrame.totemBorder = nameplate.gladdyTotemFrame:CreateTexture(nil, "BORDER")
- nameplate.gladdyTotemFrame.totemBorder:ClearAllPoints()
- nameplate.gladdyTotemFrame.totemBorder:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT")
- nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT")
- nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle)
- nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY")
- nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE")
- nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset)
+ self:CreateTotemFrame(nameplate)
end
+ nameplate.gladdyTotemFrame.unitID = unitID
nameplate.gladdyTotemFrame.totemDataEntry = totemDataEntry
nameplate.gladdyTotemFrame.parent = nameplate
nameplate.gladdyTotemFrame:SetParent(nameplate)
@@ -342,20 +407,10 @@ function TotemPlates:NAME_PLATE_UNIT_ADDED(...)
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b,
Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a)
nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "")
+ nameplate.gladdyTotemFrame.parent = nameplate
nameplate.gladdyTotemFrame:Show()
TotemPlates:SetTotemAlpha(nameplate.gladdyTotemFrame, unitID)
-
- nameplate.UnitFrame:SetAlpha(0)
- nameplate.UnitFrame.selectionHighlight:ClearAllPoints()
- nameplate.UnitFrame.selectionHighlight:SetPoint("TOPLEFT", nameplate.gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
- nameplate.UnitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
- nameplate.UnitFrame:SetScript("OnHide", function(unitFrame)
- unitFrame:SetAlpha(1)
- unitFrame.selectionHighlight:ClearAllPoints()
- unitFrame.selectionHighlight:SetPoint("TOPLEFT", unitFrame.healthBar.barTexture, "TOPLEFT")
- unitFrame.selectionHighlight:SetPoint("BOTTOMRIGHT", unitFrame.healthBar.barTexture, "BOTTOMRIGHT")
- unitFrame:SetScript("OnHide", nil)
- end)
+ self:ToggleAddon(nameplate)
self.activeTotemNameplates[unitID] = nameplate
end
end
diff --git a/Modules/Trinket.lua b/Modules/Trinket.lua
index 2158e37..b0078a8 100644
--- a/Modules/Trinket.lua
+++ b/Modules/Trinket.lua
@@ -56,12 +56,12 @@ local function iconTimer(self, elapsed)
elseif timeLeft <= 10 and timeLeft >= 5 then
-- between 10s and 5s (orange)
self.cooldownFont:SetTextColor(1, 0.7, 0)
- self.cooldownFont:SetFormattedText("%.1f", timeLeft)
+ self.cooldownFont:SetFormattedText("%.1f", self.timeLeft)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
elseif timeLeft < 5 and timeLeft > 0 then
-- between 5s and 1s (red)
self.cooldownFont:SetTextColor(1, 0, 0)
- self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0)
+ self.cooldownFont:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0)
self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE")
else
self.cooldownFont:SetText("")
@@ -249,6 +249,7 @@ function Trinket:GetOptions()
max = 100,
step = 1,
order = 4,
+ width = "full",
}),
trinketWidthFactor = Gladdy:option({
type = "range",
@@ -257,6 +258,7 @@ function Trinket:GetOptions()
max = 2,
step = 0.05,
order = 6,
+ width = "full",
}),
},
},
@@ -283,6 +285,7 @@ function Trinket:GetOptions()
max = 1,
step = 0.1,
order = 8,
+ width = "full",
}),
},
},
@@ -312,6 +315,7 @@ function Trinket:GetOptions()
min = 0.1,
max = 2,
step = 0.1,
+ width = "full",
}),
},
},
diff --git a/Modules/VersionCheck.lua b/Modules/VersionCheck.lua
index 991fecc..45bd3da 100644
--- a/Modules/VersionCheck.lua
+++ b/Modules/VersionCheck.lua
@@ -1,6 +1,8 @@
local str_match, tonumber, tostring = string.match, tonumber, tostring
local UnitName = UnitName
+local IsInGroup, IsInRaid = IsInGroup, IsInRaid
+local LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
@@ -21,6 +23,13 @@ end
function VersionCheck:JOINED_ARENA()
self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived)
+ if IsInRaid(LE_PARTY_CATEGORY_HOME) then
+ self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", self.playerName)
+ elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) or IsInRaid(LE_PARTY_CATEGORY_INSTANCE) then
+ self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "INSTANCE_CHAT", self.playerName)
+ elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then
+ self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "PARTY", self.playerName)
+ end
end
function VersionCheck:Test(unit)
@@ -39,7 +48,7 @@ function VersionCheck.OnCommReceived(prefix, message, distribution, sender)
else
Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"")
Gladdy:Warn("Please download the latest Gladdy version at:")
- Gladdy:Warn("https://github.com/XiconQoo/Gladdy-TBC")
+ Gladdy:Warn("https://www.curseforge.com/wow/addons/gladdy-tbc or https://github.com/XiconQoo/Gladdy-TBC")
end
end
end
diff --git a/Modules/XiconProfiles.lua b/Modules/XiconProfiles.lua
index 9f30f99..0d79261 100644
--- a/Modules/XiconProfiles.lua
+++ b/Modules/XiconProfiles.lua
@@ -34,6 +34,16 @@ function XiconProfiles:ApplyClassic()
Gladdy:ToggleFrame(3)
end
+function XiconProfiles:ApplyClassicNoPet()
+ local deserialized = Gladdy.modules["Export Import"]:Decode(Gladdy:GetClassicProfileNoPet())
+ if deserialized then
+ Gladdy.modules["Export Import"]:ApplyImport(deserialized, Gladdy.db)
+ end
+ Gladdy:Reset()
+ Gladdy:HideFrame()
+ Gladdy:ToggleFrame(3)
+end
+
function XiconProfiles:ApplyBlizz()
local deserialized = Gladdy.modules["Export Import"]:Decode(Gladdy:GetBlizzardProfile())
if deserialized then
@@ -84,10 +94,29 @@ function XiconProfiles:GetOptions()
width = "full",
order = 5,
},
+ headerProfileClassicNoPet = {
+ type = "header",
+ name = "Classic " .. L["Profile"] .. " No Pet",
+ order = 6,
+ },
+ classicProfileNoPet = {
+ type = "execute",
+ func = function()
+ Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile())
+ XiconProfiles:ApplyClassicNoPet()
+ end,
+ name = " ",
+ desc = "Classic " .. L["Profile"] .. " No Pet",
+ image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Classic2.blp",
+ imageWidth = 350,
+ imageHeight = 175,
+ width = "full",
+ order = 7,
+ },
headerProfileKnall = {
type = "header",
name = "Knall's " .. L["Profile"],
- order = 6,
+ order = 8,
},
knallProfile = {
type = "execute",
@@ -101,12 +130,12 @@ function XiconProfiles:GetOptions()
imageWidth = 350,
imageHeight = 175,
width = "full",
- order = 7,
+ order = 9,
},
headerProfileKlimp = {
type = "header",
name = "Klimp's " .. L["Profile"],
- order = 8,
+ order = 10,
},
klimpProfiles = {
type = "execute",
@@ -120,7 +149,7 @@ function XiconProfiles:GetOptions()
name = " ",
desc = "Klimp's " .. L["Profile"],
width = "full",
- order = 9,
+ order = 11,
},
}
diff --git a/Options.lua b/Options.lua
index 56453ca..b0e4ade 100644
--- a/Options.lua
+++ b/Options.lua
@@ -13,6 +13,7 @@ local L = Gladdy.L
Gladdy.defaults = {
profile = {
locked = false,
+ hideBlizzard = "arena",
x = 0,
y = 0,
growUp = false,
@@ -97,6 +98,11 @@ local function setOpt(info, value)
local key = info.arg or info[#info]
Gladdy.dbi.profile[key] = value
Gladdy:UpdateFrame()
+ if Gladdy.db.hideBlizzard == "always" then
+ SetCVar("showArenaEnemyFrames", 0)
+ elseif Gladdy.db.hideBlizzard == "never" then
+ SetCVar("showArenaEnemyFrames", 1)
+ end
end
local function getColorOpt(info)
local key = info.arg or info[#info]
@@ -205,10 +211,20 @@ function Gladdy:SetupOptions()
["RIGHT"] = L["Right"],
}
},
+ hideBlizzard = {
+ type = "select",
+ name = L["Hide Blizzard"],
+ values = {
+ ["arena"] = L["Arena only"],
+ ["never"] = L["Never"],
+ ["always"] = L["Always"],
+ },
+ order = 4,
+ },
group = {
type = "group",
name = L["General"],
- order = 4,
+ order = 5,
childGroups = "tree",
args = {
frameGeneral = {
diff --git a/README.md b/README.md
index 64991eb..b531725 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# Gladdy - TBC
### The most powerful arena addon for WoW TBC 2.5.1
-## [v1.12-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.12-Beta/Gladdy_TBC-Classic_v1.12-Beta.zip)
+## [v1.13-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.13-Beta/Gladdy_TBC-Classic_v1.13-Beta.zip)
###### Please consider donating if you like my work
@@ -26,6 +26,8 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca
- Highlight (highlights focus and target)
- Pets (show arena pets)
- Racial Spells
+- Range Check
+- Shadowsight Timer
- TotemPlates (show totem icons instead of normal nameplates)
- Trinket (tracks trinket usage)
- VersionCheck (checks if you use an older version that your teammate)
@@ -37,8 +39,37 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca
+## Special Thanks
+
+- **Schaka** - the original author of Gladdy! (thanks for letting me continue Gladdy and all the work you put into the TBC community)
+- **Macumba** (thanks for all the support, your feedback and your dedication for the TBC community)
+- **RMO** (without you I would not have modified Gladdy at all and thanks for all the suggestions and active feedback)
+- **Ur0b0r0s aka DrainTheLock** (thanks for testing, giving feedback and correcting/adding wrong CDs)
+- **Klimp** (thanks for all the suggestions and active feedback)
+- **the whole TBC addons 2.4.3 discord** (thanks for the support and great community, especially the MVPs)
+- **Hydra** (thanks for constructive feedback and suggestions)
+
### Changes
+### v1.13-Beta
+- frames behave now to mouseover macros
+- added Range Check module (configurable which spell is used for range check)
+- added Shadowsight Timer module (with announce)
+- added Clicks module
+- added Interrupt Tracker in Aura module (border color by spell school locked)
+- TotemPlates compatible with Plater, NeatPlates, KUI, ThreatPlates, ElvUI, TukUI
+- added a new Classic Profile in XiconProfiles
+- hide blizzard arena frames option added in General
+- castbar enable/disable
+- powerbar enable/disable
+- added some auras (Blackout, Improved Hamstring, Mace Stun, Stormherald Stun, Shadowsight Buff)
+- added Swiftmend and Berserker Rage cooldowns
+- changed textures for Mace Stun, Charge Stun and Intercept Stun
+- reduced BLP size by 80%
+- show XiconProfiles on first login
+- DR bigger icons possible
+- minor fixes
+
### v1.12-Beta
- fix classic profile
diff --git a/embeds.xml b/embeds.xml
index 2413afb..6c9b9f6 100644
--- a/embeds.xml
+++ b/embeds.xml
@@ -14,4 +14,5 @@
+
\ No newline at end of file