diff --git a/!Compatibility/api/luaAPI.lua b/!Compatibility/api/luaAPI.lua index 8a66285..7f056aa 100644 --- a/!Compatibility/api/luaAPI.lua +++ b/!Compatibility/api/luaAPI.lua @@ -306,7 +306,7 @@ end function table.wipe(t) if type(t) ~= "table" then - error(format("bad argument #1 to 'wipe' (table expected, got %s)", t ~= nil and type(t) or "no value"), 2) + return t end for k in pairs(t) do diff --git a/!Compatibility/api/wowAPI.lua b/!Compatibility/api/wowAPI.lua index ff24e7c..033ba85 100644 --- a/!Compatibility/api/wowAPI.lua +++ b/!Compatibility/api/wowAPI.lua @@ -96,7 +96,9 @@ function HookScript(frame, scriptName, handler) handler(this) end) else - frame:SetScript(scriptName, handler) + frame:SetScript(scriptName, function() + handler(this) + end) end end @@ -112,11 +114,11 @@ function hooksecurefunc(a1, a2, a3) local original_func = a1[a2] - a1[a2] = function(...) - local original_return = {original_func(unpack(arg))} - a3(unpack(arg)) + a1[a2] = function(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(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) + a3(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) - return unpack(original_return) + return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 end end diff --git a/ElvUI/Core/pluginInstaller.lua b/ElvUI/Core/pluginInstaller.lua index 8028e40..f5dd88e 100644 --- a/ElvUI/Core/pluginInstaller.lua +++ b/ElvUI/Core/pluginInstaller.lua @@ -157,7 +157,8 @@ function PI:CreateStepComplete() E:Size(imsg, 418, 72) E:Point(imsg, "TOP", 0, -190) imsg:Hide() - imsg:SetScript("OnShow", function(self) + imsg:SetScript("OnShow", function() + local self = this if self.message then PlaySoundFile([[Sound\Interface\LevelUp.wav]]) self.text:SetText(self.message) @@ -331,7 +332,8 @@ function PI:CreateFrame() E:Point(f.pending.tex, "BOTTOMRIGHT", f.pending, "BOTTOMRIGHT", -2, 2) f.pending.tex:SetTexture([[Interface\AddOns\ElvUI\media\textures\UI-OptionsFrame-NewFeatureIcon]]) E:CreateBackdrop(f.pending, "Transparent") - f.pending:SetScript("OnEnter", function(self) + f.pending:SetScript("OnEnter", function() + local self = this _G["GameTooltip"]:SetOwner(self, "ANCHOR_BOTTOMLEFT", E.PixelMode and -7 or -9) _G["GameTooltip"]:AddLine(L["List of installations in queue:"], 1, 1, 1) _G["GameTooltip"]:AddLine(" ") diff --git a/ElvUI/Core/toolkit.lua b/ElvUI/Core/toolkit.lua index e74f208..f696d77 100644 --- a/ElvUI/Core/toolkit.lua +++ b/ElvUI/Core/toolkit.lua @@ -72,6 +72,7 @@ function E:Point(obj, arg1, arg2, arg3, arg4, arg5) end function E:SetOutside(obj, anchor, xOffset, yOffset, anchor2) + if type(obj) ~= "table" then return end xOffset = xOffset or E.Border yOffset = yOffset or E.Border anchor = anchor or obj:GetParent() @@ -86,6 +87,7 @@ function E:SetOutside(obj, anchor, xOffset, yOffset, anchor2) end function E:SetInside(obj, anchor, xOffset, yOffset, anchor2) + if type(obj) ~= "table" then return end xOffset = xOffset or E.Border yOffset = yOffset or E.Border anchor = anchor or obj:GetParent() @@ -100,6 +102,7 @@ function E:SetInside(obj, anchor, xOffset, yOffset, anchor2) end function E:SetTemplate(f, t, glossTex, ignoreUpdates, forcePixelMode, isUnitFrameElement) + if not f then return end GetTemplate(t, isUnitFrameElement) if t then @@ -186,9 +189,18 @@ end function E:CreateBackdrop(f, t, tex, ignoreUpdates, forcePixelMode, isUnitFrameElement) if not t then t = "Default" end - local parent = f.IsObjectType and f:IsObjectType("Texture") and f:GetParent() or f - - local b = CreateFrame("Frame", nil, parent) + local parent = f + if f.IsObjectType and not f:IsObjectType("Frame") then + parent = f:GetParent() + end + if type(parent) == "table" and not parent[0] then + parent = f.GetParent and f:GetParent() or UIParent + end + if parent and parent.IsObjectType and not parent:IsObjectType("Frame") then + parent = UIParent + end + + local b = f.backdrop or CreateFrame("Frame", nil, parent) if f.forcePixelMode or forcePixelMode then E:SetOutside(b, nil, E.mult, E.mult) else @@ -288,6 +300,8 @@ function E:FontTemplate(fs, font, fontSize, fontStyle) end function E:StyleButton(button, noHover, noPushed, noChecked) + if not button then return end + if button.SetHighlightTexture and not button.hover and not noHover then local hover = button:CreateTexture() hover:SetTexture(1, 1, 1, 0.3) diff --git a/ElvUI/Libraries/UTF8/utf8data.lua b/ElvUI/Libraries/UTF8/utf8data.lua index 655f719..8bcc38f 100644 --- a/ElvUI/Libraries/UTF8/utf8data.lua +++ b/ElvUI/Libraries/UTF8/utf8data.lua @@ -1,4 +1,4 @@ -utf8_lc_uc = { +utf8_lc_uc = { ["a"] = "A", ["b"] = "B", ["c"] = "C", diff --git a/ElvUI/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua b/ElvUI/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua index 9095918..db97a64 100644 --- a/ElvUI/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua +++ b/ElvUI/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua @@ -23,7 +23,8 @@ local function GetDebuffType(unit, filter, filterTable) if not unit or not UnitCanAssist("player", unit) then return nil end local i = 1 while true do - local name, _, texture, _, debufftype = UnitAura(unit, i, "HARMFUL") + local texture, count, debufftype = UnitAura(unit, i, "HARMFUL") + local name = texture if not texture then break end if(filterTable) then diff --git a/ElvUI/Modules/NamePlates/Elements/Auras.lua b/ElvUI/Modules/NamePlates/Elements/Auras.lua index a9b2d42..c0137eb 100644 --- a/ElvUI/Modules/NamePlates/Elements/Auras.lua +++ b/ElvUI/Modules/NamePlates/Elements/Auras.lua @@ -395,21 +395,25 @@ function mod:UpdateElement_AurasByUnitID(unit) WipeAuraList(guid) local index = 1 - local name, _, texture, count, _, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, index, "HARMFUL") + local texture, count, debuffType = UnitAura(unit, index, "HARMFUL") + local name, duration, expirationTime, unitCaster, spellID = texture, 0, 0, nil, nil while name do SetSpellDuration(spellID, duration) SetAuraInstance(guid, name, spellID, expirationTime, count, UnitGUID(unitCaster or ""), duration, texture, AURA_TYPE_DEBUFF) index = index + 1 - name , _, texture, count, _, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, index, "HARMFUL") + texture, count, debuffType = UnitAura(unit, index, "HARMFUL") + name = texture end index = 1 - local name, _, texture, count, _, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, index, "HELPFUL") + texture, count, debuffType = UnitAura(unit, index, "HELPFUL") + name = texture while name do SetSpellDuration(spellID, duration) SetAuraInstance(guid, name, spellID, expirationTime, count, UnitGUID(unitCaster or ""), duration, texture, AURA_TYPE_BUFF) index = index + 1 - name, _, texture, count, _, duration, expirationTime, unitCaster, _, _, spellID = UnitAura(unit, index, "HELPFUL") + texture, count, debuffType = UnitAura(unit, index, "HELPFUL") + name = texture end local raidIcon, name diff --git a/ElvUI/Modules/NamePlates/NamePlates.lua b/ElvUI/Modules/NamePlates/NamePlates.lua index 87bcab8..fe6bd9d 100644 --- a/ElvUI/Modules/NamePlates/NamePlates.lua +++ b/ElvUI/Modules/NamePlates/NamePlates.lua @@ -561,7 +561,8 @@ function mod:OnCreated(frame) moveDown:SetDuration(0.1) moveDown:SetOffset(0, -35) moveDown:SetSmoothing("In") - moveDown:SetScript("OnFinished", function(self) + moveDown:SetScript("OnFinished", function() + local self = this self:Reset() end) diff --git a/ElvUI/Modules/Skins/Blizzard/Misc.lua b/ElvUI/Modules/Skins/Blizzard/Misc.lua index 39e809b..048ebf4 100644 --- a/ElvUI/Modules/Skins/Blizzard/Misc.lua +++ b/ElvUI/Modules/Skins/Blizzard/Misc.lua @@ -27,7 +27,9 @@ local function LoadSkin() } for i = 1, getn(skins) do - E:SetTemplate(_G[skins[i]], "Transparent") + if _G[skins[i]] then + E:SetTemplate(_G[skins[i]], "Transparent") + end end -- ChatMenus @@ -188,7 +190,7 @@ local function LoadSkin() for i = 1, getn(BlizzardHeader) do local title = _G[BlizzardHeader[i].."Header"] - if title then + if title and title.SetTexture then title:SetTexture("") title:ClearAllPoints() if title == _G["GameMenuFrameHeader"] then diff --git a/ElvUI/Modules/Skins/Skins.lua b/ElvUI/Modules/Skins/Skins.lua index cc2e668..62cb6c0 100644 --- a/ElvUI/Modules/Skins/Skins.lua +++ b/ElvUI/Modules/Skins/Skins.lua @@ -161,6 +161,7 @@ local tabs = { } function S:HandleTab(tab) + if not tab then return end local name = tab:GetName() for _, object in pairs(tabs) do local tex = _G[name..object] diff --git a/ElvUI/Modules/UnitFrames/Elements/Auras.lua b/ElvUI/Modules/UnitFrames/Elements/Auras.lua index 206310b..4829796 100644 --- a/ElvUI/Modules/UnitFrames/Elements/Auras.lua +++ b/ElvUI/Modules/UnitFrames/Elements/Auras.lua @@ -69,7 +69,8 @@ function UF:Construct_AuraIcon(button) button.overlay:SetTexture(nil) button:RegisterForClicks("RightButtonUp") - button:SetScript("OnClick", function(self) + button:SetScript("OnClick", function() + local self = this if E.db.unitframe.auraBlacklistModifier == "NONE" or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown()) or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown()) diff --git a/ElvUI/Modules/UnitFrames/Elements/ComboPoints.lua b/ElvUI/Modules/UnitFrames/Elements/ComboPoints.lua index 045b2ee..b6a2a0c 100644 --- a/ElvUI/Modules/UnitFrames/Elements/ComboPoints.lua +++ b/ElvUI/Modules/UnitFrames/Elements/ComboPoints.lua @@ -18,13 +18,12 @@ function UF:CombobarDetachedUpdate() CombobarDetached:RegisterEvent("PLAYER_ENTERING_WORLD") CombobarDetached:RegisterEvent("UPDATE_SHAPESHIFT_FORM") - CombobarDetached:SetScript("OnEvent", function(self, event, unit) - print(self, event, unit) + CombobarDetached:SetScript("OnEvent", function() if event == "PLAYER_ENTERING_WORLD" then E:ShapeshiftDelayedUpdate(ElvUF_Target.ComboPoints.Override, ElvUF_Target) end - ElvUF_Target.ComboPoints.Override(ElvUF_Target, event, unit) + ElvUF_Target.ComboPoints.Override(ElvUF_Target, event, arg1) end) end diff --git a/ElvUI_Config/Libraries/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/ElvUI_Config/Libraries/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua index 548f3d3..7f3653c 100644 --- a/ElvUI_Config/Libraries/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua +++ b/ElvUI_Config/Libraries/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua @@ -331,7 +331,7 @@ local methods = { toggle:SetHeight(14) toggle:ClearAllPoints() toggle:SetPoint("TOPRIGHT", button, "TOPRIGHT", -6, -1) - toggle:SetHighlightTexture("Interface\Buttons\UI-PlusButton-Hilight", "ADD") + toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight", "ADD") toggle:SetScript("OnClick", Button_OnClick) button.toggle = toggle toggle.obj = button diff --git a/ElvUI_Config/Nameplates.lua b/ElvUI_Config/Nameplates.lua index 8692c6e..c42d743 100644 --- a/ElvUI_Config/Nameplates.lua +++ b/ElvUI_Config/Nameplates.lua @@ -1046,8 +1046,10 @@ E.Options.args.nameplate = { set = function(info, value) selectedFilter = value; UpdateFilterGroup() end, values = function() filters = {} - for filter in pairs(E.global["nameplates"]["filter"]) do - filters[filter] = filter + if E.global["nameplates"] and E.global["nameplates"]["filter"] then + for filter in pairs(E.global["nameplates"]["filter"]) do + filters[filter] = filter + end end return filters end diff --git a/README.md b/README.md index 2824e16..736e435 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,15 @@ # Turtle WoW ElvUI - Vanilla (1.12.1) ## :exclamation: *Does NOT work with Retail - [Classic (1.13)](https://git.tukui.org/elvui/elvui-classic)* -# Due to Classic 1.13 release, development on this addon has halted. If you or your friends still play 1.12.1 Vanilla and are wanting to help with any bug fixes, please submit any PR requests as you please. At this time, we will not answer any support tickets you make or ask about in regards to current bugs. For now, development will stay quiet on this matter. +# This repository is actively being fixed and maintained to ensure compatibility with Turtle WoW. + +## Changelog +- **Fix:** Removed implicit `arg` table leak in `hooksecurefunc` (varargs `...` issue in Lua 5.0). +- **Fix:** Stripped invisible UTF-8 BOM from `utf8data.lua` that caused Lua parser errors. +- **Fix:** Resolved tooltip crash with ShaguTweaks by reusing existing `backdrop` frames in `CreateBackdrop` instead of unconditionally overwriting them. +- **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 check before calling `SetTexture("")` on Blizzard header frames, preventing crashes when headers are modified by other addons or the custom client. This is the backported version of ElvUI for World of Warcraft - Vanilla (1.12.1)