You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TukUI与LKAnnounce共存时GameTooltip:SetPoint()空区域错误排查

解决TukUI(修改版)与LKAnnounce共存时的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

火山引擎 最新活动