尝试调用全局"this"(零值)



我可以看到有人问过类似的问题,但我对lua编码并不那么熟悉。 我正在尝试修复一个旧的魔兽世界原版插件,以便在经典客户端中运行。

代码如下:

function FHH_OnLoad()
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
-- Register Slash Commands
SLASH_FHH1 = "/huntershelper";
SLASH_FHH2 = "/hh";
SlashCmdList["FHH"] = function(msg)
FHH_ChatCommandHandler(msg);
end

local version = GetAddOnMetadata("GFW_HuntersHelper", "Version");
GFWUtils.Print("Fizzwidget Hunter's Helper "..version.." initialized!");

end

它抛出以下错误;

Message: InterfaceAddOnsGFW_HuntersHelperHuntersHelper.lua:27: attempt to index global 'this' (a nil value)
Time: Tue Jun 30 09:25:14 2020
Count: 1
Stack: InterfaceAddOnsGFW_HuntersHelperHuntersHelper.lua:27: attempt to index global 'this' (a nil value)
InterfaceAddOnsGFW_HuntersHelperHuntersHelper.lua:27: in function `FHH_OnLoad'
[string "*:OnLoad"]:1: in function <[string "*:OnLoad"]:1>
Locals: (*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index global 'this' (a nil value)"

我试过玩弄"这个"的说法,但我真的不确定该怎么做,我想看看你们中是否有人在座的聪明人会知道发生了什么

如果所讨论的插件很旧,那么在过去的某个时候(2010年?(,插件API已经从全局变量转移到了局部变量。

框架是在 XML 文件中定义的,就像您在评论中发布的框架一样:

<Frame name="HuntersHelperFrame">
<Scripts>
<OnLoad>FHH_OnLoad();</OnLoad>
<OnEvent>
FHH_OnEvent(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); 
</OnEvent>
</Scripts>
</Frame>

<Scripts>中的元素实际上被称为函数,其内容作为函数体。它们被调用一些参数。您可以使用魔兽世界 API 作为参考来找出哪些参数。它不是官方的,但它是最接近参考手册的东西。

现在,您对小部件处理程序感兴趣。

现在,您应该采取的第一步是:

  1. 更改 XML:
    <Frame name="HuntersHelperFrame">
    <Scripts>
    <OnLoad>FHH_OnLoad(self)</OnLoad>
    <OnEvent>
    FHH_OnEvent(self, event, ...) 
    </OnEvent>
    </Scripts>
    </Frame>
    
  2. 更改 lua 以反映:
    function FHH_OnLoad(self)
    self:RegisterEvent("PLAYER_ENTERING_WORLD")
    -- and so on, change all occurrences of `this` to `self`
    -- or simply name the first argument `this` instead of `self`:
    -- function FHH_OnLoad(this)
    end
    -- Change all of the functions:
    function FHH_OnEvent(self, event, ...)
    -- function body
    end
    

根据插件的大小,它可能会成为一大块工作。可悲的是,这还不是结束;请注意,因为脚本可能直接依赖于全局变量的存在并执行一些技巧。

我想您可以尝试使用local this = self和类似技巧来解决它,但这可能不适用于所有情况,并且由于框架如何解析XML,可能会导致一些问题。

最后一点:多年来,API发生了很大变化,您很可能会遇到更多问题。祝你好运!

相关内容

  • 没有找到相关文章

最新更新