Files
coa-elvui/ElvUI_Enhanced/Modules/Misc/AddonsCompatibility.lua
T

269 lines
7.1 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local AC = E:NewModule("Enhanced_AddonsCompat", "AceEvent-3.0")
local pairs, ipairs = pairs, ipairs
local type = type
local tinsert, tremove = table.insert, table.remove
local GetAddOnInfo = GetAddOnInfo
local GetNumAddOns = GetNumAddOns
local IsAddOnLoadOnDemand = IsAddOnLoadOnDemand
local IsAddOnLoaded = IsAddOnLoaded
local externalFixes = {}
local addonFixes = {
-- Cromulent 1.5.2
["Cromulent"] = function()
local WORLDMAP_SETTINGS = WORLDMAP_SETTINGS
local WORLDMAP_WINDOWED_SIZE = WORLDMAP_WINDOWED_SIZE
local WORLDMAP_QUESTLIST_SIZE = WORLDMAP_QUESTLIST_SIZE
local _, fontSize = CromulentZoneInfo.text:GetFont()
local fontSizeWindowed = fontSize / WORLDMAP_WINDOWED_SIZE + 10
local fontSizeQuestlist = fontSize / WORLDMAP_QUESTLIST_SIZE + 5
local function UpdateFontSize()
if CromulentZoneInfo:IsShown() then
if WORLDMAP_SETTINGS.size == WORLDMAP_WINDOWED_SIZE then
CromulentZoneInfo.text:FontTemplate(nil, fontSizeWindowed, "OUTLINE")
elseif WORLDMAP_SETTINGS.size == WORLDMAP_QUESTLIST_SIZE then
CromulentZoneInfo.text:FontTemplate(nil, fontSizeQuestlist, "OUTLINE")
else
CromulentZoneInfo.text:FontTemplate(nil, fontSize, "OUTLINE")
end
end
end
UpdateFontSize()
hooksecurefunc(WorldMapFrameAreaFrame, "SetScale", UpdateFontSize)
end,
-- GroupCalendar 4.6.1
["GroupCalendar"] = function()
local DT = E:GetModule("DataTexts")
if DT.RegisteredDataTexts and DT.RegisteredDataTexts["Time"] then
DT.RegisteredDataTexts["Time"].onClick = function(_, btn)
if btn == "RightButton" then
if not IsAddOnLoaded("Blizzard_TimeManager") then
LoadAddOn("Blizzard_TimeManager")
end
TimeManagerClockButton_OnClick(TimeManagerClockButton)
elseif GroupCalendar and GroupCalendar.ToggleCalendarDisplay then
GroupCalendar.ToggleCalendarDisplay()
else
GameTimeFrame:Click()
end
end
end
end,
-- CLCRet 1.3.03.025
-- https://www.curseforge.com/wow/addons/clcret/files/439502
["CLCRet"] = function()
local UnitAffectingCombat = UnitAffectingCombat
local UnitCanAttack = UnitCanAttack
local UnitClassification = UnitClassification
local UnitExists = UnitExists
local UnitIsDead = UnitIsDead
local db = clcret.db.profile
function clcret:Enable()
self.addonEnabled = true
self.frame:Show()
end
function clcret:Disable()
self.addonEnabled = false
self.frame:Hide()
end
function clcret:PLAYER_REGEN_ENABLED()
if not self.addonEnabled then return end
self.frame:Hide()
end
function clcret:PLAYER_REGEN_DISABLED()
if not self.addonEnabled then return end
self.frame:Hide()
end
function clcret:PLAYER_TARGET_CHANGED()
if not self.addonEnabled then return end
if db.show == "boss" then
if UnitClassification("target") ~= "worldboss" then
self.frame:Hide()
return
end
end
if UnitExists("target") and UnitCanAttack("player", "target") and (not UnitIsDead("target")) then
self.frame:Show()
else
self.frame:Hide()
end
end
hooksecurefunc(clcret, "UpdateShowMethod", function(self)
if db.show == "combat" and self.addonEnabled then
if UnitAffectingCombat("player") then
self.frame:Show()
else
self.frame:Hide()
end
elseif db.show ~= "valid" and db.show ~= "boss" and self.addonEnabled then
self.frame:Show()
end
end)
end,
-- DrDamage 1.7.8
-- https://www.wowace.com/projects/dr-damage/files/426084
["DrDamage"] = function()
if not E.private.actionbar.enable then return end
local HasAction = HasAction
local SecureButton_GetEffectiveButton = SecureButton_GetEffectiveButton
local SecureButton_GetModifiedAttribute = SecureButton_GetModifiedAttribute
local AB = E:GetModule("ActionBars")
local DrD_ProcessButton = function(button, func, spell, uid, mana, disable)
if not button then return end
if not spell and not uid and not mana then
local frame = button.drd
if frame then frame:SetText(nil) end
frame = button.drd2
if frame then frame:SetText(nil) end
end
if not DrDamage.db.profile.ABText or disable then return end
if button:IsVisible() then
local id, name, rank = func(button)
if id and (not HasAction(id) or uid and uid ~= id) then return end
DrDamage:CheckAction(button, spell, id, name, rank, mana)
end
end
local updateFunc = function(button)
return SecureButton_GetModifiedAttribute(button, "action", SecureButton_GetEffectiveButton(button))
end
hooksecurefunc(DrDamage, "UpdateAB", function(self, spell, uid, disable, mana)
for _, bar in pairs(AB.handledBars) do
for _, button in ipairs(bar.buttons) do
DrD_ProcessButton(button, updateFunc, spell, uid, mana, disable)
end
end
end)
end,
-- https://github.com/ElvUI-WotLK/ElvUI_Enhanced/issues/100
["OmniBar"] = function()
hooksecurefunc("OmniBar_CreateIcon", function(self)
E:RegisterCooldown(self.icons[#self.icons].cooldown)
end)
for _, icon in ipairs(OmniBar.icons) do
E:RegisterCooldown(icon.cooldown)
end
end,
}
function AC:AddAddon(addon, func)
if type(addon) ~= "string" then
error(string.format("bad argument #1 to 'AddAddon' (string expected, got %s)", addon ~= nil and type(addon) or "no value"), 2)
elseif func and type(func) ~= "function" then
error(string.format("bad argument #2 to 'AddAddon' (function expected, got %s)", func ~= nil and type(func) or "no value"), 2)
end
if not self.initialized then
self.preinitList = self.preinitList or {}
self.preinitList[addon] = func
return
end
if not self.addonList[addon] then return end
if IsAddOnLoaded(addon) then
self:ApplyFix(addon, func)
elseif IsAddOnLoadOnDemand(addon) then
if not addonFixes[addon] then
externalFixes[addon] = externalFixes[addon] or {}
tinsert(externalFixes[addon], func)
end
tinsert(self.addonQueue, addon)
self:RegisterEvent("ADDON_LOADED")
end
end
function AC:ApplyFix(addon, func)
if func then
func()
if addonFixes[addon] then
addonFixes[addon] = nil
end
else
if addonFixes[addon] then
addonFixes[addon]()
addonFixes[addon] = nil
end
if externalFixes[addon] then
for i = 1, #externalFixes[addon] do
externalFixes[addon][i]()
end
externalFixes[addon] = nil
end
end
end
function AC:ADDON_LOADED(_, addonName)
if not (addonFixes[addonName] or externalFixes[addonName]) then return end
for i, addon in ipairs(self.addonQueue) do
if addon == addonName then
self:ApplyFix(addon)
tremove(self.addonQueue, i)
if #self.addonQueue == 0 then
self:UnregisterEvent("ADDON_LOADED")
end
break
end
end
end
function AC:Initialize()
self.addonQueue = {}
self.addonList = {}
for i = 1, GetNumAddOns() do
local name, _, _, enabled = GetAddOnInfo(i)
if enabled or IsAddOnLoadOnDemand(i) then
self.addonList[name] = true
end
end
self.initialized = true
for addon, func in pairs(addonFixes) do
self:AddAddon(addon, func)
end
if self.preinitList then
for addon, func in pairs(self.preinitList) do
self:AddAddon(addon, func)
end
end
end
local function InitializeCallback()
AC:Initialize()
end
E:RegisterModule(AC:GetName(), InitializeCallback)