改变 lua_thread 的 _ENV(使用 C API)

这是为一个多人游戏制作的,其中 NPC 脚本将作为函数块加载并缓存在单个 lua_State 上,每次玩家与 NPC 交互时,将创建一个新的 lua_thread,从全局 lua_table 中获取一个缓存函数并将其推到线程的堆栈上,然后恢复线程(npc 脚本在完成之前会多次挂起)。

我正在尝试使用 C API 更改 lua 线程的环境,以便已加载/运行的函数无法更改全局变量/由不同线程运行的其他函数更改它们。

我通过更改函数的环境来实现所需的结果,通过将此代码添加到我的脚本开头。但是我想在 C API 方面执行此操作,这样我就不必将此代码粘贴到每个脚本中。

local newgt = {}
setmetatable(newgt, {__index = _G })
local _ENV = newgt

示例代码+所需/当前输出

npcA.lua

x = 10
print(x)
y = 60

npcB.lua

print(x)
y = 25
player:someYieldingFunction()
print(y)

我希望 npcA 打印

10

并且 npcB 打印

nil
25

当前的输出是(这不是我想要的)

如果 npcA 先运行,npcB 将打印

10
25

如果 npcB 先运行然后挂起,然后 npcA 运行,然后 npcB 继续运行,npcB 将打印

10
60

这是有问题的。

点赞