# MiniExtend Core

对应源文件:core.lua

MiniExtend 已尽可能恢复标准 Lua 环境,这意味着你能正常调用那些本来被"删除"的基本函数。

以下是相对标准 Lua 环境有所不同的部分(前提是执行了 Env.__init__()):

# print

function print(...) end

由于控制台是不可见的,在脚本中 print() 函数被重定向到日志,MiniExtend 保留了这个更改,虽然进行了重写。

# loadstring2

function loadstring2(string [, chuckname]) end

环境为 _GScriptFenv_loadstring() 函数。

TIP

由于 genv["_GScriptFenv_"] 是脚本环境,因此函数中可以通过 _GScriptFenv_ 访问脚本环境,从而进一步访问 MiniExtend 。

# Env.__init__

初始化脚本运行环境。

function Env.__init() end

在每个自定义脚本开头都要最先执行,不包括 UI 作用域中的 ui_main.lua ,否则可能导致脚本效率降低,出现错误。

(实际上就是把脚本对应的函数得环境设为 _GScriptFenv_

事实上,脚本环境不是真正的 _GScriptFenv_ ,而是内部定义的一个表,这个表首先索引游戏 API (例如 Game 、Customui),然后才去索引 _GScriptFenv_

并且每个脚本都会有不同的这样的环境,因为每个脚本都对应一个函数,而调用脚本即调用该函数,在此之前会设置环境。

# Env.indexAPI

获取游戏 API 对象,最好使用一个局部变量存储返回值。

函数会访问新的 _GScriptFenv_ ,但只应用于获取游戏 API 对象。

由于 Env.__init__() 把脚本对应的函数的环境设为 _GScriptFenv_ ,因此无法直接访问游戏 API ,使用该函数访问游戏 API 。

---@param key string 访问的对象名称
---@return any 访问结果
function Env.indexAPI(key) end

# Env.index

使用旧的 _GScriptFenv_(实际上已经不存在)索引全局变量,例如脚本常量、 printtagwarn 等函数。

这等同于以常规方式访问不为游戏 API 的全局变量。

---@param key string 索引的键
---@return any 引索结果
function Env.index(key) end

# 访问范围表

方式 _GScriptFenv_ 中的值 旧的 _GScriptFenv_ 可访问的值 游戏 API
直接访问(_G)
Env.indexAPI(key)
Env.index(key)

# genv

该表表示迷你世界脚本内部环境,想知道它包含什么可以遍历它,但要注意该表包含上万个键。

开发者编辑的脚本的环境 _GScriptFenv_ 不同于 genv ,但 genv["_GScriptFenv_"] 就等于这个 _GScriptFenv_ ,也就是可以以此来通过 genv 访问脚本环境。

在使用 Env.__init__() 之前,脚本函数本身的环境是一个特殊的表,它首先控制对游戏 API 的访问,然后才去索引 _GScriptFenv_

# _G2

在任何可能的环境下(包括 _GScriptFenv_genv),只要脚本在 core 脚本后运行都可以访问该表,因此可以通过 _G2 来在各个脚本之间交换数据。

不要使用 "__MiniExtend__" 开头的变量来作为自己的索引,因为 MiniExtend 使用这种标识符作为索引存储一些变量,你可以遍历 _G2 来确定 MiniExtend 使用了哪些标识符。

# deepcopy

深拷贝一个 table

---@param table table 要深拷贝的表
---@return table 拷贝结果
function deepcopy(table) end

基本等价于 copy_table(table),使用它替代 copy_table

# 注意事项

迷你世界不是简单的 lua 解释器,有时脚本还会在服务器上运行,因此一些 lua 基本函数可能有歧义。

可以近似的认为开发者脚本在服务器上运行,因此 io, package, os.execute 等访问操作系统的函数的行为取决于服务器。

对于任何访问系统的函数,例如 io, package, os.execute ,它们大多本是被删除的函数和库,其行为取决于游戏的服务器。

  • 在单人模式下,服务器就是玩家的设备。
  • 由房主开启的多人游戏,服务器是房主的设备。
  • 开发者申请的云服,服务器是迷你世界管理该云服的服务器(未证实)。

某些基本函数可能很危险

必须注意这些危险行为,以下是一些例子:

  • io.close() 导致程序突然关闭
  • 在 Windows 下执行 os.execute("cmd") ,会弹出一个 cmd 窗口,而且该窗口会阻塞程序运行,除非手动关闭。
Last Updated: 1/8/2023, 8:39:15 AM