TukUI与LKAnnounce共存时GameTooltip:SetPoint()空区域错误排查
GameTooltip:SetPoint() Lua错误 我之前处理过不少WoW插件的初始化冲突问题,你的情况很典型——核心是self变量在tooltip锚定时为nil,而且仅在两个插件同时启用时触发,重载后消失,完全指向加载顺序或初始化时机的冲突。下面是具体的排查和修复步骤:
1. 先锁定错误的代码根源
首先看Interface\AddOns\Tukui\datatext\system.lua第98行的代码,大概率是类似这样的调用:
GameTooltip:SetPoint("TOPLEFT", self, "TOPRIGHT", 0, 0)
这里的self本该是TukUI系统数据文本的显示框架,但因为LKAnnounce的初始化逻辑干扰,这个tooltip触发事件(比如OnEnter)被提前调用了——此时TukUI的这个框架还没完成初始化,self自然就是nil,导致API报错找不到区域。
2. 最直接的修复:给self加安全检查+ fallback逻辑
修改system.lua里的这段代码,确保只有self有效时才用它锚定tooltip,否则用兜底方案:
-- 替换原SetPoint调用的代码 if self and self:IsObjectType("Frame") then -- 更严谨的类型检查 GameTooltip:SetPoint("TOPLEFT", self, "TOPRIGHT", 0, 0) else -- 临时锚定到屏幕左上角,避免报错 GameTooltip:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 20, -20) -- 或者延迟0.1秒重试,等框架初始化完成 C_Timer.After(0.1, function() if self and self:IsObjectType("Frame") then GameTooltip:SetPoint("TOPLEFT", self, "TOPRIGHT", 0, 0) end end) end
这样既避免了报错,又能在框架就绪后正常显示tooltip。
3. 调整插件加载顺序(辅助方案)
既然怀疑是加载顺序问题,你可以修改TukUI的Tukui.toc文件,添加依赖确保它在LKAnnounce之后加载:
## Dependencies: LKAnnounce
注意这是修改版插件,可能会影响其他依赖TukUI的子插件,建议先测试再保留。
4. 排查LKAnnounce的干扰逻辑
因为关闭LKAnnounce错误就消失,说明它的初始化代码可能提前触发了TukUI的tooltip事件。你可以在LKAnnounce的代码里找这几类逻辑:
- 是否有遍历UI框架、模拟鼠标悬停的代码?
- 是否直接修改了
GameTooltip的全局行为? - 是否在初始化时调用了和tooltip相关的API?
如果找到这类代码,给它加个延迟初始化,比如用C_Timer.After(1, function() ... end)包裹,让TukUI先完成数据文本框架的初始化。
5. 无调试器下的进阶追踪技巧
你可以在错误代码前后加debugstack来打印调用栈,找到触发tooltip的源头:
-- 在system.lua第98行前添加 print("Tooltip trigger stack:", debugstack(2)) print("Current self:", self)
debugstack(2)会打印调用这个函数的上层栈信息,帮你精准定位LKAnnounce里哪段代码触发了这个冲突。
内容的提问来源于stack exchange,提问作者nop




