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 @@ + +