对应源文件: core.lua
MiniExtend 已尽可能恢复标准 lua 环境,这意味着你能正常调用那些本来被"删除"的基本函数。
以下是相对标准 lua 环境有所不同的部分(前提是执行了 Env.__init__();):
print(...) 函数print() 函数效果相同,仍采用相同的格式化方式。 loadstring(string, [, chuckname]) 函数loadstring() 函数不同的是,该函数返回的函数的环境为 &genv ,因此无法直接使用 MiniExtend 。 &_GScriptFenv_ ,使用 loadstring2() 函数genv["_GScriptFenv_"] 即 &_GScriptFenv_ ,因此函数中可以访问 &_GScriptFenv_ ,从而进一步访问 MiniExtend 。 以下内容为 MiniExtend Core 增加的内容:
Env 作用域Env 作用域是为脚本环境设定的作用域。
__init__() 函数&_GScriptFenv_ 。 事实上,脚本环境不是真正的 &_GScriptFenv_ ,而是内部定义的一个表,这个表首先索引游戏 API (例如 Game, Customui),然后才去索引 &_GScriptFenv_ 。
并且每个脚本都会有不同的这样的环境,因为每个脚本都对应一个函数,而调用脚本即调用该函数,在此之前会设置环境。
indexAPI(key) 函数&_GScriptFenv_ ,但只应用于获取游戏 API 对象。 Env.__init__() 把脚本对应的函数的环境设为 &_GScriptFenv_ ,因此无法直接访问游戏 API ,使用该函数访问游戏 API 。 key:{string} API 对象的名称,例如 "Customui"{all} 访问的结果 index(key) 函数&_GScriptFenv_(实际上已经不存在) 索引全局变量,例如脚本常量, printtag(), warn() 等函数。 key:{string} 索引的键值,例如 printtag, warn{all} 索引的结果| 方式 | &_GScriptFenv_ 中的值 |
旧的 &_GScriptFenv_ 可访问的值 |
游戏 API |
|---|---|---|---|
直接访问(&_GScriptFenv_) |
√ | ||
Env.indexAPI(key) |
√ | √ | |
Env.index(key) |
√ |
genv 表&genv ,在 MiniExtend 中直接提供了这一个表。 Env.__init__() 之前,脚本函数本身的环境是一个特殊的表,它首先控制对游戏 API 的访问,然后才去索引 &_GScriptFenv_ 。 _G2 表&_GScriptFenv_ 和 &genv),只要脚本在 core 脚本后运行都可以访问该表,因此可以通过 _G2 来在各个脚本之间交换数据。 "__MiniExtend__" 开头的变量来作为自己的索引,因为 MiniExtend 使用这种标识符作为索引存储一些变量,你可以遍历 _G2 来确定 MiniExtend 使用了哪些标识符。 loadstring2(string, [, chuckname]) 函数loadstring(string, [, chuckname]); ,但是注意 losdstring() 返回的函数的环境为 genv ,而 loadstring2() 返回的函数的环境为 &_GScriptFenv_ 。 LoadLuaScript(string, [, chuckname]); ,使用它替代 LoadLuaScript() 。 deepcopy(table) 函数table 的深拷贝。 copy_table(table); ,使用它替代 copy_table() 。 table:{table} 要深拷贝的表。 return:{table} table 的深拷贝。 迷你世界不是简单的 lua 解释器,有时脚本还会在服务器上运行,因此一些 lua 基本函数可能有歧义。
可以近似的认为开发者脚本在服务器上运行,因此 io, package, os.execute 等访问操作系统的函数的行为取决于服务器。
对于任何访问系统的函数,例如 io, package, os.execute ,它们大多本是被删除的函数和库,其行为取决于游戏的服务器。
io.close(); ,这将关闭默认输出文件,在 lua 上因为不能关闭标准文件而失败,但在迷你世界中,这将导致程序突然关闭。 os.execute("cmd") ,会弹出一个 cmd 窗口,而且该窗口会阻塞程序运行,除非手动关闭,这也非常难看。