diff --git a/helpers.lua b/helpers.lua index a1e423c..7f383ea 100644 --- a/helpers.lua +++ b/helpers.lua @@ -1,17 +1,23 @@ local gfind = string.gmatch or string.gfind +local expansion ShaguTweaks.GetExpansion = function() + if expansion then return expansion end + local _, _, _, client = GetBuildInfo() client = client or 11200 - -- detect client expansion + -- detect client expansion once; the client build cannot change during a + -- running session, so repeated helpers don't need to query it again. if client >= 20000 and client <= 20400 then - return "tbc" + expansion = "tbc" elseif client >= 30000 and client <= 30300 then - return "wotlk" + expansion = "wotlk" else - return "vanilla" + expansion = "vanilla" end + + return expansion end ShaguTweaks.GetGlobalEnv = function() @@ -84,32 +90,31 @@ ShaguTweaks.HookAddonOrVariable = function(addon, func) end) end -local hooks = {} ShaguTweaks.hooksecurefunc = function(tbl, name, func, prepend) if type(tbl) == "string" then prepend, func, name, tbl = func, name, tbl, _G end - if not tbl or not tbl[name] then return end + if not tbl or type(tbl[name]) ~= "function" or type(func) ~= "function" then return end - hooks[tostring(func)] = {} - hooks[tostring(func)]["old"] = tbl[name] - hooks[tostring(func)]["new"] = func + -- Capture each hook's state in its own closure. The old implementation keyed + -- shared state by tostring(func), so reusing the same callback for another + -- hook could overwrite the first wrapper's original function. + local old = tbl[name] + local new = func if prepend then - hooks[tostring(func)]["function"] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) - hooks[tostring(func)]["new"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) - return hooks[tostring(func)]["old"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + tbl[name] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + new(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + return old(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) end else - hooks[tostring(func)]["function"] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) - local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16 = hooks[tostring(func)]["old"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) - hooks[tostring(func)]["new"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + tbl[name] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16 = old(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) + new(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16 end end - - tbl[name] = hooks[tostring(func)]["function"] end local sanitize_cache = {} @@ -446,4 +451,4 @@ ShaguTweaks.GetItemLinkByName = function(name) return CacheItemLink(name, hyperLink) end end -end +end \ No newline at end of file