tostring、concat 和直接使用对象有什么不同的结果?
2020-6-19 5:35:53
收藏:0
阅读:100
评论:1
我在一个叫做《亚玛兰王国》的游戏中使用了 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 调用时,会调用内部对象 Type 或 Actor 的本地化。
修改了 io 库的一个版本,当它接收到一个 ui64 时,会询问该对象的内部表示。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

首先,我想说我不能使用实际的
io.write,因为引擎没有加载io,但我有一个类似的方法可以用来将文本写入 ini 条目中,然而,每次调用写入方法时,它都会覆盖我的个人条目的内容,无论是否更改键。问题的基本概述是,游戏《阿玛勒王国》的 Havok 引擎有一个自定义的
write/(以及几乎任何其他显示文本的方法)例程。ui64数据类型多少是指向 Havok 或 C 中存在的对象的指针。然而,引擎提供了一个 API,可以获取这些指针并调用各种例程。将
ui64传递给write方法将使游戏调用其本地化表,并为此特定的Type在屏幕上输出本地化名称。因此,longbow_unique11a是Sin。由于我的目标是尝试获取实际的本地化名称并转储它们以及其他数据,我想出了一个解决方法。
基本上,游戏允许您为制作的物品命名,当它这样做时,它使用默认条目填充名称,所以通过反编译一些方法,我能够构建我的字符串如下所示:
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 问题,是我不理解我正在破解的外部游戏引擎。