local SLE, T, E, L, V, P, G = unpack(ElvUI_SLE) local RP = SLE.RaidProgress local TT = E.Tooltip --GLOBALS: select, unpack, hooksecurefunc, AchievementFrame_DisplayComparison local _G = _G local format = format local GetTime = GetTime local C_AddOns_IsAddOnLoaded = C_AddOns.IsAddOnLoaded local UnitExists, UnitGUID = UnitExists, UnitGUID local utf8sub = string.utf8sub local ClearAchievementComparisonUnit = ClearAchievementComparisonUnit local SetAchievementComparisonUnit = SetAchievementComparisonUnit local HideUIPanel = HideUIPanel RP.Cache = {} RP.playerGUID = UnitGUID('player') RP.highestKill = 0 RP.encounters = { { -- Emerald Nightmare option = 'nightmare', statIDs = { --Mythic { 10914, 10923, 10927, 10919, 10931, 10935, 10939 }, -- Herioc { 10913, 10922, 10926, 10917, 10930, 10934, 10938 }, -- Normal { 10912, 10921, 10925, 10916, 10929, 10933, 10937 }, -- LFR { 10911, 10920, 10924, 10915, 10928, 10932, 10936 }, }, }, { --Trial of Valor option = 'trial', statIDs = { --Mythic { 11410, 11414, 11418 }, -- Heroic { 11409, 11413, 11417 }, -- Normal { 11408, 11412, 11416 }, -- LFR { 11407, 11411, 11415 }, }, }, { -- Nighthold option = 'nighthold', statIDs = { --Mythic { 10943, 10947, 10951, 10955, 10960, 10964, 10968, 10972, 10976, 10980 }, -- Heroic { 10942, 10946, 10950, 10954, 10959, 10963, 10967, 10971, 10975, 10979 }, -- Normal { 10941, 10945, 10949, 10953, 10957, 10962, 10966, 10970, 10974, 10978 }, -- LFR { 10940, 10944, 10948, 10952, 10956, 10961, 10965, 10969, 10973, 10977 }, }, }, { -- Tomb of Sargeras option = 'sargeras', statIDs = { -- Mythic { 11880, 11884, 11888, 11892, 11896, 11900, 11904, 11908, 11912 }, -- Heroic { 11879, 11883, 11887, 11891, 11895, 11899, 11903, 11907, 11911 }, -- Normal { 11878, 11882, 11886, 11890, 11894, 11898, 11902, 11906, 11910 }, -- LFR { 11877, 11881, 11885, 11889, 11893, 11897, 11901, 11905, 11909 }, }, }, { -- Antorus, the Burning Throne option = 'antorus', statIDs = { -- Mythic { 11956, 11959, 11962, 11965, 11968, 11971, 11974, 11977, 11980, 11983, 11986 }, -- Heroic { 11955, 11958, 11961, 11964, 11967, 11970, 11973, 11976, 11979, 11982, 11985 }, -- Normal { 11954, 11957, 11960, 11963, 11966, 11969, 11972, 11975, 11978, 11981, 11984 }, -- LFR { 12117, 12118, 12119, 12120, 12121, 12122, 12123, 12124, 12125, 12126, 12127 }, }, }, { -- Uldir option = 'uldir', statIDs = { -- Mythic { 12789, 12793, 12797, 12801, 12805, 12811, 12816, 12820 }, -- Heroic { 12788, 12792, 12796, 12800, 12804, 12810, 12815, 12819 }, -- Normal { 12787, 12791, 12795, 12799, 12803, 12809, 12814, 12818 }, -- LFR { 12786, 12790, 12794, 12798, 12802, 12808, 12813, 12817 }, }, }, { -- Dazar'Alor option = 'daz', Alliance = { -- Mythic { 13331, 13348, 13353, 13362, 13366, 13370, 13374, 13378, 13382 }, -- Heroic { 13330, 13347, 13351, 13361, 13365, 13369, 13373, 13377, 13381 }, -- Normal { 13329, 13346, 13350, 13359, 13364, 13368, 13372, 13376, 13380 }, -- LFR { 13328, 13344, 13349, 13358, 13363, 13367, 13371, 13375, 13379 }, }, Horde = { -- Mythic { 13331, 13336, 13357, 13362, 13366, 13370, 13374, 13378, 13382 }, -- Heroic { 13330, 13334, 13356, 13361, 13365, 13369, 13373, 13377, 13381 }, -- Normal { 13329, 13333, 13355, 13359, 13364, 13368, 13372, 13376, 13380 }, -- LFR { 13328, 13332, 13354, 13358, 13363, 13367, 13371, 13375, 13379 }, }, true, }, { -- Storm Crucible option = 'sc', statIDs = { -- Mythic { 13407, 13413 }, -- Heroic { 13406, 13412 }, -- Normal { 13405, 13411 }, -- LFR { 13404, 13408 }, }, }, { -- Eternal Palace option = 'ep', statIDs = { -- Mythic {13590, 13594, 13598, 13603, 13607, 13611, 13615, 13619 }, -- Heroic { 13589, 13593, 13597, 13602, 13606, 13610, 13614, 13618 }, -- Normal { 13588, 13592, 13596, 13601, 13605, 13609, 13613, 13617 }, -- LFR { 13587, 13591, 13595, 13600, 13604, 13608, 13612, 13616 }, }, }, { -- Ni'alotha option = 'nzoth', statIDs = { -- Mythic { 14082, 14094, 14098, 14105, 14110, 14115, 14120, 14211, 14126, 14130, 14134, 14138 }, -- Heroic { 14080, 14093, 14097, 14104, 14109, 14114, 14119, 14210, 14125, 14129, 14133, 14137 }, -- Normal { 14079, 14091, 14096, 14102, 14108, 14112, 14118, 14208, 14124, 14128, 14132, 14136 }, -- LFR { 14078, 14089, 14095, 14101, 14107, 14111, 14117, 14207, 14123, 14127, 14131, 14135 }, }, }, { -- CastleNathria option = 'nathria', statIDs = { -- Mythic { 14421, 14425, 14429, 14433, 14437, 14441, 14445, 14449, 14453, 14457 }, -- Heroic { 14420, 14424, 14428, 14432, 14436, 14440, 14444, 14448, 14452, 14456 }, -- Normal { 14419, 14423, 14427, 14431, 14435, 14439, 14443, 14447, 14451, 14455 }, -- LFR { 14422, 14426, 14430, 14434, 14438, 14442, 14446, 14450, 14454, 14458 }, }, }, { -- Sanctum of Domination option = 'sod', statIDs = { -- Mythic { 15139, 15143, 15147, 15151, 15155, 15159, 15163, 15167, 15172, 15176 }, -- Heroic { 15138, 15142, 15146, 15150, 15154, 15158, 15162, 15166, 15171, 15175 }, -- Normal { 15137, 15141, 15145, 15149, 15153, 15157, 15161, 15165, 15170, 15174 }, -- LFR { 15136, 15140, 15144, 15148, 15152, 15156, 15160, 15164, 15169, 15173 }, } }, { -- Vault of the Incarnates option = 'voti', statIDs = { --* Mythic { 16387, 16389, 16391, 16388, 16390, 16392, 16393, 16394 }, --* Heroic { 16379, 16381, 16383, 16380, 16382, 16384, 16385, 16386 }, --* Normal { 16371, 16373, 16375, 16372, 16374, 16376, 16377, 16378 }, --* LFR { 16359, 16362, 16367, 16361, 16366, 16368, 16369, 16370 }, } }, { -- Aberrus, the Shadowed Crucible option = 'atsc', statIDs = { --* Mythic { 18219, 18220, 18121, 18222, 18223, 18224, 18225, 18226, 18227 }, --* Heroic { 18210, 18211, 18212, 18213, 18214, 18215, 18216, 18217, 18218 }, --* Normal { 18189, 18190, 18191, 18192, 18194, 18195, 18196, 18197, 18198 }, --* LFR { 18180, 18181, 18182, 18183, 18184, 18185, 18186, 18188, 18187 }, } }, { -- Amirdrassil, the Dream's Hope option = 'atdh', statIDs = { --* Mythic { 19378, 19379, 19380, 19381, 19382, 19383, 19384, 19385, 19386 }, --* Heroic { 19369, 19370, 19371, 19372, 19373, 19374, 19375, 19376, 19377 }, --* Normal { 19360, 19361, 19362, 19363, 19364, 19365, 19366, 19367, 19368 }, --* LFR { 19348, 19352, 19353, 19354, 19355, 19356, 19357, 19358, 19359 }, } }, } RP.Raids = {} RP.modes = { LONG = { PLAYER_DIFFICULTY6, PLAYER_DIFFICULTY2, PLAYER_DIFFICULTY1, PLAYER_DIFFICULTY3, }, SHORT = { utf8sub(PLAYER_DIFFICULTY6, 1 , 1), utf8sub(PLAYER_DIFFICULTY2, 1 , 1), utf8sub(PLAYER_DIFFICULTY1, 1 , 1), utf8sub(PLAYER_DIFFICULTY3, 1 , 1), }, } local function PopulateRaidsTable() RP.Raids['LONG'] = { SLE:GetMapInfo(777 , 'name'), SLE:GetMapInfo(806, 'name'), SLE:GetMapInfo(764, 'name'), SLE:GetMapInfo(850 , 'name'), SLE:GetMapInfo(909, 'name'), SLE:GetMapInfo(1148, 'name'), SLE:GetMapInfo(1358, 'name'), SLE:GetMapInfo(1345, 'name'), SLE:GetMapInfo(1512, 'name'), SLE:GetMapInfo(1580, 'name'), SLE:GetMapInfo(1735, 'name'), SLE:GetMapInfo(1998, 'name'), SLE:GetMapInfo(2119, 'name'), SLE:GetMapInfo(2166, 'name'), SLE:GetMapInfo(2232, 'name'), } RP.Raids['SHORT'] = { L["RAID_EN"], L["RAID_TOV"], L["RAID_NH"], L["RAID_TOS"], L["RAID_ANTO"], SLE:GetMapInfo(1148, 'name'), L["RAID_DAZALOR"], L["RAID_STORMCRUS"], L["RAID_ETERNALPALACE"], SLE:GetMapInfo(1580, 'name'), SLE:GetMapInfo(1735, 'name'), 'SoD', 'VotI', 'ATSC', 'ATDH', } end local kills function RP:GetProgression(guid) local statFunc = guid == RP.playerGUID and GetStatistic or GetComparisonStatistic for raid = 1, #RP.Raids['LONG'] do local option = RP.encounters[raid].option if E.db.sle.tooltip.RaidProg.raids[option] then RP.Cache[guid].header[raid] = {} RP.Cache[guid].info[raid] = {} local statTable = RP.encounters[raid][E.myfaction] or RP.encounters[raid].statIDs for level = 1, #statTable do RP.highestKill = 0 for statInfo = 1, #statTable[level] do kills = tonumber((statFunc(statTable[level][statInfo]))) if kills and kills > 0 then RP.highestKill = RP.highestKill + 1 end end if RP.highestKill > 0 or RP.ShowZeroesMode then RP.Cache[guid].header[raid][level] = format('%s [%s]:', RP.Raids[E.db.sle.tooltip.RaidProg.NameStyle][raid], RP.modes[E.db.sle.tooltip.RaidProg.DifStyle][level]) RP.Cache[guid].info[raid][level] = format('%d/%d', RP.highestKill, #statTable[level]) if RP.highestKill == #statTable[level] then break end end end end end end function RP:UpdateProgression(guid) RP.Cache[guid] = RP.Cache[guid] or {} RP.Cache[guid].header = RP.Cache[guid].header or {} RP.Cache[guid].info = RP.Cache[guid].info or {} RP.Cache[guid].timer = GetTime() RP:GetProgression(guid) end function RP:SetProgressionInfo(guid, tt) if RP.Cache[guid] and RP.Cache[guid].header then local updated = 0 for i=1, tt:NumLines() do local leftTipText = _G['GameTooltipTextLeft'..i] for raid = 1, #RP.Raids['LONG'] do for level = 1, 4 do if (leftTipText:GetText() and leftTipText:GetText():find(RP.Raids[E.db.sle.tooltip.RaidProg.NameStyle][raid]) and leftTipText:GetText():find(RP.modes[E.db.sle.tooltip.RaidProg.DifStyle][level]) and (RP.Cache[guid].header[raid][level] and RP.Cache[guid].info[raid][level])) then -- update found tooltip text line local rightTipText = _G['GameTooltipTextRight'..i] leftTipText:SetText(RP.Cache[guid].header[raid][level]) rightTipText:SetText(RP.Cache[guid].info[raid][level]) updated = 1 end end end end if updated == 1 then return end -- add progression tooltip line if RP.highestKill > 0 then tt:AddLine(' ') end for raid = 1, #RP.Raids['LONG'] do local option = RP.encounters[raid].option if E.db.sle.tooltip.RaidProg.raids[option] then for level = 1, 4 do tt:AddDoubleLine(RP.Cache[guid].header[raid][level], RP.Cache[guid].info[raid][level], nil, nil, nil, 1, 1, 1) end end end end end local function AchieveReady(event, GUID) if (TT.compareGUID ~= GUID) then return end local unit = 'mouseover' if UnitExists(unit) then RP:UpdateProgression(GUID) _G.GameTooltip:SetUnit(unit) end ClearAchievementComparisonUnit() TT:UnregisterEvent('INSPECT_ACHIEVEMENT_READY') end local function OnInspectInfo(self, tt, unit, numTries, r, g, b) if InCombatLockdown() then return end if not E.db.sle.tooltip.RaidProg.enable then return end if not (unit and CanInspect(unit)) then return end local guid = UnitGUID(unit) if not RP.Cache[guid] or (GetTime() - RP.Cache[guid].timer) > 600 then if guid == RP.playerGUID then RP:UpdateProgression(guid) else ClearAchievementComparisonUnit() if not self.loadedComparison and select(2, C_AddOns_IsAddOnLoaded('Blizzard_AchievementUI')) then AchievementFrame_DisplayComparison(unit) HideUIPanel(_G.AchievementFrame) ClearAchievementComparisonUnit() self.loadedComparison = true end self.compareGUID = guid if SetAchievementComparisonUnit(unit) then self:RegisterEvent('INSPECT_ACHIEVEMENT_READY', AchieveReady) end return end end RP:SetProgressionInfo(guid, tt) end function RP:Initialize() PopulateRaidsTable() hooksecurefunc(TT, 'AddInspectInfo', OnInspectInfo) end SLE:RegisterModule(RP:GetName())