sleep([time=0])
主动让出执行权并等待;不要用不让出的空循环计时。
查接口、参数和事件。按编程任务组织,遇到具体问题直接跳读。
减少关键词,或恢复全部内容再选择章节。
本册按编程任务重新组织官方公开的接口事实,讲解与示例独立编写,不是官方译本,也不是官网镜像。已有的实战手册负责搭建与模组联动,这里用于核对接口、数据类型和事件。
[参数] 表示可以省略,不是实际 Lua 调用中的方括号。... 表示变长参数。多个参数形式是重载选项,不能把它们全部连在一起传入。
number 数值、string 字符串、boolean 布尔值、table 表、nil 无值、any 任意值。类型中的 | 是可能类型之一;返回分支中的逗号表示多个返回值,不是一个表。
类型名如 fs.ReadHandle 用于描述返回对象,不是要求照抄成全局变量。fs 句柄、外设和终端对象通常用点号,io 句柄与向量按各自接口用冒号。
资料核对日期为 2026-11-12,官网快照包含到 1.121.0 的条目。它不是某个整合包的兼容保证:先检查安装版本,再检查函数和外设能力。实验性接口单独标注;示例未做游戏内实测。
覆盖官网主目录的 95 个主题与 551 个显式接口、常量及类型成员,保留其签名和类型信息。未复制官网叙述、示例代码、图像或样式;未纳入独立 Java API、历史版本整站和站外 Lua 手册。
_G基础输入与输出写小程序时不必先加载库:print、read、sleep 等名字已经在运行环境里。交互文字与按键事件是两层接口,输入一整行优先用 read。
使用边界:sleep 的秒数按 0.05 秒的节拍向上取整,实际等待还受服务器运行速度影响。read 的遮盖字符只改变显示,不是密码加密。
write("Station name: ")
local name = read()
if name == "" then
printError("A name is required.")
else
print("Connected to " .. name)
endsleep([time=0])主动让出执行权并等待;不要用不让出的空循环计时。
write(text)向屏幕追加可自动折行的文字,但不主动结束当前行。
print(...)把多项值排成一行输出,结束后换行,适合日志与调试。
printError(...)输出醒目的错误提示;它不会代替 error 中断程序。
read([replaceChar [, history [, completeFn [, default]]]])获得一行编辑后的输入,可附带历史、补全函数和初始文字。
_HOST运行环境标识,可用于记录 CC:T 与 Minecraft 的版本信息。
_CC_DEFAULT_SETTINGS由模组配置提供的默认设置字符串;日常配置应使用 settings。
os事件、时间与程序生命周期把程序写成“收到事件,再更新状态”的循环。定时器、网络与外设都通过事件交付结果,不能把等待某一种事件当作完全无损的通用消息队列。
使用边界:pullEvent 收到终止请求会报错退出;pullEventRaw 把 terminate 交给程序处理,即使设了其他过滤器也要处理它。秒、游戏小时与 epoch 毫秒不可混用。
local token = os.startTimer(3)
while true do
local event, value = os.pullEvent()
if event == "timer" and value == token then
print("Three seconds elapsed.")
break
elseif event == "key" and value == keys.q then
os.cancelTimer(token)
break
end
endos.loadAPI(path)旧式加载器,把文件导出的名字放到全局表;新模块优先使用 require。
os.unloadAPI(name)移除旧式 API 的全局入口,不负责关闭该 API 创建的设备或文件。
os.pullEvent([filter])等待匹配事件并返回事件名及其载荷;Ctrl+T 由系统处理。
os.pullEventRaw([filter])接收原始事件,适用于需要清理资源后再处理终止的程序。
os.sleep([time=0])与全局 sleep 相同;挂起期间不会执行当前协程的业务逻辑。
os.version()获取 CraftOS 标识,不要把它当作 CC:T 模组版本。
os.run(env, path, ...)在指定环境表中执行文件;执行结果以成功标志返回。
os.queueEvent(name, ...)给本机事件队列追加自定义消息;不能用它直接给另一台电脑发消息。
os.startTimer(time)安排一次延时通知,返回的编号用于辨认后续 timer。
os.cancelTimer(token)取消指定编号的定时器;不要误取消同一程序中的另一项计时。
os.setAlarm(time)按游戏一天中的时刻安排闹钟,返回用于匹配 alarm 的编号。
os.cancelAlarm(token)撤销指定闹钟,参数不是小时数而是闹钟编号。
os.shutdown()立即关机;在调用之前保存数据并关闭文件。
os.reboot()立即重新启动,随后重新走启动文件流程。
os.getComputerID()读取电脑编号;用于寻址时仍需考虑网络上的身份伪造。
os.computerID()getComputerID 的兼容名字。
os.getComputerLabel()读取用户设置的名称;尚未命名时得到 nil。
os.computerLabel()getComputerLabel 的兼容名字。
os.setComputerLabel([label])设定名称,省略参数可清除名称。
os.clock()读取本次运行经过的秒数,适合测量程序内时间间隔。
os.time([locale])读取一天中的小时值;ingame、utc 与 local 使用不同时间基准。
os.day([locale])读取所选时间基准的天数;不要把游戏日和现实日期编号相混。
os.epoch([locale])读取所选时间基准的毫秒时间戳;现实时间戳通常选 utc。
os.date([format [, time]])按格式输出日期,*t 可得到字段表;传入时间值使用秒而不是 epoch 毫秒。
shell命令行与程序入口shell 负责当前目录、程序查找、别名和补全。处理用户输入的路径时,先用 shell.resolve 得到路径,再交给 fs。
使用边界:execute 保留每个参数的边界,run 会按命令行重新解释参数。含空格的用户参数优先交给 execute;新程序的全局变量不会自动回写到调用者。
shell.execute(command, ...)按已经分开的参数启动程序,适合参数中含空格的调用。
shell.run(...)按命令行语法启动程序;引号和空白会参与参数解析。
shell.exit()结束当前 shell;不是关闭整台电脑的命令。
shell.dir()读取当前工作目录,供路径提示和相对路径处理使用。
shell.setDir(dir)切换工作目录,目标应是实际存在的目录。
shell.path()读取以冒号分隔的程序搜索目录。
shell.setPath(path)替换程序搜索路径;不会移动或安装程序。
shell.resolve(path)把 shell 相对路径转换成文件系统路径。
shell.resolveProgram(command)结合别名和搜索路径查找程序,找不到时返回 nil。
shell.programs([include_hidden])列出可从搜索路径启动的程序,可选择包含隐藏项。
shell.complete(sLine)对整条命令行提出补全候选。
shell.completeProgram(program)只补全程序名,不处理其后参数。
shell.setCompletionFunction(program, complete)为某个程序路径注册参数补全回调。
shell.getCompletionInfo()取得已经注册的补全配置表。
shell.getRunningProgram()获取当前程序路径,便于定位同目录资源。
shell.setAlias(command, program)注册一个短命令到实际程序的映射。
shell.clearAlias(command)删除指定短命令映射,不删除程序文件。
shell.aliases()读取当前 shell 的别名表。
shell.openTab(...)在支持 multishell 的环境中用新标签运行命令。
shell.switchTab(id)把指定 multishell 标签切到前台。
multishell多标签程序高级电脑的多标签终端让多个程序协作运行。区分正在执行的程序和用户正在看的标签:前者用 getCurrent,后者用 getFocus。
使用边界:普通电脑或自建运行环境可能没有 multishell。启动前先检查该全局是否存在;新标签不会因为创建就自动成为焦点。
multishell.getFocus()读取当前可见标签的编号。
multishell.setFocus(n)请求切换可见标签,检查返回值以确认编号有效。
multishell.getTitle(n)读取指定标签标题。
multishell.setTitle(n, title)修改标签标题,不影响程序路径。
multishell.getCurrent()读取调用代码所在的标签编号。
multishell.launch(tProgramEnv, sProgramPath, ...)给出环境表、程序路径和参数,创建一个新任务标签。
multishell.getCount()获取当前标签数量;不要把数量当作永久稳定的任务 ID。
parallel协作式并发需要同时处理键盘、计时和网络时,把互相独立的循环交给 parallel。它在协程之间调度,并不是多个 CPU 线程同时运行 Lua。
使用边界:传函数本身,而不是函数调用结果。某个函数长期不让出执行权会阻塞同组任务;其中一个报错也会使并发调用失败。
parallel.waitForAny(
function()
while true do
print("Uptime:", os.clock())
sleep(2)
end
end,
function()
while true do
local _, key = os.pullEvent("key")
if key == keys.q then return end
end
end
)parallel.waitForAny(...)任一分支正常结束就返回其位置;适合一个退出按钮结束一组监听。
parallel.waitForAll(...)等待所有分支都完成;适合必须全部结束的有限任务。
settings配置与持久化先用 define 描述设置的类型和默认值,再通过 get、set 访问。运行中的值与磁盘上的配置是两回事,修改后需要显式保存。
使用边界:load 会将读入值并入当前设置,不等同于先清空。clear 清的是值,不是设置定义;程序应检查 load、save 的成功标志。
settings.define("station.interval", {
description = "Polling interval in seconds",
default = 5,
type = "number",
})
local value = settings.get("station.interval")
print("Interval:", value)
settings.set("station.interval", value)
if not settings.save() then error("Could not save settings.", 0) endsettings.define(name [, options])登记设置的描述、类型与默认值。
settings.undefine(name)撤掉设置的定义;它和清除当前设置值不是同一个动作。
settings.set(name, value)写入运行期配置值,并触发相应变更事件。
settings.get(name [, default])读取当前值;未设置时使用定义的默认值或调用时给出的后备值。
settings.getDetails(name)读取值、默认值、描述及类型等元信息。
settings.unset(name)移除一个显式值,让默认值重新生效。
settings.clear()一次清除全部显式设置值。
settings.getNames()取得当前已知设置名,适合配置浏览器和补全。
settings.load([path=".settings"])从文件合并设置,默认文件为 .settings。
settings.save([path=".settings"])将当前设置写入文件,默认目标为 .settings。
help本机帮助文件这是 CraftOS 内置帮助文件的索引,不是联网搜索。可以将自己的帮助目录加入路径,为自编程序提供离线说明。
使用边界:帮助搜索路径中的目录使用绝对路径;找不到主题时先检查文件位置,再检查搜索路径。
help.path()读取帮助搜索目录,多个目录用冒号分隔。
help.setPath(newPath)设置帮助文件查找路径。
help.lookup(topic)将主题名解析成帮助文件路径,未找到时为 nil。
help.topics()列出能查到的帮助主题。
help.completeTopic(prefix)返回补在输入前缀后面的候选文本。
fs文件系统与文件句柄fs 适合明确控制打开、读取、写入和关闭的流程。路径相对电脑根目录解释,不跟随 shell 当前目录;磁盘、ROM 和本机硬盘是不同挂载。
使用边界:w 会截断原文件,a 才是追加。1.109.0 起支持 r+ / w+,文本模式也以原始字节处理;不等于任意 Unicode 文本都能正确显示。写后关闭,读取大文件时分块处理。
local path = shell.resolve("station-log.txt")
local file, reason = fs.open(path, "a")
if not file then error(reason, 0) end
local ok, failure = pcall(function()
file.writeLine(tostring(os.epoch("utc")) .. " station checked")
end)
file.close()
if not ok then error(failure, 0) end
print("Appended to " .. path)fs.complete(...)根据当前位置和输入前缀给出文件名补全,可筛选文件、目录和隐藏项。
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
path | string | 必需 |
location | string | 必需 |
include_files | boolean | 可选;默认 true |
include_dirs | boolean | 可选;默认 true |
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
path | string | 必需 |
location | string | 必需 |
options | { include_dirs ? = boolean , include_files ? = boolean , include_hidden ? = boolean } | 可选 |
{ string ... }新增 1.74 · 变更 1.101.0。变更细节以对应版本原始定义为准。
fs.find(path)用通配路径查找文件;这是路径匹配,不是文件正文搜索。
fs.isDriveRoot(path)判断路径是不是挂载点,区分磁盘根目录与普通子目录。
fs.list(path)列出目录内的名字;若要访问它们,应再与父路径组合。
fs.combine(path, ...)拼接并规整路径,避免手工处理重复分隔符。
fs.getName(path)提取路径最后一段,不读取文件。
fs.getDir(path)提取父目录部分,不检查目录是否存在。
fs.getSize(path)读取文件大小,单位是字节。
fs.exists(path)判断路径是否存在,文件与目录都算。
fs.isDir(path)区分目录与其他路径。
fs.isReadOnly(path)检查所在路径是否不可写;检查结果不是后续写入必定成功的保证。
fs.makeDir(path)建立目录,并补齐缺失的父目录。
fs.move(path, dest)将文件或目录移动到新路径;目标冲突等情况可能报错。
fs.copy(path, dest)复制文件或目录,原位置仍然保留。
fs.delete(path)删除文件;传目录会连同其内容删除,调用前确认路径。
fs.open(path, mode)按模式取得句柄;r 只读、a 追加,w 会立即截断旧文件。失败可能返回 nil, 原因,非法模式则可能抛错。
fs.getDrive(path)查出路径所属的挂载名称,例如本机硬盘或 ROM。
fs.getFreeSpace(path)查询挂载剩余字节数;某些挂载用字符串 unlimited 表示无限。
fs.getCapacity(path)查询挂载总容量;ROM 等只读挂载可能返回 nil。
fs.attributes(path)取得大小、目录标志、只读标志及创建/修改时间。
fs.ReadWriteHandle.read([count])从当前位置读取字节;到末尾为 nil。二进制模式省略数量时返回一个字节数值,给出数量时返回字符串。
fs.ReadWriteHandle.readAll()取得当前位置之后的剩余内容;不是每次都从文件头重读。
fs.ReadWriteHandle.readLine([withTrailing])读取下一行;可选择保留行尾字符,文件结束时为 nil。
fs.ReadWriteHandle.seek([whence [, offset]])移动读写位置;set、cur、end 分别从开头、当前位置、末尾计算偏移。
fs.ReadWriteHandle.write(...)在当前位置写入字符串;旧式二进制句柄也接受单字节数值。
fs.ReadWriteHandle.writeLine(text)写入文字并附加换行,不自动关闭文件。
fs.ReadWriteHandle.flush()把缓冲数据送出,句柄保持打开。
fs.ReadWriteHandle.close()结束对文件的访问并释放句柄;关闭后不要继续读写。
fs.WriteHandle.write(...)在当前位置写入字符串;旧式二进制句柄也接受单字节数值。
fs.WriteHandle.writeLine(text)写入文字并附加换行,不自动关闭文件。
fs.WriteHandle.flush()把缓冲数据送出,句柄保持打开。
fs.WriteHandle.seek([whence [, offset]])移动读写位置;set、cur、end 分别从开头、当前位置、末尾计算偏移。
fs.WriteHandle.close()结束对文件的访问并释放句柄;关闭后不要继续读写。
fs.ReadHandle.read([count])从当前位置读取字节;到末尾为 nil。二进制模式省略数量时返回一个字节数值,给出数量时返回字符串。
fs.ReadHandle.readAll()取得当前位置之后的剩余内容;不是每次都从文件头重读。
fs.ReadHandle.readLine([withTrailing])读取下一行;可选择保留行尾字符,文件结束时为 nil。
fs.ReadHandle.seek([whence [, offset]])移动读写位置;set、cur、end 分别从开头、当前位置、末尾计算偏移。
fs.ReadHandle.close()结束对文件的访问并释放句柄;关闭后不要继续读写。
ioLua 风格的文件流io 提供标准流和迭代读取风格。逐行扫描优先考虑 io.lines;需要显式控制文件寿命时,保留 io.open 返回的句柄并关闭它。
使用边界:它模拟 Lua 的文件 API,不代表能启动操作系统进程。io.open 返回的句柄以冒号调用;与 fs.open 句柄的点号调用区分。
local path = shell.resolve("station-log.txt")
if not fs.exists(path) then error("Missing log: " .. path, 0) end
local count = 0
for line in io.lines(path) do
count = count + 1
print(count, line)
endio.stdin标准输入流;读取会与终端用户交互。
io.stdout标准输出流;写入内容显示在终端。
io.stderr标准错误输出流,适合诊断文字。
io.close([file])关闭指定流;未传流时作用于当前输出流。
io.flush()刷新当前输出流的缓冲数据。
io.input([file])读取或切换当前默认输入流。
io.lines([filename, ...])取得逐行或按指定格式读取的迭代器;使用文件名创建的迭代器在结束时关闭文件。
io.open(filename [, mode])打开指定文件并返回句柄;失败时为 nil 和原因。
io.output([file])读取或切换当前默认输出流。
io.read(...)按格式从当前默认输入流取数据。
io.type(obj)判断对象是不是文件句柄,以及它是否已关闭。
io.write(...)将多项值写到当前默认输出流。
io.Handle.close()关闭这一个句柄,不影响其他已打开文件。
io.Handle.flush()刷新这个句柄的待写数据。
io.Handle.lines(...)创建基于此句柄的读取迭代器;调用者仍负责关闭句柄。
io.Handle.read(...)按数字长度或 a、l、L 等格式读取;多个格式对应多个返回值。
io.Handle.seek([whence [, offset]])按 set、cur、end 调整文件位置,并返回新偏移。
io.Handle.setvbuf(mode [, size])设置缓冲接口;此兼容层不提供可依赖的实际缓冲策略切换。
io.Handle.write(...)写入字符串或数值,适合以 file:write(...) 形式调用。
textutils序列化与文字整理需要存档就选 Lua 序列化,需要与外部服务交换就选 JSON。格式化输出、分页显示和 Lua 表达式补全也集中在这里。
使用边界:Lua 表、JSON 对象与 JSON 数组不是完全等价的结构。空数组和 JSON null 有专用标记;解析失败必须检查结果,不要把失败当作空数据继续覆盖存档。
textutils.slowWrite(text [, rate])按字符逐步输出文字,不自动换行;速率按每秒字符数计算。
textutils.slowPrint(sText [, nRate])逐字显示后再换行,适合提示文字,不适合高频日志。
textutils.formatTime(nTime [, bTwentyFourHour])把小时数变成易读时间,可选 24 小时格式。
textutils.pagedPrint(text [, free_lines])长文本超出屏幕后等待用户继续。
textutils.tabulate(...)按列排列表格内容,可在参数间插入颜色值。
textutils.pagedTabulate(...)分屏显示表格,避免输出超过屏幕后无法阅读。
textutils.empty_json_array告诉 JSON 序列化器这里是空数组,而不是空对象。
textutils.json_null在 Lua 中保留 JSON null 的专用标记。
textutils.serialize(t, opts)把可表示的 Lua 数据转成文本,便于存盘或检查。
textutils.serialise(t, opts)serialize 的英式拼写别名。
textutils.unserialize(s)从 Lua 序列化文本恢复数据;失败返回 nil。
textutils.unserialise(s)unserialize 的英式拼写别名。
textutils.serializeJSON(...)把数据转换成 JSON;选项可控制非标准值和格式细节。
textutils.serialiseJSON(...)serializeJSON 的英式拼写别名。
textutils.unserializeJSON(s [, options])解析 JSON;按选项决定空数组、null 和 Unicode 的处理。
textutils.unserialiseJSON(s [, options])unserializeJSON 的英式拼写别名。
textutils.urlEncode(str)对 URL 参数或表单字段做百分号编码;不是把任意完整 URL 直接编码。
textutils.complete(sSearchText [, tSearchTable])针对 Lua 名称或表达式前缀返回补全后缀。
vector三维向量适合存储位置、位移和方向。用 vector.new 创建对象,再用冒号方法或运算符做计算。
使用边界:向量运算返回新向量;不要把归一化方向当作原始距离。零向量没有可用的单位方向,归一化前先检查长度。
vector.new(x, y, z)用 x、y、z 构造向量对象。
vector.Vector:add(o)逐分量相加,适合位置叠加位移。
vector.Vector:sub(o)逐分量相减,适合求两点的位移。
vector.Vector:mul(factor)按一个标量缩放向量。
vector.Vector:div(factor)逐分量除以标量;调用前排除零除数。
vector.Vector:unm()取反方向,各分量变号。
vector.Vector:dot(o)得到点积数值,可用于计算投影或方向关系。
vector.Vector:cross(o)得到叉积向量,顺序会影响方向。
vector.Vector:length()计算向量长度。
vector.Vector:normalize()得到长度为 1 的同方向向量;先排除零向量。
vector.Vector:round([tolerance])按容差将各分量取整,适合将测量坐标吸附到网格。
vector.Vector:tostring()转为便于显示和调试的坐标文字。
vector.Vector:equals(other)检查各分量是否相同;浮点测量比较通常需要另设容差。
term终端绘制与重定向终端以字符格为坐标单位,左上角为 (1, 1)。普通输出可用 print,布局控件则用光标定位、write 和 blit。
使用边界:term.write 不自动折行;clear 不把光标移回左上角。重定向前保存旧目标,结束或出错后恢复;native 是底层终端,不是“当前窗口”。
local parent = term.current()
local width, height = parent.getSize()
local pane = window.create(parent, 1, 1, width, math.min(3, height), false)
term.redirect(pane)
local ok, reason = pcall(function()
term.setBackgroundColor(colors.black)
term.clear()
term.setCursorPos(1, 1)
print("Status: ready")
end)
term.redirect(parent)
if not ok then error(reason, 0) end
pane.setVisible(true)term.nativePaletteColour(colour)读取该颜色槽的出厂 RGB 值,不受当前调色板修改影响。 与美式拼写方法等价。
term.nativePaletteColor(colour)读取该颜色槽的出厂 RGB 值,不受当前调色板修改影响。
term.write(text)在光标处写文字并向右移动光标;超出行宽的部分不会自动换行。
term.scroll(y)让画面滚动指定行数;正数向上,负数向下。
term.getCursorPos()获取光标的列、行坐标。
term.setCursorPos(x, y)设置接下来写入文字的位置,坐标从 1 开始。
term.getCursorBlink()读取光标闪烁开关。
term.setCursorBlink(blink)启用或关闭当前光标的闪烁显示。
term.getSize()取得可绘制的列数和行数;窗口或监视器尺寸改变后应重新查询。
term.clear()用当前背景色清空整个目标,光标位置保持不变。
term.clearLine()只擦除光标所在行。
term.getTextColour()获取后续普通文字使用的前景色。 与美式拼写方法等价。
term.getTextColor()获取后续普通文字使用的前景色。
term.setTextColour(colour)指定后续普通文字的前景色。 与美式拼写方法等价。
term.setTextColor(colour)指定后续普通文字的前景色。
term.getBackgroundColour()获取写字和清屏使用的背景色。 与美式拼写方法等价。
term.getBackgroundColor()获取写字和清屏使用的背景色。
term.setBackgroundColour(colour)指定后续写字和清屏使用的背景色。 与美式拼写方法等价。
term.setBackgroundColor(colour)指定后续写字和清屏使用的背景色。
term.isColour()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。 与美式拼写方法等价。
term.isColor()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。
term.blit(text, textColour, backgroundColour)一次写入文字、逐字符前景与逐字符背景;三段字符串长度必须相同。
term.setPaletteColour(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。 与美式拼写方法等价。
term.setPaletteColor(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。
term.getPaletteColour(colour)读取当前调色板槽的三个 RGB 通道。 与美式拼写方法等价。
term.getPaletteColor(colour)读取当前调色板槽的三个 RGB 通道。
term.redirect(target)把 term 输出改送到另一个终端对象,并返回旧对象以便恢复。
term.current()取得当前输出目标,可能是监视器、窗口或自定义终端。
term.native()取得电脑本身的原生终端对象。
term.Redirect.write(text)在光标处写文字并向右移动光标;超出行宽的部分不会自动换行。
term.Redirect.scroll(y)让画面滚动指定行数;正数向上,负数向下。
term.Redirect.getCursorPos()获取光标的列、行坐标。
term.Redirect.setCursorPos(x, y)设置接下来写入文字的位置,坐标从 1 开始。
term.Redirect.getCursorBlink()读取光标闪烁开关。
term.Redirect.setCursorBlink(blink)启用或关闭当前光标的闪烁显示。
term.Redirect.getSize()取得可绘制的列数和行数;窗口或监视器尺寸改变后应重新查询。
term.Redirect.clear()用当前背景色清空整个目标,光标位置保持不变。
term.Redirect.clearLine()只擦除光标所在行。
term.Redirect.getTextColour()获取后续普通文字使用的前景色。 与美式拼写方法等价。
term.Redirect.getTextColor()获取后续普通文字使用的前景色。
term.Redirect.setTextColour(colour)指定后续普通文字的前景色。 与美式拼写方法等价。
term.Redirect.setTextColor(colour)指定后续普通文字的前景色。
term.Redirect.getBackgroundColour()获取写字和清屏使用的背景色。 与美式拼写方法等价。
term.Redirect.getBackgroundColor()获取写字和清屏使用的背景色。
term.Redirect.setBackgroundColour(colour)指定后续写字和清屏使用的背景色。 与美式拼写方法等价。
term.Redirect.setBackgroundColor(colour)指定后续写字和清屏使用的背景色。
term.Redirect.isColour()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。 与美式拼写方法等价。
term.Redirect.isColor()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。
term.Redirect.blit(text, textColour, backgroundColour)一次写入文字、逐字符前景与逐字符背景;三段字符串长度必须相同。
term.Redirect.setPaletteColour(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。 与美式拼写方法等价。
term.Redirect.setPaletteColor(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。
term.Redirect.getPaletteColour(colour)读取当前调色板槽的三个 RGB 通道。 与美式拼写方法等价。
term.Redirect.getPaletteColor(colour)读取当前调色板槽的三个 RGB 通道。
window窗口与离屏绘制窗口是父终端中的一个矩形区域,使用与 term 相同的绘制方法。隐藏窗口可以先写入缓冲,再显示,适合减少界面闪烁。
使用边界:窗口不自动帮程序处理鼠标命中;父终端变大也不代表子窗口自动适应。重设位置或尺寸后,根据新的宽高重新排版。
window.create(parent, nX, nY, nWidth, nHeight [, bStartVisible])指定父终端、左上角与尺寸,创建独立光标和缓冲的窗口。
window.Window.write(sText)在光标处写文字并向右移动光标;超出行宽的部分不会自动换行。
window.Window.blit(sText, sTextColor, sBackgroundColor)一次写入文字、逐字符前景与逐字符背景;三段字符串长度必须相同。
window.Window.clear()用当前背景色清空整个目标,光标位置保持不变。
window.Window.clearLine()只擦除光标所在行。
window.Window.getCursorPos()获取光标的列、行坐标。
window.Window.setCursorPos(x, y)设置接下来写入文字的位置,坐标从 1 开始。
window.Window.setCursorBlink(blink)启用或关闭当前光标的闪烁显示。
window.Window.getCursorBlink()读取光标闪烁开关。
window.Window.isColor()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。
window.Window.isColour()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。 与美式拼写方法等价。
window.Window.setTextColor(color)指定后续普通文字的前景色。
window.Window.setTextColour(color)指定后续普通文字的前景色。 与美式拼写方法等价。
window.Window.setPaletteColour(colour, r, g, b)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。 与美式拼写方法等价。
window.Window.setPaletteColor(colour, r, g, b)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。
window.Window.getPaletteColour(colour)读取当前调色板槽的三个 RGB 通道。 与美式拼写方法等价。
window.Window.getPaletteColor(colour)读取当前调色板槽的三个 RGB 通道。
window.Window.setBackgroundColor(color)指定后续写字和清屏使用的背景色。
window.Window.setBackgroundColour(color)指定后续写字和清屏使用的背景色。 与美式拼写方法等价。
window.Window.getSize()取得可绘制的列数和行数;窗口或监视器尺寸改变后应重新查询。
window.Window.scroll(n)让画面滚动指定行数;正数向上,负数向下。
window.Window.getTextColor()获取后续普通文字使用的前景色。
window.Window.getTextColour()获取后续普通文字使用的前景色。 与美式拼写方法等价。
window.Window.getBackgroundColor()获取写字和清屏使用的背景色。
window.Window.getBackgroundColour()获取写字和清屏使用的背景色。 与美式拼写方法等价。
window.Window.getLine(y)读取缓冲中的一行,返回文字、前景 blit 字符串和背景 blit 字符串。
window.Window.setVisible(visible)切换显示状态;隐藏时写入仍会更新窗口缓冲。
window.Window.isVisible()读取当前可见状态。
window.Window.redraw()将可见窗口的缓冲重新绘制到父终端。
window.Window.restoreCursor()把父终端光标同步到窗口光标,隐藏窗口不执行该动作。
window.Window.getPosition()取得窗口在父终端中的左上角。
window.Window.reposition(new_x, new_y [, new_width, new_height [, new_parent]])更换位置,并可同时调整尺寸或父终端。
colors颜色与位掩码同一个颜色常量可以代表终端调色板槽,也可代表束线信号中的一位。终端使用单色常量;束线集合则用 combine、subtract 和 test 操作。
使用边界:term.blit 使用单个十六进制字符 0 到 f,不是直接传颜色常量。RGB 通道采用 0 到 1;修改调色板不会改变颜色常量的数值。
colors.white = 0x1白色槽:位常量为 1,对应 blit 字符 0。
colors.orange = 0x2橙色槽:位常量为 2,对应 blit 字符 1。
colors.magenta = 0x4品红色槽:位常量为 4,对应 blit 字符 2。
colors.lightBlue = 0x8浅蓝色槽:位常量为 8,对应 blit 字符 3。
colors.yellow = 0x10黄色槽:位常量为 16,对应 blit 字符 4。
colors.lime = 0x20黄绿色槽:位常量为 32,对应 blit 字符 5。
colors.pink = 0x40粉色槽:位常量为 64,对应 blit 字符 6。
colors.gray = 0x80灰色槽:位常量为 128,对应 blit 字符 7。
colors.lightGray = 0x100浅灰色槽:位常量为 256,对应 blit 字符 8。
colors.cyan = 0x200青色槽:位常量为 512,对应 blit 字符 9。
colors.purple = 0x400紫色槽:位常量为 1024,对应 blit 字符 a。
colors.blue = 0x800蓝色槽:位常量为 2048,对应 blit 字符 b。
colors.brown = 0x1000棕色槽:位常量为 4096,对应 blit 字符 c。
colors.green = 0x2000绿色槽:位常量为 8192,对应 blit 字符 d。
colors.red = 0x4000红色槽:位常量为 16384,对应 blit 字符 e。
colors.black = 0x8000黑色槽:位常量为 32768,对应 blit 字符 f。
colors.combine(...)合并颜色位集合,不是把 RGB 颜色混合。
colors.subtract(colors, ...)从位集合中去掉指定颜色位。
colors.test(colors, color)检查目标掩码中的全部颜色位是否都存在。
colors.packRGB(r, g, b)把三个 0~1 的 RGB 通道打包成整数。
colors.unpackRGB(rgb)将 RGB 整数拆成三个 0~1 的通道。
colors.rgb8(...)兼容式双向转换:三个参数打包,一个参数拆包。
colors.toBlit(color)把单色常量变为 blit 需要的一位字符。
colors.fromBlit(hex)将一位 blit 字符转换回颜色常量。
colours颜色的英式名字colours 与 colors 对应同一组颜色操作,可在英式代码习惯中使用。
使用边界:除了 grey / lightGrey 的拼写差异,接口与 colors 对照使用。
colours.grey灰色常量,对应 colors.gray,blit 字符为 7。
colours.lightGrey浅灰色常量,对应 colors.lightGray,blit 字符为 8。
paintutils字符格图形适合进度条、框线和简单像素图。这里的一个“像素”是一格字符背景,并非真实屏幕像素。
使用边界:绘制会改变终端状态。颜色参数省略时使用当前颜色;需要细密字符和多色文字图时再看 cc.image.nft。
paintutils.parseImage(image)将 paint 格式字符串变成可绘制的颜色数组。
paintutils.loadImage(path)读取 paint 图片文件;加载失败时检查是否返回 nil。
paintutils.drawPixel(xPos, yPos [, colour])给指定字符格着色。
paintutils.drawLine(startX, startY, endX, endY [, colour])在两个字符坐标之间画线。
paintutils.drawBox(startX, startY, endX, endY [, colour])绘制矩形边框,内部不填充。
paintutils.drawFilledBox(startX, startY, endX, endY [, colour])填满指定矩形范围。
paintutils.drawImage(image, xPos, yPos)从指定左上角绘制已解析的图片数组。
keys按键名称快捷键用 keys.enter、keys.left 这样的符号判断;文本编辑用 char 事件。
使用边界:键码在 Minecraft 版本之间有过变化,不要把数值写死。主回车与小键盘回车可能是不同键。
keys.getName(code)把数值键码换成可读名称;无法识别的键码可能返回 nil。
monitor监视器将 peripheral.find("monitor") 的结果作为独立终端使用。需要把 print 也送上大屏时,再临时调用 term.redirect。
使用边界:字号为 0.5~5、步长 0.5;字号越大,可用字符格越少。拼接或缩放后收到 monitor_resize,应重新查询尺寸。触摸事件需要高级监视器。
monitor.setTextScale(scale)调整字符缩放倍率,随后重新读取宽高并重绘。
monitor.getTextScale()取得当前倍率,不是监视器方块数量。
monitor.write(text)在光标处写文字并向右移动光标;超出行宽的部分不会自动换行。
monitor.scroll(y)让画面滚动指定行数;正数向上,负数向下。
monitor.getCursorPos()获取光标的列、行坐标。
monitor.setCursorPos(x, y)设置接下来写入文字的位置,坐标从 1 开始。
monitor.getCursorBlink()读取光标闪烁开关。
monitor.setCursorBlink(blink)启用或关闭当前光标的闪烁显示。
monitor.getSize()取得可绘制的列数和行数;窗口或监视器尺寸改变后应重新查询。
monitor.clear()用当前背景色清空整个目标,光标位置保持不变。
monitor.clearLine()只擦除光标所在行。
monitor.getTextColour()获取后续普通文字使用的前景色。 与美式拼写方法等价。
monitor.getTextColor()获取后续普通文字使用的前景色。
monitor.setTextColour(colour)指定后续普通文字的前景色。 与美式拼写方法等价。
monitor.setTextColor(colour)指定后续普通文字的前景色。
monitor.getBackgroundColour()获取写字和清屏使用的背景色。 与美式拼写方法等价。
monitor.getBackgroundColor()获取写字和清屏使用的背景色。
monitor.setBackgroundColour(colour)指定后续写字和清屏使用的背景色。 与美式拼写方法等价。
monitor.setBackgroundColor(colour)指定后续写字和清屏使用的背景色。
monitor.isColour()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。 与美式拼写方法等价。
monitor.isColor()判断目标是否具有彩色显示能力;别仅凭某个函数存在来判断。
monitor.blit(text, textColour, backgroundColour)一次写入文字、逐字符前景与逐字符背景;三段字符串长度必须相同。
monitor.setPaletteColour(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。 与美式拼写方法等价。
monitor.setPaletteColor(...)调整一个颜色槽对应的 RGB;可用三个通道或打包后的 RGB 值。
monitor.getPaletteColour(colour)读取当前调色板槽的三个 RGB 通道。 与美式拼写方法等价。
monitor.getPaletteColor(colour)读取当前调色板槽的三个 RGB 通道。
httpHTTP 与 WebSocket简单下载使用同步接口;需要主循环继续工作时,用异步请求配合事件。返回的 HTTP 响应仍是需要关闭的资源。
使用边界:URL 是否可访问受服务器配置、DNS、端口与请求配额共同影响。网络失败和 HTTP 错误状态都要处理;错误响应有时仍提供可读取的句柄。WebSocket 不是浏览器对象。
http.get(...)发起 GET 并等待响应;成功返回响应句柄,失败返回原因并可能带错误响应。
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
url | string | 必需 |
headers | { [ string ] = string } | 可选 |
binary | boolean | 可选;默认 false |
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
request | { url = string , headers ? = { [ string ] = string }, binary ? = boolean , method ? = string , redirect ? = boolean , timeout ? = number } | 可选 |
Responsenil,string,Response | nil变更 1.63 · 变更 1.80pr1 · 变更 1.80pr1.6 · 变更 1.86.0 · 变更 1.105.0 · 变更 1.109.0 · 变更 1.121.0。变更细节以对应版本原始定义为准。
http.post(...)发送请求体并等待 POST 响应;表形式可指定更多请求选项。
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
url | string | 必需 |
body | string | 必需 |
headers | { [ string ] = string } | 可选 |
binary | boolean | 可选;默认 false |
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
request | { url = string , body ? = string , headers ? = { [ string ] = string }, binary ? = boolean , method ? = string , redirect ? = boolean , timeout ? = number } | 可选 |
Responsenil,string,Response | nil新增 1.31 · 变更 1.63 · 变更 1.80pr1 · 变更 1.80pr1.6 · 变更 1.86.0 · 变更 1.105.0 · 变更 1.109.0 · 变更 1.121.0。变更细节以对应版本原始定义为准。
http.request(...)只提交异步请求,最终结果通过 http_success 或 http_failure 获取。
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
url | string | 必需 |
body | string | 可选 |
headers | { [ string ] = string } | 可选 |
binary | boolean | 可选;默认 false |
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
request | { url = string , body ? = string , headers ? = { [ string ] = string }, binary ? = boolean , method ? = string , redirect ? = boolean , timeout ? = number } | 可选 |
官方条目未声明返回值;不要依赖未约定的结果。
变更 1.63 · 变更 1.80pr1 · 变更 1.80pr1.6 · 变更 1.86.0 · 变更 1.105.0 · 变更 1.109.0 · 变更 1.121.0。变更细节以对应版本原始定义为准。
http.checkURLAsync(url)异步检查 URL 是否符合访问规则,结果通过 http_check 送达。
http.checkURL(url)等待 URL 规则检查结果;通过检查不代表远端服务一定在线。
http.websocketAsync(...)发起 WebSocket 握手,不阻塞到连接完成。
http.websocket(...)等待 WebSocket 握手,成功后得到连接对象。
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
url | string | 必需 |
headers | { [ string ] = string } | 可选 |
| 参数名 | 类型 / 字段结构 | 约定 |
|---|---|---|
request | { url = string , headers ? = { [ string ] = string }, timeout ? = number } | 可选 |
Websocketfalse,string新增 1.80pr1.1 · 变更 1.80pr1.3 · 变更 1.95.3 · 变更 1.105.0 · 变更 1.109.0。变更细节以对应版本原始定义为准。
http.Response.getResponseCode()取得 HTTP 状态码与状态文本。
http.Response.getResponseHeaders()取得响应头表,同名重复头可能合并为逗号分隔值。
http.Websocket.receive([timeout])等待一条消息;可设超时,并区分文本与二进制标记。
http.Websocket.send(message [, binary])发送一条消息,可声明为二进制。
http.Websocket.close()关闭此连接,后续不能继续发送或接收。
http.Websocket.getResponseHeaders()读取建立 WebSocket 连接时收到的响应头。
rednet电脑之间的消息Rednet 在 modem 通道之上提供电脑编号、协议名与主机查询。先打开连接的 modem,再收发结构化消息。
使用边界:协议名用于分类,不提供身份认证或保密。发送成功不等于对方已执行业务;需要确认时自行设计请求编号和回执。
local modem = peripheral.find("modem")
if not modem then error("Connect a modem first.", 0) end
local name = peripheral.getName(modem)
rednet.open(name)
local ok, reason = pcall(function()
local sender, message = rednet.receive("station.status", 10)
if sender == nil then
print("No status report received.")
elseif type(message) == "table" and type(message.state) == "string" then
print(sender, message.state)
else
printError("Invalid status report.")
end
end)
rednet.close(name)
if not ok then error(reason, 0) endrednet.CHANNEL_BROADCAST = 65535广播保留通道,数值为 65535。
rednet.CHANNEL_REPEAT = 65533中继保留通道,数值为 65533。
rednet.MAX_ID_CHANNELS = 65500电脑编号通道的模数为 65500;更大的编号会折回通道范围。
rednet.open(modem)让指定 modem 加入 Rednet 收发。
rednet.close([modem])关闭指定 modem 的 Rednet,省略名字则关闭全部。
rednet.isOpen([modem])检查指定 modem 或任一 modem 是否已打开 Rednet。
rednet.send(recipient, message [, protocol])向目标电脑编号发送消息,可附加协议名;返回值不代表业务回执。
rednet.broadcast(message [, protocol])向所有监听 Rednet 的设备广播,可附协议名。
rednet.receive([protocol_filter [, timeout]])等待消息,可按协议筛选并设置超时;超时不会给出正常消息。
rednet.host(protocol, hostname)登记协议与主机名,供同网设备查找。
rednet.unhost(protocol)撤销某协议的主机登记。
rednet.lookup(protocol [, hostname [, timeout=2]])查找协议主机的电脑编号;没有指定主机名时可能返回多个编号。
rednet.run()Rednet 的事件转发循环,正常 CraftOS 已在后台启动,不应重复启动。
gps坐标定位GPS 通过无线 modem 与已有坐标的主机计算位置,不会凭空读取世界坐标。用于导航时,定位失败必须停止依赖坐标的动作。
使用边界:主机必须处于加载状态,且布局不能全部共面。坐标使用主机电脑方块位置;末影 modem 的跨维通信不意味着可以跨维完成测距定位。
gps.CHANNEL_GPS = 65534GPS 使用的保留通道为 65534,避免把它用于自己的协议。
gps.locate([timeout=2 [, debug=false]])等待坐标解算,成功返回 x、y、z,失败返回 nil;可设置等待时间和诊断输出。
modem原始通道与有线网络原始 modem 消息使用通道号,而不是 Rednet 的电脑编号。远程外设枚举和调用属于有线 modem 的网络能力。
使用边界:通道范围 0~65535,同时最多打开 128 个。接收方须打开目标通道;发送时给出的回信通道也需要本机打开才能收回信。无线 modem 不能直接包装另一台电脑的远端外设。
modem.open(channel)开始监听一个通道,并占用一个打开通道名额。
modem.isOpen(channel)检查本 modem 是否正在监听指定通道。
modem.close(channel)停止监听指定通道。
modem.closeAll()释放本 modem 的全部通道监听。
modem.transmit(channel, replyChannel, payload)发送目标通道、回信通道和载荷;不自动确认对方收到。
modem.isWireless()区分无线与有线 modem;末影 modem 也属于无线。
modem.getNamesRemote()列出当前有线网络上的远端外设名称。
modem.isPresentRemote(name)检查远端外设是否仍在本有线网络。
modem.getTypeRemote(name)查询远端设备类型;设备消失时可能为 nil。
modem.hasTypeRemote(name, type)检查远端设备是否实现指定类型。
modem.getMethodsRemote(name)获取远端设备方法清单。
modem.callRemote(remoteName, method, ...)把方法与参数转交远端外设,返回其实际结果。
modem.getNameLocal()获取本机在有线网络中的名称,未启用连接时可能为 nil。
peripheral发现与调用外设先确认设备是否被电脑识别,再取得包装对象。相邻设备常用六向名字,有线网络设备使用网络名称。
使用边界:find 返回多个值,不是一个数组;收集全部设备可写 {peripheral.find("inventory")}。设备可能同时实现多个类型,优先使用 hasType 判断能力。
local stores = { peripheral.find("inventory") }
for _, store in ipairs(stores) do
print(peripheral.getName(store), store.size())
end
if #stores == 0 then printError("No inventory is connected.") endperipheral.getNames()枚举本机可见的外设名称。
peripheral.isPresent(name)检查名称当前是否还可访问,适合处理热插拔。
peripheral.getType(peripheral)取得设备的一个或多个类型,接受名称或包装对象。
peripheral.hasType(peripheral, peripheral_type)检查设备是否具备某类接口,不要求它只有这一种类型。
peripheral.getMethods(name)列出设备提供的方法名,便于确认模组联动能力。
peripheral.getName(peripheral)从包装对象反查网络名称。
peripheral.call(name, method, ...)按设备名、方法名和参数直接调用。
peripheral.wrap(name)得到包含设备方法的表,之后可用点号调用其中函数。
peripheral.find(ty [, filter])按类型查找所有匹配设备,可增加 (name, wrapped) 过滤回调。
turtle海龟动作与背包先读状态,再发出一步动作,再检查结果。移动、挖掘、放置都可能失败,导航程序不能在失败后照样更新内部坐标。
使用边界:槽位为 1~16。移动通常消耗燃料,转向不消耗;unlimited 是字符串而非数字。前、上、下是动作方向,某些方法中的 side 是选择左/右工具,不是任意行动方向。
if not turtle then error("Run this on a turtle.", 0) end
local found, block = turtle.inspect()
if found then
print(block.name)
print(textutils.serialize(block.state))
else
printError(block)
endturtle.craft([limit=64])按背包中的合成网格制作;需要合成能力,无关槽位里的物品也可能使配方无效。
turtle.native底层海龟接口表,不含运行时生成的辅助入口。
turtle.forward()尝试向前移动一格,检查成功标志后再更新位置。
turtle.back()尝试后退一格;没有对应的后方挖掘方法。
turtle.up()尝试向上移动一格。
turtle.down()尝试向下移动一格。
turtle.turnLeft()向左转 90 度,内部朝向记录也应随成功结果更新。
turtle.turnRight()向右转 90 度。
turtle.dig([side])尝试用工具破坏前方方块;检查成功标志与失败原因。
turtle.digUp([side])尝试用工具破坏上方方块;检查成功标志与失败原因。
turtle.digDown([side])尝试用工具破坏下方方块;检查成功标志与失败原因。
turtle.place([text])用当前槽物品向前方放置或执行可用交互;返回成功与否。
turtle.placeUp([text])用当前槽物品向上方放置或执行可用交互;返回成功与否。
turtle.placeDown([text])用当前槽物品向下方放置或执行可用交互;返回成功与否。
turtle.drop([count])把当前槽物品送进前方库存;没有库存时会成为掉落物。
turtle.dropUp([count])把当前槽物品送进上方库存;没有库存时会成为掉落物。
turtle.dropDown([count])把当前槽物品送进下方库存;没有库存时会成为掉落物。
turtle.select(slot)改变当前选中的背包槽位。
turtle.getItemCount([slot])读取指定槽位数量,省略槽位时检查当前选中槽。
turtle.getItemSpace([slot])查询该槽当前还能放入多少个同类物品。
turtle.detect()检查前方是否为非空气、非液体方块,不返回方块种类。
turtle.detectUp()检查上方是否为非空气、非液体方块,不返回方块种类。
turtle.detectDown()检查下方是否为非空气、非液体方块,不返回方块种类。
turtle.compare()比较前方方块与当前选中物品是否匹配。
turtle.compareUp()比较上方方块与当前选中物品是否匹配。
turtle.compareDown()比较下方方块与当前选中物品是否匹配。
turtle.attack([side])尝试攻击前方实体,可选左侧或右侧工具。
turtle.attackUp([side])尝试攻击上方实体,可选左侧或右侧工具。
turtle.attackDown([side])尝试攻击下方实体,可选左侧或右侧工具。
turtle.suck([count])从前方库存或世界掉落物吸入背包,可限制数量。
turtle.suckUp([count])从上方库存或世界掉落物吸入背包,可限制数量。
turtle.suckDown([count])从下方库存或世界掉落物吸入背包,可限制数量。
turtle.getFuelLevel()读取剩余燃料;禁用燃料限制时可能得到 unlimited。
turtle.refuel([count])消耗当前槽的燃料补充储备;数量 0 可探测是否为燃料而不消耗。
turtle.compareTo(slot)比较当前槽与另一槽的物品类型。
turtle.transferTo(slot [, count])在自己的背包内转移物品,不是向外部箱子传送。
turtle.getSelectedSlot()取得当前选中槽的编号。
turtle.getFuelLimit()取得燃料容量上限,可能是 unlimited。
turtle.equipLeft()用选中槽更换或卸下左侧升级;替换出的物品会回到背包。
turtle.equipRight()用选中槽更换或卸下右侧升级。
turtle.getEquippedLeft()读取左侧升级资料;没有装备时为 nil。
turtle.getEquippedRight()读取右侧升级资料;没有装备时为 nil。
turtle.inspect()读取前方方块资料;成功返回资料表,失败返回原因。
turtle.inspectUp()读取上方方块资料;成功返回资料表,失败返回原因。
turtle.inspectDown()读取下方方块资料;成功返回资料表,失败返回原因。
turtle.getItemDetail([slot [, detailed]])读取物品资料,可要求详细信息;空槽为 nil,基础信息不包含全部标签和附魔字段。
pocket口袋电脑升级pocket.equipBack()从玩家物品栏寻找可装备升级,并尝试替换当前背面升级。
pocket.unequipBack()卸下背面升级,检查返回值确认动作完成。
redstone本机红石将红石输入读取与输出控制分开:输入表示外部状态,输出表示程序设置。rs 是常用的兼容入口。
使用边界:六向名字相对电脑朝向。模拟信号范围为 0~15;束线能力需要相容的外部实现。收到 redstone 事件后重新读取感兴趣的侧面。
local previous = redstone.getAnalogInput("back")
print("back:", previous)
while true do
os.pullEvent("redstone")
local current = redstone.getAnalogInput("back")
if current ~= previous then
print(previous, "->", current)
previous = current
end
endredstone.getSides()取得 top、bottom、left、right、front、back 六个合法侧面。
redstone.setOutput(side, on)将一侧输出切换为开或关。
redstone.getOutput(side)查询程序给这一侧设置的开关输出。
redstone.getInput(side)判断这一侧当前是否收到红石输入。
redstone.setAnalogOutput(side, value)设置这一侧的输出强度,合法范围为 0~15。
redstone.setAnalogueOutput(side, value)设置这一侧的输出强度,合法范围为 0~15。 与 Analog 拼写方法等价。
redstone.getAnalogOutput(side)读取这一侧已设置的模拟输出强度。
redstone.getAnalogueOutput(side)读取这一侧已设置的模拟输出强度。 与 Analog 拼写方法等价。
redstone.getAnalogInput(side)读取这一侧实际收到的模拟输入强度。
redstone.getAnalogueInput(side)读取这一侧实际收到的模拟输入强度。 与 Analog 拼写方法等价。
redstone.setBundledOutput(side, output)将颜色位掩码作为束线输出。
redstone.getBundledOutput(side)取得当前束线输出位掩码。
redstone.getBundledInput(side)读取束线输入位掩码。
redstone.testBundledInput(side, mask)检查掩码指定的全部束线通道是否都处于开启状态。
disk按名称访问磁盘机disk 是针对磁盘机的便利入口,每次传入磁盘机名称。它与包装后的 drive 对象操作的是同一类设备。
使用边界:磁盘机内可以放数据盘、唱片或其他物品。存在物品、可挂载数据和可播放音频是三个不同条件。
disk.isPresent(name)确认磁盘机里是否放有物品,不保证是数据盘。
disk.getLabel(name)读取当前介质标签,设备或标签不存在时可能为 nil。
disk.setLabel(name, label)修改介质标签;传 nil 可清除。
disk.hasData(name)判断介质能否提供文件系统挂载。
disk.getMountPath(name)取得数据盘在本机的挂载目录,不能挂载时为 nil。
disk.hasAudio(name)判断介质是否提供可播放的音轨。
disk.getAudioTitle(name)取得曲名;没有唱片与没有设备使用不同的空结果。
disk.playAudio(name)开始播放磁盘机中的唱片。
disk.stopAudio(name)停止此前由磁盘机播放的唱片。
disk.eject(name)弹出介质,它会成为世界中的掉落物。
disk.getID(name)读取软盘编号,无法取得时返回 nil。
commands命令电脑这是具有命令权限的电脑接口,不是普通生存电脑默认可用的功能。用它查询方块或实体时,也应控制查询范围和频率。
使用边界:普通电脑上先检查 commands 是否存在。异步调用返回任务编号,应匹配 task_complete,不能把任务已提交当作命令成功。
commands.exec(command)执行一条 Minecraft 命令,返回成功标志、输出行及可能的影响数量。
commands.execAsync(command)提交异步命令,保存任务编号以对应完成通知。
commands.list(...)列出当前权限允许执行的命令或子命令。
commands.getDimension()读取当前维度的命名空间 ID。
commands.getBlockPosition()直接读取命令电脑所在方块的 x、y、z。
commands.getBlockInfos(minX, minY, minZ, maxX, maxY, maxZ [, dimension])批量读取长方体区域的方块资料,较大区域应分批处理。
commands.getBlockInfo(x, y, z [, dimension])读取单个坐标的方块资料,可指定维度。
commands.getEntities(selector)按实体选择器查询实体资料。
commands.native底层命令接口,不包含自动生成的命令快捷函数。
commands.async异步命令快捷函数表,执行后仍需处理任务完成事件。
inventory通用物品库存在有线网络中按设备名称搬运,来源槽与目标槽都从 1 开始。先 list 得到概况,再按需查询详细信息。
使用边界:list 是稀疏槽位表,用 pairs,不要靠 # 或 ipairs 统计全部槽。搬运返回实际件数,可能为 0;同名设备必须是本网络可访问的库存。
local store = peripheral.find("inventory")
if not store then error("Connect an inventory first.", 0) end
local total = 0
for slot, stack in pairs(store.list()) do
print(slot, stack.name, stack.count)
total = total + stack.count
end
print("Items:", total, "Slots:", store.size())inventory.size()得到总槽数,包含空槽。
inventory.list()得到非空槽的基础物品资料;键就是槽位编号。
inventory.getItemDetail(slot)读取一个槽的详细信息,空槽为 nil。
inventory.getItemLimit(slot)读取这个槽允许的最大堆叠量,不是剩余空间。
inventory.pushItems(toName, fromSlot [, limit [, toSlot]])把当前库存的来源槽送入目标库存;可指定最大件数和目标槽。
inventory.pullItems(fromName, fromSlot [, limit [, toSlot]])从另一库存的来源槽取到当前库存;目标槽属于当前库存。
fluid_storage通用流体库存将多个可访问储罐看作网络端点,按流体注册名选择搬运对象。物品槽位参数不能直接套用到流体接口。
使用边界:返回实际转移量,而非请求量。容器是否暴露通用能力与模组、加载器有关;流体数量单位按当前平台实现核对,不能跨环境无条件当作 mB。
fluid_storage.tanks()枚举内部储罐的流体基础资料,结果可能含空位。
fluid_storage.pushFluid(toName [, limit [, fluidName]])从当前储罐送往目标设备;可限制数量和流体注册名。
fluid_storage.pullFluid(fromName [, limit [, fluidName]])从指定来源设备取到当前储罐,检查实际返回数量。
energy_storage通用能量读数这个通用接口用于监测,不提供直接的能量推拉方法。传能仍由管线、机器侧配置或对应模组完成。
使用边界:能量读数使用 FE 口径,但并不是每台储能方块都实现这个外设类型。先检查 peripheral.hasType。
energy_storage.getEnergy()读取当前存储能量,单位 FE。
energy_storage.getEnergyCapacity()读取最大储能容量,配合当前值计算占用比例。
computer另一台电脑的电源computer.turnOn()启动目标电脑;已经启动时不会重新运行整个开机流程。
computer.shutdown()关闭目标电脑,先确保目标程序已保存必要数据。
computer.reboot()重启目标电脑,关闭状态下也可启动。
computer.getID()读取目标电脑编号,不是当前控制电脑的编号。
computer.isOn()查询目标电脑是否处于开机状态。
computer.getLabel()读取目标标签,未命名时为 nil。
drive磁盘机对象包装磁盘机后,不再需要像 disk API 那样每次传入名字。用挂载路径操作文件,而不是猜测一定叫 disk。
使用边界:多台磁盘机会有不同挂载名。磁盘弹出后,原路径和句柄可能失效;处理 disk / disk_eject 重新检查。
drive.isDiskPresent()检查槽里是否有介质。
drive.getDiskLabel()读取介质标签,空槽或未命名时可能为 nil。
drive.setDiskLabel([label])设定或清除介质标签。
drive.hasData()判断是否可以把介质作为文件系统访问。
drive.getMountPath()取得插入介质的实际挂载路径。
drive.hasAudio()判断介质能否播放音轨。
drive.getAudioTitle()取得曲名;不能只用真假判断来区分所有无音频情况。
drive.playAudio()播放介质音轨。
drive.stopAudio()停止当前介质音轨。
drive.ejectDisk()弹出介质为掉落物,文件访问也随之终止。
drive.getDiskID()读取软盘的数值编号,没有可编号介质时为 nil。
printer打印机打印流程分三步:申请一页、写入内容、提交到输出槽。要分别处理纸张、墨水和输出空间不足。
使用边界:不是调用 write 就完成了实体打印;newPage 与 endPage 都返回是否成功。光标和页面尺寸以字符格计算。
printer.write(text)把文字写到正在编辑的纸页上。
printer.getCursorPos()读取纸页中的光标列与行。
printer.setCursorPos(x, y)设置纸页内的写入位置。
printer.getPageSize()取得当前纸页的字符宽高。
printer.newPage()尝试开始一页;无纸或无墨等情况会失败。
printer.endPage()尝试结束并输出当前页;输出槽阻塞时要等待或处理。
printer.setPageTitle([title])设置这页纸的标题,省略参数可清空。
printer.getInkLevel()查询剩余墨水量。
printer.getPaperLevel()查询剩余纸张量。
redstone_relay远端红石中继中继让电脑通过外设连接控制另一个位置的红石。调用习惯与本机 redstone 接近,但侧面相对中继本身。
使用边界:中继输入变化也使用 redstone 事件,事件本身不列出哪个侧面改变。保存旧状态,再读取目标侧面比较。
redstone_relay.setOutput(side, on)将一侧输出切换为开或关。
redstone_relay.getOutput(side)查询程序给这一侧设置的开关输出。
redstone_relay.getInput(side)判断这一侧当前是否收到红石输入。
redstone_relay.setAnalogOutput(side, value)设置这一侧的输出强度,合法范围为 0~15。
redstone_relay.setAnalogueOutput(side, value)设置这一侧的输出强度,合法范围为 0~15。 与 Analog 拼写方法等价。
redstone_relay.getAnalogOutput(side)读取这一侧已设置的模拟输出强度。
redstone_relay.getAnalogueOutput(side)读取这一侧已设置的模拟输出强度。 与 Analog 拼写方法等价。
redstone_relay.getAnalogInput(side)读取这一侧实际收到的模拟输入强度。
redstone_relay.getAnalogueInput(side)读取这一侧实际收到的模拟输入强度。 与 Analog 拼写方法等价。
redstone_relay.setBundledOutput(side, output)将颜色位掩码作为束线输出。
redstone_relay.getBundledOutput(side)取得当前束线输出位掩码。
redstone_relay.getBundledInput(side)读取束线输入位掩码。
redstone_relay.testBundledInput(side, mask)检查掩码指定的全部束线通道是否都处于开启状态。
speaker扬声器游戏音效、音符盒音符和 PCM 音频是三条不同入口。连续音频需要先解码成采样数组,再按缓冲可用情况送入。
使用边界:playAudio 接收 48 kHz、-128~127 的采样整数,一次最多 131072 个。返回 false 时等待本扬声器的 speaker_audio_empty,然后重试同一批,不要丢掉它。
speaker.playNote(instrument [, volume [, pitch]])播放乐器音符;音量 0~3 默认 1,半音编号 0~24 默认 12,达到限制时可能失败。
speaker.playSound(name [, volume [, pitch]])按 Minecraft 声音 ID 播放;音量 0~3 默认 1,音高倍率 0.5~2 默认 1。
speaker.playAudio(audio [, volume])尝试接纳一批 PCM 采样;返回值表示是否入缓冲,不表示已经播放完。
speaker.stop()停止本扬声器正在播放的音频。
turtle_storage海龟储物升级(实验性)这是装备在海龟上的储物外设,例如可访问所装备容器的内容。其搬运目标固定为海龟背包,不接收另一外设名字。
使用边界:官网标为 1.121.0 新增且实验性,需要启用 computercraft/turtle_storage 数据包,方法仍可能变化。不要把它写成旧版本默认可用的箱子接口。
turtle_storage.size()查询升级容器的槽数,不是海龟自身的 16 槽。
turtle_storage.list()列出升级容器中的非空槽,结果可能有空索引。
turtle_storage.getItemDetail(slot)读取升级容器某一槽的详细物品信息。
turtle_storage.pushItems(fromSlot [, limit [, toSlot]])从升级容器的 fromSlot 送到海龟背包;可限制数量并指定海龟目标槽。
turtle_storage.pullItems([fromSlot [, limit [, toSlot]]])从海龟背包取回到升级容器;省略来源槽时使用海龟当前选中槽。
command命令方块外设对接命令方块的管理入口,与 commands 命令电脑 API 不同。只有相应服务器配置启用时才可用。
使用边界:能发现方块不等于拥有任意命令权限。先核对服务器配置,再处理 runCommand 的失败结果。
command.getCommand()读取方块当前保存的命令。
command.setCommand(command)替换方块中保存的命令,不立即执行。
command.runCommand()执行一次当前保存的命令,检查成功标志与错误原因。
cc.audio.dfpwmDFPWM 音频编解码先 require("cc.audio.dfpwm")。整段转换与连续流的用法不同:流式处理要在整个音轨期间复用同一个编码器或解码器。
使用边界:不要给每个分块重新 make_decoder,否则块间状态丢失。解码后仍须遵守扬声器的采样数上限与缓冲等待。
cc.audio.dfpwm.make_encoder()创建带内部状态的编码函数,供连续 PCM 分块复用。
cc.audio.dfpwm.encode(input)一次性把独立 PCM 数据转换成 DFPWM 字符串。
cc.audio.dfpwm.make_decoder()创建带内部状态的解码函数,供同一条 DFPWM 流持续使用。
cc.audio.dfpwm.decode(input)一次性将完整 DFPWM 数据转换成采样数组。
cc.base64Base64 数据包装先 require("cc.base64")。把二进制装进 JSON 或其他文本通道时可用 Base64,但这不是加密。
使用边界:默认末两位字符为 +/,替代字符必须是长度 2 的字符串。解码遇到非法数据或缺失必要填充会返回失败,不应默默使用损坏内容。
local base64 = require("cc.base64")
local packed = base64.encode("station:42")
local unpacked, reason = base64.decode(packed)
if not unpacked then error(reason, 0) end
print(packed)
print(unpacked)cc.base64.encode(str [, alt_chars="+/"])把字节字符串变成 Base64 文本,可指定替代字母表字符。
cc.base64.decode(str [, alt_chars="+/"])恢复原字节串;非法输入返回 nil 和原因。
cc.completion输入框补全先加载 cc.completion,把它的结果交给 read 的补全回调。返回值是应追加的后缀,不是整段替换文本。
使用边界:add_space 决定完成后是否附空格。自由输入和受限选项应分别校验,补全候选本身不是输入验证。
cc.completion.choice(text, choices [, add_space])从自定义候选字符串中筛出可追加后缀。
cc.completion.peripheral(text [, add_space])补全当前存在的外设名称。
cc.completion.side(text [, add_space])补全电脑六向侧面名字。
cc.completion.setting(text [, add_space])补全当前已知设置名。
cc.completion.command(text [, add_space])补全 Minecraft 命令名,需相应命令能力。
cc.expect参数检查模块入口用 expect 检查位置参数,用 field 检查选项表,再用 range 限制数值。
使用边界:检查失败会抛错;它们不负责将字符串转成数字。先决定是否允许类型转换,再进行检查。
local expect = require("cc.expect")
local function setInterval(seconds)
expect.expect(1, seconds, "number")
expect.range(seconds, 0.1, 60)
return seconds
end
print(setInterval(2))cc.expect.expect(index, value, ...)验证第几个参数属于允许的 Lua 类型,成功后原值直接返回。
cc.expect.field(tbl, index, ...)验证选项表中的指定字段,并返回该字段值。
cc.expect.range(num [, min=-math.huge [, max=math.huge]])检查数值是否在闭区间内,未指定边界时该侧无限。
cc.image.nftNFT 字符图这里的 NFT 是终端文字图像格式,与区块链无关。它能保存字符及前景背景色,而 paint 图片主要表达背景色。
使用边界:先解析或加载,再绘制到指定终端。目标坐标仍以字符格计,文件加载失败需要处理。
cc.image.nft.parse(image)将 NFT 格式文本解析为图像数据。
cc.image.nft.load(path)从文件加载 NFT 图像,失败返回 nil 和原因。
cc.image.nft.draw(image, xPos, yPos [, target])将图像绘制到坐标位置,可指定目标终端。
cc.pretty可换行的结构化输出先构建文档对象,再按目标宽度渲染;适合调试复杂表和输出结构化报告。文档对象不是普通字符串。
使用边界:group 决定一组内容能否压成一行;长单词本身不会因为设置宽度就被截断。ribbon_frac 默认 0.6,表示用于内容的宽度比例。
cc.pretty.empty空文档,适合作为组合布局的零元素。
cc.pretty.space包含一个空格的文档。
cc.pretty.line可被分组压掉的换行节点。
cc.pretty.space_line分组压缩时变为空格的换行节点。
cc.pretty.text(text [, colour])把文字与可选颜色包装成文档片段。
cc.pretty.concat(...)连接多个文档片段或字符串。
cc.pretty.nest(depth, doc)为片段后续各行增加缩进。
cc.pretty.group(doc)空间足够时将该组压成一行,否则保留换行布局。
cc.pretty.write(doc [, ribbon_frac=0.6])把文档布局绘制到终端,不额外换行。
cc.pretty.print(doc [, ribbon_frac=0.6])绘制文档并在末尾换行。
cc.pretty.render(doc [, width [, ribbon_frac=0.6]])将布局结果变成字符串,而不是直接写终端。
cc.pretty.pretty(obj [, options])把任意对象转成便于阅读的文档,可显示函数参数或来源。
cc.pretty.pretty_print(obj [, options [, ribbon_frac=0.6]])将对象格式化后直接输出,适合快速查看表结构。
cc.require自建模块环境普通程序直接使用 require;只有编写自己的程序运行器、包环境或隔离工具时才需要 cc.require.make。
使用边界:给定的环境表不是安全沙箱的自动保证。模块能访问什么,取决于环境里暴露了哪些功能。
cc.require.make(env, dir)为环境表和基准目录创建一对 require 函数与 package 表。
cc.shell.completion命令参数补全用 build 按参数位置声明规则,再交给 shell.setCompletionFunction。文件路径补全会使用当前 shell 的工作目录。
使用边界:每个位置可放 nil、回调或带选项的表;末尾表可用 many=true 处理余下参数。回调收到 shell、当前文本和之前的参数。
cc.shell.completion.file(shell, text)补全相对于工作目录的文件。
cc.shell.completion.dir(shell, text)只补全目录。
cc.shell.completion.dirOrFile(shell, text, previous [, add_space])同时补全目录和文件,可控制是否追加空格。
cc.shell.completion.program(shell, text)补全可运行程序名字。
cc.shell.completion.programWithArgs(shell, text, previous, starting)让嵌套命令继续使用它自己的参数补全规则。
cc.shell.completion.help适配帮助主题补全,供 build 使用。
cc.shell.completion.choice适配固定选项补全,供 build 使用。
cc.shell.completion.peripheral适配外设名补全,供 build 使用。
cc.shell.completion.side适配六向侧面补全,供 build 使用。
cc.shell.completion.setting适配设置名补全,供 build 使用。
cc.shell.completion.command适配 Minecraft 命令名补全,供 build 使用。
cc.shell.completion.build(...)把逐参数的补全声明组合成 shell 所需的回调。
cc.strings字符串排版与分割把固定列宽和折行逻辑放到工具库里,而不是在每个界面重写。先 require("cc.strings")。
使用边界:Lua 模式不是正则表达式;如果分隔符应该按字面匹配,显式设 plain=true。默认宽度取终端宽度。
local strings = require("cc.strings")
local width = term.getSize()
local lines = strings.wrap("Inventory report for the north warehouse.", width)
for _, line in ipairs(lines) do print(line) end
print(strings.ensure_width("READY", width))cc.strings.wrap(text [, width])按宽度折成多行,返回行数组。
cc.strings.ensure_width(line [, width])把单行补空格或截短到指定宽度。
cc.strings.split(str, deliminator [, plain=false [, limit]])按 Lua 模式或字面分隔符切分,可限制结果项数。
先收事件名,再按位置解包。需要保留末尾 nil 时用 table.pack(os.pullEvent());过滤式等待可能丢弃其他事件,多个监听任务可交给 parallel。
alarm游戏时刻闹钟到达 os.setAlarm 安排的时刻时产生。
使用边界:用返回编号区分多个闹钟,不按到达顺序猜测。
"alarm" → alarmId:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
timer延时到期os.startTimer 到期后送出一次通知。
使用边界:用编号匹配;服务器卡顿可能让实际等待时间更长。
"timer" → timerId:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
char输入字符用于文字输入,得到实际产生的字符。
使用边界:Ctrl、方向键等不一定产生字符;快捷键改用 key。
"char" → text:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
key按下按键按键按下或持续按住时产生,isHeld 区分重复按键。
使用边界:使用 keys 常量比较,不写死数值。
"key" → keyCode:number | isHeld:boolean
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
key_up释放按键按键释放或终端关闭导致按住状态结束时产生。
"key_up" → keyCode:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
paste粘贴文字用户向终端粘贴文字时产生,内容不必是单个字符。
使用边界:自行处理换行和长度,不能把它当作可信命令直接执行。
"paste" → text:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
mouse_click鼠标按下高级电脑终端里的鼠标按下事件。
使用边界:按钮 1/2/3 分别是左/右/中键,坐标从 1 开始。
"mouse_click" → button:number | x:number | y:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
mouse_up鼠标释放鼠标按钮松开,或按住时移出终端会结束按压。
"mouse_up" → button:number | x:number | y:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
mouse_drag鼠标拖动按住鼠标按钮移动时报告当前坐标。
"mouse_drag" → button:number | x:number | y:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
mouse_scroll鼠标滚轮滚轮变化时报告方向与当时指针位置。
使用边界:向上是 -1,向下是 1;这不是鼠标按钮编号。
"mouse_scroll" → direction:number | x:number | y:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
monitor_touch监视器触摸玩家右击高级监视器时产生。
使用边界:名字可能是侧面,也可能是有线网络名称;坐标单位为字符格。
"monitor_touch" → name:string | x:number | y:number
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
monitor_resize监视器尺寸改变监视器拼接或缩放等改变可用字符尺寸时产生。
使用边界:对该设备重新调用 getSize 并重绘。
"monitor_resize" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
term_resize主终端尺寸改变例如多标签栏出现或消失后,需要更新布局。
使用边界:重定向场景也可能收到该通知;按当前终端尺寸重画。
"term_resize" → 无额外参数
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
peripheral外设接入相邻设备或有线网络新外设可访问时产生。
使用边界:再次读取类型和方法,不沿用旧设备的能力假设。
"peripheral" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
peripheral_detach外设离开设备被移除或网络断开后产生。
使用边界:撤销旧包装对象的业务使用,等待设备重新出现。
"peripheral_detach" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
disk介质插入磁盘机插入介质时产生。
使用边界:重新检查是否有数据以及实际挂载路径。
"disk" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
disk_eject介质移除介质从磁盘机移除时产生。
"disk_eject" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
redstone红石输入变化电脑或红石中继的输入发生变化时产生。
使用边界:事件不携带侧面和强度;读取设备状态与旧值比较。
"redstone" → 无额外参数
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
turtle_inventory海龟背包变化海龟物品栏发生变化时产生。
使用边界:重新读取相关槽位;不要假设只改变了选中槽。
"turtle_inventory" → 无额外参数
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
modem_message原始 modem 消息已打开的通道收到消息时报告通道、回信通道与载荷。
使用边界:跨维消息的距离可能为 nil;有线网络的值也不应当作无线测距。载荷不是可信身份。
"modem_message" → side:string | channel:number | replyChannel:number | payload:any | distance:number/nil
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
rednet_messageRednet 消息由 CraftOS 将 modem 消息转换为 Rednet 消息。
使用边界:通常交给 rednet.receive;自己收事件时保留同样的类型和协议校验。
"rednet_message" → senderId:number | message:any | protocol:string/nil
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
http_successHTTP 请求完成异步 HTTP 请求成功后取得响应句柄。
使用边界:读完关闭句柄;并发请求同一 URL 时需自己管理对应关系。
"http_success" → url:string | response:http.Response
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
http_failureHTTP 请求失败连接失败、超时或 HTTP 错误状态通过这里报告。
使用边界:存在错误响应时可以读取错误正文,但仍必须关闭句柄。
"http_failure" → url:string | reason:string | response:http.Response/nil
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
http_checkURL 规则检查完成http.checkURLAsync 的结果。
使用边界:这是配置允许性检查,不是服务健康检测。
"http_check" → url:string | allowed:boolean | reason:string/nil
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
websocket_successWebSocket 已连接异步握手成功后取得连接对象。
"websocket_success" → url:string | socket:http.Websocket
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
websocket_failureWebSocket 连接失败异步握手失败,连接对象未建立。
"websocket_failure" → url:string | reason:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
websocket_messageWebSocket 收到消息已连接的 WebSocket 收到一条消息。
使用边界:按 binary 区分数据用途,不把不可信消息直接当 Lua 执行。
"websocket_message" → url:string | message:string | binary:boolean
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
websocket_closedWebSocket 已断开已打开的连接关闭时产生。
使用边界:异常断开可能没有关闭原因与状态码;重连要设置退避。
"websocket_closed" → url:string | reason:string/nil | code:number/nil
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
speaker_audio_empty音频缓冲可继续写入对应扬声器能够继续接收采样时产生。
使用边界:不是整首音轨已经播放完;应重试之前未接收的采样块。
"speaker_audio_empty" → name:string
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
setting_changed设置值变化通过设置 API 修改值时报告新旧值。
使用边界:可能包含 nil,收集事件参数时注意 Lua 表长度不能表示末尾 nil。
"setting_changed" → name:string | newValue:any | oldValue:any
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
task_complete异步任务完成用于领取异步任务结果,例如命令电脑提交的任务。
使用边界:匹配 taskId,并按照 success 分支解释后续参数。
"task_complete" → taskId:number | success:boolean | 失败原因(失败时) | 任务附加返回值…
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
computer_command服务器命令消息服务器的 /computercraft queue 向命令电脑传入参数。
使用边界:不要将玩家传入字符串未经校验拼接成高权限命令。
"computer_command" → args:string…
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
terminate用户终止请求持续按住 Ctrl+T 时请求结束程序。
使用边界:pullEvent 将其转为错误;pullEventRaw 要自行退出,不能只忽略它。
"terminate" → 无额外参数
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
file_transfer拖放导入文件用户把本机文件拖到打开的电脑界面后,程序可以枚举待接收文件。
使用边界:每个文件是只读二进制句柄并提供 getName;保存前限制目标目录、确认覆盖,读完关闭。
"file_transfer" → files:TransferredFiles
第一项始终是事件名;后面才是本行列出的载荷。这里的字段名用于解释位置,不代表返回的是字段表。
file_transfer.TransferredFiles.getFiles()取出本批传入文件对象列表。
file_transfer.TransferredFile.getName()取得传入文件名;保存到磁盘前仍要处理路径与同名覆盖。
定位程序依赖多个坐标已知、持续加载的主机。把建设和测试分成两步:先确认主机坐标,再让独立客户端请求定位。
准备四台带无线 modem 的主机,使位置在三个坐标轴上展开,不全部落在同一平面。示意布点可为 (200,80,200)、(206,80,200)、(200,86,200)、(200,80,206);这是示例,不是固定配方。
记录每台电脑方块的实际坐标,不要抄玩家脚下坐标或 modem 方块坐标。主机应保持区块加载;末影 modem 可改善无线覆盖,但不免除加载与有效测距要求。
各主机运行 gps host x y z,三个数换成该主机坐标。客户端装无线 modem,用 gps locate 或 gps.locate 测试。失败依次检查主机运行、加载、范围、坐标填写和共面布局。
local x, y, z = gps.locate(4, false)
if x == nil then
error("GPS unavailable: check hosts, loading and radio range.", 0)
end
print(string.format("Position %.2f / %.2f / %.2f", x, y, z))默认阻止私网访问是服务器的安全边界。需要连接局域网服务时,由服务器管理者为目标地址添加最小范围规则,而不是把所有私网限制全部删除。
MC 1.13+ 且 CC:T 1.87.0+ 通常在世界目录的 serverconfig/computercraft-server.toml 配置 http.rules;1.95.0+ 可见 $private 规则。更旧版本使用不同配置文件和字段,不能原样照搬。
确认服务监听地址、端口、DNS 与网络可达性,再看规则是否允许。http.checkURL 通过仅说明配置允许;连接超时仍可能是网络或服务问题。
仅允许需要的主机、端口及流量额度,保留其余拒绝规则,按该版本要求重新加载或重启。多人服务器上的电脑代码可能由其他玩家编写,不应开放访问宿主的管理接口和凭据服务。
CC:T 1.86.2 及更早的 MC 1.13+ 配置可在 config/computercraft-common.toml;MC 1.12.2 及以前使用 ComputerCraft.cfg。以安装版本的官方指南为准,修改前备份。
采用“读取一块 → 解码 → 等待缓冲可用 → 提交”的流水线,不把整首音轨展开到一个 Lua 表里。
扬声器需要 48000 个采样/秒,采样是 -128~127 的整数。MP3 文件不能直接传给 playAudio;先使用合适工具转成 DFPWM 等可解码格式。
同一音轨只创建一次 DFPWM 解码器。16 KiB 的 DFPWM 数据可展开为 131072 个采样,正好达到单次上限;示例采用更小的 4096 字节块。
提交失败时保留同一批采样,等待对应扬声器的事件再试。文件读完可以关闭文件,但不要立刻 stop,否则尚未播放完的尾部会被截断。
调整音量或混音可处理采样幅度,结果应限制在合法范围;延迟效果要跨块保存历史。简单跳过或重复采样会同时影响速度与音高,不能声称它是保真变调。
local codec = require("cc.audio.dfpwm")
local speaker = peripheral.find("speaker")
if not speaker then error("Connect a speaker first.", 0) end
local file, reason = fs.open("announcement.dfpwm", "rb")
if not file then error(reason, 0) end
local decode = codec.make_decoder()
local name = peripheral.getName(speaker)
local ok, failure = pcall(function()
while true do
local bytes = file.read(4096)
if not bytes then break end
local samples = decode(bytes)
while not speaker.playAudio(samples) do
local _, available
repeat
_, available = os.pullEvent("speaker_audio_empty")
until available == name
end
end
end)
file.close()
if not ok then error(failure, 0) end给长期运行的服务单独写主程序,启动文件只负责加载配置与启动服务。这样可以直接在终端运行服务,便于排错。
电脑根目录的 /startup.lua 可调用主程序。先手动运行主程序确认能启动,再重启电脑,不要把每次重启都当成唯一调试方式。
/startup/ 中的程序按字典序执行。可用 10-config.lua、20-service.lua 显示表达先后关系;前一个永不返回的循环会挡住后面的启动步骤。
可启动磁盘可能先于硬盘入口执行。排查“改了 startup 仍没生效”时,检查连接磁盘及 shell.allow_disk_startup、shell.allow_startup,不要只检查根目录文件。
-- Save as /startup.lua after creating /station.lua.
local program = "/station.lua"
if not fs.exists(program) then
error("Missing service: " .. program, 0)
end
if not shell.execute(program) then
error("Station service exited with an error.", 0)
end先决定模块输出的能力,再决定文件名。主程序只依赖返回值,不依赖模块把名字偷偷放进全局环境。
require("factory.stock") 查找 factory/stock.lua 或匹配搜索模板的入口;模块名不写 .lua,目录层次用点号。相对搜索以当前程序为基准,不是随意以终端当前目录为基准。
模块末尾通常返回函数表,也可以返回函数或其他值。同一模块的加载结果会缓存;不要依赖重复 require 来重做初始化。需要可重复动作时导出一个显式函数。
先检查模块文件大小写、程序所在位置和 package.path,再检查模块本身是否报错。自建运行环境使用 cc.require.make;普通业务程序不必替换加载器。
-- File: station_format.lua
local function quantity(name, amount)
return string.format("%s: %d", name, amount)
end
return { quantity = quantity }
-- Save the following separately as report.lua:
-- local format = require("station_format")
-- print(format.quantity("Iron", 24))方块查询返回的是当时的资料快照,不是可写入的世界对象。常用入口为 turtle.inspect 与 commands.getBlockInfo。
name:string 是命名空间 ID;state:table 表示方块状态。判断农作物成熟、活塞朝向等优先读状态字段,而不是依赖旧版 metadata 数字。
tags 是标签名到 true 的映射,测试用 info.tags["某标签"];mapColour / mapColor 是可选的 RGB 整数,不是 colors 的 16 色位常量。
方块状态字段在 1.76 加入,地图颜色在 1.117.0 加入。不同提供者可能有附加字段,程序应先确认字段存在,而不是假定所有方块都长一样。
迁移时先记录 Minecraft、CC:T 和外设附属版本,再按实际使用的能力核查。核心 API 稳定不代表所有模组外设也稳定。
Lua 运行时迁移涉及 _ENV、函数环境和变长参数。函数内改用 ...,不要依赖旧式 arg;load 默认使用全局环境。string.dump 与二进制 chunk 不再可用,随机数算法也已变化。
这一时期文件、HTTP 与 WebSocket 统一使用原始字节。非 ASCII 内容不能继续假定旧版文本模式会自动做 UTF-8 转换。处理网络编码时明确约定格式。
键码随 LWJGL 变化,使用 keys 常量,并分别考虑主回车与小键盘回车。旧版物品 damage/方块 metadata 分类应改用物品 ID 和方块状态;自定义 ROM 改由数据包提供。
MC 1.13 后海龟可含水,不再把穿过水源等同于破坏水。CC:T 1.88.0 起,未命名电脑被破坏后也保留 ID,因此不能再依赖其像普通方块一样堆叠。
ComputerCraft 1.80pr1 后 shell.run 程序有独立环境;包含 / 的程序路径按当前目录解析,不再按所有搜索路径补全。
/computercraft 用于观察和管理运行中的电脑,不是电脑 Lua 中的普通函数。执行前明确目标范围,尤其避免无参数的批量电源操作。
电脑选择器为 @c[...],支持 id、instance、family、label、distance;#编号 是按 ID 选择的简写。不要把它与实体选择器 @e 混用。
dump 列出已加载电脑,也可进一步查看单台;turn-on / shutdown 处理指定目标,省略目标可能作用于全部已加载电脑。tp 和 view 分别用于传送与远程打开终端。
track start 开始统计,track stop 停止并查看,track dump 可在过程中读取。可选字段如 server_tasks_count、server_tasks、http_upload、http_download,分别用于任务和网络开销排查。
多人服务器中管理子命令通常需要 OP;queue 可由普通玩家向命令电脑送事件。单人无作弊时可用部分诊断、电源、统计命令,tp/view 仍需作弊权限;权限模组可用 computercraft.command.NAME 细分授权。
数据包是服务器分发统一程序和扩展模组规则的途径。包格式依 Minecraft 版本变化,先选匹配版本,再制作内容。
ROM 程序放在 data/computercraft/lua/rom 下。programs 提供命令,modules/main 提供 require 模块,autorun 提供开机初始化。数据包路径与文件名使用小写。
rom/apis 会在启动时加载;其 http、turtle、pocket、command 子目录分别按相应能力启用。新模块优先放在 modules,而不是继续扩大全局 API。
computercraft:turtle_can_place 是可被海龟使用的物品标签;turtle_can_use 指可交互方块。always_breakable 扩展所有工具都能破坏的方块;turtle_shovel_harvestable、turtle_sword_harvestable、turtle_hoe_harvestable 分别针对工具。
本页不混写不同版本的升级 JSON 格式。1.20.x、1.21.x 和 26.3 的官方数据包参考为独立版本页面。修改后按环境执行 /reload 并重新启动相关电脑;在测试世界确认后再分发。
1.118.0 起的相关实体查询可用于命令电脑监测。先确认当前版本存在 commands.getEntities。
name 是实体类型 ID,不是某一个体的持久身份。displayName 是服务器语言下的显示文字,不能拿它替代稳定类型判断。
适用实体提供 health、maxHealth;tags 是实体类型标签集合。不要假定所有实体都有生命值,也不要将类型标签与自定义命令标记混为一谈。
一般业务代码让错误自然传出即可;只有编写协程调度器时,才需要考虑如何把原协程栈传给 CraftOS 的错误显示层。
普通错误可能只是字符串;CraftOS 异常对象是带 message:string、thread:thread 的表,其元表用 __name="exception" 标识。捕获错误时不能只假定它是字符串。
coroutine.resume 的失败结果若仅重新包装成普通字符串,会丢失来源协程信息。自建调度器需保存来源线程,并按协议转交,避免诊断只剩调度器的位置。
parallel 为兼容会被用户捕获和检查的旧式错误,并非每次都包装异常。自建调度器可研究 debug.getregistry().try_barrier 的 context,其中 co 是父协程,can_wrap 控制是否允许包装;这是底层集成约定,不是普通业务的必需模板。
CC:T 使用 Cobalt,不能仅凭 _VERSION 假定等同于完整桌面 Lua。语言语法、标准库和兼容别名需要分别判断。
支持 goto、_ENV、__len、__pairs、rawlen、table.pack/unpack、带参数的 xpcall、package.searchpath、bit32,并保留部分旧版兼容名字。
支持 utf8、\u{...}、string.pack/unpack/packsize、table.move、coroutine.isyieldable。没有独立整数子类型、原生位运算符或整除运算符;不要直接移植含这些语法的代码。
loadstring、全局 unpack、table.maxn、math.log10、math.frexp/ldexp/pow/cosh/sinh/tanh、bit32 等旧名字仍可见;不能按“新 Lua 删除了”反推这里不存在。
collectgarbage、os.execute、os.exit、string.dump、二进制 chunk 不能照搬桌面实现。getfenv/setfenv 只对带 _ENV 的 Lua 闭包有相应意义;package.loaders 没有整体换成 package.searchers。
官网还列有 table.create 与 utf8.offset 返回结束位置等较新能力,旧整合包不一定支持。GC 由 Java 管理,调试钩子、弱表等细节应按具体兼容表核查。
列表接口适合快速概览,详细查询适合确实需要附魔、标签或耐久的判断。不要为每次刷新都对所有空槽做详细查询。
name:string 与 count:number 表示物品类型和数量。可选的 nbt:string 是数据摘要,不是可读取的 NBT 内容;用名称和摘要区分附魔、内容等不同的同名物品。
displayName 是显示名称,lore 是说明行,maxCount 是堆叠上限。显示语言由服务器环境决定,业务分类不要依赖英文或中文显示名。
tags 按标签名映射到 true。itemGroups 中的元素包含 id 和 displayName;MC 1.19.3~1.20.3 这个字段存在但为空,不能据此断定物品没有分类。
damage 是已消耗耐久,maxDamage 是最大耐久;可选 durability 为耐久条剩余比例 0~1,unbreakable 表示不可破坏。非耐久物品不能照搬这些字段。
enchantments 的元素可读 name、displayName、level。potionEffects 可读效果名、显示名及可选的 duration(秒)、potency;瞬时效果不一定有持续时间。
mapColour / mapColor 是可选 RGB 整数。1.94.0 扩充 NBT 摘要、标签等详细数据;1.100.9 加入物品组,1.117.0 加入地图色与药水效果。
排查开机行为时,要区分 ROM 初始化、磁盘入口和本机入口。
先执行 /rom/autorun。允许磁盘启动时,检查已连接磁盘,找到可启动介质后执行该介质的 startup 或 startup.lua,再执行其 startup/ 内程序。只有没找到磁盘启动项且允许本机启动时,才检查硬盘根目录。
目录内文件按 fs.list 的字典序执行;多个磁盘之间的查找顺序没有保证。只保留一个可启动磁盘,或禁用磁盘启动,避免依赖不稳定顺序。
启动脚本中定义配置和补全后应返回。长期任务集中在明确的服务入口,不能让一个初始化脚本无限循环并期待后续脚本继续执行。