mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-27 08:24:44 +00:00
Bugfixes: removed hard nil val checks from toolkit.lua fixed few mismatches causing crashes
This commit is contained in:
@@ -114,9 +114,9 @@ function hooksecurefunc(a1, a2, a3)
|
|||||||
|
|
||||||
local original_func = a1[a2]
|
local original_func = a1[a2]
|
||||||
|
|
||||||
a1[a2] = function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)
|
a1[a2] = function(...)
|
||||||
local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 = original_func(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)
|
local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 = original_func(unpack(arg))
|
||||||
a3(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)
|
a3(unpack(arg))
|
||||||
|
|
||||||
return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10
|
return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10
|
||||||
end
|
end
|
||||||
|
|||||||
+19
-5
@@ -45,22 +45,26 @@ local function GetTemplate(t, isUnitFrameElement)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function E:Size(frame, width, height)
|
function E:Size(frame, width, height)
|
||||||
|
if not frame then return end
|
||||||
assert(width)
|
assert(width)
|
||||||
frame:SetWidth(E:Scale(width))
|
frame:SetWidth(E:Scale(width))
|
||||||
frame:SetHeight(E:Scale(height or width))
|
frame:SetHeight(E:Scale(height or width))
|
||||||
end
|
end
|
||||||
|
|
||||||
function E:Width(frame, width)
|
function E:Width(frame, width)
|
||||||
|
if not frame then return end
|
||||||
assert(width)
|
assert(width)
|
||||||
frame:SetWidth(E:Scale(width))
|
frame:SetWidth(E:Scale(width))
|
||||||
end
|
end
|
||||||
|
|
||||||
function E:Height(frame, height)
|
function E:Height(frame, height)
|
||||||
|
if not frame then return end
|
||||||
assert(height)
|
assert(height)
|
||||||
frame:SetHeight(E:Scale(height))
|
frame:SetHeight(E:Scale(height))
|
||||||
end
|
end
|
||||||
|
|
||||||
function E:Point(obj, arg1, arg2, arg3, arg4, arg5)
|
function E:Point(obj, arg1, arg2, arg3, arg4, arg5)
|
||||||
|
if not obj then return end
|
||||||
if arg2 == nil then arg2 = obj:GetParent() end
|
if arg2 == nil then arg2 = obj:GetParent() end
|
||||||
|
|
||||||
if type(arg2)=="number" then arg2 = E:Scale(arg2) end
|
if type(arg2)=="number" then arg2 = E:Scale(arg2) end
|
||||||
@@ -77,7 +81,7 @@ function E:SetOutside(obj, anchor, xOffset, yOffset, anchor2)
|
|||||||
yOffset = yOffset or E.Border
|
yOffset = yOffset or E.Border
|
||||||
anchor = anchor or obj:GetParent()
|
anchor = anchor or obj:GetParent()
|
||||||
|
|
||||||
assert(anchor)
|
if not anchor then return end
|
||||||
if obj:GetPoint() then
|
if obj:GetPoint() then
|
||||||
obj:ClearAllPoints()
|
obj:ClearAllPoints()
|
||||||
end
|
end
|
||||||
@@ -92,7 +96,7 @@ function E:SetInside(obj, anchor, xOffset, yOffset, anchor2)
|
|||||||
yOffset = yOffset or E.Border
|
yOffset = yOffset or E.Border
|
||||||
anchor = anchor or obj:GetParent()
|
anchor = anchor or obj:GetParent()
|
||||||
|
|
||||||
assert(anchor)
|
if not anchor then return end
|
||||||
if obj:GetPoint() then
|
if obj:GetPoint() then
|
||||||
obj:ClearAllPoints()
|
obj:ClearAllPoints()
|
||||||
end
|
end
|
||||||
@@ -102,7 +106,7 @@ function E:SetInside(obj, anchor, xOffset, yOffset, anchor2)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function E:SetTemplate(f, t, glossTex, ignoreUpdates, forcePixelMode, isUnitFrameElement)
|
function E:SetTemplate(f, t, glossTex, ignoreUpdates, forcePixelMode, isUnitFrameElement)
|
||||||
if not f then return end
|
if not f or type(f) ~= "table" then return end
|
||||||
GetTemplate(t, isUnitFrameElement)
|
GetTemplate(t, isUnitFrameElement)
|
||||||
|
|
||||||
if t then
|
if t then
|
||||||
@@ -187,6 +191,7 @@ function E:SetTemplate(f, t, glossTex, ignoreUpdates, forcePixelMode, isUnitFram
|
|||||||
end
|
end
|
||||||
|
|
||||||
function E:CreateBackdrop(f, t, tex, ignoreUpdates, forcePixelMode, isUnitFrameElement)
|
function E:CreateBackdrop(f, t, tex, ignoreUpdates, forcePixelMode, isUnitFrameElement)
|
||||||
|
if not f then return end
|
||||||
if not t then t = "Default" end
|
if not t then t = "Default" end
|
||||||
|
|
||||||
local parent = f
|
local parent = f
|
||||||
@@ -199,8 +204,16 @@ function E:CreateBackdrop(f, t, tex, ignoreUpdates, forcePixelMode, isUnitFrameE
|
|||||||
if parent and parent.IsObjectType and not parent:IsObjectType("Frame") then
|
if parent and parent.IsObjectType and not parent:IsObjectType("Frame") then
|
||||||
parent = UIParent
|
parent = UIParent
|
||||||
end
|
end
|
||||||
|
if not parent or type(parent) ~= "table" or not parent.GetObjectType then
|
||||||
|
parent = UIParent
|
||||||
|
end
|
||||||
|
|
||||||
|
local b = (type(f.backdrop) == "table" and f.backdrop)
|
||||||
|
if not b then
|
||||||
|
b = CreateFrame("Frame", nil)
|
||||||
|
pcall(function() b:SetParent(parent) end)
|
||||||
|
end
|
||||||
|
|
||||||
local b = f.backdrop or CreateFrame("Frame", nil, parent)
|
|
||||||
if f.forcePixelMode or forcePixelMode then
|
if f.forcePixelMode or forcePixelMode then
|
||||||
E:SetOutside(b, nil, E.mult, E.mult)
|
E:SetOutside(b, nil, E.mult, E.mult)
|
||||||
else
|
else
|
||||||
@@ -247,7 +260,8 @@ function E:Kill(object)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function E:StripTextures(object, kill, alpha)
|
function E:StripTextures(object, kill, alpha)
|
||||||
if object:IsObjectType("Texture") then
|
if not object or type(object) ~= "table" then return end
|
||||||
|
if object.IsObjectType and object:IsObjectType("Texture") then
|
||||||
if kill then
|
if kill then
|
||||||
E:Kill(object)
|
E:Kill(object)
|
||||||
elseif alpha then
|
elseif alpha then
|
||||||
|
|||||||
@@ -225,14 +225,22 @@ local function LoadSkin()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- if a button position is not really where we want, we move it here
|
-- if a button position is not really where we want, we move it here
|
||||||
OptionsFrameCancel:ClearAllPoints()
|
if OptionsFrameCancel then
|
||||||
E:Point(OptionsFrameCancel, "BOTTOMLEFT",OptionsFrame,"BOTTOMRIGHT",-105,15)
|
OptionsFrameCancel:ClearAllPoints()
|
||||||
OptionsFrameOkay:ClearAllPoints()
|
E:Point(OptionsFrameCancel, "BOTTOMLEFT",OptionsFrame,"BOTTOMRIGHT",-105,15)
|
||||||
E:Point(OptionsFrameOkay, "RIGHT",OptionsFrameCancel,"LEFT",-4,0)
|
end
|
||||||
SoundOptionsFrameOkay:ClearAllPoints()
|
if OptionsFrameOkay and OptionsFrameCancel then
|
||||||
E:Point(SoundOptionsFrameOkay, "RIGHT",SoundOptionsFrameCancel,"LEFT",-4,0)
|
OptionsFrameOkay:ClearAllPoints()
|
||||||
UIOptionsFrameOkay:ClearAllPoints()
|
E:Point(OptionsFrameOkay, "RIGHT",OptionsFrameCancel,"LEFT",-4,0)
|
||||||
E:Point(UIOptionsFrameOkay, "RIGHT",UIOptionsFrameCancel,"LEFT", -4,0)
|
end
|
||||||
|
if SoundOptionsFrameOkay and SoundOptionsFrameCancel then
|
||||||
|
SoundOptionsFrameOkay:ClearAllPoints()
|
||||||
|
E:Point(SoundOptionsFrameOkay, "RIGHT",SoundOptionsFrameCancel,"LEFT",-4,0)
|
||||||
|
end
|
||||||
|
if UIOptionsFrameOkay and UIOptionsFrameCancel then
|
||||||
|
UIOptionsFrameOkay:ClearAllPoints()
|
||||||
|
E:Point(UIOptionsFrameOkay, "RIGHT",UIOptionsFrameCancel,"LEFT", -4,0)
|
||||||
|
end
|
||||||
|
|
||||||
-- others
|
-- others
|
||||||
ZoneTextFrame:ClearAllPoints()
|
ZoneTextFrame:ClearAllPoints()
|
||||||
@@ -261,12 +269,14 @@ local function LoadSkin()
|
|||||||
S:HandleSliderFrame(OpacityFrameSlider)
|
S:HandleSliderFrame(OpacityFrameSlider)
|
||||||
|
|
||||||
-- Interface Options
|
-- Interface Options
|
||||||
UIOptionsFrame:SetParent(E.UIParent)
|
if UIOptionsFrame then
|
||||||
UIOptionsFrame:EnableMouse(false)
|
UIOptionsFrame:SetParent(E.UIParent)
|
||||||
|
UIOptionsFrame:EnableMouse(false)
|
||||||
|
|
||||||
hooksecurefunc("UIOptionsFrame_Load", function()
|
hooksecurefunc("UIOptionsFrame_Load", function()
|
||||||
E:StripTextures(UIOptionsFrame)
|
E:StripTextures(UIOptionsFrame)
|
||||||
end)
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
local UIOptions = {
|
local UIOptions = {
|
||||||
"BasicOptions",
|
"BasicOptions",
|
||||||
@@ -286,52 +296,62 @@ local function LoadSkin()
|
|||||||
E:SetTemplate(options, "Transparent")
|
E:SetTemplate(options, "Transparent")
|
||||||
end
|
end
|
||||||
|
|
||||||
BasicOptions.backdrop = CreateFrame("Frame", nil, BasicOptions)
|
if BasicOptions and BasicOptionsGeneral and BasicOptionsHelp then
|
||||||
E:Point(BasicOptions.backdrop, "TOPLEFT", BasicOptionsGeneral, -20, 35)
|
BasicOptions.backdrop = CreateFrame("Frame", nil, BasicOptions)
|
||||||
E:Point(BasicOptions.backdrop, "BOTTOMRIGHT", BasicOptionsHelp, 20, -130)
|
E:Point(BasicOptions.backdrop, "TOPLEFT", BasicOptionsGeneral, -20, 35)
|
||||||
E:SetTemplate(BasicOptions.backdrop, "Transparent")
|
E:Point(BasicOptions.backdrop, "BOTTOMRIGHT", BasicOptionsHelp, 20, -130)
|
||||||
|
E:SetTemplate(BasicOptions.backdrop, "Transparent")
|
||||||
|
end
|
||||||
|
|
||||||
AdvancedOptions.backdrop = CreateFrame("Frame", nil, AdvancedOptions)
|
if AdvancedOptions and BasicOptionsGeneral and AdvancedOptionsCombatText then
|
||||||
E:Point(AdvancedOptions.backdrop, "TOPLEFT", BasicOptionsGeneral, -20, 35)
|
AdvancedOptions.backdrop = CreateFrame("Frame", nil, AdvancedOptions)
|
||||||
E:Point(AdvancedOptions.backdrop, "BOTTOMRIGHT", BasicOptionsHelp, 20, -130)
|
E:Point(AdvancedOptions.backdrop, "TOPLEFT", BasicOptionsGeneral, -20, 35)
|
||||||
E:SetTemplate(AdvancedOptions.backdrop, "Transparent")
|
E:Point(AdvancedOptions.backdrop, "BOTTOMRIGHT", AdvancedOptionsCombatText, 20, -130)
|
||||||
|
E:SetTemplate(AdvancedOptions.backdrop, "Transparent")
|
||||||
|
end
|
||||||
|
|
||||||
for i = 1, 2 do
|
for i = 1, 2 do
|
||||||
local tab = _G["UIOptionsFrameTab"..i]
|
local tab = _G["UIOptionsFrameTab"..i]
|
||||||
E:StripTextures(tab, true)
|
if tab then
|
||||||
E:CreateBackdrop(tab, "Transparent")
|
E:StripTextures(tab, true)
|
||||||
|
E:CreateBackdrop(tab, "Transparent")
|
||||||
|
|
||||||
tab:SetFrameLevel(tab:GetParent():GetFrameLevel() + 2)
|
tab:SetFrameLevel(tab:GetParent():GetFrameLevel() + 2)
|
||||||
tab.backdrop:SetFrameLevel(tab:GetParent():GetFrameLevel() + 1)
|
tab.backdrop:SetFrameLevel(tab:GetParent():GetFrameLevel() + 1)
|
||||||
|
|
||||||
E:Point(tab.backdrop, "TOPLEFT", 5, E.PixelMode and -14 or -16)
|
E:Point(tab.backdrop, "TOPLEFT", 5, E.PixelMode and -14 or -16)
|
||||||
E:Point(tab.backdrop, "BOTTOMRIGHT", -5, E.PixelMode and -4 or -6)
|
E:Point(tab.backdrop, "BOTTOMRIGHT", -5, E.PixelMode and -4 or -6)
|
||||||
|
|
||||||
tab:SetScript("OnClick", function()
|
tab:SetScript("OnClick", function()
|
||||||
PanelTemplates_Tab_OnClick(UIOptionsFrame)
|
PanelTemplates_Tab_OnClick(UIOptionsFrame)
|
||||||
if AdvancedOptions:IsShown() then
|
if AdvancedOptions:IsShown() then
|
||||||
BasicOptions:Show()
|
BasicOptions:Show()
|
||||||
AdvancedOptions:Hide()
|
AdvancedOptions:Hide()
|
||||||
else
|
else
|
||||||
BasicOptions:Hide()
|
BasicOptions:Hide()
|
||||||
AdvancedOptions:Show()
|
AdvancedOptions:Show()
|
||||||
end
|
end
|
||||||
PlaySound("igCharacterInfoTab")
|
PlaySound("igCharacterInfoTab")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
HookScript(tab, "OnEnter", S.SetModifiedBackdrop)
|
HookScript(tab, "OnEnter", S.SetModifiedBackdrop)
|
||||||
HookScript(tab, "OnLeave", S.SetOriginalBackdrop)
|
HookScript(tab, "OnLeave", S.SetOriginalBackdrop)
|
||||||
end
|
|
||||||
|
|
||||||
for _, child in ipairs({UIOptionsFrame:GetChildren()}) do
|
|
||||||
if child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then
|
|
||||||
child:SetFrameLevel(UIOptionsFrame:GetFrameLevel() + 2)
|
|
||||||
S:HandleCloseButton(child, UIOptionsFrame.backdrop)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
OptionsFrameDefaults:ClearAllPoints()
|
if UIOptionsFrame then
|
||||||
E:Point(OptionsFrameDefaults, "TOPLEFT", OptionsFrame, "BOTTOMLEFT", 15, 36)
|
for _, child in ipairs({UIOptionsFrame:GetChildren()}) do
|
||||||
|
if child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then
|
||||||
|
child:SetFrameLevel(UIOptionsFrame:GetFrameLevel() + 2)
|
||||||
|
S:HandleCloseButton(child, UIOptionsFrame.backdrop)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if OptionsFrameDefaults then
|
||||||
|
OptionsFrameDefaults:ClearAllPoints()
|
||||||
|
E:Point(OptionsFrameDefaults, "TOPLEFT", OptionsFrame, "BOTTOMLEFT", 15, 36)
|
||||||
|
end
|
||||||
|
|
||||||
S:HandleButton(UIOptionsFrameResetTutorials)
|
S:HandleButton(UIOptionsFrameResetTutorials)
|
||||||
|
|
||||||
@@ -368,48 +388,69 @@ local function LoadSkin()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Interface Options Checkboxes
|
-- Interface Options Checkboxes
|
||||||
for _, value in UIOptionsFrameCheckButtons do
|
if type(UIOptionsFrameCheckButtons) == "table" then
|
||||||
local UIOptionsFrameCheckBox = _G["UIOptionsFrameCheckButton"..value.index]
|
for _, value in pairs(UIOptionsFrameCheckButtons) do
|
||||||
if value.index == 7 then
|
local index = type(value) == "table" and value.index or value
|
||||||
E:Kill(UIOptionsFrameCheckBox)
|
local UIOptionsFrameCheckBox = _G["UIOptionsFrameCheckButton"..index]
|
||||||
end
|
if index == 7 and UIOptionsFrameCheckBox then
|
||||||
if value.index == 8 then
|
E:Kill(UIOptionsFrameCheckBox)
|
||||||
E:Point(UIOptionsFrameCheckBox, "TOPLEFT", 10, -8)
|
end
|
||||||
end
|
if index == 8 and UIOptionsFrameCheckBox then
|
||||||
if UIOptionsFrameCheckBox then
|
E:Point(UIOptionsFrameCheckBox, "TOPLEFT", 10, -8)
|
||||||
S:HandleCheckBox(UIOptionsFrameCheckBox)
|
end
|
||||||
|
if UIOptionsFrameCheckBox then
|
||||||
|
S:HandleCheckBox(UIOptionsFrameCheckBox)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Video Options Checkboxes
|
-- Video Options Checkboxes
|
||||||
for _, value in OptionsFrameCheckButtons do
|
if type(OptionsFrameCheckButtons) == "table" then
|
||||||
local OptionsFrameCheckButton = _G["OptionsFrameCheckButton"..value.index]
|
for _, value in pairs(OptionsFrameCheckButtons) do
|
||||||
if OptionsFrameCheckButton then
|
local index = type(value) == "table" and value.index or value
|
||||||
S:HandleCheckBox(OptionsFrameCheckButton)
|
local OptionsFrameCheckButton = _G["OptionsFrameCheckButton"..index]
|
||||||
|
if OptionsFrameCheckButton then
|
||||||
|
S:HandleCheckBox(OptionsFrameCheckButton)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sound Options Checkboxes
|
-- Sound Options Checkboxes
|
||||||
for _, value in SoundOptionsFrameCheckButtons do
|
if type(SoundOptionsFrameCheckButtons) == "table" then
|
||||||
local SoundOptionsFrameCheckButton = _G["SoundOptionsFrameCheckButton"..value.index]
|
for _, value in pairs(SoundOptionsFrameCheckButtons) do
|
||||||
if SoundOptionsFrameCheckButton then
|
local index = type(value) == "table" and value.index or value
|
||||||
S:HandleCheckBox(SoundOptionsFrameCheckButton)
|
local SoundOptionsFrameCheckButton = _G["SoundOptionsFrameCheckButton"..index]
|
||||||
|
if SoundOptionsFrameCheckButton then
|
||||||
|
S:HandleCheckBox(SoundOptionsFrameCheckButton)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Interface Options Sliders
|
-- Interface Options Sliders
|
||||||
for i in UIOptionsFrameSliders do
|
if type(UIOptionsFrameSliders) == "table" then
|
||||||
S:HandleSliderFrame(_G["UIOptionsFrameSlider"..i])
|
for _, value in pairs(UIOptionsFrameSliders) do
|
||||||
|
local index = type(value) == "table" and value.index or value
|
||||||
|
local slider = _G["UIOptionsFrameSlider"..index]
|
||||||
|
if slider then S:HandleSliderFrame(slider) end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Video Options Sliders
|
-- Video Options Sliders
|
||||||
for i in OptionsFrameSliders do
|
if type(OptionsFrameSliders) == "table" then
|
||||||
S:HandleSliderFrame(_G["OptionsFrameSlider"..i])
|
for _, value in pairs(OptionsFrameSliders) do
|
||||||
|
local index = type(value) == "table" and value.index or value
|
||||||
|
local slider = _G["OptionsFrameSlider"..index]
|
||||||
|
if slider then S:HandleSliderFrame(slider) end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sound Options Sliders
|
-- Sound Options Sliders
|
||||||
for i in SoundOptionsFrameSliders do
|
if type(SoundOptionsFrameSliders) == "table" then
|
||||||
S:HandleSliderFrame(_G["SoundOptionsFrameSlider"..i])
|
for _, value in pairs(SoundOptionsFrameSliders) do
|
||||||
|
local index = type(value) == "table" and value.index or value
|
||||||
|
local slider = _G["SoundOptionsFrameSlider"..index]
|
||||||
|
if slider then S:HandleSliderFrame(slider) end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ function S:SetOriginalBackdrop()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function S:HandleButton(f, strip, isDeclineButton)
|
function S:HandleButton(f, strip, isDeclineButton)
|
||||||
|
if not f then return end
|
||||||
local name = f:GetName()
|
local name = f:GetName()
|
||||||
if name then
|
if name then
|
||||||
local left = _G[name.."Left"]
|
local left = _G[name.."Left"]
|
||||||
|
|||||||
@@ -12,6 +12,10 @@
|
|||||||
- **Fix:** Made ElvUI's backported `table.wipe` resilient to `nil` values, fixing crashes with native Turtle WoW UI scripts (like `Turtle_ShopUI.lua`) and lazy addons.
|
- **Fix:** Made ElvUI's backported `table.wipe` resilient to `nil` values, fixing crashes with native Turtle WoW UI scripts (like `Turtle_ShopUI.lua`) and lazy addons.
|
||||||
- **Fix:** Added type safety checks to `SetOutside` and `SetInside` to prevent crashes when other addons overwrite frame globals with dummy functions.
|
- **Fix:** Added type safety checks to `SetOutside` and `SetInside` to prevent crashes when other addons overwrite frame globals with dummy functions.
|
||||||
- **Fix:** Added type safety check before calling `SetTexture("")` on Blizzard header frames, preventing crashes when headers are modified by other addons or the custom client.
|
- **Fix:** Added type safety check before calling `SetTexture("")` on Blizzard header frames, preventing crashes when headers are modified by other addons or the custom client.
|
||||||
|
- **Fix:** Wrapped `SetParent` in `pcall` within `CreateBackdrop` to prevent crashes on non-UI object dummy tables.
|
||||||
|
- **Fix:** Added graceful `nil` fallbacks to `E:Point`, `E:Size`, `E:Width`, and `E:Height` layout anchors, immunizing the UI against crashes when Turtle WoW or other addons delete elements.
|
||||||
|
- **Fix:** Rewrote `Misc.lua` options skinning loops using `pairs()` to resolve Lua 5.0 `attempt to call a nil value` crashes caused by missing options tabs/sliders/checkboxes.
|
||||||
|
- **Fix:** Added element existence checks in `Skins.lua` `HandleButton` to skip skinning gracefully instead of crashing on `nil`.
|
||||||
|
|
||||||
This is the backported version of ElvUI for World of Warcraft - Vanilla (1.12.1)
|
This is the backported version of ElvUI for World of Warcraft - Vanilla (1.12.1)
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
Reference in New Issue
Block a user