diff --git a/Constants.lua b/Constants.lua index b6ad45c..88657e6 100644 --- a/Constants.lua +++ b/Constants.lua @@ -1,3 +1,5 @@ +local tbl_sort, select = table.sort, select + local GetSpellInfo = GetSpellInfo local Gladdy = LibStub("Gladdy") @@ -155,7 +157,7 @@ function Gladdy:GetImportantAuras() priority = 40, spellID = 33786, }, - -- Hibername + -- Hibernate [GetSpellInfo(18658)] = { track = AURA_TYPE_DEBUFF, duration = 10, @@ -581,6 +583,14 @@ function Gladdy:GetImportantAuras() 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)] = { @@ -607,4 +617,283 @@ function Gladdy:GetImportantAuras() 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, + }, + }, + }, + + -- 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 + [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 + --[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 + }, + } +end + +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 diff --git a/EventListener.lua b/EventListener.lua index b16a00f..2b09a64 100644 --- a/EventListener.lua +++ b/EventListener.lua @@ -1,4 +1,4 @@ -local select, string_gsub = select, string.gsub +local select, string_gsub, tostring = select, string.gsub, tostring local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local RAID_CLASS_COLORS = RAID_CLASS_COLORS @@ -34,7 +34,7 @@ function EventListener:JOINED_ARENA() self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") self:SetScript("OnEvent", EventListener.OnEvent) - Gladdy:SendCommMessage("GladdyVCheck", Gladdy.version, "RAID", UnitName("player")) + Gladdy:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", UnitName("player")) end function EventListener:Reset() @@ -106,17 +106,24 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED() 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 (Cooldowns.cooldownSpells[Gladdy.buttons[srcUnit].class][spellId]) then - unitClass = Gladdy.buttons[srcUnit].class - else - unitClass = Gladdy.buttons[srcUnit].race + 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 + + if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then + Gladdy:SendMessage("RACIAL_USED", srcUnit) end if not Gladdy.buttons[srcUnit].class then diff --git a/Frame.lua b/Frame.lua index bd1cb9a..561c68f 100644 --- a/Frame.lua +++ b/Frame.lua @@ -284,4 +284,18 @@ function Gladdy:CreateButton(i) for k, v in self:IterModules() do self:Call(v, "CreateFrame", button.unit) end +end + +function Gladdy:GetAnchor(unit, position) + local anchor = "healthBar" + if Gladdy.db.classIconPos == position then + anchor = "classIcon" + end + if Gladdy.db.trinketPos == position then + anchor = "trinket" + end + if anchor == Gladdy.db.racialAnchor and Gladdy.db.racialPos == position then + anchor = "racial" + end + return Gladdy.buttons[unit][anchor] end \ No newline at end of file diff --git a/Gladdy.lua b/Gladdy.lua index a7976dd..cbc593a 100644 --- a/Gladdy.lua +++ b/Gladdy.lua @@ -11,6 +11,9 @@ local IsAddOnLoaded = IsAddOnLoaded local IsInInstance = IsInInstance local GetBattlefieldStatus = GetBattlefieldStatus local IsActiveBattlefieldArena = IsActiveBattlefieldArena +local RELEASE_TYPES = { alpha = "Alpha", beta = "Beta", release = "Release"} +local PREFIX = "TBC-Classic_v" +local VERSION_REGEX = PREFIX .. "(%d+%.%d+)%-(%a)" --------------------------- @@ -21,9 +24,12 @@ local IsActiveBattlefieldArena = IsActiveBattlefieldArena local MAJOR, MINOR = "Gladdy", 4 local Gladdy = LibStub:NewLibrary(MAJOR, MINOR) local L -Gladdy.version_major = "TBC-Classic_v1" -Gladdy.version_minor = "0.4-Beta" -Gladdy.version = Gladdy.version_major .. "." .. Gladdy.version_minor +Gladdy.version_major_num = 1 +Gladdy.version_minor_num = 0.05 +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 +Gladdy.VERSION_REGEX = VERSION_REGEX LibStub("AceTimer-3.0"):Embed(Gladdy) LibStub("AceComm-3.0"):Embed(Gladdy) @@ -160,6 +166,25 @@ end --------------------------- +function Gladdy:DeleteUnknownOptions(tbl, refTbl, str) + if str == nil then + str = "Gladdy.db" + end + for k,v in pairs(tbl) do + if refTbl[k] == nil then + --Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "not found!") + tbl[k] = nil + else + if type(v) ~= type(refTbl[k]) then + --Gladdy:Print("SavedVariable deleted:", str .. "." .. k, "type error!", "Expected", type(refTbl[k]), "but found", type(v)) + tbl[k] = nil + elseif type(v) == "table" then + Gladdy:DeleteUnknownOptions(v, refTbl[k], str .. "." .. k) + end + end + end +end + function Gladdy:OnInitialize() self.dbi = LibStub("AceDB-3.0"):New("GladdyXZ", self.defaults) self.dbi.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged") @@ -201,10 +226,12 @@ function Gladdy:OnInitialize() for k, v in self:IterModules() do self:Call(v, "Initialize") -- B.E > A.E :D end + self:DeleteUnknownOptions(self.db, self.defaults.profile) end function Gladdy:OnProfileChanged() self.db = self.dbi.profile + self:DeleteUnknownOptions(self.db, self.defaults.profile) self:HideFrame() self:ToggleFrame(3) diff --git a/Gladdy.toc b/Gladdy.toc index 83e3044..2e09d39 100644 --- a/Gladdy.toc +++ b/Gladdy.toc @@ -1,6 +1,6 @@ ## Interface: 20501 ## Title: Gladdy - TBC -## Version: 1.0.4-Beta +## Version: 1.0.5-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 @@ -14,6 +14,7 @@ Lang.lua Frame.lua Options.lua Constants.lua +ImportStrings.lua Modules\Announcements.lua Modules\Healthbar.lua @@ -25,6 +26,7 @@ Modules\Diminishings.lua Modules\Highlight.lua Modules\TotemPlates.lua Modules\Trinket.lua +Modules\Racial.lua Modules\Cooldowns.lua Modules\ArenaCountDown.lua Modules\BuffsDebuffs.lua diff --git a/ImportStrings.lua b/ImportStrings.lua new file mode 100644 index 0000000..6c5ef8f --- /dev/null +++ b/ImportStrings.lua @@ -0,0 +1,13 @@ +local Gladdy = LibStub("Gladdy") + +function Gladdy:GetKlimpProfile() + return "4XzRBL1CBBKe(xKvn3hpAzhz7QIL1gQu7Uv5IoqKqICnjGwaW1r5H8BF7z6EWbVaKLEiMqaZ0tp910FDpzoF(TZND3U7VV(YW)8PfLf3KTC56IhMFnN(s4LZw)x5ZVwO6p43U5XvzZVsRykj3R1cNsP9M53)gTC(Sfz1nxMvDzz1Y8Q3vUPSkSuzizNFnB(ShI)Bv4FBMpBjmOYnll)rbs32LFVxZUWnFwXJ3wLVTS6QYIM)9xGbL3ej2YQ3VUo7Un5VBD1In5ZVRJpEOppWUqDCUGg9hZx)WkGKIWNYwSoBZVuei7Y5xoF2J5nFmpBtZQEd0WImvzt(2B2K1KJcN3U5hzpvFBw1d5nWCVJ2rZwv(J3URk795X)m8ECrUPSE(SF7tF4J3g2k)Z1lBwDv2IgGTVMFbitxLw2BZ)ZMDv5ZN951fR3MTzDDucgehWwa24bP3ss4pR5j4nZ(urtE19zlY)6BxU8lf1F9dBan9tF9tBZEiV(R4y)2h2uwdmXkyBTjU12BdFknjVtgUQt4eEiYurZhURV5tsV(HQYF8(1v5lAwxw0U9rI85S)miD6RUNp79LvRRV5gGfcYW913aZ2Ar8gPDFRBYqwMEFN55N2UDxr(WT2fEpAHCbte3G8Egji3Cv16)6V)J)XUSLvznz)9FCBYH6F1ZU8XYFKxDtE1I8IgqAheQDSv7atw8dv8bfz7qEJ9qg)QYQTN23cCxcS8MS64()a)XR0AWV1i1oMZ5H)J8FpQ3bPYsc4RScM2Q9kM06fwqyD)BuEuX8ty7vvURyz(YVD3MhhiKjRhrqsC0iu92ub)QXeg9MZZI)Q)V7YQs8xuL2lcGnzZounNgw3(aCcYkkGT6I8TW4QdCBt16IVN38B5zlFkyex)y(IWSZlY3gFbnGFVgdbHRu4dlZdU(pMv18eSfZR3vrEs1HXTmmT6UzC7kyiRaLym0wdXEbVmyi)V8QAyIFBB2)PS6Bf72IE1Xit755boz3uw1uLTU5NqooqpFFv228UGwDlx37I6R(H53xPx3l6CB0NbmgYhG3jyb3S(X)(pI8WWqBtAci)TVh6(lAurR37iHxQK6Um8ibyf9SJX6t4u2bmeYMQUJUINm9lrBUlB9aVD928ymMmy()6VCv8SPEc8Uaz7lva7JfFpFz6yoyIoMMfMdNz92WdcHx7JVXjeXxinEv4bR0zc)k16WpARjotHxjJJp9RsO5Hh8mzCGCPaoNjqGi9CCIUCUlobiqv8fAUmom67CFA9slOqH)nlTqEEKXemlYjmo(GuHeYjXbcjcfNPX6CifKkCaaVIBAnotopoqUrZJ7bHZIKcyo874F61S4FlfetAKitjvSO0Z5frcWTwAtyvXLYLwBTW4P9jZqRnUnugfYmATf5cT3hhRItmmqoCD1U4hmoIwgB87wgjdb1z8bji2XTSWehHNXWTUIlrovGlQijU1YKufxkbJzIp4DOuMZ5wCkoCtRf4VCTYf)IZOS0ly4dEfhPQdLKbQJYdGVWh8ECpWTolojjzBAqHUWiT0ErGVWBJtvNuFGXmoqd(GfNiSuOmxXIlo8vCLmKjih2iTgZrsA4sYIWPJlQozPiK4I704matiuvyrDbPXWVcs74SLggoBlN8nsczboqldfcC89wl9d6YOTKbbZtcnRNm1v0dCtCesgh3JcWIXtK0q2zC0ywOKezq)eHvGgXKdpeBGMGGCRu(4dHCtWLxqea5pqTJ6bRJm)iVhAEWOjhwUlU9nOnOLtcfPj(DjNmRbNeCLKss2ImKLtMkeD4cvRaj631eJgtbNHObTN6)CJlhpQUjIxaNA4VdztDi2O(H)BHdmBBzjWdP0f2pG8(NBoGN49YJN3NNchkaz5MxSCt8CbihOcGH2v0e4ikHAq3LoWiKnY3p4aIUvfszppRo)ycKaSSyEAME5z3LoFBA7jXreW0TF5MUdRogWi8053UOzx2MiKqA2bMRxAMtqKSScs0VQ5mQ0lShGtiDODaJyAP3pnwAOFyxEDDEVe2G3DnKFuVSGndv9tKX7JGIieRDvJsr8K9e)bPegyXAiz2FDnGk66KKVNETdXEpceh0EzlgF3ba1iBukjeFhE1jSD23K6D7Q2ZGIpiT)O50MYq2irLEcn0r25NGhUsdHVmkiZl40DjhHjPclYP(s1P(sd6sFA4Jjw5ar2YQR3TzZ5dN0jFoUPb7CMg9XS23BEcQK)C(vWHSALxZfW5pojeCgqdkPGHDEF7R7Uz1t1RHC9hd1wtaPZLDsNjU9URSPPC7NHyQRlcHq4ZpsniI2bx(LBV9lFU)NBJ8GMNFmBZ9tyftk3GLDhiM(r1pD0d3qYe4IPCgcFqDxMymHyyee8kKEqYFSFnOAX73)LPT3eKelptnsiZRynz(PHeHB5qeYGLXga(C(iN5Y7oZ9UjufQuzW6JRJ3kREPi6AttyVItArgouYVhOFRWFBokKvme6fDkXH4NhmJPvh0b2shxbgz(qUb)gSNBpNV3khTM77T2(E8mSEhL03yaZNGnyVC(4KjDyeIjKsgMPClgtjG5bHXWnP0vD0ysyjAXqesfghScXKLsc0qGEeIe2grczOxtihAHqWWmpLkkb8qWFk3xAisN0sZob8mGpm8qc5jKsnMilKKn9GxtW(uewt4nyoV2eyeNfZe3XuTSjHagZQvc5rJ5f75uk6spBiqtUf)IuOjWTaAmmPAJEiMaPnbPxyBttNwzfMOUe2SOChW1GciLeLUWwJwPu2(aEBkDBfLUTW4O8ZnChLHpNe0Ie6nzsrc47jOjCemQukqeVopwbGwKLk48zezMkHF1qMossiAiC2gncxeW4r4OJGucUJPS4osDP(C2dRxCS0scEarpAbwwvkx6aHhcDyKQrDylhiIt(ohcB4unPORjeh2bfIiTjhi2pBPNveWbvrTF4HJ7KN12OKjhyVn9UUClXuqFQiB76fifUSnQZrOiOxo484EXO(jlFE)ZN6K3)eIWbhIGub3QYJ0xJBkxxdhPDSSnmD82YtK1WbNPpOVEtQyP9RCBqB(RaOS3NFF2UnnHLYeQ6WTHAD31HTQ1a2HMNIfNSjwxm5PhdK8sZCQssNNoOF9iJjwLUZVw4bjJrhJES1cdfFQXiOXeQ7155hms(jhdYpXy7JWZXtbhzTSbJ8tngjshJ36hBmXJEhrVB8UXOJGbyogtolL(tRtj(ju60repYrTcJNXmgd7pTohxOyLTo)qukM60QQKioCs8iUnHuvg1YXE6LczN4bLJi9eoXys4y16hrxQmNztH(mq6fJABH5RC(DUqlSJPiWkEos8IyYnJ5xfYBDSykHkkpIcnwB2rgtmNZZVwHILoIvAip1rwOyPUhrak9ItlC04sfkX7y(4H08oV(e7JXi7B5OHTX8gpVjyiLYZpcSlqNFLITnzK9ntCMqoj3QZyQtCtmP4Xm)KJSsn9BfAFKMxzysfa6cqpWymqvDM0KWSgom1vkN2bvGSn3cZHWbFg3pP2g22ljVE1gC1(x3NqpthuUY6dbZo4oBmOGb)KPp2RP7PvlCFxi8chTY3Ty0NrxOaIpoih)6MSMD13LKhjwpDBt6ucRE2TCgvNdQSiPG2V9e9Zh(WcWAywTsPemzOrpkDxbypXxQo1xqzzN(reuN7xu9OjXvAUia6Mb2UEBaolEbxAryC4v15DaWQhaFI8y1iQ3KN)4E(m3xwTipm5GGFD43R5sdZhLwlAQ2u3SRykZbmMJveQQy5KNIZGlZQm8sdn2emHOQWe(E9ugnKWrSwT1lYAaGmtBoCDCxSeGPe6YuZuMeOyXkmUysJMRIhhDFEw1ugF4YcefSLLtIBaFyhPiEgtjI9Vk)XWLfQyr(KMLhNfGp(HYI67QYZAwnLjQiH8USPmADOQkb5vvE(FLdrCMKjS2jJ(wR3(i8MjPyAnhFAXMYIjjcm8iV10ZJD4nUQTCf9cG3)wyD8Ymq1fbdMh4JMWFkT4b9lgpmxwVQV0ThAicXHZ9SVkuYXTNIqx4tLTqlNk5KmlM20RaJH54(YjKtQFviKr5FDieNPFLOKwIG)EXeYjeVo2tccR5XSN0jZjQAL6XjNuAmYxfgZXpjJ98iKoClLEniea0J96eoWXvNsiDrQeX(UAUncXcNf(AWvAQkBVyc5G0Mo12dcd2Jwx4nJto48i)RdFXTVsBqU71rKlHeMoLO65rjSjrNYMYmWOkOfCJtsWW61XXXrLN8ftiilMxkhbF6P5x5mXAl6KoMwXvXRQGAE6gREz6(QkHJhXBJyOSkHhayKHF40Dxt4WBWNrs3wuPZJxhvt6g9LU(OwCMcQluh2qrHHOTK66NZqx3nS)vwCIyVRS0DqKOoJ6xLhV)GcLhVbGA6gzQXgNPLyBiJaAIt0XPB3OYIKYAORGQc7pzBJrXUhYvylYaUwL4ASHGWeXlFikX0c86AkLwCgXIqeOq46WG8e29XuBcXXdNhPh2YrLH4qswl5ux50cSlGaccd1OrQvFbPDQ)IuldT0DIeGcGIDPnDtfvI0nvK6yimB6oiJxSvH1H3HX2ogYDyxpvAq7L2(y)IPRujjg5iTn4LxTzVgWDi8XU2wbAsid4f7o5f2RVjpEHog26qKkdt(DcxlKiG)dUFAus1iQylN5msqpAKHlwSm49e6uwe)(BlwScwJuPgMV))VN8Z3PR9HO37kM1tqfe3puv(JF)ra2qZ85))Vz1LDS" +end + +function Gladdy:GetClassicProfile() + return "4XzRB12CBBJe(x05H4DGpg3uNKzAs9v5oxVzYOuAjABErI0hj1L6(H(B)wGDbjeLOOCQYhmPiawS7I91hYSKT8ULlw3CDDZ6IMFOEtDJ)b5l)eB5I7d)9XWFB8)TdE2UhEO9dRQRwu(Nfl)exqp6A)FEZMNFcx6Q82URZNKSzbYMfiBMNSRHjvVzD93QiAKDLLO8XgO657Ak2w3CtDv3)(NHjv0fi36M3w2MF)MIFOSz1MIL3VCXZ1FRO5nR62LVz51lx01uw91IUdMwt(QY8n)yL)PR9t85IU3xKVP7jqmEFr5Jpb7GolS11DfBVDtExbkWVzZ3YFP9U8Mhl6G1EpX3lEQ(BVzxt(Blc)CytUTUD5IF5dV79bn))QCD3t3KVQRoOIx8uCtVR4p621uSCXhlRk3MVPSnON8ImOEbUgufUHZUfDVapBXhQ6kAEiFvXNFZ61)Cv7NF3M81RF5ZFyB(JfTFgN7xA)V7YBkw)L738mSJGWTjiG3psLh40F6hV5Ue2cvkbUiybW4PwaXv(UM6V92YMIvDL1v7tJpM)hE9B6r4YfVTUPS92BbteVg7GZWIHt5)HEptUbtrMl(8bJUpSD7UQI9n9UY5qRVRY4d21KblYn30u(N)1V)p3LVUjVl)V(97UBF7HJE0em0UTOzvrvhOR98nzR06L3aRn(WEDZV1lxSdz)BQB2oTFd4i4z8n5TbTWe(A3OvANtzyzcPYYeQLp8pucpDMAKMPgXVB05B)XbldpZ(7AeMO)hSRw34fSBH1wwHHHgRH8oyZPHswZ3p)foDtcfW0dhVEp9FSQy7lH4g0e7LKBugPntyLwzMZLzYaLPembZRQQ3vTQylyV06Lbk00VuKV(fV1t7ZfR8xlcK(((j8RTyek0DYpW6IGbyEt3lGGx0URH88cwER9lRDyf39emLNGZri8Di4BGLj3Y)xrtlSWVSn))u38LQDBXO)HaxJCvt9ioW47gqM1go3kDwTYWTKXfyqQ4CJjZyZ4gftlKdgKtmsZuJaCZdn5BlO4H7XOdplC(pe)aK5dmJAtc8)0(YezYGwiqOaWbOR85)63jRdGdQxTJOLF5ihmzuDIObtC5OSjFh2OnGj06On695y2eFSWS4EMer66r7hXfz9EF0Q5Av)JURCBriouExmm(6MeT1qK4XIChOj(AX6y6pyH2mvMFnSmJZ4VHZDkx4jwop8aH2j93yewT)QqP8xugDyLCNueMF8QKRy(BCzIWezcoZgiqGEwgrxgZgwGXHpqXeHPrJZCX9lUHCj(7S4g5ybgJ7DGdxz4ncjsiRaNOIJusBSwKccjobGxrHwHRKXctKPvSGmWTgKuaZHJJ)0PYc)wWjMeS)XhabucsPJhiaZyiHWidBLnU3kU2rYzMM2BumKAjYmkiCF4jkNlmxjJyyGC4(QSHb0wIwAtyCtgPdHJZWncqTJIS3s6A)Ptgk6sMa5uoUP8O6wjIAvCR4zz6WnolQLzmMbxIffAfhVYusByeRwAOhKH34KmKQwut6PoQpa(cVX5qzGzSgCrcY2uJkDUwyizHJpWzclvfp(aJzCIA8gdUqyRqDUmlS5WO4oPjtqgii9gZbsQzcYIWQcBQkAPWf4MBv4kati8OWGNf0jgokOTdRwOZWvByKVrujZXjAYqLadFUXqxqxgLHmiYCKsZ4itDjDdthMHiJHYihSyCej1KDgdnM5sbrg0pHB4Orm5WdXgOfWj3kPlCJwOIEQebq(do2XZbJLm)iVhADWSjhwMni(A0g0WiLIqhgxWiZAWjb3jHG0TidzyKPcrhgx2Rqc(DDHuHXiVGoVVgGZU9NqiY9kfetJmQ3hgwR1Hpnww2EnhOJfqHX5bpppFEBDdezUS77izZEfeLw8duVCr16nH6FGzubC4UQopdrDjcNTXekdjIbJ(fpc9j8Rpt143xBLlk)P92ftiDSAVXuDuxE3pOp8musLLNr)TRBGY(B6oXP2vMKUgs07hVTH4mgxilvl3KfTlH0iAWJuiScJ2Ku0(XhPzQr663RZO3MdkwOVfnQO8HZHKEdJYiucPxmBbQ8tLvEtoYYoPEHHg9tiqysJQUCtTV6HKdWRFmT8sdpZxuqMV0AitRZlSsu1bz00GtpK7ZPe8Sev3XhPzQrguDuLsMdRC8h210wCetQyhi6KMl7DWHm9dATPmbuqetTeQKdovfmRLKWhNCKMPgPlT(Z90IAPvbvUaXXG)bjHt0IxYUg9bTM3f5yT933GXz6(2fqHzOA8ut4FljyYllVX6Sqkdi1RuL50oV7cKXyXFaJKXD(CBwOGQqnvWiIyiPVJ4M7xK(idOBF6L2siK9CDX257X76PXFkaEtDxx92pc6GYkSW(drMzSB3173DKKh07jESjrpI9uDLyS57RsFSxEKa4bapCo5kz7zkFMMe9aKmUbfqmhs5c1wNGUrkeDKZBcMNzrC4oU9mANmeYaz4pb9PgIMr7r)wh7q90qNfXOlT)r2qLgtJi1H(8cOnmHhjcluQmx27ZJqR(iDDWY7W(8XTxFOX8Ppj2JqP8eStYJxy0Eh2hxDVpwGhaw0GDBuYLgleBu7IrU2lv8RYqEph7u7Kxdr2ZByDZ7Z38WuEbP6YeyMELQ(ttDerOOwmBWGD)QoHunqRXqVPq)UqeuNMuMRhkWZoUq4zHs5WyBuDS0r0Hf(MuqBsil0d8G8jeIexhXJa6hcRXN7BPj0mHItL4JnPyXo0GgUPgRToeUbDSJTi8agCLChIZattDjZ5uZWqlNiTXMTGE80u7myh5gCHyBtgQhtI6zy7va3GSl0Id2Fi1XTcHAqjWwIeqvrulMmQ7vPbjLrtqmincChSuBVypqsTG4AzKRXMaHfInxIAmfhBhxafAIDMYO2V81EG8e2(exI9RHZNdfCyjzcrGqQjoK01cMgzvfh7iNZuAoUxCc8cqBJWiOzOKdkrQNFj2akxyIDIk5XorrLLawnHXecCbhceg2rjOVPoCrGQKGXDV4hUrtTmtQrgsBncor3HbebBWI8rfig7JqMwI46MpTBZMZi9hfMXJ27xpdh)(SFu(i7O3n3S(K0SNGZUXivq7)kRs4H)ry7RgCpU1ZahHcxjhPkc1QUPihymQgU7hQE0lbJq19ax8dQUQUSfYIEm1VEzYBF84HrpiQlUPVuLVTCfo9R3VMZP7A0EGs5D7kABlcaZtX3sl7ik1NlxDMZnV)nsEAgojzWyD6hZFSC1XA5jQsVINiLJa8oXG44VDrecariXdbIGxdL2P9ziMHepEOj(fi9RF9TD5D7AVpYpXCuMrV870wv7PXc)lI569nmpd924eNHCoCdHJypi4qsue7AiYxepnlnNiyN9GC6XQdNSebnoIs1b5By8i01qlz4A7X4mdHgdYQLrORAjGrf0u8iiqRoImoJsjeHgNLzDuQmgDJtr4sljWWHNqXNJOLAnuUSmzpBsq0JPGemohbUZXimefUS9rcNzWreCLC)Sj95RIGwc5bO35a30JJymjVHYRyruPHdasldv2etWq7ueosi3kHhOKWdKRTeaI9zJKmsrZJWllIhKghNsDethfZQzPsh6H(UpDKwgbyxtMocsjsPkfAfMsJR1eq)buuJoVd1l90KVWo0k(gJXK58PtLzqMCTBa1HjgPzQr6I1HL23D0NyCVyP9wFe0WeoHas0OeGKYmPGrC8rAMAK0mIjXFgJ0WWRGMIxfJl579Rxh6BPB8lS(hGsxFSUPSi4T3UPO4z)nfdHvEOUzvHF)95Rk9x)etObnxG56A202TR6Cwdu0DqGAQwF2lXQXT5PC8llyUfO9gNWc(A75mBW1k0Xy7Q8oO1NZBnm8yznKO2dJC35SiDMbrRD1znBOQq)SFOiV5CMV)TfguS11Nf3OSslDq8kwsijztXZE8wRwvCwRYHRc6(9X6Q27BkY7E6CwOKuY7YpNzR8rT86RMII)Sa6A6SmHvwrWPVC7ZWtoRdMEZXxwTPU6SubAwG3ssV(BP(XjDfFC0cOwmXK9(nSZ)tizN1)JvNS(7aVMN0w6aZ2reIPG86xek5bFCccDfKadl4Ik1(mih0Ql4jFzymiu1fHqwOUNlbH0s3LHqSm1fIsk)B78sqilNFzSN4(3x6e2tQO5ev)UAEYbzvHSpxcgZYMKXEDes5)EeUeeIR8fCEjOK1Jp0ek9yttUKMZonX8j9UeCLYiUqEWkOONjepimycTUYPNNCqIh3LHV8FBoxgczVmQCbuz0uQQxhLWUTMYMsVNrL)uWopjbdRlJJJ13T0LGqq5k)D5OUL7bvwsF9Eiq(PY2U3w8q(UnHY18V1C)1KQpEUPeQhT7LW7rRZJfm51C05WcHmXVNPtthS5TzMt4Bf707fIwWC0rRMBVW(TNAoCAoEaopn)GTRp5Cq(j0a)m8CaQJz2ltMDA5sG0r7mU5MtaFLzo31o7C0HNPKZrhHq4M(mL4h)lBEg1JywRWaqcZXWUPpZXnsr1lCIPiLzYPpQIQypClZ424XJAwlhZ0BfYob0qMr7XT850WHVz0zolL6tiuOpdK5FwBleuQtl5Cf3m3bb(D3nt8IacwZ5x5bNCUyk(VRXzoqdFHGZmNaWINEV8FYEZyL6bJCMnk8bxoJcu44tRCu4wzSZrgelVtFEIFnTZi3IzdBJGdEAtqpUHNEg43I8P3PWhV7mYDg)eHCIUvNWuN4MaYNZz(jMzN6g9EKp87sp8Uwg)4KpJ)Z4TWn6fBhF7geTh)9Xp(dticDb()pedlZQfEKtf(puB)hHL)10HqI(MQvpbmtKYlh))3Nx1NAWEFVcJX88K)p7y2xt4WxHr6NXA3YL)))SydmWc" +end + +function Gladdy:GetKnallProfile() + return "4XzRA12CBJJd(xuZW3j1hBA302z2(YTo7CBNPJ7QyRe7R2s5KKVUz)W(B)ajaLPKJIuA9xIvKabbabbEaixYxE9YfRRVSQEDr9RQ2vv7Fr(YpWxU4MWFVl83A)FBxUyvv1U1vFVC2d4Md3EBZL()8YD3VbPBvEt7L5JoPSapybEW88ynqeoTipUYizAMmtzDsUZKPxE7l0sGV7YBAE3QQYpv1SCXV(lxbCT8(RRl2xvFvvz7N)iigfTbEVU(1BBYVzxXR2wVAxXYBwU4(QVxu)YvThY3T8YoP8TfBVBdmgHbeO8vBZ39lL(XT2tZ9fTVTiFx7MecnSWSw1wS)t7YBlqf)L7(E(dnxNxFxrlm2BilZInvF)LhQZFDr4F9VhNKGk8BV7nV9AsW8u(B5Rk8t7M4CEDXF1EOUy5If7RQA3KiqFQOEvrzB(DHbexHx0(aORlExzBr9TaZ(YlxV(JLnF5n7YxV(HV8U9a9nFbP9RVzxvdieBa1Axq1UKe64QrqgV(JFkrGWj3BSxS9VlGvurQlqCGVPU67VEBDXQ2TvLDQjYK3N)xERq662YfVUQEBZNGjk3BRozHR44s7l0CKQFDBt7RlUn)WUwV3LXAz(Flsw8Q3cST9HLFqfCZeoRCCA4ApnCHuRNGpCMK5MIgNsmoFW5sYng(K8XONAUKCHqnkncIgo3oH8iYabACAq5jd2yoLmRvUjNllZnUEjr(yYSztrJWXgNgAD3K5MIpcMwnfFKsz24RPK8yTJBcjZJCsVqxMBCJCuGZgFnhNiyzyksukMA8LQOjwKjMABdtn(u155yhFQqXXzut6CjCIPSWoqKNATuzEcLc3ZWvYj9T4mHDC)yuZfAHDQfcbeUy85IIxOuzt55iScXKMqhO8tTG6uzpHEH0KjDtTuyytfnvluprqhnfiyYfuHmtmUXrJtL1nfBKsbBQyGsPDA9wozyBLwjhNg0f0OMYjvi0tM4lJn5QGKjEIqoXTvpHRojnm2tKcj6(jNyMAJykocG8D73FOSWpSJWiVildrsEbtKGGfH1naxrkqUtavHiYqanG43bcoaZzvoacbMdhju)7TRbaq5RARcZia96psGDouUVQQEFFPof8lW02eyTZgWCuatb86Xe9dacSU6q56I1F9MD33Z2DeE366aKBySBlbXqCQs6b4oLsMmMNL818FpKxhLVaqzsaNrTjek9ai8FPSy)dbFTeEGkjSYMxwc2Hvf7bi1nEM2wVT8BfT)wr(6h8qqBUVyL)3IaBUPJGFVb9GrST(pSUObM6Bxb)PUO5qnHcUXt1A)GAos)1Bas2aRLX9pbHZJqgi5)vu3ad8R7Z)pv1FT8WEu3c(Qd9UjDkwIchi82689fDEVzPJKElNwvoITwAoDXTzKYHMTZ6TvRoqm0Zdum6TlkiEB6ZyAP5c9GIT(bCH65IVzy1t3CQkdfGuK3u8yQ1fkYP2K4GHsgkXqaS42Of3Nx)Tz4MsKF929fH4f5TXIBxxNy8pwM1WqqTGn9BfRJ1ycd0b1p7hdNzZS(hamCa(c)BCqQu)lKgaaj8G1Neh(1x3ZL(CKMWifzaump9XFbakC)dzmzGqUuWDbge4xaZLFCCi(E41z4l0CzGm67iOb)8fNqF(F))ZItugpiycMfLeghFqQqg5ZF4)vlqozSohYbPcjWx71LXCJ(3WdeYnAEqhGkbrwbch(D8Fdf345KGesJefkPIfSEUmrGbby(bLWQctLlo3AOAdspzgAUr1qzuOWO1wuk0zzbAvCsGrKfWdAx4dghXlJn8DlJSHWYz4bjy2rvwycues1hMnUeLuboPIO5wlJwvCQWu2(H6qRCOsXWqCOsRf4VyDDxgGPBPxWWhYuCKRo0s65oApa5cFild1baeHfhKK8nnOrxyKwsxe4lYSHHQJlFGZmsObFWIdeXZcpOyHjh(kotgYfKdksNZCGLgUK8iC6WKQJEkcjo5onocWfcxkS4AbTIHFfS2HrlnmC0woT3iAKfiHwgAe447Tw6hClduye6qWYiJMnJC1v0dCtGcjJJ6iwVaYsd5NXrNzHssSb3NaLeGoX0gEi2anabTTYxwXLeM1W0ligGYxOoYlj4Z(xNr7EOXbutBy5UG6BqFqlNmkst47so5wdBsWzckOoqpUzcSEKRcXhUq1zqc77I4i6biH7ZreZao7Ssb(0HC7fW(fIj9tn4rv1V5KEg(WYRCWUgdtPbDhICbk4TVaScrybNMEdsD(PQAis922F2uyPWAUQEBr56DbKnaoPsqypu26LwmDKqB6sWeZZF1lGapAfevLjZG0agHx4buq3vx99F)EQJBD9fL1t4tsifZBneonMILA06nhrRMmMzcGBD9)cq)1(elOxypjpAW2dVcuRUPUVdJNXdZHEm7AkC(oqjFaatLalMr4s6AHz89DsrslQJcbGRZlhnGh2VUTKipmVjg1J9cpHdbIgG5BxLpNFyDh8rh8XETXL8BpwctYMKxDOEaqhEpS7ME75qTeY)NyUgAAPDaN0ex69NwL1J1U3ouMZ0rPn039JGmtxAsxpjKsxgXjbXPXypcFO2qqoTGc9GbpDyMdaiaLW3LHWGmXmjrylwCKIme)d3qzVfckjnKke5nMeaY9yOWSisbloqmCULY9rCNHH9bPbfxi0lM3IqcOriqAjgQgcjrXQDCkRQYISYAiOpkReNbhLogJnRmssQvrPgtobdet6HwmTaHjaywWreApGNdzmbkmiadWuI5rq6fkhLMbaEemekdjHKTwYnOOQfisbbxBe4CjiqvG1gH3y4OM7JMrSbtmkK2ygsLiMHenwsy0e2xeqLW6WCNypz806qa0kaKzN6hEWqPYjZih5TbbnbUI)fKBW34AJgsRPYaNaJp8QSBhWZlfvc1FAZdnBHs3MQu7wFfOx2fjQx7jQABR2)Ey3Y2sF9E92j3lWZLF86R)47t)CAZgsRWjj4vmsKFt(XImt3CoEGC3XDZHwzat5CSuHbS5zgUGe)3COOPPiupoeZPZoLK34ZhpcmAmhdd6pWW1d7Z0W1S3NF32vpw81lm0sM4Oc4tYew4OzVtI4dIOp481WKeDNJxAb08bUD)4Oo6qyDxQboKao0mojPxssVKH(zCsdd6A5cjw9oh0uQtNMRGsauaClOEjUudq0Pde(X210ZxyWjl(4UhSh9mTp2OKXoo6oYMblbvlzFYWEDGlk4AW)8NxdRYTBV)F(ZG9p2XKppSlJNM3mMfM1zD73TN1Dqadqp6JzEcH40t8MCIPz6uqY9HieHJgvNtK(11VnF3TZWuUkIWnjgxyg(HDTt737CeGy)ApILbxqEOmF)2vihokBpchHn9Ne0lrtMrUHDf5GAqaEUzWv8OpEYhTl2PPvQ22arrESyYMLj3rJ5ADsV8ht4ufn8rNNaMm8iS85wJnVsYZWEoHNyU)bMJOj2KIUMt4RXgjwHn7jwD5j4XG6FJ94stTKOR3emSKwa1hJ6kIJAOHKir6KwA0XoAXjitXwAb1QNrq940dzAQFskQjwWBi8lXUC4SewpMQtmPwRHq0WZ73)IWb2heQmw)oyXT4xKcTQpARo8CXMna4KOEfkSD1)hbbBjCxoSBsWcazLvsEeagntX2iaypP64vuD8cJJk8VdTgu9j1KPyBHKXfsBMGGwfHRfr95iO1DTSQdUMrfBmMHCDKKrKGsknAeYNakBhNNq3pA7V7pjFr)Bc1Zk4cDXAg7scD8sa9dW7EbUY7Uzrpnuj(Yto6Ob34kTc2laEpaCxfaG2eVXv92mhtDNeQkPi1ndVOuGbpjt3aydQhpUgAxonzcLLjjWwtBE7HMBIcxmXM9yETtV8uX7z1c)P5CzVSKPvwNeBDgw0q80Js6MN9bKG6Ckm94I0WMuK61mdghx9MNPFyz3PNa4hoSB3mWH3Lz80(FTU(vW2G7aBCrikFZUII79pKCmW3wvVQWpC)oKT(F)axcO(qLPTExt7HY5mgWboa)SUC9ShIZGtZMC8eBNAagFqjyaFRzoudHud1M1SkVf2MpVXW1bTynKF23MV25midZIToB1SOgQw2t9Tf51ZHE)P7emSWgQ5qV2PC0cXZyiHsIQlU33g2YvfZAuz4OwxNFxvzZn1f5Wo(zmqfzKpKphQ1(SvE7vDrXFx0wNplxyTtQ8JA7(7H3mRfMo3XhwTRQCwMadpiBjX4)JKOZPh79i3lIzeRJsPHOm9K26)xaiu4IHSA6qs5jvoCuHAjgX1aMVZcNCC7ym6ISi6BTCUStYS41c6miy4D46NNroP(SWiJk78WiotFM4KwIxUXFAg5eIZJ)KGUlLpM)Ko6oHm7c90Stkng5zrWC8rfSNhJ0(Zy(CWiHoJDEch44QXmsxWjJE2r0htWmFIXZHuPPBr(pnJCAUym1dcdMWRlYmtZoi5u25rU42ZKcYDNhtUeqpnMP65XjSs8X8Pm9CQ8RcUPzj4yDE244ORF)pnJain)Sse8PBoEuQo2GQzp9sqMC8GME35Rzu2WGgrg4Io5MFf7qFuCySJyCO50ZTqXrVSC1gy(IL2TC4TR8hVy7H1hnckQz14RH9GRN9HNG6Ihwlw())l6WhMj" +end \ No newline at end of file diff --git a/Modules/Auras.lua b/Modules/Auras.lua index 8d0ab5c..3db15de 100644 --- a/Modules/Auras.lua +++ b/Modules/Auras.lua @@ -1,4 +1,4 @@ -local pairs, ipairs, select, tinsert, tbl_sort = pairs, ipairs, select, tinsert, table.sort +local pairs, ipairs, select, tinsert, tbl_sort, tostring = pairs, ipairs, select, tinsert, table.sort, tostring local GetSpellInfo = GetSpellInfo local CreateFrame, GetTime = CreateFrame, GetTime @@ -10,9 +10,9 @@ local function defaultSpells(auraType) local spells = {} for k,v in pairs(Gladdy:GetImportantAuras()) do if not auraType or auraType == v.track then - spells[k] = {} - spells[k].enabled = true - spells[k].priority = v.priority + spells[tostring(v.spellID)] = {} + spells[tostring(v.spellID)].enabled = true + spells[tostring(v.spellID)].priority = v.priority end end return spells @@ -74,7 +74,7 @@ function Auras:CreateFrame(unit) Auras:AURA_FADE(unit) else self.timeLeft = self.timeLeft - elapsed - self.text:SetFormattedText("%.1f", self.timeLeft) + self.text:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0) end end end) @@ -136,16 +136,13 @@ function Auras:Test(unit) if (unit == "arena1") then aura, _, icon = GetSpellInfo(12826) - elseif (unit == "arena4") then + self:AURA_GAIN(unit,nil, 12826, aura, icon, self.auras[aura].duration, GetTime() + self.auras[aura].duration) + elseif (unit == "arena2") then aura, _, icon = GetSpellInfo(6770) + self:AURA_GAIN(unit,nil, 6770, aura, icon, self.auras[aura].duration, GetTime() + self.auras[aura].duration) elseif (unit == "arena3") then aura, _, icon = GetSpellInfo(31224) - end - - if (aura) then - --(unit, auraType, spellID, aura, icon, duration, expirationTime, count, debuffType) - self:AURA_GAIN(unit,nil, nil, aura, icon, self.auras[aura].duration, GetTime() + self.auras[aura].duration) - --self:AURA_FADE(unit) + self:AURA_GAIN(unit,nil, 31224, aura, icon, self.auras[aura].duration, GetTime() + self.auras[aura].duration) end end @@ -157,22 +154,26 @@ function Auras:JOINED_ARENA() end function Auras:AURA_GAIN(unit, auraType, spellID, aura, icon, duration, expirationTime, count, debuffType) - if not Gladdy.db.auraListDefault[aura] or not Gladdy.db.auraListDefault[aura].enabled then - return - end local auraFrame = self.frames[unit] if (not auraFrame) then return end + if not self.auras[aura] then + return + end + -- don't use spellId from combatlog, in case of different spellrank + if not Gladdy.db.auraListDefault[tostring(self.auras[aura].spellID)] or not Gladdy.db.auraListDefault[tostring(self.auras[aura].spellID)].enabled then + return + end - if (auraFrame.priority and auraFrame.priority > Gladdy.db.auraListDefault[aura].priority) then + if (auraFrame.priority and auraFrame.priority > Gladdy.db.auraListDefault[tostring(self.auras[aura].spellID)].priority) then return end auraFrame.startTime = expirationTime - duration auraFrame.endTime = expirationTime auraFrame.name = aura auraFrame.timeLeft = expirationTime - GetTime() - auraFrame.priority = Gladdy.db.auraListDefault[aura].priority + auraFrame.priority = Gladdy.db.auraListDefault[tostring(self.auras[aura].spellID)].priority auraFrame.icon:SetTexture(icon) auraFrame.track = self.auras[aura].track auraFrame.active = true @@ -356,28 +357,28 @@ function Auras:GetAuraOptions(auraType) local auras = {} for k,v in pairs(Gladdy:GetImportantAuras()) do if v.track == auraType then - tinsert(auras, k) + tinsert(auras, v.spellID) end end tbl_sort(auras) for i,k in ipairs(auras) do - options[k] = { + options[tostring(k)] = { type = "group", - name = k, + name = GetSpellInfo(k), order = i+2, - icon = select(3, GetSpellInfo(Gladdy:GetImportantAuras()[k].spellID)), + icon = select(3, GetSpellInfo(k)), args = { enabled = { order = 1, name = L["Enabled"], type = "toggle", - image = select(3, GetSpellInfo(Gladdy:GetImportantAuras()[k].spellID)), + image = select(3, GetSpellInfo(k)), width = "2", set = function(info, value) - Gladdy.db.auraListDefault[k].enabled = value + Gladdy.db.auraListDefault[tostring(k)].enabled = value end, get = function(info) - return Gladdy.db.auraListDefault[k].enabled + return Gladdy.db.auraListDefault[tostring(k)].enabled end }, priority = { @@ -389,10 +390,10 @@ function Auras:GetAuraOptions(auraType) width = "2", step = 1, get = function(info) - return Gladdy.db.auraListDefault[k].priority + return Gladdy.db.auraListDefault[tostring(k)].priority end, set = function(info, value) - Gladdy.db.auraListDefault[k].priority = value + Gladdy.db.auraListDefault[tostring(k)].priority = value end, } } diff --git a/Modules/BuffsDebuffs.lua b/Modules/BuffsDebuffs.lua index db5a125..35e21da 100644 --- a/Modules/BuffsDebuffs.lua +++ b/Modules/BuffsDebuffs.lua @@ -87,6 +87,8 @@ function BuffsDebuffs:Initialize() self.trackedCC = {} self.framePool = {} self:RegisterMessage("JOINED_ARENA") + self:RegisterMessage("UNIT_DESTROYED") + self:RegisterMessage("UNIT_DEATH") self:RegisterMessage("AURA_FADE") self:RegisterMessage("AURA_GAIN") self:RegisterMessage("AURA_GAIN_LIMIT") @@ -126,6 +128,14 @@ function BuffsDebuffs:ResetUnit(unit) end end +function BuffsDebuffs:UNIT_DESTROYED(unit) + BuffsDebuffs:ResetUnit(unit) +end + +function BuffsDebuffs:UNIT_DEATH(unit) + BuffsDebuffs:ResetUnit(unit) +end + function BuffsDebuffs:Reset() for i=1,#self.framePool do self.framePool[i]:Hide() @@ -282,55 +292,22 @@ function BuffsDebuffs:UpdateFrame(unit) self.frames[unit].debuffFrame:SetPoint("TOPRIGHT", Gladdy.buttons[unit].powerBar, "BOTTOMLEFT", Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset -verticalMargin) end elseif Gladdy.db.buffsCooldownPos == "LEFT" then - horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding + local anchor = Gladdy:GetAnchor(unit, "LEFT") + if anchor == Gladdy.buttons[unit].healthBar then + self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset) + else + self.frames[unit].debuffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset) end - if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.castBarPos == "LEFT") then - verticalMargin = verticalMargin - - (((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin + (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - self.frames[unit].debuffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin) + elseif Gladdy.db.buffsCooldownPos == "RIGHT" then horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "RIGHT") + if anchor == Gladdy.buttons[unit].healthBar then + self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset) + else + self.frames[unit].debuffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset) end - if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.castBarPos == "RIGHT") then - verticalMargin = verticalMargin - - (((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin + (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - self.frames[unit].debuffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsXOffset, Gladdy.db.buffsYOffset + verticalMargin) end self.frames[unit].buffFrame:SetHeight(Gladdy.db.buffsBuffsIconSize) @@ -381,7 +358,16 @@ function BuffsDebuffs:UpdateFrame(unit) if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2) end - self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin) + --self.frames[unit].buffFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin) + + local anchor = Gladdy:GetAnchor(unit, "LEFT") + horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding + if anchor == Gladdy.buttons[unit].healthBar then + self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset) + else + self.frames[unit].buffFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset) + end + elseif Gladdy.db.buffsBuffsCooldownPos == "RIGHT" then horizontalMargin = horizontalMargin - 1 + Gladdy.db.padding if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then @@ -406,7 +392,15 @@ function BuffsDebuffs:UpdateFrame(unit) if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then verticalMargin = verticalMargin + (Gladdy.db.buffsBuffsIconSize/2 + Gladdy.db.padding/2) end - self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin) + --self.frames[unit].buffFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset + verticalMargin) + + local anchor = Gladdy:GetAnchor(unit, "RIGHT") + horizontalMargin = Gladdy.db.highlightBorderSize - 1 + Gladdy.db.padding + if anchor == Gladdy.buttons[unit].healthBar then + self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset) + else + self.frames[unit].buffFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.buffsBuffsXOffset, Gladdy.db.buffsBuffsYOffset) + end end for i=1, #self.frames[unit].auras[AURA_TYPE_BUFF] do styleIcon(self.frames[unit].auras[AURA_TYPE_BUFF][i], AURA_TYPE_BUFF) @@ -490,7 +484,7 @@ local function iconTimer(auraFrame, elapsed) auraFrame.cooldown:SetFormattedText("%d", timeLeftSec) elseif timeLeftMilliSec <= 3 and timeLeftMilliSec > 0 then if Gladdy.db.buffsDynamicColor then auraFrame.cooldown:SetTextColor(1, 0, 0) end - auraFrame.cooldown:SetFormattedText("%.1f", timeLeftMilliSec) + auraFrame.cooldown:SetFormattedText("%.1f", timeLeftMilliSec >= 0.0 and timeLeftMilliSec or 0.0) elseif timeLeftMilliSec <= 0 and timeLeftMilliSec > -0.05 then -- 50ms ping max wait for SPELL_AURA_REMOVED event auraFrame.cooldown:SetText("") else -- fallback in case SPELL_AURA_REMOVED is not fired diff --git a/Modules/Castbar.lua b/Modules/Castbar.lua index 284c7fe..5ae10aa 100644 --- a/Modules/Castbar.lua +++ b/Modules/Castbar.lua @@ -164,52 +164,21 @@ function Castbar:UpdateFrame(unit) castBar:ClearAllPoints() local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding - local verticalMargin = -(Gladdy.db.powerBarHeight)/2 if (Gladdy.db.castBarPos == "LEFT") then - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "LEFT") + if anchor == Gladdy.buttons[unit].healthBar then + castBar:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset) + else + castBar:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset) end - if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin + (Gladdy.db.cooldownSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + (Gladdy.db.drIconSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.buffsCooldownPos == "LEFT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin + Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2 - end - castBar:SetPoint("RIGHT", button.healthBar, "LEFT", -horizontalMargin - leftMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset + verticalMargin) end if (Gladdy.db.castBarPos == "RIGHT") then - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "RIGHT") + if anchor == Gladdy.buttons[unit].healthBar then + castBar:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset) + else + castBar:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset) end - if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin + (Gladdy.db.cooldownSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + (Gladdy.db.drIconSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.buffsCooldownPos == "RIGHT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin + Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2 - end - castBar:SetPoint("LEFT", button.healthBar, "RIGHT", horizontalMargin + rightMargin + Gladdy.db.castBarXOffset, Gladdy.db.castBarYOffset + verticalMargin) end castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) @@ -515,7 +484,7 @@ function Castbar:Test(unit) if (unit == "arena2") then spell, _, icon = GetSpellInfo(27072) - value, maxValue, event = 0, 2, "cast" + value, maxValue, event = 0, 40, "cast" elseif (unit == "arena1") then spell, _, icon = GetSpellInfo(27220) endTime = GetTime() * 1000 + 60*1000 diff --git a/Modules/Cooldowns.lua b/Modules/Cooldowns.lua index 5416861..dc3942f 100644 --- a/Modules/Cooldowns.lua +++ b/Modules/Cooldowns.lua @@ -1,12 +1,54 @@ -local type, pairs, ceil, tonumber, mod = type, pairs, ceil, tonumber, mod +local type, pairs, ceil, tonumber, mod, tostring, upper, select = type, pairs, ceil, tonumber, mod, tostring, string.upper, select local GetTime = GetTime local CreateFrame = CreateFrame +local RACE_ICON_TCOORDS = { + ["HUMAN_MALE"] = {0, 0.125, 0, 0.25}, + ["DWARF_MALE"] = {0.125, 0.25, 0, 0.25}, + ["GNOME_MALE"] = {0.25, 0.375, 0, 0.25}, + ["NIGHTELF_MALE"] = {0.375, 0.5, 0, 0.25}, + + ["TAUREN_MALE"] = {0, 0.125, 0.25, 0.5}, + ["SCOURGE_MALE"] = {0.125, 0.25, 0.25, 0.5}, + ["TROLL_MALE"] = {0.25, 0.375, 0.25, 0.5}, + ["ORC_MALE"] = {0.375, 0.5, 0.25, 0.5}, + + ["HUMAN_FEMALE"] = {0, 0.125, 0.5, 0.75}, + ["DWARF_FEMALE"] = {0.125, 0.25, 0.5, 0.75}, + ["GNOME_FEMALE"] = {0.25, 0.375, 0.5, 0.75}, + ["NIGHTELF_FEMALE"] = {0.375, 0.5, 0.5, 0.75}, + + ["TAUREN_FEMALE"] = {0, 0.125, 0.75, 1.0}, + ["SCOURGE_FEMALE"] = {0.125, 0.25, 0.75, 1.0}, + ["TROLL_FEMALE"] = {0.25, 0.375, 0.75, 1.0}, + ["ORC_FEMALE"] = {0.375, 0.5, 0.75, 1.0}, + + ["BLOODELF_MALE"] = {0.5, 0.625, 0.25, 0.5}, + ["BLOODELF_FEMALE"] = {0.5, 0.625, 0.75, 1.0}, + + ["DRAENEI_MALE"] = {0.5, 0.625, 0, 0.25}, + ["DRAENEI_FEMALE"] = {0.5, 0.625, 0.5, 0.75}, +} local GetSpellInfo = GetSpellInfo local Gladdy = LibStub("Gladdy") local L = Gladdy.L +local function getDefaultCooldown() + local cooldowns = {} + for class, t in pairs(Gladdy:GetCooldownList()) do + for spellId, v in pairs(t) do + local spellName, _, texture = GetSpellInfo(spellId) + if spellName then + cooldowns[tostring(spellId)] = true + else + Gladdy:Print("spellid does not exist " .. spellId) + end + end + end + return cooldowns +end + local Cooldowns = Gladdy:NewModule("Cooldowns", nil, { cooldownFont = "DorisPP", cooldownFontScale = 1, @@ -23,13 +65,14 @@ local Cooldowns = Gladdy:NewModule("Cooldowns", nil, { cooldownBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_Gloss", cooldownBorderColor = { r = 1, g = 1, b = 1, a = 1 }, cooldownDisableCircle = false, - cooldownCooldownAlpha = 1 + cooldownCooldownAlpha = 1, + cooldownCooldowns = getDefaultCooldown() }) function Cooldowns:Initialize() self.cooldownSpellIds = {} self.spellTextures = {} - for class, t in pairs(self.cooldownSpells) do + for class, t in pairs(Gladdy:GetCooldownList()) do for k, v in pairs(t) do local spellName, _, texture = GetSpellInfo(k) if spellName then @@ -43,6 +86,7 @@ function Cooldowns:Initialize() self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("SPEC_DETECTED") self:RegisterMessage("UNIT_DEATH") + self:RegisterMessage("UNIT_DESTROYED") end function Cooldowns:CreateFrame(unit) @@ -102,56 +146,19 @@ function Cooldowns:UpdateFrame(unit) button.spellCooldownFrame:SetPoint("TOPLEFT", button.powerBar, "BOTTOMLEFT", Gladdy.db.cooldownXOffset, -Gladdy.db.highlightBorderSize + Gladdy.db.cooldownYOffset) end elseif Gladdy.db.cooldownYPos == "LEFT" then - local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "LEFT") + if anchor == Gladdy.buttons[unit].healthBar then + button.spellCooldownFrame:SetPoint("RIGHT", anchor, "LEFT", -(Gladdy.db.highlightBorderSize + Gladdy.db.padding) + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset) + else + button.spellCooldownFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset) end - if (Gladdy.db.drCooldownPos == "LEFT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.castBarPos == "LEFT") then - verticalMargin = verticalMargin - - ((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.buffsCooldownPos == "LEFT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin - (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - button.spellCooldownFrame:SetPoint("RIGHT", button.healthBar, "LEFT", -horizontalMargin + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset + verticalMargin) elseif Gladdy.db.cooldownYPos == "RIGHT" then - verticalMargin = -(Gladdy.db.powerBarHeight)/2 - local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "RIGHT") + if anchor == Gladdy.buttons[unit].healthBar then + button.spellCooldownFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.highlightBorderSize + Gladdy.db.padding + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset) + else + button.spellCooldownFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset) end - if (Gladdy.db.drCooldownPos == "RIGHT" and Gladdy.db.drEnabled) then - verticalMargin = verticalMargin + Gladdy.db.drIconSize/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.castBarPos == "RIGHT") then - verticalMargin = verticalMargin - - ((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2 - end - if (Gladdy.db.buffsCooldownPos == "RIGHT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin - (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - button.spellCooldownFrame:SetPoint("LEFT", button.healthBar, "RIGHT", horizontalMargin + Gladdy.db.cooldownXOffset, Gladdy.db.cooldownYOffset + verticalMargin) end button.spellCooldownFrame:SetHeight(Gladdy.db.cooldownSize) button.spellCooldownFrame:SetWidth(1) @@ -227,12 +234,10 @@ function Cooldowns:UpdateFrame(unit) end function Cooldowns:Test(unit) - if Gladdy.db.cooldown then - local button = Gladdy.buttons[unit] - button.spellCooldownFrame:Show() - button.lastCooldownSpell = 1 - self:UpdateTestCooldowns(unit) - end + local button = Gladdy.buttons[unit] + button.spellCooldownFrame:Show() + button.lastCooldownSpell = 1 + self:UpdateTestCooldowns(unit) end function Cooldowns:UpdateTestCooldowns(unit) @@ -246,12 +251,12 @@ function Cooldowns:UpdateTestCooldowns(unit) button.test = true -- use class spells - for k, v in pairs(self.cooldownSpells[button.class]) do + for k, v in pairs(Gladdy:GetCooldownList()[button.class]) do --k is spellId self:CooldownUsed(unit, button.class, k, nil) end -- use race spells - for k, v in pairs(self.cooldownSpells[button.race]) do + for k, v in pairs(Gladdy:GetCooldownList()[button.race]) do self:CooldownUsed(unit, button.race, k, nil) end end @@ -345,30 +350,32 @@ function Cooldowns:DetectSpec(unit, spec) if (Gladdy.db.cooldown) then local class = Gladdy.buttons[unit].class local race = Gladdy.buttons[unit].race - for k, v in pairs(self.cooldownSpells[class]) do - --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then - if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true + for k, v in pairs(Gladdy:GetCooldownList()[class]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then + if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then + local sharedCD = false + if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then + for spellId, _ in pairs(v.sharedCD) do + for i = 1, button.lastCooldownSpell do + local icon = button.spellCooldownFrame["icon" .. i] + if (icon.spellId == spellId) then + sharedCD = true + end end end end - end - if sharedCD then - return - end + if sharedCD then + return + end - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.texture:SetTexture(self.spellTextures[k]) - icon.spellId = k - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 + local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] + icon:Show() + icon.texture:SetTexture(self.spellTextures[k]) + icon.spellId = k + button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon + button.lastCooldownSpell = button.lastCooldownSpell + 1 + end end end --end @@ -377,31 +384,33 @@ function Cooldowns:DetectSpec(unit, spec) --- RACE FUNCTIONALITY ---------------------- local race = Gladdy.buttons[unit].race - if self.cooldownSpells[race] then - for k, v in pairs(self.cooldownSpells[race]) do - --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then - if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true + if Gladdy:GetCooldownList()[race] then + for k, v in pairs(Gladdy:GetCooldownList()[race]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then + if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then + local sharedCD = false + if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then + for spellId, _ in pairs(v.sharedCD) do + for i = 1, button.lastCooldownSpell do + local icon = button.spellCooldownFrame["icon" .. i] + if (icon.spellId == spellId) then + sharedCD = true + end end end end - end - if sharedCD then - return - end + if sharedCD then + return + end - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.texture:SetTexture(self.spellTextures[k]) - icon.spellId = k - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 + local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] + icon:Show() + icon.texture:SetTexture(self.spellTextures[k]) + icon.spellId = k + button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon + button.lastCooldownSpell = button.lastCooldownSpell + 1 + end end end end @@ -412,6 +421,10 @@ function Cooldowns:ResetUnit(unit) Gladdy.buttons[unit].test = nil end +function Cooldowns:UNIT_DESTROYED(unit) + +end + function Cooldowns:UpdateCooldowns(button) local class = button.class local race = button.race @@ -420,29 +433,31 @@ function Cooldowns:UpdateCooldowns(button) end if (Gladdy.db.cooldown) then - for k, v in pairs(self.cooldownSpells[class]) do - if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then - -- see if we have shared cooldowns without a cooldown defined - -- e.g. hunter traps have shared cooldowns, so only display one trap instead all of them - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true + for k, v in pairs(Gladdy:GetCooldownList()[class]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then + -- see if we have shared cooldowns without a cooldown defined + -- e.g. hunter traps have shared cooldowns, so only display one trap instead all of them + local sharedCD = false + if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then + for spellId, _ in pairs(v.sharedCD) do + for i = 1, button.lastCooldownSpell do + local icon = button.spellCooldownFrame["icon" .. i] + if (icon.spellId == spellId) then + sharedCD = true + end end end end - end - if (not sharedCD) then - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.spellId = k - icon.texture:SetTexture(self.spellTextures[k]) - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 + if (not sharedCD) then + local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] + icon:Show() + icon.spellId = k + icon.texture:SetTexture(self.spellTextures[k]) + button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon + button.lastCooldownSpell = button.lastCooldownSpell + 1 + end end end end @@ -450,14 +465,16 @@ function Cooldowns:UpdateCooldowns(button) -- RACE FUNCTIONALITY ---- - for k, v in pairs(self.cooldownSpells[race]) do - if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.spellId = k - icon.texture:SetTexture(self.spellTextures[k]) - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 + for k, v in pairs(Gladdy:GetCooldownList()[race]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then + local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] + icon:Show() + icon.spellId = k + icon.texture:SetTexture(self.spellTextures[k]) + button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon + button.lastCooldownSpell = button.lastCooldownSpell + 1 + end end end end @@ -470,7 +487,7 @@ function Cooldowns:CooldownUsed(unit, unitClass, spellId, spellName) end -- if (self.db.cooldownList[spellId] == false) then return end - local cooldown = self.cooldownSpells[unitClass][spellId] + local cooldown = Gladdy:GetCooldownList()[unitClass][spellId] local cd = cooldown if (type(cooldown) == "table") then -- return if the spec doesn't have a cooldown for this spell @@ -755,9 +772,80 @@ function Cooldowns:GetOptions() }, }, }, + cooldowns = { + type = "group", + childGroups = "tree", + name = "Cooldowns", + order = 4, + args = Cooldowns:GetCooldownOptions(), + }, } end +function Cooldowns:GetCooldownOptions() + local group = {} + + local p = 1 + for i,class in ipairs(Gladdy.CLASSES) do + group[class] = { + type = "group", + name = LOCALIZED_CLASS_NAMES_MALE[class], + order = i, + icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes", + iconCoords = CLASS_ICON_TCOORDS[class], + args = {} + } + local o = 1 + for spellId,cooldown in pairs(Gladdy:GetCooldownList()[class]) do + group[class].args[tostring(spellId)] = { + type = "toggle", + name = select(1, GetSpellInfo(spellId)) .. (type(cooldown) == "table" and cooldown.spec and (" - " .. cooldown.spec) or ""), + order = o, + width = "full", + image = select(3, GetSpellInfo(spellId)), + get = function(info) + return Gladdy.db.cooldownCooldowns[tostring(spellId)] + end, + set = function(info, value) + Gladdy.db.cooldownCooldowns[tostring(spellId)] = value + Gladdy:UpdateFrame() + end + } + o = o + 1 + end + p = p + i + end + for i,race in ipairs(Gladdy.RACES) do + group[race] = { + type = "group", + name = L[race], + order = i + p, + icon = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Races", + iconCoords = RACE_ICON_TCOORDS[upper(race) .. "_FEMALE"], + args = {} + } + local o = 1 + for spellId,cooldown in pairs(Gladdy:GetCooldownList()[race]) do + group[race].args[tostring(spellId)] = { + type = "toggle", + name = select(1, GetSpellInfo(spellId)) .. (type(cooldown) == "table" and cooldown.spec and (" - " .. cooldown.spec) or ""), + order = o, + width = "full", + image = select(3, GetSpellInfo(spellId)), + get = function(info) + return Gladdy.db.cooldownCooldowns[tostring(spellId)] + end, + set = function(info, value) + Gladdy.db.cooldownCooldowns[tostring(spellId)] = value + Gladdy:UpdateFrame() + end + } + o = o + 1 + end + end + return group +end + function Gladdy:UpdateTestCooldowns(i) local unit = "arena" .. i local button = Gladdy.buttons[unit] @@ -769,219 +857,13 @@ function Gladdy:UpdateTestCooldowns(i) Cooldowns:DetectSpec(unit, button.testSpec) -- use class spells - for k, v in pairs(Cooldowns.cooldownSpells[button.class]) do + for k, v in pairs(Gladdy:GetCooldownList()[button.class]) do --k is spellId Cooldowns:CooldownUsed(unit, button.class, k, nil) end -- use race spells - for k, v in pairs(Cooldowns.cooldownSpells[button.race]) do + for k, v in pairs(Gladdy:GetCooldownList()[button.race]) do Cooldowns:CooldownUsed(unit, button.race, k, nil) end end -end - -Cooldowns.cooldownSpells = { - -- 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 - [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 - --[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"] = { - [7744] = 120, -- Will of the Forsaken - }, - ["BloodElf"] = { - [28730] = 120, -- Arcane Torrent - }, - ["Tauren"] = { - [20549] = 120, -- War Stomp - }, - ["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 - [20600] = 180, -- Perception - }, - ["Gnome"] = { - [20589] = 105, -- Escape Artist - }, - ["Dwarf"] = { - [20594] = 180, -- Stoneform - [13908] = { cd = 600, spec = L["Discipline"], }, -- Desperate Prayer - }, -} \ No newline at end of file +end \ No newline at end of file diff --git a/Modules/Diminishings.lua b/Modules/Diminishings.lua index d51085a..3b4a9e2 100644 --- a/Modules/Diminishings.lua +++ b/Modules/Diminishings.lua @@ -62,7 +62,7 @@ end function Diminishings:Initialize() self.frames = {} - self:RegisterMessage("UNIT_DEATH", "ResetUnit", "AURA_FADE") + self:RegisterMessage("UNIT_DEATH", "ResetUnit", "AURA_FADE", "UNIT_DESTROYED") end function Diminishings:CreateFrame(unit) @@ -94,7 +94,7 @@ function Diminishings:CreateFrame(unit) if self.timeLeft >=5 then self.timeText:SetFormattedText("%d", self.timeLeft) else - self.timeText:SetFormattedText("%.1f", self.timeLeft) + self.timeText:SetFormattedText("%.1f", self.timeLeft >= 0.0 and self.timeLeft or 0.0) end end end @@ -161,56 +161,21 @@ function Diminishings:UpdateFrame(unit) drFrame:ClearAllPoints() local horizontalMargin = Gladdy.db.highlightBorderSize + Gladdy.db.padding - local verticalMargin = -(Gladdy.db.powerBarHeight)/2 if (Gladdy.db.drCooldownPos == "LEFT") then - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "LEFT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "LEFT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "LEFT") + if anchor == Gladdy.buttons[unit].healthBar then + drFrame:SetPoint("RIGHT", anchor, "LEFT", -horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset) + else + drFrame:SetPoint("RIGHT", anchor, "LEFT", -Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset) end - if (Gladdy.db.castBarPos == "LEFT") then - verticalMargin = verticalMargin - - (((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.cooldownYPos == "LEFT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin - (Gladdy.db.cooldownSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.buffsCooldownPos == "LEFT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin - (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - drFrame:SetPoint("RIGHT", Gladdy.buttons[unit].healthBar, "LEFT", -horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset + verticalMargin) end if (Gladdy.db.drCooldownPos == "RIGHT") then - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - if (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - end - elseif (Gladdy.db.classIconPos == "RIGHT") then - horizontalMargin = horizontalMargin + (Gladdy.db.classIconSize * Gladdy.db.classIconWidthFactor) + Gladdy.db.padding - if (Gladdy.db.trinketPos == "RIGHT" and Gladdy.db.trinketEnabled) then - horizontalMargin = horizontalMargin + (Gladdy.db.trinketSize * Gladdy.db.trinketWidthFactor) + Gladdy.db.padding - end + local anchor = Gladdy:GetAnchor(unit, "RIGHT") + if anchor == Gladdy.buttons[unit].healthBar then + drFrame:SetPoint("LEFT", anchor, "RIGHT", horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset) + else + drFrame:SetPoint("LEFT", anchor, "RIGHT", Gladdy.db.padding + Gladdy.db.drXOffset, Gladdy.db.drYOffset) end - if (Gladdy.db.castBarPos == "RIGHT") then - verticalMargin = verticalMargin - - (((Gladdy.db.castBarHeight < Gladdy.db.castBarIconSize) and Gladdy.db.castBarIconSize - or Gladdy.db.castBarHeight)/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.cooldownYPos == "RIGHT" and Gladdy.db.cooldown) then - verticalMargin = verticalMargin - (Gladdy.db.cooldownSize/2 + Gladdy.db.padding/2) - end - if (Gladdy.db.buffsCooldownPos == "RIGHT" and Gladdy.db.buffsEnabled) then - verticalMargin = verticalMargin - (Gladdy.db.buffsIconSize/2 + Gladdy.db.padding/2) - end - drFrame:SetPoint("LEFT", Gladdy.buttons[unit].healthBar, "RIGHT", horizontalMargin + Gladdy.db.drXOffset, Gladdy.db.drYOffset + verticalMargin) end drFrame:SetWidth(Gladdy.db.drIconSize * 16) @@ -289,6 +254,10 @@ function Diminishings:ResetUnit(unit) end end +function Diminishings:UNIT_DESTROYED(unit) + Diminishings:ResetUnit(unit) +end + function Diminishings:Test(unit) if Gladdy.db.drEnabled then local spells = { 33786, 118, 8643, 8983 } diff --git a/Modules/ExportImport.lua b/Modules/ExportImport.lua index 2a4ff40..8be70b4 100644 --- a/Modules/ExportImport.lua +++ b/Modules/ExportImport.lua @@ -64,9 +64,11 @@ importButton:SetText("Import\n(this will overwrite your current profile!)") importButton:SetWidth(200) importButton:SetHeight(50) importButton:SetCallback("OnClick", function(widget) - ExportImport:ApplyImport(import.deserializedTable) - Gladdy:UpdateFrame() + ExportImport:ApplyImport(import.deserializedTable, Gladdy.db) import:Hide() + Gladdy:Reset() + Gladdy:HideFrame() + Gladdy:ToggleFrame(3) end) import:AddChild(importButton) import.button = importButton @@ -84,25 +86,24 @@ import:AddChild(importClearButton) import.clearButton = importClearButton function ExportImport:CheckDeserializedOptions(tbl, refTbl, str) - if str == nil and not tbl.version_major then - return false, "Version conflict: version_major not seen" + if str == nil and not tbl.version_major_num then + return false, "Version conflict: version_major_num not seen" end - if str == nil and tbl.version_major ~= Gladdy.version_major then - return false, "Version conflict: " .. tbl.version_major .. " ~= " .. Gladdy.version_major + if str == nil and tbl.version_major_num ~= Gladdy.version_major_num then + return false, "Version conflict: " .. tbl.version_major_num .. " ~= " .. Gladdy.version_major_num end if str == nil then str = "Gladdy.db" - tbl.version_major = nil + tbl.version_major_num = nil end - if type(tbl) == "table" then - for k,v in pairs(tbl) do - if refTbl[k] ~= nil then - if type(v) ~= type(refTbl[k]) then - return false, str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) - end + for k,v in pairs(tbl) do + if refTbl[k] == nil then + return false, str .. "." .. k .. " does not exist" + else + if type(v) ~= type(refTbl[k]) then + return false, str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) + elseif type(v) == "table" then ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k) - else - return false, str .. "." .. k .. " does not exist" end end end @@ -122,7 +123,7 @@ function ExportImport:GetOptions() type = "execute", func = function() local db = table_copy(Gladdy.db) - db.version_major = Gladdy.version_major + db.version_major_num = Gladdy.version_major_num dump = AceSerializer:Serialize(db) local compress_deflate = LibDeflate:CompressZlib(dump) printable_compressed = LibDeflate:EncodeForPrint(compress_deflate) @@ -164,14 +165,11 @@ function ExportImport:GetOptions() end function ExportImport:ApplyImport(t, table) - if table == nil then - table = Gladdy.dbi.profile - end for k,v in pairs(t) do if type(v) == "table" then ExportImport:ApplyImport(v, table[k]) else - table[k] = v; + table[k] = v end end end @@ -204,7 +202,7 @@ function ExportImport:Decode(str, showError) end return nil end - local statusOption, error = ExportImport:CheckDeserializedOptions(deserialized, Gladdy.db) + local statusOption, error = ExportImport:CheckDeserializedOptions(deserialized, Gladdy.defaults.profile) if not statusOption then if showError then import.statustext:SetTextColor(1,0,0) diff --git a/Modules/Healthbar.lua b/Modules/Healthbar.lua index 0230cd2..de10d75 100644 --- a/Modules/Healthbar.lua +++ b/Modules/Healthbar.lua @@ -17,7 +17,9 @@ local Healthbar = Gladdy:NewModule("Healthbar", 100, { healthBarBorderColor = { r = 0, g = 0, b = 0, a = 1 }, healthBarBgColor = { r = 0, g = 0, b = 0, a = 0.4 }, healthBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, - healthBarFontSize = 12, + healthBarNameFontSize = 12, + healthBarHealthFontSize = 12, + healthName = true, healthActual = false, healthMax = true, healthPercentage = true, @@ -26,6 +28,7 @@ local Healthbar = Gladdy:NewModule("Healthbar", 100, { function Healthbar:Initialize() self.frames = {} self:RegisterMessage("ENEMY_SPOTTED") + self:RegisterMessage("UNIT_DESTROYED") self:RegisterMessage("UNIT_DEATH") end @@ -51,11 +54,11 @@ function Healthbar:CreateFrame(unit) healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a) healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall") - if (Gladdy.db.healthBarFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) + if (Gladdy.db.healthBarNameFontSize < 1) then + healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarFontSize) + healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) healthBar.nameText:Show() end healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) @@ -65,11 +68,11 @@ function Healthbar:CreateFrame(unit) healthBar.nameText:SetPoint("LEFT", 5, 0) healthBar.healthText = healthBar:CreateFontString(nil, "LOW") - if (Gladdy.db.healthBarFontSize < 1) then + if (Gladdy.db.healthBarHealthFontSize < 1) then healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarFontSize) + healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:Hide() end healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) @@ -166,17 +169,24 @@ function Healthbar:UpdateFrame(unit) healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) - if (Gladdy.db.healthBarFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) + if (Gladdy.db.healthBarHealthFontSize < 1) then healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) - healthBar.nameText:Hide() healthBar.healthText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarFontSize) - healthBar.nameText:Show() - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarFontSize) + healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:Show() end + if (Gladdy.db.healthBarNameFontSize < 1) then + healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) + healthBar.nameText:Hide() + else + healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) + if Gladdy.db.healthName then + healthBar.nameText:Show() + else + healthBar.nameText:Hide() + end + end healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) end @@ -270,6 +280,17 @@ function Healthbar:UNIT_DEATH(unit) healthBar.healthText:SetText(L["DEAD"]) end +function Healthbar:UNIT_DESTROYED(unit) + local healthBar = self.frames[unit] + if (not healthBar) then + return + end + + healthBar.hp:SetValue(0) + healthBar.healthText:SetText(L["LEAVE"]) + healthBar.nameText:SetText("") +end + local function option(params) local defaults = { get = function(info) @@ -283,6 +304,9 @@ local function option(params) if Gladdy.db.healthBarBorderSize > Gladdy.db.healthBarHeight/2 then Gladdy.db.healthBarBorderSize = Gladdy.db.healthBarHeight/2 end + for i=1,Gladdy.curBracket do + Healthbar:Test("arena" .. i) + end Gladdy:UpdateFrame() end, } @@ -368,11 +392,21 @@ function Healthbar:GetOptions() order = 12, hasAlpha = true, }), - healthBarFontSize = option({ + healthBarNameFontSize = option({ type = "range", - name = L["Font size"], - desc = L["Size of the text"], + name = L["Name font size"], + desc = L["Size of the name text"], order = 13, + step = 0.1, + min = 0, + max = 20, + }), + healthBarHealthFontSize = option({ + type = "range", + name = L["Health font size"], + desc = L["Size of the health text"], + order = 14, + step = 0.1, min = 0, max = 20, }), @@ -415,14 +449,20 @@ function Healthbar:GetOptions() }, healthValues = { type = "group", - name = L["Health Values"], + name = L["Health Bar Text"], order = 4, args = { header = { type = "header", - name = L["Health Values"], + name = L["Health Bar Text"], order = 1, }, + healthName = option({ + type = "toggle", + name = L["Show the name"], + desc = L["Show the units name"], + order = 30, + }), healthActual = option({ type = "toggle", name = L["Show the actual health"], diff --git a/Modules/Pets.lua b/Modules/Pets.lua index 20ea5fb..d7590b0 100644 --- a/Modules/Pets.lua +++ b/Modules/Pets.lua @@ -500,20 +500,25 @@ function Pets:GetOptions() name = L["Position"], order = 5, args = { + header = { + type = "header", + name = L["Position"], + order = 1, + }, petXOffset = Gladdy:option({ type = "range", name = L["Horizontal offset"], order = 22, - min = -400, - max = 400, + min = -600, + max = 600, step = 0.1, }), petYOffset = Gladdy:option({ type = "range", name = L["Vertical offset"], order = 23, - min = -400, - max = 400, + min = -600, + max = 600, step = 0.1, }), } diff --git a/Modules/Powerbar.lua b/Modules/Powerbar.lua index 2c0aa54..c7a2e7a 100644 --- a/Modules/Powerbar.lua +++ b/Modules/Powerbar.lua @@ -16,6 +16,8 @@ local Powerbar = Gladdy:NewModule("Powerbar", 90, { powerBarFontColor = { r = 1, g = 1, b = 1, a = 1 }, powerBarBgColor = { r = 0.3, g = 0.3, b = 0.3, a = 0.7 }, powerBarFontSize = 10, + powerShowSpec = true, + powerShowRace = true, powerActual = true, powerMax = true, powerPercentage = false, @@ -27,6 +29,7 @@ function Powerbar:Initialize() self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("UNIT_SPEC") self:RegisterMessage("UNIT_DEATH") + self:RegisterMessage("UNIT_DESTROYED") end function Powerbar:CreateFrame(unit) @@ -185,9 +188,9 @@ function Powerbar:ENEMY_SPOTTED(unit) return end - local raceText = button.raceLoc + local raceText = Gladdy.db.powerShowRace and button.raceLoc or "" - if (button.spec) then + if (button.spec and Gladdy.db.powerShowSpec) then raceText = button.spec .. " " .. raceText end @@ -263,6 +266,15 @@ function Powerbar:UNIT_DEATH(unit) powerBar.powerText:SetText("0%") end +function Powerbar:UNIT_DESTROYED(unit) + local powerBar = self.frames[unit] + if (not powerBar) then + return + end + powerBar.energy:SetValue(0) + powerBar.powerText:SetText("0%") +end + local function option(params) local defaults = { get = function(info) @@ -272,10 +284,13 @@ local function option(params) set = function(info, value) local key = info.arg or info[#info] Gladdy.dbi.profile[key] = value - Gladdy.options.args.Powerbar.args.group.args.border.arg.powerBarBorderSize.max = Gladdy.db.powerBarHeight/2 + Gladdy.options.args.Powerbar.args.group.args.border.args.powerBarBorderSize.max = Gladdy.db.powerBarHeight/2 if Gladdy.db.powerBarBorderSize > Gladdy.db.powerBarHeight/2 then Gladdy.db.powerBarBorderSize = Gladdy.db.powerBarHeight/2 end + for i=1,Gladdy.curBracket do + Powerbar:Test("arena" .. i) + end Gladdy:UpdateFrame() end, } @@ -366,6 +381,7 @@ function Powerbar:GetOptions() name = L["Font size"], desc = L["Size of the text"], order = 13, + step = 0.1, min = 1, max = 20, }), @@ -408,14 +424,26 @@ function Powerbar:GetOptions() }, powerValues = { type = "group", - name = L["Power Values"], + name = L["Power Bar Text"], order = 4, args = { header = { type = "header", - name = L["Power Values"], + name = L["Power Texts"], order = 1, }, + powerShowRace = option({ + type = "toggle", + name = L["Show race"], + desc = L["Show race"], + order = 2, + }), + powerShowSpec= option({ + type = "toggle", + name = L["Show spec"], + desc = L["Show spec"], + order = 3, + }), powerActual = option({ type = "toggle", name = L["Show the actual power"], diff --git a/Modules/Racial.lua b/Modules/Racial.lua new file mode 100644 index 0000000..9d6725d --- /dev/null +++ b/Modules/Racial.lua @@ -0,0 +1,392 @@ +local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber + +local CreateFrame = CreateFrame +local GetTime = GetTime + + + +local Gladdy = LibStub("Gladdy") +local L = Gladdy.L +local Racial = Gladdy:NewModule("Racial", nil, { + racialFont = "DorisPP", + racialFontScale = 1, + racialEnabled = true, + racialSize = 60 + 20 + 1, + racialWidthFactor = 0.9, + racialAnchor = "trinket", + racialPos = "RIGHT", + racialXOffset = 0, + racialYOffset = 0, + racialBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", + racialBorderColor = { r = 0, g = 0, b = 0, a = 1 }, + racialDisableCircle = false, + racialCooldownAlpha = 1, +}) + +local ANCHORS = { ["LEFT"] = "RIGHT", ["RIGHT"] = "LEFT", ["BOTTOM"] = "TOP", ["TOP"] = "BOTTOM"} + +function Racial:Initialize() + self.frames = {} + + self:RegisterMessage("JOINED_ARENA") + self:RegisterMessage("ENEMY_SPOTTED") + self:RegisterMessage("RACIAL_USED") +end + +local function iconTimer(self,elapsed) + if (self.active) then + if (self.timeLeft <= 0) then + self.active = false + self.cooldown:Clear() + else + self.timeLeft = self.timeLeft - elapsed + end + + local timeLeft = ceil(self.timeLeft) + + if timeLeft >= 60 then + -- more than 1 minute + self.cooldownFont:SetTextColor(1, 1, 0) + self.cooldownFont:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60))) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE") + elseif timeLeft < 60 and timeLeft >= 21 then + -- between 60s and 21s (green) + self.cooldownFont:SetTextColor(0.7, 1, 0) + self.cooldownFont:SetText(timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + elseif timeLeft < 20.9 and timeLeft >= 11 then + -- between 20s and 11s (green) + self.cooldownFont:SetTextColor(0, 1, 0) + self.cooldownFont:SetText(timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + elseif timeLeft <= 10 and timeLeft >= 5 then + -- between 10s and 5s (orange) + self.cooldownFont:SetTextColor(1, 0.7, 0) + self.cooldownFont:SetFormattedText("%.1f", timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + elseif timeLeft < 5 and timeLeft > 0 then + -- between 5s and 1s (red) + self.cooldownFont:SetTextColor(1, 0, 0) + self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + else + self.cooldownFont:SetText("") + end + end +end + +function Racial:CreateFrame(unit) + local racial = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit]) + racial.texture = racial:CreateTexture(nil, "BACKGROUND") + racial.texture:SetAllPoints(racial) + --racial.texture:SetTexture("Interface\\Icons\\INV_Jewelry_TrinketPVP_02") + + racial.cooldown = CreateFrame("Cooldown", nil, racial, "CooldownFrameTemplate") + racial.cooldown.noCooldownCount = true --Gladdy.db.racialDisableOmniCC + racial.cooldown:SetHideCountdownNumbers(true) + + racial.cooldownFrame = CreateFrame("Frame", nil, racial) + racial.cooldownFrame:ClearAllPoints() + racial.cooldownFrame:SetPoint("TOPLEFT", racial, "TOPLEFT") + racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT") + + racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY") + racial.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), 20, "OUTLINE") + --trinket.cooldownFont:SetAllPoints(trinket.cooldown) + racial.cooldownFont:SetJustifyH("CENTER") + racial.cooldownFont:SetPoint("CENTER") + + racial.borderFrame = CreateFrame("Frame", nil, racial) + racial.borderFrame:SetAllPoints(racial) + racial.texture.overlay = racial.borderFrame:CreateTexture(nil, "OVERLAY") + racial.texture.overlay:SetAllPoints(racial) + racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) + + racial:SetScript("OnUpdate", iconTimer) + + Gladdy.buttons[unit].racial = racial + self.frames[unit] = racial +end + +function Racial:UpdateFrame(unit) + local racial = self.frames[unit] + if (not racial) then + return + end + + local width, height = Gladdy.db.racialSize * Gladdy.db.racialWidthFactor, Gladdy.db.racialSize + + racial:SetWidth(width) + racial:SetHeight(height) + racial.cooldown:SetWidth(width - width/16) + racial.cooldown:SetHeight(height - height/16) + racial.cooldown:ClearAllPoints() + racial.cooldown:SetPoint("CENTER", racial, "CENTER") + racial.cooldown.noCooldownCount = true -- Gladdy.db.racialDisableOmniCC + racial.cooldown:SetAlpha(Gladdy.db.racialCooldownAlpha) + + racial.texture:ClearAllPoints() + racial.texture:SetAllPoints(racial) + + racial.texture.overlay:SetTexture(Gladdy.db.racialBorderStyle) + racial.texture.overlay:SetVertexColor(Gladdy.db.racialBorderColor.r, Gladdy.db.racialBorderColor.g, Gladdy.db.racialBorderColor.b, Gladdy.db.racialBorderColor.a) + + racial:ClearAllPoints() + local margin = Gladdy.db.highlightBorderSize + Gladdy.db.padding + local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor] + if (Gladdy.db.racialPos == "RIGHT") then + racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset) + elseif (Gladdy.db.racialPos == "LEFT") then + racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, -Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset) + elseif (Gladdy.db.racialPos == "TOP") then + racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, Gladdy.db.padding + Gladdy.db.racialYOffset) + elseif (Gladdy.db.racialPos == "BOTTOM") then + racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.racialXOffset, -Gladdy.db.padding + Gladdy.db.racialYOffset) + end + + if (Gladdy.db.racialEnabled == false) then + racial:Hide() + else + racial:Show() + end +end + +function Racial:JOINED_ARENA() + self:RegisterEvent("ARENA_COOLDOWNS_UPDATE") + self:SetScript("OnEvent", function(self, event, ...) + if self[event] then + self[event](self, ...) + end + end) +end + +function Racial:RACIAL_USED(unit) + local racial = self.frames[unit] + local button = Gladdy.buttons[unit] + if (not racial or not button or not button.race) then + return + end + Racial:Used(unit, GetTime(), Gladdy:Racials()[button.race].duration) +end + +function Racial:Used(unit, startTime, duration) + local racial = self.frames[unit] + if (not racial) then + return + end + if not racial.active then + racial.timeLeft = duration + if not Gladdy.db.trinketDisableCircle then racial.cooldown:SetCooldown(startTime, duration) end + racial.active = true + end +end + +function Racial:ENEMY_SPOTTED(unit) + local racial = self.frames[unit] + if (not racial) then + return + end + racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture) +end + +function Racial:ResetUnit(unit) + local racial = self.frames[unit] + if (not racial) then + return + end + + racial.timeLeft = nil + racial.active = false + racial.cooldown:Clear() + racial.cooldownFont:SetText("") +end + +function Racial:Test(unit) + Racial:ENEMY_SPOTTED(unit) + if (unit == "arena1" or unit == "arena3") then + Racial:Used(unit, GetTime(), Gladdy:Racials()[Gladdy.buttons[unit].race].duration) + end +end + +function Racial:GetOptions() + return { + headerTrinket = { + type = "header", + name = L["Racial"], + order = 2, + }, + racialEnabled = Gladdy:option({ + type = "toggle", + name = L["Enabled"], + desc = L["Enable racial icon"], + order = 3, + }), + group = { + type = "group", + childGroups = "tree", + name = "Frame", + order = 4, + args = { + general = { + type = "group", + name = L["Size"], + order = 1, + args = { + header = { + type = "header", + name = L["Size"], + order = 4, + }, + racialSize = Gladdy:option({ + type = "range", + name = L["Icon size"], + min = 5, + max = 100, + step = 1, + order = 4, + }), + racialWidthFactor = Gladdy:option({ + type = "range", + name = L["Icon width factor"], + min = 0.5, + max = 2, + step = 0.05, + order = 6, + }), + }, + }, + cooldown = { + type = "group", + name = L["Cooldown"], + order = 2, + args = { + header = { + type = "header", + name = L["Cooldown"], + order = 4, + }, + racialDisableCircle = Gladdy:option({ + type = "toggle", + name = L["No Cooldown Circle"], + order = 7, + }), + racialCooldownAlpha = Gladdy:option({ + type = "range", + name = L["Cooldown circle alpha"], + min = 0, + max = 1, + step = 0.1, + order = 8, + }), + }, + }, + font = { + type = "group", + name = L["Font"], + order = 3, + args = { + header = { + type = "header", + name = L["Font"], + order = 4, + }, + racialFont = Gladdy:option({ + type = "select", + name = L["Font"], + desc = L["Font of the cooldown"], + order = 11, + dialogControl = "LSM30_Font", + values = AceGUIWidgetLSMlists.font, + }), + racialFontScale = Gladdy:option({ + type = "range", + name = L["Font scale"], + desc = L["Scale of the font"], + order = 12, + min = 0.1, + max = 2, + step = 0.1, + }), + }, + }, + position = { + type = "group", + name = L["Position"], + order = 4, + args = { + header = { + type = "header", + name = L["Position"], + order = 4, + }, + racialAnchor = Gladdy:option({ + type = "select", + name = L["Anchor"], + desc = L["This changes the anchor of the racial icon"], + order = 20, + values = { + ["trinket"] = L["Trinket"], + ["classIcon"] = L["Class Icon"], + ["healthBar"] = L["Health Bar"], + ["powerBar"] = L["Power Bar"], + }, + }), + racialPos = Gladdy:option({ + type = "select", + name = L["Position"], + desc = L["This changes position relative to its anchor of the racial icon"], + order = 21, + values = { + ["LEFT"] = L["Left"], + ["RIGHT"] = L["Right"], + ["TOP"] = L["Top"], + ["BOTTOM"] = L["Bottom"], + }, + }), + racialXOffset = Gladdy:option({ + type = "range", + name = L["Horizontal offset"], + order = 23, + min = -400, + max = 400, + step = 0.1, + }), + racialYOffset = Gladdy:option({ + type = "range", + name = L["Vertical offset"], + order = 24, + min = -400, + max = 400, + step = 0.1, + }), + }, + }, + border = { + type = "group", + name = L["Border"], + order = 4, + args = { + header = { + type = "header", + name = L["Border"], + order = 4, + }, + racialBorderStyle = Gladdy:option({ + type = "select", + name = L["Border style"], + order = 31, + values = Gladdy:GetIconStyles() + }), + racialBorderColor = Gladdy:colorOption({ + type = "color", + name = L["Border color"], + desc = L["Color of the border"], + order = 32, + hasAlpha = true, + }), + }, + }, + }, + }, + } +end \ No newline at end of file diff --git a/Modules/TotemPlates.lua b/Modules/TotemPlates.lua index ae4dc2c..91d17bb 100644 --- a/Modules/TotemPlates.lua +++ b/Modules/TotemPlates.lua @@ -1,5 +1,5 @@ local select, pairs, string_lower, tremove, tinsert, format, string_gsub, ipairs = select, pairs, string.lower, tremove, tinsert, format, string.gsub, ipairs -local UnitExists, UnitIsUnit, UnitName = UnitExists, UnitIsUnit, UnitName +local UnitExists, UnitIsUnit, UnitName, UnitIsEnemy = UnitExists, UnitIsUnit, UnitName, UnitIsEnemy local C_NamePlate = C_NamePlate local Gladdy = LibStub("Gladdy") local L = Gladdy.L @@ -222,6 +222,8 @@ end local TotemPlates = Gladdy:NewModule("TotemPlates", nil, { npTotems = true, + npTotemsShowFriendly = true, + npTotemsShowEnemy = true, npTotemPlatesBorderStyle = "Interface\\AddOns\\Gladdy\\Images\\Border_rounded_blp", npTotemPlatesSize = 40, npTotemPlatesWidthFactor = 1, @@ -303,6 +305,13 @@ end function TotemPlates:NAME_PLATE_UNIT_ADDED(...) local unitID = ... + local isEnemy = UnitIsEnemy("player", unitID) + if not Gladdy.db.npTotemsShowEnemy and isEnemy then + return + end + if not Gladdy.db.npTotemsShowFriendly and not isEnemy then + return + end local nameplateName = UnitName(unitID) local totemName = string_gsub(nameplateName, "^%s+", "") --trim totemName = string_gsub(totemName, "%s+$", "") --trim @@ -414,6 +423,21 @@ function TotemPlates:GetOptions() name = L["Totem icons on/off"], desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], order = 3, + width = 0.9, + }), + npTotemsShowFriendly = Gladdy:option({ + type = "toggle", + name = L["Show friendly"], + desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], + order = 4, + width = 0.65, + }), + npTotemsShowEnemy = Gladdy:option({ + type = "toggle", + name = L["Show enemy"], + desc = L["Turns totem icons instead of nameplates on or off. (Requires reload)"], + order = 5, + width = 0.6, }), group = { type = "group", diff --git a/Modules/Trinket.lua b/Modules/Trinket.lua index ca1fa4c..5338494 100644 --- a/Modules/Trinket.lua +++ b/Modules/Trinket.lua @@ -1,4 +1,5 @@ local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber +local C_PvP = C_PvP local CreateFrame = CreateFrame local GetTime = GetTime @@ -25,6 +26,49 @@ function Trinket:Initialize() self:RegisterMessage("JOINED_ARENA") end +local function iconTimer(self, elapsed) + if (self.active) then + if (self.timeLeft <= 0) then + self.active = false + self.cooldown:Clear() + Gladdy:SendMessage("TRINKET_READY", self.unit) + else + self.timeLeft = self.timeLeft - elapsed + end + + local timeLeft = ceil(self.timeLeft) + + if timeLeft >= 60 then + -- more than 1 minute + self.cooldownFont:SetTextColor(1, 1, 0) + self.cooldownFont:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60))) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") + elseif timeLeft < 60 and timeLeft >= 21 then + -- between 60s and 21s (green) + self.cooldownFont:SetTextColor(0.7, 1, 0) + self.cooldownFont:SetText(timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + elseif timeLeft < 20.9 and timeLeft >= 11 then + -- between 20s and 11s (green) + self.cooldownFont:SetTextColor(0, 1, 0) + self.cooldownFont:SetText(timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + elseif timeLeft <= 10 and timeLeft >= 5 then + -- between 10s and 5s (orange) + self.cooldownFont:SetTextColor(1, 0.7, 0) + self.cooldownFont:SetFormattedText("%.1f", timeLeft) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + elseif timeLeft < 5 and timeLeft > 0 then + -- between 5s and 1s (red) + self.cooldownFont:SetTextColor(1, 0, 0) + self.cooldownFont:SetFormattedText("%.1f", timeLeft >= 0.0 and timeLeft or 0.0) + self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + else + self.cooldownFont:SetText("") + end + end +end + function Trinket:CreateFrame(unit) local trinket = CreateFrame("Button", "GladdyTrinketButton" .. unit, Gladdy.buttons[unit]) trinket.texture = trinket:CreateTexture(nil, "BACKGROUND") @@ -52,55 +96,12 @@ function Trinket:CreateFrame(unit) trinket.texture.overlay:SetAllPoints(trinket) trinket.texture.overlay:SetTexture(Gladdy.db.trinketBorderStyle) - local function formatTimer(num, numDecimalPlaces) - return tonumber(string_format("%." .. (numDecimalPlaces or 0) .. "f", num)) - end + trinket.unit = unit - trinket:SetScript("OnUpdate", function(self, elapsed) - if (self.active) then - if (self.timeLeft <= 0) then - self.active = false - self.cooldown:Clear() - Gladdy:SendMessage("TRINKET_READY", unit) - else - self.timeLeft = self.timeLeft - elapsed - end - - local timeLeft = ceil(self.timeLeft) - local timeLeftMilliSec = formatTimer(self.timeLeft, 1) - - if timeLeft >= 60 then - -- more than 1 minute - self.cooldownFont:SetTextColor(1, 1, 0) - self.cooldownFont:SetText(floor(timeLeft / 60) .. ":" .. string_format("%02.f", floor(timeLeft - floor(timeLeft / 60) * 60))) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (trinket:GetWidth()/2 - 0.15*trinket:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") - elseif timeLeft < 60 and timeLeft >= 21 then - -- between 60s and 21s (green) - self.cooldownFont:SetTextColor(0.7, 1, 0) - self.cooldownFont:SetText(timeLeft) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (trinket:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") - elseif timeLeft < 20.9 and timeLeft >= 11 then - -- between 20s and 11s (green) - self.cooldownFont:SetTextColor(0, 1, 0) - self.cooldownFont:SetText(timeLeft) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (trinket:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") - elseif timeLeftMilliSec <= 10 and timeLeftMilliSec >= 5 then - -- between 10s and 5s (orange) - self.cooldownFont:SetTextColor(1, 0.7, 0) - self.cooldownFont:SetFormattedText("%.1f", timeLeftMilliSec) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (trinket:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") - elseif timeLeftMilliSec < 5 and timeLeftMilliSec > 0 then - -- between 5s and 1s (red) - self.cooldownFont:SetTextColor(1, 0, 0) - self.cooldownFont:SetFormattedText("%.1f", timeLeftMilliSec) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (trinket:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") - else - self.cooldownFont:SetText("") - end - end - end) + trinket:SetScript("OnUpdate", iconTimer) self.frames[unit] = trinket + Gladdy.buttons[unit].trinket = trinket end function Trinket:UpdateFrame(unit) diff --git a/Modules/VersionCheck.lua b/Modules/VersionCheck.lua index c6ae30a..991fecc 100644 --- a/Modules/VersionCheck.lua +++ b/Modules/VersionCheck.lua @@ -1,3 +1,5 @@ +local str_match, tonumber, tostring = string.match, tonumber, tostring + local UnitName = UnitName local Gladdy = LibStub("Gladdy") @@ -24,19 +26,20 @@ end function VersionCheck:Test(unit) if unit == "arena1" then self:RegisterComm("GladdyVCheck", VersionCheck.OnCommReceived) - self:SendCommMessage("GladdyVCheck", Gladdy.version, "RAID", self.playerName) + self:SendCommMessage("GladdyVCheck", tostring(Gladdy.version_num), "RAID", self.playerName) end end function VersionCheck.OnCommReceived(prefix, message, distribution, sender) if sender ~= VersionCheck.playerName then - local addonVersion = Gladdy.version - if (message == addonVersion) then + local addonVersion = Gladdy.version_num + message = tonumber(message) + if message and message <= Gladdy.version_num then --Gladdy:Print("Version", "\"".. addonVersion.."\"", "is up to date") else Gladdy:Warn("Current version", "\"".. addonVersion.."\"", "is outdated. Most recent version is", "\"".. message.."\"") Gladdy:Warn("Please download the latest Gladdy version at:") - Gladdy:Warn("https://github.com/XiconQoo/Gladdy") + Gladdy:Warn("https://github.com/XiconQoo/Gladdy-TBC") end end end diff --git a/Modules/XiconProfiles.lua b/Modules/XiconProfiles.lua index 46c189f..0dbc157 100644 --- a/Modules/XiconProfiles.lua +++ b/Modules/XiconProfiles.lua @@ -4,37 +4,34 @@ local L = Gladdy.L local XiconProfiles = Gladdy:NewModule("XiconProfiles", nil, { }) -local ExportImport - -function XiconProfiles:Initialize() - ExportImport = Gladdy.modules["ExportImport"] -end - function XiconProfiles:ApplyKlimp() - local klimpExport = "4XzRB11DIJZK(NZU7fDoydgm7DXKqsE3KUZgy6m75mhMiSfGMyS8kBN00xKF7Bv6dBzBCWDVCtsWixQ(sLQNhPSYz1YvlIebCrevmJhZf4diR(QZQfRL)CR8Nc8N5WZk2Sj7UqEYc2pPR(Q7i9JcWFCzC6oYQ5EJgmAOZuppx)rJ8MoE1MV4nC1IqswEaPZPAGCQgiNQb4uPh)F(nqY08vF9ltGNftYKt)J8SvlU)65GessxkO75I58K8)hZGhGw1vSmY6y6mMimMUADLkS1E6hCXOpvbULY2UdePl8vP08BPK48DwpF8aPoWZP7FmMKtvUHlJFNCiBjrSLMtJWjx6NwSJ)(LfcYvu5hXNhjEMfLVBojmNJU5lgIpBgiPTCbJMHQzwmLMI)bnbTOOvbRwSHlcPOVafcd)9xDgoEWuLUNlIZYls6Z7aHOH47isI69R4pwnn7iI995fg7oym(cVM1Nr76o1hhDwijpNk63744jTIiwg62sY7ZlnEWezADuyVgTZipC0BOerFgVRJJ0meCEV0gp)r(6aXVWR4kFfAkyYKKqAVERPQ3ksq2YtYwlOK8D95fhPDYfK(mAVPtu(lbL(tAUG0Ruyp)HJW3ITpfEsVcmLPJhcJ5j9Yfm2rQBsNaw5awTd1iWArMQHlYpapzXDjqg4gsi9VUmk6Bjz)1nXKOOd)1D7jBPz)LAS)9nX8mOI0oOKqSSSGzb)mopoI)UQG1YV9OD9sZ3DJG)(vmbnmNbk3INU7MBxwwtrwQsUcih)4Wjd9XpeE6cOez5yO(2yB3rUwqoEodMCwKKVZKUe0ftDvY6cChG(jUHdMa1kopkgum8Sii)HENfbnE00ZJGCg4DMKK3WPJolcY3198Kp5oYVln6cpt6Ksyx4DAXnC4yy)TZHI570PI9RjiVXtopbpxVPdopLd8Dg1Lt6chTtFAvFGNqy42QNdTYBYWZ0kyph3UmpOmOLSUy64tloyRTPNh9YzYzYaD8ppU8HqVxD5Q(1KKZ4UR)EHZ4AjvyuW)0IesSoplC8DgFE2JbAi6)VAuEDmmRwCf0aB2JqRceePqhGykH68LHdvJ8Eww(v0nKIyzRJZI5Kx)4f(MpEzXoc0NrZ2OtfmyIYpiH2GtRSBW)TSpEj4ynewn8rYH)iHLaIUinvqZYWox6A8oYXpBhO4SSMDNvnSHYHnNkiXF8cmAa60jg7J84dGxl9uQ6TK97PcLV4FvaArR2KB(glyX02ntBzsYnEMlBS9ek5mEb2czwkngSRVaUmLSJ6JWzjB)4LLqNZF8Y1B2aDiEQGcmzN04ULTMksaaMNyCbKSU9SkJ7U9PKtRuzhc3XcblpesSAIxS5OVuessOGvZfI2W4A6LUlegAqmp81tKDFxscv82Nz0Q005cEw(hV8v(BnX4002VHieqja7y6ju2Njqsiu3yFtGqn9bZokqMMJ6k2Bm0tbWoOXDNoPSFvnGnfIdNqQ)rswo(LF8YLB2eZKGs6RbUGgvOqX85ZX1iw1TXYS7NaOUDxAYSgkjSqwKrgSF)uogS8fudHZIpXiLO7cPP5yCPf3hTQkO4Ja94TGN3CS)xSWx)vwUheJvrrhcwL6rmZ6Z9Ko6Wkg7bVcSw9xB6yjDpgLj88H3G6eONb0Rtm2L7W1HucU25zw(ow3kURUoFlsuAktaxCrsKQeiUx7jRb6Q98rj0d9kiDl)9yLdFjfwmFkfArorSbaQ3RKLB4fFYgyQX8aHDQYHQ4P0j8PgKUCysoBplI0J1GluBi9eDt8jY08u6kKWGRPsYf8tTSArlQE6y2V)ZkC30K0(GIt5eQVuc3hnI3TB20Dcf3KTh5mp1fvBngyUHQNkcVVB)(cvvDRoHbKeQoHh4wHVs3KNQFW5c2p)4L)7csKGKtGC1LAr)Nw0DNYFNkEelMbkhK4fG9KQ4xYIFlzZNY3ToPZiTx1yAVPQpNRi694T3EHS39s25BXX)Cpp)rJgp0ZFGVpaz1xFMahL2DTwBAWDUV3GbEJg5oD84Xo(UUW7oAQQL3FdM6Y(FlicA0FVooTMBwDGgakrWtipHb4DXYEsZTHZazW)uodR353x)KbvTcw7mlKZQcxUtvwZo5ztupjWwekB0hersISrX9W4uClkyjVsZFIsIoGGmGUvdXFttO7LpqpG)itLRRMj5XxqZGzoLiGe)fasGcHMiZmCCr4RLv9gl3bdzheGnfRLQ3dKFGIAN5OvSIhtq6Jj7Pv8ZkDS2h0tZOt21vRjlfPosifQxJdS53ikj3zYeLQjm1uavamjxlza2dC5dj3CKvrclvSIp4MljZfKWxPrMZkAPSDBb)nAeUhlwFBwmlfLrqmmsSWyGPrpyeGM(FcDsaW0Whd1E4OcI)9)QiARm2RQqMJ7DptuKratd)(JHxcE8LGLePRrgydJiW0prqjChOrjqLWhaWkrGI3Z2ihyRw)GETj5fckc88gbjlvPTsCfLMZ6cH0kEg97GrXzzC5dowt4bvnqd)5Cyd71K4yPWQ1aN8ba8rwKPhh1qeMwzKFgB3mq3VsWrAziqVnUT0Q0VABiJk2owSoWRG4Q7LODuXYXdB6svpCgU0bEYsc4LLExRwDrnGksLsO0EEKbLdKEBuZLp5GGVo2yE6SLVxed4JiRzX4oy4xO1kqlbfozR1UVYPfWDtIz)uhhv(g7MrBpQYxwdXc(Skd5yioKtDHitB3xX5spCTwsXhlfyqSQVtYBs31ZuYRqHlmQYlKMC7MXr1Gqfmq(ycsxQrTKQ7HQccD(U0gwZJZnEuCZV9hjm(mllsP7vlEH1xzyb1TnSs5cXRJ1LLR9kgeqVrTsEzP74wlTQj26nVdp4bopzJ2uR3lNvAW17xdfDKJXQphulb04fPMiZtSuW8LFrfhmYa(B8cHm0avd3wqvpKefFWSOas1U7oJo8LKI9Rvdx)L3P(sOE5AybNz211qmHZMekeuHq02)CxsgSve853XtPgfdlt)xl3H1VfyfusAJOaM(KaDq2mh5Jx(3LKt9FGFrahXYRzPcTgsOEPCjkLGgqrcAbGiOna0avZZ4V0A4LI9QQm2TOIr7dPCiHrSNrWpQleknoEr4U22ILjUKNabh5tvWuG)4Ayl8DR1vXBI6aJ5WIk54AHDh9SKFsTErAJ57jA4Ryt5gvb9dzGVlkZo2vIUhNLFazyulRxfbAvMQdwYGVP(oKlO4Qivju7m5asctvSQX627LhJBGnNgbv5YqFmk9Sw5rtDqnlCbL76knTMk43j7tzcmn2Av3T0FCKSqloPKkbnf3FVqfREcSMc166zcwAAS1ckPb0jfb4ltFd0(6jKTGBjhNE79QG61)yhb3JsnlG7gYKXnXLBXHpcpxB5F8DwQCtxtPii4gZvRvB6uEGlYr(FXgov5B3wye8deHC)ILfyHT)awEqK6KQA2coUCqjJWxLAVjzsvSMPwDClhdGMI(QVck0as4YYEw6MZ2a5caqPXmfzWqvA6bscrf)G8vXoDZ3pPs(QXPTT1UaA1twZ(vAvEdQ3u1uD32eTwRSX5XevwFm0sS1oO2OPRhKUClpbFL8kKa9(gyHiSm3rb1D76yGHQjJwqs2c5a)rQfcc5fHqFfhsXpkaVjl30q86k90CbRMyAJ)YW8csS8mq0AL8AwquxGkycNoWUJF7B518XdgoY3D4ypNbdgmeWECAaODd(2(AG1BVP2(TVSj4v9sPVAeqwoKZaOKYJusJLQctI11NZyTGgGWEZa0J3Zsqim6qTfuLirTRZIsaYb14GRq(41KIqZ1rNr(wbNL0FiRzH51S9qlIzhHUezA8rsVm4SLhuBxx9o0DcDaH7Q837j)deDwSmy2xMHCuWc)73CkJinHDHP9Dh7n(RwNlNDsrt86DS4ixE9avwm6SSJz2C7Cy1CFF3joEUEt9M67pEWuKeeic9JvZh55mAQ34PE(UUoUJMGFJlmRcAcrwhd1w9110BCBV8J7oaoes8Pi0iNQqma2zj1mFXBG)GXUdh6oDS7KHdLtoYEeppNVhQxd7lU6RFXXVw6)NWOvqnW9EdSCR1P1WeKqdRIBatW53yXtnExKClbQsFwCBZx3rtRLwGQuMZi5hRyAZvsuGHXl7AJgdSRj3knk6t4jSKtU2KliJhTpEzTYuQJERQFt2o(TvR8MVzt0Ive5pTQyuUruJ7H7enJOd1eIQVYyxiVYH2lVkDZl2JB6xJhVESSRw57(DxGRrnvF3uqN)Ps3WMUb4ImOBhzDARcNLCZ63E1jeFOKgvb1AhQRv1bHP3QsTo6QjJAAJq4LMBIGFPRtENU)vwVuBZMudzPdAUgSr4qGxp8Hthpc2R21F8qhfvWJqlQRVzDxFtUDrJMC2wVBNtekQD30ljju7e7OfOwRCIeFTioU)flqstFThPR6HFdayltHzZyBDxU5iSEoYQyqvEHTUyL)OF8rmMlm3Ot)wAik5Fts)T3jStpO9uU7xDRwfxQbgMub8m03v9C)oIn5UKnfzAOmpq2AJ8eHDyXpZZmffC3W2KFKhpNdyzLm2Gx3ffENVbGf0GpJjcnY1LSTkynZXZKxcBjohhxfKxfSVNbCYsWavx1Hk9wZY7CORrwErKctdf5MW8AiYKpm3raetcf7jpxI59Y1CiPbqfAkZiNvAYpzOfaJKIOTnq8UNsIm0clT5h1WLUlewt9DktX5)rOZ9rb5G5nRPQqa81SxvmuBpidFuwNdUu1)NcaUAPcTChxOMZRte6gdK3ZdCwGWGuQTUMsnMQhOYZywQnihfklpKdnpEOLAHa2ZRcgeHGPADR0twH7EwmehcRYcMX3VUcVmYLfYYqIYdMKbIU0WqU6Ef1B5jnHwQGsn8sOi7dao)gnw6ovCpNcvRuqOHPevyK91eyLXwMnvVB4gUW00ClQKrhehD5(0y2Mdii3TSqzoc0ptcodevEKmKJqCHM02ufVqDDDSM6wZ96b3Ejowda(E6BSCnLQk9BBHoVTEcEv(BqmrZNCQgLSIAit((CIk1664IetwyiTMx1yV6fyLl4Kb1YpvE9AQc66Cln3bZi5vY663iMSRQfalEhksus61rZPXZxaKI(akUISpLMy5PVstLE9avN3mcPs(glJvYq2rWvPtrpwf2XvLKJ6O0AR2pRV5zp65jO2zx7wFlRpFcRbqV(gZD9)Dwu1vL0f(ySSi2NVtJtDoquhaxVFLMUBvS8iWynE7lCR3ktnq2bFB5YV9qT9yTALExZ)B0q8erIBjXB6rKt1hZHeYEwOA4b1DqYJcgwFwKT2eGn(YjL9h9Ba2QwZJL9b3dnUnAFTF0M0MEih5Cw1q3UFz2CQ34PgETtLE0eUvObjo6IR54(n7yQjDdsvyUhGeFYqFh4hJ99hAURercaRIi)Z6TAInEY2T8kB5SnbCD11D3WKQ9pBAwBilTBc1WUxR)rlBFfwQIfdhJ)JFb9a0NiQcvyDadkPuoJYk4RpgqdJRqfaM4maGOaavaCkEWpWaqduwQCLbRAEFz(9xb1mxWIjolFaAbnVpeFA168vR()(x0twDc" - local deserialized = ExportImport:Decode(klimpExport) + local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetKlimpProfile()) if deserialized then - ExportImport:ApplyImport(deserialized) + Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db) end - Gladdy:UpdateFrame() + Gladdy:Reset() + Gladdy:HideFrame() + Gladdy:ToggleFrame(3) end function XiconProfiles:ApplyKnall() - local klimpExport = "4XzRB11vIZKe(NZU7fJhcqcH9oJkk7QZ4kmJV75mhgBsAG(1q6SDs0H5c)TVv1FK0jbK48YnQeQU667UEQoUWzX8fZIebCrevCbpMlWhqw8zNfZwk)5A5pf4pZxmlKZJJ4VM05fSSy1QSa8hNhNUrrxijlpGCWnTNKh9K8OhYJiGi12Q4XeVb9C7ny8Wr(dC89g7Uy1NCha8nMKLnnKNCppBXSBVAcW1K05c6wUycpj))(fqmO5sEhjUKLrwgtVGjcJPlwUywk)vQ48W8cs8IGsP8gkB9gyn99akO53qjX5BSEUxp5MWZPBVpMKtv655XVs2LnNiwtZPri3LgIzB4VEEHGCjv(r85rIhzr5BMqcZ5sJgQUaFwZfmAgAyYIP0u8pOjOahHc3kUiKIQkYcg(7p7mWR3yP9kmxeNLxK0L14o2BaUgrsuNxIVNAB2qeB7Yc863ZdxWZzDH6(9h7JuNfsYZPIUTghxPweXYqZwsExwKxVrYq0OWorTZqxK6vuIOl033XrQgcoVtsJR)qFTJ4dSK(YLqtbvMKes70QgRwvKGSMNKTuqj5B6YchQnYfKUqT74rk7LGs)fnxq6uiSR)GH4QyBtHN0jhtz44UWyEsNmbEoszl3kJ(EkqhyextXvzQiolFhuBy20eiqCfjK(9ZJI(ss23VoMefT77t3c0N9DfT)46yEgu3zduxiwwBiqN1BQEjlln)l3Bxv08Dxl4VEjtqdZzGmo7HPxFdOiBKY2DKFI8YUu2Izxcb6z3d8IG1tAvlJwvT7tUokQULLLFjDfPiwgEDrmN88BpXx92tZ2qaHOzQwQGbBs(oO4N0cFPmI5VL92tb7lOPI8HsYVNWsawxKMkOzzOADi6DK0FXgOIllRPhSISbsYMqfK43EcOgkUEeAVNhVdSyPhtuVHSDlvOSf)RcqkALk1CfZyX02jCwQKm4FIm4)ic5f8cm(klLgd61NatMI3rDH5SK1V90Ci76TNUA1ki85yofyZoQYDdBjvKahcDe6cizh2YQuUPBtjhxOY2fUHfcAEiey18mLMuFUiKKqbTMleTl130knneiniMh(8rIUNMKqfV8EkTkmDIGNL)2tFM)sZ6Gn19Rjcb0xGTp9ic7JeiiCwoFBZILnTbxS3IDnP6s2lm0sb1KOXhoCsP)QAaRke7ocx)Aswo(LV905RwfZKvS6QcoJgvOkX9(7Xv45zRJLr3pahhE4stMCOKWczrgPZ(1JzyWYxqneol(iukl9hstZr)sR(JAvvq1ZcAXBDeEtA)3SWN)iP7bXyvu0GGvPUhJSEFlPJ2TI(EWQa5QFSTJLCyAuQWJ7EbQtGwgqUocTZ3G5HucM78ilFd7WcEFDD(wnA1KNWHMfjrQsGyd4hTgyFTLpkHURtoPB4VgRm4ZPqY8XeOz5eXk4u8ofSCnV4DoatrZDe2XkhQ8NsJW7Qq6YHj5STSishYbNPoq6b6Q4JeP5QKviGbZPsYf8JLwnRv7Ghy3V99kC3uL02GIJzeQNkHNJgXpSz20DcfpKTdXmpCO2XBqyUPpWkCWt3UTqvvVcn8zJhRaeFwV(waXvOtB0lOKF)rzJF9h6E2OfkGTwn4USchpUEGxqtJa)91mOnG0)Wc5CtzEcxHcC)43ptcQPezENX8BeqBm7ypS)g9LllsqJ(XY40A2TzmO1Sp70hvq5udG1I1X(C)2kjcA)ykP1A(qYx2)RGimYN0xznEbhhdkG6ium0vQitg63FeaM3ZPNxF)EJ9wS6tdHihssISLVTWALNIMlyjptZFGsI2HHcqFNH4VPj0TYhOj4RzQOw1UlhvbnduZvq9vaYzwHqJwjdPkcxuwf9Z3aKSb8HMIUsbwJKzJzik1DdReKT0YOXXAlAfoMHJA7yYUQk)QKTANGKX(N5IOaHUdupfjS28AuKbzKMyJ5malagvtYntrksyTnvG3AMOaOCdFMgzMUZCz7Vc(l0i8mpSEZfXSuKhbXaLyHQatJxafG89pHt2byt4JHAbCuaX)(FveTw6bvvSYXZsVquKr0k0(WVap(CqtI01ScSBRpWC(Eqj8dOXfqKWhaW8qGB3YwjjSvRyqVVK8cbfbcETGKLQKwzF(LQZYcHulEet(aLIZY4YhSVMIdQAOf(ZjWbOljXYHWvVHk5da4CSitphkseMwlKFgB)lq3)qWEocpqFSQn3QKVAhqIc2gwS2XRGCQpBVTxXYWdhcsvp8cmfaEYCcyLLwxRwprjGksLCOuFUNbj6sRnk5YNStWxgBupD0Y3kIb8kKLSy8ef8l0sfiLGaNS260q52c4GjXSFP9JkBJDZHTPQCXAipWNvri7dbGCRlezA9(soxAHR1Ii(yjddIv9bsErAUEKsEgk)GEvEHuLB3CmkgeQGb8hdqoKyulO6wO0RqhVl1HL84CJffptA7ECJpYYIuYEvYlKFLHLfx3qlLjIxfRlUwBjgejVqTcEzPB4wPw1yB9MPHhChNNSsRQ17TYkm4QTlHIosAS67aLsaDCrQXZ8alfuF5xuntePd)fEHq6AGQHRlOQhsII3zskGqTPtnYWNsk2UurU(lNQ(sOE5siHZS76Aig3zta(bvi2STpttYGJuGp)kozzKnSm9FnFdEiUaRGssB4fWWNeOJUMXiV90FxoSO)b(fbCeBTEQrO2qc1PYLOgcAaniOvd9bTbegOAMf)LwcpxSvvLXULr0BVlLdbmITmc(rDHqPYXlc30wxSuX58eW5iFQc2a8hxre5BwQRI3efa6ZHKkjDTWsJwwYVOwlK2y)EGg(m2KSruq7qgy7IYS9DLOTXD5Nqeg1s7vEGwLPoWuRGVP(jKZOywKQeQDKCajHPkw1iV9wZmxRMXqqvSm0pIsoRvE0uhupvSGYtDLQwtb8BKTPmbggBL1Dd9N7jk0AgrsHGMINVxO8vpaAtHkV(cblnn2kHsQaheYoUy6lG0xpGSf8hjD6J3RCQx9Zne8mk1UaMBisgpexEeh(iCi0Y)4BSu5HUMsrGZnMRYvBAuUJlYX5XITnQI3UPWW47ic55fZlWcBFfspiszsvnBghthu8i8zP0BcMufRzQSJB4Od0u0x9vqHgGdNx2ZYHNHAGmbaeAmsr6muLMUJKqu(piEvSr3w9dQGVAZy2wBNbT6jRz)mTkUbLBQARMUorl1kDCsmrf1hdT2ADcQn626oPZxZtWLKx1JFNbnHaKQFvPskB0YCnE06cBxdXaFnfB3h5MPbDDx5vxERPR8jFAKNRNJZ4bEEU9h733G7WgHPfcvvp66Bz1cikAfwsu3fkSp(YRO9)aaJYFhnhb32aqSHbEaEc7RRTgUmfmmSQk0padcNLqeBGl43ajxnKMT39o4b1sGSiI999ObjvbsX6kUnMqaCfcJndakEllrtU05BbEP6U0T4GKOgokCI5w4DQbq2bXub639qUpKnL)x1u1mcvMoSNWudCB5TjBBFNt)PSI6SzBXIklMbTsHhp9JTK)em5ZMhCXNUaNbbl8hV4ucXTg(njIt9xOm3EEvg3w3WwK4ZfXXVVlvgyMlFjaQb(S0TApxfTJDwku0Sd5P)CXe)rdChoEONR)4(9gaWSHmVbWAe0eISGik4kvPVRxBZ89B2bges8XgSrovb9WEMdDqcxYZZ5BHZaGZAb07dCRRJ7frT94E0(czCQ((q1pYAQvo1nWhUuHFLGjNJeSBDjR0U2sROm9ZVg6mlt1Cgeuwn(n8vdPCowvx(RPU6H2yltyuZb8PEG9e70MKUOl1gSwPyAoH4a3eTQcr5LABpAL(wCZQAs5XwRTfhzXA58mhO9id0XydAMn3X4lTMVV7(UQWBdzy4(nk1giLL5wYk97)tpR6KkhWHEpK2CWYsa)Sc7Tf03pyqkKXuCCpVVJ2P1rjwVusQsNqYNUmEVAfXTeS6VLxFO666xcI6TUCKJDR9(GPNAxP7TD)mgY7MRvptUaZe5G(IPVQ6D7vSh3PjRkY0TeFhzTncgS9vlC(pYuJY5A2Q8984j4mgLi)XxJbvFZFbA6udIjMi0iGMZwRApEcExR4(aMdKUkOtk4dpc4TKnvwDf2vYTEAHaU7CwErKQ3ykIX1SmSd33m39l2Blf7TlxID68L8ygIUaYEOKmDN10KFXqnaOKIO2mqfUvg5zPZ3RB7EAi4o)gLPMb8Egl49cYoZkRjQGd85SNvt60MiZCnSUFtPO)NfaSNsbA(gUqTNxLi0TUlV)ECxa3GKRTE9tASv3rL3DOuAqSUknpKd9oSRLyHa)YRCga2DM648slzf(TlGmvryvuWf8TlRWDHZebrRMOSGjzaRlvmCMppJYT8chqnfGlBW3QgAeaa7fAS0CQMHzkKOOGIbBjkW4u8sGCJ1m7rgUIBMPIECPIkECGbqC(waB6QDiyP1Sqzmcunmb3bIkos6YrOsqtNRQ8xOSUmwpcqZ7RbwajowdK6w6lSC9O5uY36cDCB9a8Q43GyIEUKPA0wQrmyI3NquHwxfxKyIcdP1SQg9vNGvMWjDQLFQ81MOYPRJT0yqVGKxXRREHyIUQsaM9kuKOC4j7nMgNtnWf9GUVKSnLMyzPVups26oQdEJ3sH8fwgRCslY2hUHeVQd9zOlPIn5)HQ2xRl(AVgXzh4CUgf5lVyq1tg1RwpEwNeRLW9OlN1VDhEw6thAjQzFXkFWEGFGNEkuBzUv3aD3a3PJdB1MUQWY(AQ1B)DhGgDjxUCxczllujGWd3bGg6n0X1FqFx8vuTNVpcAyOH8MTsv1yELpQVl6QRUvoNHnPRcNOQzx19H15gxmDF04L(2DyVHdCg7623F4qx59BkFPVnaDq9ZYVB1q6MMVZ2UdnDs3bxxt3H5eZ95pgAdqvhiBLiKbv8kYwAIdmMWrn6I)3pfCZhSVxT9QgmuR520vRtvVzB(Wt8W0PyBWvAbP5LSAGp181EOkcDGBB8ev3YCnWoL9f7Bhe3(1DWEnYiRGVmF(xURskBg3BJvU14V2dgNE7hJtz9X2JQq3FVQAlYLC8JdgnWh)q4XT8elmbvVLk5Ag5460B0jHt(oJoeJoBSP4T7GUYUb9g1Z7ejyJ7DAyKpeYDkyK3WXNgg50Z9eXjxaF7jHr(97FAIN6p0)qseoxY16Flu)(OSBWapVbNebZ35Gc2hJrUEJonoV(UJ7DAkh47m8qgPZC0g9Xv1TocZW)ZBofsL7ObNOmyx4OHdOEqzqlED2yVJZUbUJhFAKlNrNif0X)0yYhGxYZjHtoEhU(7zoE1cQqVG)XzjeyDAsC8D8onNX44(x(OH8gZYR9RNPvRpE1Ez36WSTBmPojxCX6Nh6FQr9iwnx0wVEvnbPLb8jwakvOg8w08Ta93Vn3Mn31gNyhhHCZ3yW3fyw(If)))1HXqD" - local deserialized = ExportImport:Decode(klimpExport) + local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetKnallProfile()) if deserialized then - ExportImport:ApplyImport(deserialized) + Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db) end - Gladdy:UpdateFrame() + Gladdy:Reset() + Gladdy:HideFrame() + Gladdy:ToggleFrame(3) end function XiconProfiles:ApplyClassic() - local klimpExport = "4XzR7STCIJSKFo7Up0oKq333myJTph7E4yOhpBetW4cubuhlK0wsYUPFWF7NmRlsLeiGUhIOd3GuvzL3ZSYmzU98zZNgZhMXJP8rzjzC8bK5F1E(0fI)Uw8xo(3Y5txMLLeN9rApBySNRtKVRDK1GqFh7WW5R(INlcK(EdVV3ah2IQvRkgI)56K8nYZyjPOCiPxe2sGWwce2sGWY1)h)gafA58VoimaEycPO4HLzPtYkMp9XBhdGinFgNUnJpolT8)tVAlK5CdRGSiHoIXxMqNVy(08SpO8RxwwrsMpS(iUNYwVbpbyt50Y7PKKYngp33sCizL0TtsiLujrDDYhKDfZi810sAmcDbvpDt2hxxXj3qfFfFEm)fwC5MXKLLzcXX0n6Jyg97LvC68PpXszBjjSIsC9iPayhG0F16QO5tl5S03OL7Z7SomVBdG4jcKxJwJuIFd(wJqs)Y74zFCdJtxwYYs1ltIRpr(oYXm51ZNEtgNvmzcGjibVhZM2io(IVJ5bIsWPSFaKNDK(5n02dB3wLsBRDCvuKKiVYAGHsTuakXMXC2p(81)vfjMtkjF(6mnnwRc9fBLkWekFjnTKSwGOkzBbsGIn0vCfZBbIU474m(2(1LVkuGPAf3ZwgQnyR5H2wsgTectl3bS5PpKws5RilP)51XX)wAXFExcjoE3F(WwG4k(t5A)RI))kcNg)xlsYBX0uYGbijkSQG9YsLoo6sLOs9POsJ98RJFcjKH5NTVwj0qSnSzD1eYyVa3qlNq3qxROiRalWFKlO2qstZQsxs3c7TajbL50Zus8oubOiNUe)FAkDR4bQf8TcWWEO(0fMYu0anNWl3b0nTOIRSwekpX42kA2XSnWs2aIrHVLsfkRmLQ9b0G)bEE(UoHbErwUb2(rk8FfNSLQChOfmnwwd82xwvCBkAlg36CuYfHi3TJhTFbzgh4PXAzwlGPocRAvTzSTuHvcPu7vjMBGInog6A5vYjlFJgRDMcB8HT58S3PXF(6lGM6NVokHLJWyycSYSQs8Zt3qalhyfaM()(5RtiSu8XGFLmebXp)pQIxlui(81SvF(A5gkakEvbbin893t2c4S8L)JQIs2sX2UgOe4ObN8Id6E2ckpvbYHjSub5mc4mahKuwcOe(GB4ag85RpYwjw4TGkC66eb6)CwwzXNV(vcgg4)c(0DCsrUeBZb(qd5SOIlOIxq(oquzSImXdUJW5aZ)Zx)cGySeAQevhTBzswQ4JJbF6lijIyEGmPSePmnnaoA45mKOkrtF5s4a4gsbPN47jzFiadLi5nzFKi5mZOWrlE2te22wqRb)a1j2wwmreubrSnSeLGF0gm8jE0vPhqQyW4hbKI8HJq7j4jZiaxwWDPKYn4ZzscKYZfqOMEMWa)gcUnI5INSJNTirtEkTLFVkjfKAlyjmW6gFHcRaSeq401cqaSTk1XcXbHi2)qjhL8gi0lnbi)HKIn7VQ6npMNvuk(Uud5BPfLO5WNVE9QvjSL18QkEHIUVjltWHFz37GoNI8Whla4qKAanEY7c21luYBG3muQMvji5)jB5BMQicE4ycLZa4Jki9HgTuQEe8kWv67cAyrwsPMJIX42EaX4lSIyjU3y8c2xfOx21DOsHH4TjkF1T2cOcSSQOG9o1q5LLVjZW0QfyBXPWh8uww6kfPcjCjHzjplXun42TlaNoI18mf1KiAdQmoVkxlzEMLdKV4ftYs2bs5CLa)9SkUq0aEdxxrLpKeNStBuaQAp8Ggh(sA12fYLRE5dYxc(lxagC6tx5drloNuSB5g2s4bl5uYwj(Tp)5H0ci(e89piCXIWS0KFA2g0)nh9GsY7ifq1NuArrxDKpF9)Emi)t(FWxmeu5HDlmHfudW1KMYatC1kQ051)KfNs3ziXkj8vcqPnVeHBwsZlBE0ujgnvHHxZ3k9YmccMLB4(DxEgOWW3Yi4xvocfexw1Yn7tlgK4SSuq4iE6Dzvsk4wiU(MfkV4sTETzR48EgmQeRRRdCbNL8dQXgPDoVNPlFlbqdnQG8HcG3fxyk7q5)qL72B)oOHrnOEPeyp3uJ5uQ09YmoYDA49TJqoLIwrsxOMAYdjPmPZQo2TpkY)sSZ4QAxsADzi5gjE2Y9O2p4ergxcXRmQRG06IG)ozBoJJQXgwD3t)(b0cLom)A27ejsqZX47vsz1Za1ujTRhXz55jgguccWWR8EobFM(oG9TvivbSA5Z(zQk8EJq92VVHGXOKNcWUbnzmiUieh(i8gvIp87SCrqxTRiq4MKjTv7YuEkJxssW1Yzs9T7R0a(jcxeVywf6y7BG5brGtsVztZqZbjmw(Ma71ktsN1mP1X9zOau70x(kWrdaHRRZzrLedKACsYESmWaaqAutrimKUMEIKsKYpqFLVrLL(ZsLpHBdT3ctQDkKQNWN9B0g9geVPYJ6H1PkSwsJJtisT(eiPyJiOtLi6JQVAiKUEDwkULYMRmC2fHaVVL(2XnLYOB62hVYlRbDGVLBCTcJmFJ5JGOPRH7rtfz3waKDo(bAZAwLbEhXBNHGGH))xTD8TIK3sSKNuG6TNXE8IGBHd7HNgF2Bj0xEmBiY74EQn4pWYh3WBfNZQhmisCVXczsPN3ES9eurmyCdSnqf8m2KVvGqweV8SwTTRhU6vycVNX6hyBlidoy)DoR3dUIQsq8tSLbIT0KsY5SRi5UI5eWiOybhtv(C2ORIjxroNv7ffi5xyKik6A4S2vOJOyHST5WtolbtT6O6UnNXw8Tf4MrbvAvCT6AlOQk4IM1HGCbrw7oasrIsk(VQGCeoIRJRc2R6ukamW3R2dGbkyFLt9kBklgwkYMBf3Q6tLIkoEcpyxf2GgM1StvWNMRMBupqnD)e57iIumHYFKLklwGaxA73QNck2PYGjz493XTKtl1SslRdv9X9knzdjk8MFaVS6Ip5BWU1vgz8xc9Che47556y7h6AHLN2fepWLcWeT(RTK)nW8MoB4OVmcRohB5F9UTUsysgLJTmeq)fyuZ0ou1pV3ScpNrGctjlYXmfC)HrHT3nFCyuyuqORJRRNvKFuasAGy67WBSgezB7BhAhea)ZhFdOHb3OpLiIPJyRsjZZFFw9Kn7aobyjCIs9vsL3E2KoRRM90TyMiWwZklZ2cjTajhc6rUTmaosfBh2UexU(1BuvBPGg5c(KMIJ1Unh)uf0QvriffAfWIZjtbtJ9dwq)6I)2T8waZRX2EGtOrvFfwdp)WD3pRHu7dnm0HIpsXWnk87zOn2Q3sM2(AuSgZ1zeD82iOBjHzziney)HH5FDAARnWZX(owEwoyHDdTblBxvFOwOC3z42tPIAQA2sFqk(X7aMLuYGKVvI(o0HkHpbuBbR1TkF)vUho3Xwf49WsKg3OMNvTFuPATMWDdcDSd9J8qcx3ofJqgocS8acQ(p)nhKKg77g6zh6ea51yB7bNLMtp23ZpkYlW2YX1leIhRqL19(gEFVPCEN(bz27HC9NToKu0evDdT8dgmi0nk03lyqOM3mFS3GbbbGUI1GapBFh3guTN3W77nDYD4mScBFpJtQ11Q1O1fOx5XB)RFSFVivzYaSQjWLhHRJv(31)xm)RvjjNVFpSNiVDgEv0CMd6N8agScMHVHluf7jSD)FoJtwHO9qsJdC9CSS9c9CIGBL4ewRu0A3igCaiCLRY)JRY)JRXEURIwuiR0KjZYWqnHITD44HASBCSSxiBzDoouAG(n7kUhg1EkVcWFZUuYw2s5Y7eM)mqXn)KP(OTVARSp2Z1csElYZdmWDHRVQekX1j591bnDhVBetztJ(L5QprwZwEOCo1m1RguhKPz(bm0tmcOTP7if4y1YA10PDlFbNYZHPMJOtMLKYQIf69R5sbDgHGFk)cTA0xm)EsYQZvlYGDcjitjDsI3QJvJF9g)zuvBCmUP34esamoa8Uhzhyz5Afznq0Gv1qU0ZB499MA7KU59R1KpqQE3FGMyVuNsExJS2TNxRv0kmDWalVaFaXcTCccdnWzFFxlFlB45UrEodSmctF43SOV3uw3d2H6oW(mnLkQP4e0b8NV(q6QQcvjqbJgZkwJLR0OVoVWKTU7o2QYd84XzlRkeD6bOwvDs)TT0uvrRtiCvfVNXwllh64kU4bpb2f46AkvUSCXVq4YIiklPOQ2Gk8w1D4XGniRSkwwluk2td92WkAILyelEm(9NPyT8kf1k)6fzqqRnF(QwXwCQ00FWqkawjfRsVU0WpkStnO5jQYS(WsWU(3Pm5aeCG2apHt2P3zlufuhER4nzNTnxKUpwtWEHux1(NP)7Q3HRaQ)(SnzC5zEBkxPl(qAkceHyqavzhNQYZ50cTe28OEIMgRKtdXEBiP8LzWnS3ThAHf6VSryq4CM8AU1CYM61pc8RXx2OfmkB7IM6SJ9ad7orQKdMwaGUMWWE89gI3I5vbPuoLQ7NHSjHZ4K3Pjc2PSN15GVrzP3HJerySRTPGL2AMzlIxLP7HMQ948gy0tdNUEBEcB1oS44y0euhbIaKINarQhje5yPXb)cRAKxiUUir1Y3RbEb2(B0FDsIQW5psFNvQAfRe)wxP0BBRG3O)omHO6dDUQ66YwkP13htKQw3MuLQ1cxsBXv10RYaR2GtiuR)2nS3zicBi0v6wQEomIu2aRBFNO1UAmaM(b4KOUzzhuNgNlbakQbB4gY2CAQbN(gvl4BlOUteot2UmmlAZEr8q67ScwDN1kRJA2Rx(9U4IroP9DLVFHqWhA(Tejd)lde1DiKxUh9QxIF1jas8DgsEhlVFzNrmU3rtnylvaY2Z2k4IajSow9aORIgOsGqLP(zaohRal)leIfzDzauiCN4lbG8Ha3xeazB5DHGeCBk3lcGcHBMFra0a3W(WOR80QtQ8r9on4CC89DUiiwODVi2phG88dUmcVbErwxg3bH2U9XKUsFRQOM06pbWWE5DjWkVaNlKfShKJEpKh4g0awxf5FAW54ffDzWl4AlxiafEzy5odIc7Jv9ZbjB)(9)EfoYWgkvOui80GeuSUmgoH2(xMym2E)Tdnu2PEH7pHTImC6(4v4Lao7MF0PEN6kyIvH5rif6BORivjI(CpkjJ8M5fv62ZFix8mX98uJm9nIwxJzeo8qDVUz5UILV)Dw6B92I1pAdElJIUTsUzzoIL1A8voXABghWJJQhAeJp(o0twwVKKiGLyEWofs2)49CgaF)Hn7ecf5WGDc2r9SuF81jMS2JtCQrN(eivNjO84RwFfSzzC((ZCsxUKr9goU2T4ArVFmIwQMAo(BhN2p00GFCK9fIyW0Y22DQn6YdgDWPUO7QQV7N8ANhN(vxSglJZXH6XNm5JtGnJV4XpJ9hRZtzd1zOnpbJXyo1p(k7orSNWRqRj6)4RD)Pa)4SorzDeme0lLX1VpU6A)ZB5PooC4Bpoj0EQUp(ANTHQ(DmGvzSCdRFeFGYp)Et8vxy2BbeooKBnh0NWty3FFfNq(3EIQpb2lM15JVgXVLJtCMDgo6t4o08xaYjaSmG0Z0vjNqtZtIRTgJ)ta79MlTEo9hpMJ7UKuZmcFkDBttjmok(JI442rMZ7(XX8N7BUa7SWY5nZnGzHR0f0s9drZ2k03bB3HJTh8hCiIc7)hbROIyT)bo(tvzQwDyQBtqmgMmJKsrsR7VSTt0SSY5Z)p)QTqPQ" - local deserialized = ExportImport:Decode(klimpExport) + local deserialized = Gladdy.modules["ExportImport"]:Decode(Gladdy:GetClassicProfile()) if deserialized then - ExportImport:ApplyImport(deserialized) + Gladdy.modules["ExportImport"]:ApplyImport(deserialized, Gladdy.db) end - Gladdy:UpdateFrame() + Gladdy:Reset() + Gladdy:HideFrame() + Gladdy:ToggleFrame(3) end function XiconProfiles:GetOptions() diff --git a/Options.lua b/Options.lua index 6e0df71..fc7fa5d 100644 --- a/Options.lua +++ b/Options.lua @@ -1,4 +1,4 @@ -local type, pairs, tinsert, tsort = type, pairs, table.insert, table.sort +local type, pairs, tinsert, tsort, tostring = type, pairs, table.insert, table.sort, tostring local InterfaceOptionsFrame_OpenToFrame = InterfaceOptionsFrame_OpenToFrame local GetSpellInfo = GetSpellInfo @@ -699,7 +699,7 @@ function Gladdy:GetAuras(auraType) if classSpells[i].texture then texture = classSpells[i].texture end - args[classSpells[i].name] = { + args[tostring(classSpells[i].id[1])] = { order = i, name = classSpells[i].name, type = "toggle", @@ -707,7 +707,7 @@ function Gladdy:GetAuras(auraType) width = "2", arg = classSpells[i].name } - defaultDebuffs[classSpells[i].name] = true + defaultDebuffs[tostring(classSpells[i].id[1])] = true end return args end diff --git a/README.md b/README.md index f26bcc4..674fd38 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Gladdy - TBC ### The most powerful arena addon for WoW TBC 2.5.1 -## [v1.0.4-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.0.4-Beta/Gladdy_TBC-Classic_v1.0.4-Beta.zip) +## [v1.0.5-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.0.5-Beta/Gladdy_TBC-Classic_v1.0.5-Beta.zip) ###### Please consider donating if you like my work @@ -35,6 +35,20 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca ### Changes +#### v1.0.5-Beta +- fixed Aura-Module +- Racial module added to EventListener and Version check updated +- constants for auras/cooldowns/racials updated +- anchoring for modules rewritten +- fix Aura module options (localization independent for profile export) +- Power-/HealthBar customize texts added and UNIT_DESTROYED added +- Racial module added and trinket modified +- XiconProfiles import strings +- Pets position extended +- delete unused saved variables +- ExportImport, VersionCheck & XiconProfiles fix +- TotemPlates add option to show friendly/enemy icons + #### v1.0.4-Beta - XiconProfiles fixed