1

我在一款名为《Amalur 王国》的游戏中使用了 Lua 5.1 版本。这是havocscript,但afaik,havocscript是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

直接地

字符串

0

连接(不存在)

我不是 Lua 专家,但我试图了解它是如何工作的。因为我希望能够打印调试信息并将其保存在外部。

编辑:简短的回答是游戏的引擎使用了专有的重写 io write 方法。

Amalur 有不同的类型,ui64实际上是指向一些 lua/havok 脚本无法访问的内存的指针,但该库允许操作。基本上,当 aui64传入 raw 以调用内部对象表示的或或任何内部对象write的本地化时。TypeActor

有一个更改版本的 io 库,当它收到一个 ui64 时会询问

4

1 回答 1

2

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

该问题的基本要点是,游戏《阿玛鲁尔王国》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

所以,是的,与其说是一个 lua 问题,不如说是一个 havok 问题,而且我不了解我正在破解的外国游戏引擎。

于 2020-06-19T05:58:13.360 回答