You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
12 KiB

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 = {
4 years ago
--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 = {
4 years ago
--Mythic
{ 11410, 11414, 11418 },
-- Heroic
{ 11409, 11413, 11417 },
-- Normal
{ 11408, 11412, 11416 },
-- LFR
{ 11407, 11411, 11415 },
},
},
{ -- Nighthold
option = 'nighthold',
statIDs = {
4 years ago
--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 = {
4 years ago
-- 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 = {
4 years ago
-- 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 = {
4 years ago
-- 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 = {
4 years ago
-- 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 = {
4 years ago
-- 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 = {
4 years ago
-- Mythic
{ 13407, 13413 },
-- Heroic
{ 13406, 13412 },
-- Normal
{ 13405, 13411 },
-- LFR
{ 13404, 13408 },
},
},
{ -- Eternal Palace
option = 'ep',
statIDs = {
4 years ago
-- 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 = {
4 years ago
-- 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 = {
4 years ago
-- 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 },
},
},
4 years ago
{ -- Sanctum of Domination
option = 'sod',
statIDs = {
4 years ago
-- 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'),
4 years ago
'SoD',
'VotI',
'ATSC',
'ATDH',
}
end
4 years ago
local kills
function RP:GetProgression(guid)
4 years ago
local statFunc = guid == RP.playerGUID and GetStatistic or GetComparisonStatistic
4 years ago
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
4 years ago
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())