tostring、concat 和直接使用对象有什么不同的结果?

我在一个叫做《亚玛兰王国》的游戏中使用了 Lua 5.1 的版本。这是 HavokScript,但据我所知,HavokScript 是 Lua 的一种。现在游戏中有一种名为 ui64 的自定义类型和一个自定义的包,注入了一个我添加到游戏中的钩子。

如果我执行以下操作:

module("playerdodge_hook", package.seeall)

function save_to_file(filename, data)
    if io then
        io.output(filename)
        io.write(data)
        io.flush()
    end
end

function dodge_hook()
    local x = SIMTYPE_ID("longbow_unique11a")
    save_to_file("type", type(x))
    save_to_file("directly", x)
    save_to_file("tostring", tostring(x))
    save_to_file("concat", "" .. x)
end

文件的输出如下所示: 类型

ui64

直接

Sin

tostring

0

concat(不存在)

我不是 Lua 的专家,但我正在尝试理解这是如何工作的。因为我想能够打印调试信息并将其外部保存。

编辑: 简短的回答是游戏引擎使用了一个专有的覆盖 io 写入方法的方法。

Amalur 有不同的类型,ui64 实际上是一个指向 Lua/Havok Script 无法访问的某些内存的指针,但该库允许操作。当一个 ui64 原始地传递给 write 调用时,会调用内部对象 TypeActor 的本地化。

修改了 io 库的一个版本,当它接收到一个 ui64 时,会询问该对象的内部表示。

点赞
用户468672
用户468672

首先,我想说我不能使用实际的 io.write,因为引擎没有加载 io,但我有一个类似的方法可以用来将文本写入 ini 条目中,然而,每次调用写入方法时,它都会覆盖我的个人条目的内容,无论是否更改键。

问题的基本概述是,游戏《阿玛勒王国》的 Havok 引擎有一个自定义的 write/(以及几乎任何其他显示文本的方法)例程。

ui64 数据类型多少是指向 Havok 或 C 中存在的对象的指针。然而,引擎提供了一个 API,可以获取这些指针并调用各种例程。

ui64传递给write方法将使游戏调用其本地化表,并为此特定的Type在屏幕上输出本地化名称。因此,longbow_unique11aSin

由于我的目标是尝试获取实际的本地化名称并转储它们以及其他数据,我想出了一个解决方法。

基本上,游戏允许您为制作的物品命名,当它这样做时,它使用默认条目填充名称,所以通过反编译一些方法,我能够构建我的字符串如下所示:

function dump_item_names(tbl)
    local callback = function(text, canceled)
        op = {}
        for i = 1,#tbl do
           local actor = tbl[i]
           local typeId = get_hex_of_raw_id(actor)
           WINDOW.populate_edit_box(name_win.m_editbox, actor)
           local name = WINDOW.get_editbox_text(name_win.m_editbox)
           op[#op + 1] = typeId .. ',' .. name
        end
        save_to_file("items.txt", table.concat(op,'\n'))
    end
    name_win.launch(SL(357894144), tbl[1], true, 100, callback, false)
end

所以,是一个 Havok 问题,而不是一个 Lua 问题,是我不理解我正在破解的外部游戏引擎。

2020-06-19 05:58:13