在 Lua 中从另一个脚本修改本地变量

我正在尝试创建一个使用 Lua 语言的游戏 Don't Starve Together 的 mod。因此,我不能修改他们的源变量/文件

为了尝试修改世界生成,我需要访问在另一个文件(该文件名为 "levels.lua")中实例化的本地表。 变量名是 "levellist"。 是否有一种方法可以访问该变量,以便我可以向表中添加某些元素?

具体来说,我想向 levellist[DST_CAVE].overrides 添加 {"task_set", "cave_custom"}。

如果有人可以帮助或者告诉我是否可能,那就太好了。 谢谢!

点赞
用户3979429
用户3979429

你要做的事情根本没有意义。局部变量只能从定义它的范围内以及嵌套的范围内访问。没有普通方法可以从不同的范围中进行更改,更不用说完全不同的脚本了。

如果你希望所有脚本都使用变量,请使用全局变量

2016-03-24 09:52:44
用户936986
用户936986

当然,你无法访问另一个函数使用的局部变量(即“指针”),除非使用很少暴露给用户沙盒的模糊调试方法,但你并不需要这样做。因为你不想修改某些局部变量(例如将它指向另一个表),而是想要访问某个表并修改其中的值。所以你只需要找到任何一个地方,以任何方式将其暴露给你。

你应该在问题中编辑相关内容,因为来回切换文件真的很麻烦。根据注释/聊天记录提供的结构,AddLevel(LEVELTYPE.SURVIVAL, ...)会向levellist[LEVELTYPE.SURVIVAL]表中插入一个条目。如果你检查levels.lua,你还可以看到它返回一个表,sandbox_levels 正好分配给它。

因此:

local levels = require "levels"
print(levels.sandbox_levels)
-- 将打印“table: SOMENUMBERS”-即levellist[LEVELTYPE.SURVIVAL]的地址

你现在可以使用for idx = 1, #levels.sandbox_levelsipairs来迭代它,并找到属于"DST_CAVE"的条目。我无法告诉你ID字段将被称为什么或其结构将如何,因为在插入你发布的文件之前,数据将经过函数Level 预处理。

2016-03-24 10:47:40
用户251199
用户251199

正如其他人所建议的那样,这可能不是你最好的策略。

但是,根据你的环境,也许可以滥用一些更深奥的运行时特征,让你间接地修改那些不属于“你”的值。请查看debug.sethooksetfenv

2016-03-26 01:55:26