Files
Andrew6810 8ad40722a0 Fixes Enhanced character frame
Update nameplate coloring.
Fix world map blips
2022-10-30 16:41:03 -07:00

372 lines
9.7 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local PI = E:NewModule("Enhanced_ProgressionInfo", "AceHook-3.0", "AceEvent-3.0")
local TT = E:GetModule("Tooltip")
local pairs, ipairs, select, tonumber = pairs, ipairs, select, tonumber
local format = string.format
local twipe = table.wipe
local CanInspect = CanInspect
local ClearAchievementComparisonUnit = ClearAchievementComparisonUnit
local GetAchievementComparisonInfo = GetAchievementComparisonInfo
local GetAchievementInfo = GetAchievementInfo
local GetComparisonStatistic = GetComparisonStatistic
local GetStatistic = GetStatistic
local GetTime = GetTime
local InCombatLockdown = InCombatLockdown
local IsAltKeyDown = IsAltKeyDown
local IsControlKeyDown = IsControlKeyDown
local IsShiftKeyDown = IsShiftKeyDown
local SetAchievementComparisonUnit = SetAchievementComparisonUnit
local UnitExists = UnitExists
local UnitGUID = UnitGUID
local UnitIsPlayer = UnitIsPlayer
local UnitLevel = UnitLevel
local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
local difficulties = {"H25", "H10", "N25", "N10"}
local statisticTiers = {
["RS"] = {
{4823}, -- Heroic 25
{4822}, -- Heroic 10
{4820}, -- Normal 25
{4821} -- Normal 10
},
["ICC"] = {
{4642, 4656, 4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688}, -- Heroic 25
{4640, 4654, 4659, 4662, 4665, 4668, 4671, 4674, 4677, 4680, 4684, 4686}, -- Heroic 10
{4641, 4655, 4660, 4663, 4666, 4669, 4672, 4675, 4678, 4681, 4683, 4687}, -- Normal 25
{4639, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653} -- Normal 10
},
["ToC"] = {
{4029, 4035, 4039, 4043, 4047}, -- Heroic 25
{4030, 4033, 4037, 4041, 4045}, -- Heroic 10
{4031, 4034, 4038, 4042, 4046}, -- Normal 25
{4028, 4032, 4036, 4040, 4044} -- Normal 10
},
["Ulduar"] = {
{},
{},
{2872, 2873, 2874, 2884, 2885, 2875, 2882, 3256, 3257, 3258, 2879, 2880, 2883, 2881}, -- Normal 25
{2856, 2857, 2858, 2859, 2860, 2861, 2868, 2862, 2863, 2864, 2865, 2866, 2869, 2867} -- Normal 10
}
}
local achievementTiers = {
["RS"] = {
{ -- Heroic 25
4816 -- [1] Heroic: The Twilight Destroyer
},
{ -- Heroic 10
4818 -- [1] Heroic: The Twilight Destroyer
},
{ -- Normal 25
4815 -- [1] The Twilight Destroyer
},
{ -- Normal 10
4817 -- [1] The Twilight Destroyer
}
},
["ICC"] = {
{ -- Heroic 25
-- [0] = 4637, -- [12] Heroic: Fall of the Lich King
4632, -- [4] Heroic: Storming the Citadel
4633, -- [3] Heroic: The Plagueworks
4634, -- [2] Heroic: The Crimson Hall
4635, -- [2] Heroic: The Frostwing Halls
4584 -- [1] The Light of Dawn
},
{ -- Heroic 10
-- [0] = 4636, -- [12] Heroic: Fall of the Lich King
4628, -- [4] Heroic: Storming the Citadel
4629, -- [3] Heroic: The Plagueworks
4630, -- [2] Heroic: The Crimson Hall
4631, -- [2] Heroic: The Frostwing Halls
4583 -- [1] Bane of the Fallen King
},
{ -- Normal 25
-- [0] = 4608, -- [12] Fall of the Lich King
4604, -- [4] Storming the Citadel
4605, -- [3] The Plagueworks
4606, -- [2] The Crimson Hall
4607, -- [2] The Frostwing Halls
4597 -- [1] The Frozen Throne
},
{ -- Normal 10
-- [0] = 4532, -- [12] Fall of the Lich King
4531, -- [4] Storming the Citadel
4528, -- [3] The Plagueworks
4529, -- [2] The Crimson Hall
4527, -- [2] The Frostwing Halls
4530 -- [1] The Frozen Throne
}
},
["ToC"] = {
{ -- Heroic 25
3812 -- [5] Call of the Grand Crusade
},
{ -- Heroic 10
3918 -- [5] Call of the Grand Crusade
},
{ -- Normal 25
3916 -- [5] Call of the Crusade
},
{ -- Normal 10
3917 -- [5] Call of the Crusade
}
},
["Ulduar"] = {
{},
{},
{ -- Normal 25
-- [0] = 2895, -- [13] The Secrets of Ulduar
2887, -- [4] The Siege of Ulduar
2889, -- [3] The Antechamber of Ulduar
2891, -- [4] The Keepers of Ulduar
2893, -- [2] The Descent into Madness
3037 -- [1] Observed
},
{ -- Normal 10
-- [0] = 2894, -- [13] The Secrets of Ulduar
2886, -- [4] The Siege of Ulduar
2888, -- [3] The Antechamber of Ulduar
2890, -- [4] The Keepers of Ulduar
2892, -- [2] The Descent into Madness
3036 -- [1] Observed
}
}
}
local progressCache = {}
--[[
local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo
local GetAchievementNumCriteria = GetAchievementNumCriteria
local function getAchievementProgress(achievementID, criteriaInfo)
local progress = 0
for i = 1, GetAchievementNumCriteria(achievementID) do
local _, _, completed = GetAchievementCriteriaInfo(achievementID, i)
if completed then
progress = progress + 1
end
end
return progress
end
]]
local function isAchievementComplete(achievementID)
return (select(4, GetAchievementInfo(achievementID))) and 1 or 0
end
local function isAchievementComparisonComplete(achievementID)
return (GetAchievementComparisonInfo(achievementID)) and 1 or 0
end
local function GetProgression(guid)
local total, kills, killed, tierName
local statFunc, tiers
if E.db.enhanced.tooltip.progressInfo.checkAchievements then
statFunc = guid == E.myguid and isAchievementComplete or isAchievementComparisonComplete
tiers = achievementTiers
else
statFunc = guid == E.myguid and GetStatistic or GetComparisonStatistic
tiers = statisticTiers
end
local header = progressCache[guid].header
local info = progressCache[guid].info
for tier in pairs(tiers) do
header[tier] = header[tier] and twipe(header[tier]) or {}
info[tier] = info[tier] and twipe(info[tier]) or {}
for i, difficulty in ipairs(difficulties) do
if #tiers[tier][i] > 0 then
total = #tiers[tier][i]
killed = 0
for _, statsID in ipairs(tiers[tier][i]) do
kills = tonumber(statFunc(statsID))
if kills and kills > 0 then
killed = killed + 1
end
end
if killed > 0 then
tierName = tier
if i <= 2 and tier == "ToC" then
tierName = "ToGC"
end
header[tier][i] = format("%s [%s]:", L[tierName], difficulty)
info[tier][i] = format("%d/%d", killed, total)
if killed == total then
break
end
end
end
end
end
end
local function UpdateProgression(guid)
if not progressCache[guid] then
progressCache[guid] = {
header = {},
info = {},
}
end
progressCache[guid].timer = GetTime()
GetProgression(guid)
end
local function SetProgressionInfo(guid, tt)
if not progressCache[guid] then return end
local tiers = E.db.enhanced.tooltip.progressInfo.checkAchievements and achievementTiers or statisticTiers
for tier in pairs(tiers) do
if E.db.enhanced.tooltip.progressInfo.tiers[tier] then
for i = 1, #difficulties do
if #tiers[tier][i] > 0 then
tt:AddDoubleLine(progressCache[guid].header[tier][i], progressCache[guid].info[tier][i], nil, nil, nil, 1, 1, 1)
end
end
end
end
end
local function ShowInspectInfo(tt)
if InCombatLockdown() then return end
local modifier = E.db.enhanced.tooltip.progressInfo.modifier
if modifier ~= "ALL" and not ((modifier == "SHIFT" and IsShiftKeyDown()) or (modifier == "CTRL" and IsControlKeyDown()) or (modifier == "ALT" and IsAltKeyDown())) then return end
local unit = select(2, tt:GetUnit())
if unit == "player" then
if not E.db.enhanced.tooltip.progressInfo.checkPlayer then return end
UpdateProgression(E.myguid)
SetProgressionInfo(E.myguid, tt)
return
end
if not unit or not UnitIsPlayer(unit) then return end
local level = UnitLevel(unit)
if not level or level < MAX_PLAYER_LEVEL then return end
if not CanInspect(unit, false) then return end
local guid = UnitGUID(unit)
local frameShowen = AchievementFrame and AchievementFrame:IsShown()
if progressCache[guid] and (frameShowen or (GetTime() - progressCache[guid].timer) < 600) then
SetProgressionInfo(guid, tt)
elseif not frameShowen then
PI.compareGUID = guid
PI:RegisterEvent("INSPECT_ACHIEVEMENT_READY")
if AchievementFrameComparison then
AchievementFrameComparison:UnregisterEvent("INSPECT_ACHIEVEMENT_READY")
end
ClearAchievementComparisonUnit()
SetAchievementComparisonUnit(unit)
end
end
function PI:INSPECT_ACHIEVEMENT_READY()
UpdateProgression(self.compareGUID)
ClearAchievementComparisonUnit()
if UnitExists("mouseover") and UnitGUID("mouseover") == self.compareGUID then
GameTooltip:SetUnit("mouseover")
end
self:UnregisterEvent("INSPECT_ACHIEVEMENT_READY")
if AchievementFrameComparison then
AchievementFrameComparison:RegisterEvent("INSPECT_ACHIEVEMENT_READY")
end
self.compareGUID = nil
end
function PI:MODIFIER_STATE_CHANGED(_, key)
if (key == format("L%s", self.modifier) or key == format("R%s", self.modifier)) and UnitExists("mouseover") then
GameTooltip:SetUnit("mouseover")
end
end
function PI:UpdateSettings()
local enabled
for _, state in pairs(E.db.enhanced.tooltip.progressInfo.tiers) do
if state then
enabled = state
break
end
end
if enabled then
self:ToggleState()
else
self:UnregisterEvent("INSPECT_ACHIEVEMENT_READY")
self:UnhookAll()
end
end
function PI:UpdateModifier()
self.modifier = E.db.enhanced.tooltip.progressInfo.modifier
if self.modifier == "ALL" then
self:UnregisterEvent("MODIFIER_STATE_CHANGED")
else
self:RegisterEvent("MODIFIER_STATE_CHANGED")
end
end
function PI:ToggleState()
if E.db.enhanced.tooltip.progressInfo.enable then
if E.private.tooltip.enabled and TT then
if not self:IsHooked(TT, "GameTooltip_OnTooltipSetUnit", ShowInspectInfo) then
self:SecureHook(TT, "GameTooltip_OnTooltipSetUnit", ShowInspectInfo)
end
else
if not self:IsHooked(GameTooltip, "OnTooltipSetUnit", ShowInspectInfo) then
self:HookScript(GameTooltip, "OnTooltipSetUnit", ShowInspectInfo)
end
end
self:UpdateModifier()
else
self:UnregisterAllEvents()
self:UnhookAll()
end
end
function PI:Initialize()
if not E.db.enhanced.tooltip.progressInfo.enable then return end
self.progressCache = progressCache
self:ToggleState()
end
local function InitializeCallback()
PI:Initialize()
end
E:RegisterModule(PI:GetName(), InitializeCallback)