|
|
|
|
<Ui><Script><![CDATA[--[[
|
|
|
|
|
|
|
|
|
|
TaintLess [23-05-18]
|
|
|
|
|
https://www.townlong-yak.com/addons/taintless
|
|
|
|
|
|
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
|
|
Permission is hereby granted to distribute unmodified copies of this file.
|
|
|
|
|
]]
|
|
|
|
|
|
|
|
|
|
local function purgeKey(t, k)
|
|
|
|
|
local logLevel, c = GetCVar("taintLog"), -42
|
|
|
|
|
if (tonumber(logLevel) or 0) > 1 then
|
|
|
|
|
if CVarCallbackRegistry then
|
|
|
|
|
CVarCallbackRegistry:UnregisterEvent("CVAR_UPDATE")
|
|
|
|
|
end
|
|
|
|
|
SetCVar("taintLog", "1")
|
|
|
|
|
else
|
|
|
|
|
logLevel = nil
|
|
|
|
|
end
|
|
|
|
|
t[k] = nil
|
|
|
|
|
repeat
|
|
|
|
|
if t[c] == nil then
|
|
|
|
|
t[c] = nil
|
|
|
|
|
end
|
|
|
|
|
c = c - 1
|
|
|
|
|
until issecurevariable(t, k)
|
|
|
|
|
if logLevel then
|
|
|
|
|
SetCVar("taintLog", logLevel)
|
|
|
|
|
if CVarCallbackRegistry then
|
|
|
|
|
CVarCallbackRegistry:RegisterEvent("CVAR_UPDATE")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local patch do
|
|
|
|
|
local q, skips = {}, securecall(function()
|
|
|
|
|
local cb, r, _, an = select(4,GetBuildInfo()), {moon="haunted"}
|
|
|
|
|
r.moon, _, an = nil, issecurevariable(r, "moon")
|
|
|
|
|
for m, v, clo, chi in (GetAddOnMetadata(an, "X-TaintLess-DisableMitigations") or ""):gmatch("([%a_]+)=(%d+):?(%d*):?(%d*)") do
|
|
|
|
|
if (clo == "" or cb >= clo+0) and (chi == "" or chi+0 >= cb) then
|
|
|
|
|
r[m] = v + 0
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return r
|
|
|
|
|
end)
|
|
|
|
|
function patch(name, version, impl)
|
|
|
|
|
if name == nil then
|
|
|
|
|
for qf, v in pairs(q) do
|
|
|
|
|
securecall(qf, v)
|
|
|
|
|
end
|
|
|
|
|
elseif not ((tonumber(_G[name]) or 0) >= version or skips and skips[name] == version) then
|
|
|
|
|
_G[name], q[impl] = version, version
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- https://www.townlong-yak.com/addons/taintless/fixes/RefreshOverread
|
|
|
|
|
patch("UIDD_REFRESH_OVERREAD_PATCH_VERSION", 3, function(V)
|
|
|
|
|
hooksecurefunc("UIDropDownMenu_InitializeHelper", function()
|
|
|
|
|
for i=1, UIDD_REFRESH_OVERREAD_PATCH_VERSION == V and UIDROPDOWNMENU_MAXLEVELS or 0 do
|
|
|
|
|
for j=1+_G["DropDownList" .. i].numButtons, UIDROPDOWNMENU_MAXBUTTONS do
|
|
|
|
|
local b, _ = _G["DropDownList" .. i .. "Button" .. j]
|
|
|
|
|
_ = issecurevariable(b, "checked") or purgeKey(b, "checked")
|
|
|
|
|
_ = issecurevariable(b, "notCheckable") or purgeKey(b, "notCheckable")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
-- https://www.townlong-yak.com/addons/taintless/fixes/DisplayModeTaint
|
|
|
|
|
patch("UIDROPDOWNMENU_OPEN_PATCH_VERSION", 1, function(V)
|
|
|
|
|
hooksecurefunc("UIDropDownMenu_InitializeHelper", function(frame)
|
|
|
|
|
if UIDROPDOWNMENU_OPEN_PATCH_VERSION == V
|
|
|
|
|
and UIDROPDOWNMENU_OPEN_MENU and UIDROPDOWNMENU_OPEN_MENU ~= frame
|
|
|
|
|
and not issecurevariable(UIDROPDOWNMENU_OPEN_MENU, "displayMode") then
|
|
|
|
|
purgeKey(_G, "UIDROPDOWNMENU_OPEN_MENU")
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
-- https://www.townlong-yak.com/addons/taintless/fixes/IOFrameSelection
|
|
|
|
|
patch("IOFRAME_SELECTION_PATCH_VERSION", 5, function(V)
|
|
|
|
|
if type(InterfaceOptionsFrame) == "table" and type(InterfaceOptionsFrame.HookScript) == "function" then
|
|
|
|
|
InterfaceOptionsFrame:HookScript("OnHide", function()
|
|
|
|
|
if IOFRAME_SELECTION_PATCH_VERSION == V then
|
|
|
|
|
InterfaceOptionsFrameCategories.selection = nil
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
-- https://www.townlong-yak.com/addons/taintless/fixes/EditModeOpenDrop
|
|
|
|
|
patch("EDITMAN_OPENDROP_PATCH_VERSION", 3, function(V)
|
|
|
|
|
if not (type(EditModeManagerFrame) == "table" and
|
|
|
|
|
type(EditModeManagerFrame.GetAttribute) == "function" and
|
|
|
|
|
type(FriendsFrameStatusDropDown) == "table") then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
hooksecurefunc(EditModeManagerFrame, "GetAttribute", function(_, attr)
|
|
|
|
|
if attr ~= "UIPanelLayout-checkFit" or EDITMAN_OPENDROP_PATCH_VERSION ~= V
|
|
|
|
|
or (issecurevariable(DropDownList1, "maxWidth") and issecurevariable("UIDROPDOWNMENU_MENU_LEVEL"))
|
|
|
|
|
or InCombatLockdown() and FriendsFrameStatusDropDown:IsProtected() then
|
|
|
|
|
elseif FriendsFrameStatusDropDown:IsVisible() then
|
|
|
|
|
FriendsFrameStatusDropDown:Hide()
|
|
|
|
|
FriendsFrameStatusDropDown:Show()
|
|
|
|
|
else
|
|
|
|
|
local op = FriendsFrameStatusDropDown:GetParent()
|
|
|
|
|
FriendsFrameStatusDropDown:SetParent(nil)
|
|
|
|
|
if not FriendsFrameStatusDropDown:IsShown() then
|
|
|
|
|
FriendsFrameStatusDropDown:Show()
|
|
|
|
|
FriendsFrameStatusDropDown:Hide()
|
|
|
|
|
end
|
|
|
|
|
FriendsFrameStatusDropDown:SetParent(op)
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
-- https://www.townlong-yak.com/addons/taintless/fixes/ObjectiveTrackerUpdate
|
|
|
|
|
patch("OBJTRACK_DELAYUPDATE_PATCH_VERSION", 3, function(V)
|
|
|
|
|
if not (type(ObjectiveTrackerFrame) == "table" and
|
|
|
|
|
type(ObjectiveTrackerFrame.HeaderMenu) == "table" and
|
|
|
|
|
type(ObjectiveTrackerFrame.HeaderMenu.Title) == "table") then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local counter, didDelayUpdate, delayFrameCount = (CreateFrame("Frame", nil, ObjectiveTrackerFrame))
|
|
|
|
|
counter:Hide()
|
|
|
|
|
counter:SetScript("OnUpdate", function()
|
|
|
|
|
if OBJTRACK_DELAYUPDATE_PATCH_VERSION == V and delayFrameCount then
|
|
|
|
|
delayFrameCount = delayFrameCount + 1
|
|
|
|
|
else
|
|
|
|
|
counter:Hide()
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
hooksecurefunc("ObjectiveTracker_Update", function()
|
|
|
|
|
if OBJTRACK_DELAYUPDATE_PATCH_VERSION == V and didDelayUpdate then
|
|
|
|
|
didDelayUpdate = nil
|
|
|
|
|
purgeKey(ObjectiveTrackerFrame, "isUpdating")
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
hooksecurefunc(ObjectiveTrackerFrame.HeaderMenu.Title, "ClearAllPoints", function()
|
|
|
|
|
if OBJTRACK_DELAYUPDATE_PATCH_VERSION ~= V or ObjectiveTrackerFrame.isUpdating then
|
|
|
|
|
elseif issecurevariable(ObjectiveTrackerFrame, "isOnLeftSideOfScreen") then
|
|
|
|
|
if delayFrameCount then
|
|
|
|
|
delayFrameCount = nil
|
|
|
|
|
counter:Hide()
|
|
|
|
|
end
|
|
|
|
|
elseif 4 > (delayFrameCount or 0) then
|
|
|
|
|
ObjectiveTrackerFrame.isUpdating, didDelayUpdate, delayFrameCount = 86, 1, delayFrameCount or 0
|
|
|
|
|
counter:Show()
|
|
|
|
|
else
|
|
|
|
|
counter:Hide()
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
patch()
|
|
|
|
|
]]></Script></Ui>
|