COMPUTERCRAFT / FACTORY FIELD GUIDE

CC: Tweaked 中文实战手册

先掌握 CC: Tweaked 本体,再按模组查阅联动接口。从 Lua、外设与海龟,到工业自动化和船载仪表。

Lua 与外设物流与自动合成船载仪表离线单文件
CC: Tweaked 主题方块工坊插画:采矿机器人、储物箱与连接绿色监视器的电脑
AI 主题插画 · 非游戏截图

PART 01 / CORE

第一章 · CC: Tweaked 本体

从终端与 Lua 开始,依次掌握外设、显示、事件、网络和海龟。

1.1入门与程序管理

CC: Tweaked 能做什么?

CC: Tweaked 在 Minecraft 中提供可编程电脑与海龟,使用 Lua 编写程序。电脑可连接箱子、显示器、调制解调器及兼容机器,读取状态、搬运物品、响应事件并输出控制信号。

从基础 Lua、外设连接与事件处理开始,逐步完成库存看板、自动合成、红石控制和船载仪表。

先学这条路线

  1. 电脑上创建 hello.lua。
  2. 运行外设探测器,搞清名称与类型。
  3. 做箱子搬运与显示器看板。
  4. 处理事件,用红石或 Rednet 连接程序。
  5. 保存配置,并编写能处理失败的海龟程序。

页面中的示例独立使用;带“改名”的代码先换成探测器打印的外设名称。游戏终端文本统一使用 ASCII,避免字体不支持中文。

创建第一个程序

右键电脑,依次输入以下命令。编辑器中写入代码后,通过 Ctrl 打开菜单,选择 Save 与 Exit。

label set Factory
edit hello.lua
hello
print("Hello, factory!")
print("Computer ID:", os.getComputerID())

常用终端命令

命令作用
ls / dir列目录
cd / mkdir切换/新建目录
edit file.lua编辑文件
file 或 file.lua运行程序
cp / mv / rm复制/移动/删除
help peripheral查看内置帮助
reboot / shutdown重启/关机
id / label get电脑编号/标签

自启动与中止

创建 startup.lua;开机时自动执行。持续按 Ctrl+T 中止程序,Ctrl+R 重启,Ctrl+S 关机。添加标签有助于保留并辨认电脑。

-- startup.lua
if fs.exists("dashboard.lua") then
  shell.run("dashboard.lua")
end

文件传输与 HTTP

可使用软盘和磁盘驱动器,或客户端支持的文件拖入上传。HTTP 是否可用由服务端决定,无法访问时检查域名规则与配置。

wget https://example.com/program.lua program.lua

上面的地址仅展示命令格式。下载的程序先打开检查,再执行。离线手册不依赖下载或在线脚本。

1.2Lua 语法

变量、分支与默认值

用 local 声明局部变量;只有 false 和 nil 为假,数字 0 与空字符串为真。比较相等使用 ==,不等使用 ~=。

local count = 12
local name = "minecraft:iron_ingot"
if count < 64 then
  print(name .. " is low")
elseif count == 64 then
  print("exactly one stack")
else
  print("enough")
end

表、遍历与稀疏槽位

数组习惯从 1 开始。ipairs 适合连续数组;箱子 list() 返回稀疏槽位表,使用 pairs。

local target = { name = "minecraft:iron_ingot", count = 64 }
local slots = { [2] = {name="minecraft:stone", count=16} }
for slot, stack in pairs(slots) do
  print(slot, stack.name, stack.count)
end

函数、多返回值与错误

pcall 的第一个返回值只表示调用有没有抛异常。外设仍可能正常返回 nil, error 或 false, reason,需要再检查。

local function divide(a, b)
  if b == 0 then return nil, "zero divisor" end
  return a / b
end
local ok, value, err = pcall(divide, 10, 0)
if not ok then print(value)
elseif value == nil then print(err)
else print(value) end

循环必须让出执行权

长循环用 sleep、事件或会等待的外设方法让出执行权,否则可能出现 Too long without yielding。通常从 0.5~2 秒刷新开始。

while true do
  print(os.time())
  sleep(1)
end

1.3外设连接、名称与类型

外设提供哪些能力?

外设接口有三种常见来源:CC 的通用容器能力、机器模组提供的原生集成,以及附属模组增加的专用接口。同一个方块可以同时提供多种能力。

用 peripheral.getNames() 获取设备名称,getType(name) 查看类型,getMethods(name) 列出可调用方法。程序通过名称绑定设备,再调用它提供的方法。

三种连接方式

  1. 相邻:外设贴电脑,名称通常是 left / right / top / bottom / front / back。
  2. 有线:电脑与设备各接有线调制解调器,中间连接网络线缆;右键设备端调制解调器启用共享。
  3. 无线:用于电脑间通信;无线 modem 不会自动把远处箱子变成可 wrap 的外设。

有线网络里的名称如 minecraft:chest_0 是设备名称;inventory 是类型,不能混用。

外设探测器 · 保存为 inspect.lua

连接未知机器、附属方块或船载控制器时,先跑这个程序。结果写入 peripherals.txt,可在编辑器中查看。

local report = {}
local function line(s)
  print(s)
  report[#report + 1] = s
end
for _, name in ipairs(peripheral.getNames()) do
  line("[" .. name .. "] " ..
    table.concat({peripheral.getType(name)}, ", "))
  local methods = peripheral.getMethods(name) or {}
  table.sort(methods)
  for _, method in ipairs(methods) do
    line("  " .. method)
  end
end
local f = assert(fs.open("peripherals.txt", "w"))
f.write(table.concat(report, "\n"))
f.close()

按类型找 / 按名称绑定

find 可能返回多个外设;只接收一个变量时拿到第一个。正式程序有多个同类设备时,建议固定名称。wrap 后的方法使用点号调用。

local monitor = peripheral.find("monitor")
local chest = peripheral.wrap("minecraft:chest_0") -- change me
if not chest then error("Chest is not connected") end
print(peripheral.hasType("minecraft:chest_0", "inventory"))
print(textutils.serialize(chest.list()))

方向的参照物

CC 的 left / right / front / back / top / bottom 以电脑自身为参照。例如 redstone.setOutput("left", true) 打开电脑左侧红石输出。

机器自身还可能有“前面/输入面/输出面”。改动摆放方向后,先用小批量物品验证。红石开关的启停逻辑也由机器配置决定。

1.4通用物品、流体与能量接口

容器接口

调用说明
size()总槽数
list()仅非空槽:name、count 等
getItemDetail(slot)单槽详细资料或 nil
getItemLimit(slot)槽位堆叠限制
pushItems(toName, fromSlot, limit?, toSlot?)从当前容器送出
pullItems(fromName, fromSlot, limit?, toSlot?)向当前容器拉入
返回实际搬运数量,可能为 0 或小于请求值。目标必须在当前可见的有线网络中,且支持物品能力;库存空槽不代表机器允许从该面输入。

只搬铁锭 · 保存为 transfer.lua

两个箱子接入同一有线网络。把名称换成探测结果;每轮最多逐槽请求 64 个。使用 pairs,避免漏掉中间有空位的箱子。

local sourceName = "minecraft:chest_0" -- change me
local targetName = "minecraft:chest_1" -- change me
assert(sourceName ~= targetName, "Same inventory")
local source = assert(peripheral.wrap(sourceName), "No source")
assert(peripheral.isPresent(targetName), "No target")
while true do
  local moved = 0
  for slot, item in pairs(source.list()) do
    if item.name == "minecraft:iron_ingot" then
      moved = moved + source.pushItems(targetName, slot, 64)
    end
  end
  print("Moved:", moved)
  sleep(1)
end

流体容器

tanks() 查询槽内流体;pushFluid(toName, limit?, fluidName?) 与 pullFluid 搬运流体,单位通常是 mB。不是所有机器都提供该能力。

local tank = assert(peripheral.wrap("tank_0"), "Change tank name")
print(textutils.serialize(tank.tanks()))
-- Optional: move at most one bucket of water
-- print(tank.pushFluid("tank_1", 1000, "minecraft:water"))

储能查询与能量流量

通用 energy_storage 提供 getEnergy() 与 getEnergyCapacity(),通常按 FE 计。CC 通用接口不直接搬运 FE;让电缆负责输电。

通用能量接口负责查询储能。能量运输由电缆等设备完成,物品和流体使用各自的转移方法。

local battery = peripheral.find("energy_storage")
if battery then
  local max = battery.getEnergyCapacity()
  print("FE:", battery.getEnergy(), "/", max)
end

1.5显示器、触摸与声音

显示器常用接口

方法用途
setTextScale(0.5 .. 5)显示器字符缩放,步进 0.5
getSize()当前字符宽高
setCursorPos(x, y)光标从 1,1 起算
setTextColor / setBackgroundColor设置颜色,高级显示器支持彩色
clear / clearLine / write清屏/清行/写字
monitor_touch高级显示器触摸事件:外设名称、x、y

库存看板 · 保存为 dashboard.lua

需要一个显示器和一个箱子;修改箱子名称。每次先取实际宽度,避免文字越界。

local m = assert(peripheral.find("monitor"), "No monitor")
local chest = assert(peripheral.wrap("minecraft:chest_0"), "No chest")
m.setTextScale(0.5)
while true do
  local count = 0
  for _, item in pairs(chest.list()) do count = count + item.count end
  local w, h = m.getSize()
  m.setBackgroundColor(colors.black)
  m.setTextColor(colors.white)
  m.clear()
  m.setCursorPos(1, 1)
  m.write(("ITEMS: " .. count):sub(1, w))
  if h >= 2 then
    m.setCursorPos(1, 2)
    m.write(("TIME: " .. textutils.formatTime(os.time(), true)):sub(1, w))
  end
  sleep(1)
end

触摸按钮

下面切换电脑背面的红石信号。仅处理指定显示器第一行,退出时恢复关闭。机器是否“有信号才工作”需要你在机器里配置。

local m = assert(peripheral.find("monitor"), "No monitor")
local name = peripheral.getName(m)
local on = false
local function draw()
  m.clear()
  m.setCursorPos(1, 1)
  m.write(on and "[ ON ]" or "[ OFF ]")
end
local ok, err = pcall(function()
  draw()
  while true do
    local _, device, x, y = os.pullEvent("monitor_touch")
    if device == name and y == 1 and x <= 7 then
      on = not on
      redstone.setOutput("back", on)
      draw()
    end
  end
end)
redstone.setOutput("back", false)
if not ok then print(err) end

扬声器与终端重定向

简单报警使用 playNote 或 playSound。播放音频时关注 speaker_audio_empty 的缓冲回补;这不同于直接播放 MP3 文件。

local speaker = peripheral.find("speaker")
if speaker then speaker.playNote("pling", 1, 12) end

local m = peripheral.find("monitor")
if m then
  local old = term.redirect(m)
  local ok, err = pcall(function() print("Hello monitor") end)
  term.redirect(old)
  if not ok then error(err, 0) end
end

1.6事件、并发、红石与网络

事件与定时器

os.pullEvent() 等待事件;过滤参数只接收指定事件。需要同时处理多个事件时,接收全部事件再分支。Ctrl+T 会使普通 pullEvent 抛出终止错误。

local timer = os.startTimer(1)
while true do
  local e, a, b, c = os.pullEvent()
  if e == "timer" and a == timer then
    print("tick")
    timer = os.startTimer(1)
  elseif e == "peripheral_detach" then
    print("Lost:", a)
  elseif e == "monitor_touch" then
    print(a, b, c)
  end
end

parallel 是协作并发

waitForAny 在一个任务结束时结束整体;waitForAll 等所有任务结束。任务仍要让出执行权。适合显示刷新与输入监听同时运行。

parallel.waitForAny(
  function()
    while true do print("refresh"); sleep(2) end
  end,
  function()
    while true do
      local _, key = os.pullEvent("key")
      if key == keys.q then return end
    end
  end
)

普通红石与模拟信号

数字信号是开/关;模拟信号是 0~15。输入变化触发 redstone 事件。红石侧名相对电脑自身。

redstone.setOutput("back", true)
redstone.setAnalogOutput("right", 7)
print(redstone.getInput("front"))
print(redstone.getAnalogInput("left"))
-- turn off after the demonstration
sleep(2)
redstone.setOutput("back", false)
redstone.setAnalogOutput("right", 0)

Rednet 两台电脑互发

两台电脑都安装 modem。先运行接收端;发送端把 12 改为接收端的电脑 ID。协议名用于区分用途,不提供加密或身份认证。

-- receiver
rednet.open("top") -- modem side
while true do
  local sender, message = rednet.receive("factory.status")
  print(sender, textutils.serialize(message))
end
-- sender
rednet.open("top")
rednet.send(12, {kind="status", items=128}, "factory.status")

GPS 与原始 modem

gps.locate(timeout) 依赖布置并运行 GPS host 的定位网络,不能凭空获得坐标。跨维度、区块未加载与无线范围都会影响可用性。

原始 modem 使用频道,modem_message 携带来源侧、频道、回复频道、消息、距离。Rednet 提供电脑 ID 与协议封装,通常更适合入门。

local x, y, z = gps.locate(2)
if x then print(x, y, z) else print("GPS unavailable") end

1.7文件、配置与持久化

保存配置

textutils.serialize 与 unserialize 适合 Lua 表。先校验读取结果的类型;不要假定文件永远完整。

local config = {refresh=1, chest="minecraft:chest_0"}
local out = assert(fs.open("config.txt", "w"))
out.write(textutils.serialize(config))
out.close()

local input = fs.open("config.txt", "r")
if input then
  local loaded = textutils.unserialize(input.readAll())
  input.close()
  if type(loaded) == "table" then config = loaded end
end
print(config.chest)

记录错误与断线恢复

显示/采样程序可以在设备重连后重试。搬运、下单、移动等动作可能已部分执行;不要在 catch 后立即无限重复提交。

local function log(message)
  local f = assert(fs.open("events.log", "a"))
  f.writeLine(tostring(os.epoch("utc")) .. " " .. tostring(message))
  f.close()
end
local ok, err = pcall(function()
  local p = assert(peripheral.wrap("left"), "Peripheral offline")
  print(textutils.serialize(p))
end)
if not ok then log(err); print(err) end

1.8海龟:移动、背包与任务恢复

移动、工具与物品接口

操作方法
移动forward / back / up / down / turnLeft / turnRight
检测detect / inspect,另有 Up / Down 变体
挖掘/放置dig / place,需要合适工具与选中物品
背包select / getItemDetail / getItemCount / transferTo
外部交换suck / drop,另有 Up / Down 变体
燃料getFuelLevel / getFuelLimit / refuel
移动常返回 success, reason。失败不能照样更新坐标。空岛先铺测试台,先单步验证路径,再启动循环。

有界移动:失败就停止

将海龟放在平整测试平台,前方至少留 3 格空位;它只前进、不挖方块、不自动回程。

assert(turtle, "Run on a turtle")
local fuel = turtle.getFuelLevel()
if fuel ~= "unlimited" and fuel < 3 then
  error("Need at least 3 fuel")
end
for step = 1, 3 do
  local ok, reason = turtle.forward()
  if not ok then error("Stopped: " .. tostring(reason)) end
  print("Step", step)
end

重启后恢复的最低要求

保存当前位置、朝向、任务阶段与剩余步骤;每次成功移动后更新记录。GPS 可以辅助校准位置,但不直接给出朝向。无法确认状态时停机。

电脑、海龟、目标设备及连接路径所在的区块需要保持加载,程序才能持续工作。

1.9常用程序模板

通用事件探测 · 按 Q 退出

观察程序收到的事件及其参数。事件数据可能很多,仅在调试时运行。

while true do
  local e = table.pack(os.pullEvent())
  if e[1] == "key" and e[2] == keys.q then break end
  print(textutils.serialize(e))
end

储能低水位指示 · 含滞回

背面红石信号表示“电量低”;不是通用发电机开机命令。低于 20% 置位,高于 80% 复位;读数故障或退出清零并停止。

local b = assert(peripheral.find("energy_storage"), "No battery")
local low = false
local ok, err = pcall(function()
  while true do
    local capacity = b.getEnergyCapacity()
    assert(capacity > 0, "Invalid capacity")
    local ratio = b.getEnergy() / capacity
    if ratio < 0.2 then low = true
    elseif ratio > 0.8 then low = false end
    redstone.setOutput("back", low)
    print(("Energy %.1f%% | low=%s"):format(ratio*100, tostring(low)))
    sleep(2)
  end
end)
redstone.setOutput("back", false)
if not ok then print(err) end

多台设备命名建议

把电脑标签设成角色:Factory_Main、Ship_Telemetry、Storage_Requester。将实际设备名称放进配置,不要把 find 的偶然返回顺序当成设备身份。

每个控制看板至少显示设备在线状态、读数时间、当前模式与最近一次错误。屏幕内容再漂亮,也需要能辨别设备断线。

1.10本体常见问题

程序与外设排错

现象排查路径
No peripheral / wrap 返回 nil检查摆放面、modem 共享开关、线缆与区块加载;无线 modem 不共享远端外设。
attempt to call ... nil方法名/版本/设备类型不符;核对 getMethods,别把网络名称当 type。
物品搬运一直 0检查输入面、机器锁定、目标容量、过滤器和双方是否同网;先换普通箱子验证。
Too long without yielding循环补 sleep 或事件等待;不要递归忙等。
屏幕不显示/文字被截断检查 setTextScale、getSize 与光标范围;多块显示器需要正确拼接。
触摸没有事件使用高级显示器;检查事件来源名称及是否被另一个事件循环消耗。
海龟不动检查燃料、障碍、权限与实体阻挡;打印移动返回原因。
重启后程序不运行确认根目录 startup.lua;检查文件存在、语法错误与设备是否尚未加载。

PART 02 / INTEGRATIONS

第二章 · 模组联动

按用途分类,按模组查阅;每个模组的接口与示例集中介绍。

联动索引

按模组查找联动

各模组的接口、连接方式和示例集中在同一个条目中。先按用途选择分类,再进入对应模组。

分类模组内容
通用外设与红石Advanced Peripherals探测器、海龟升级与 AE2 / RS 存储桥
通用外设与红石More Red × CC束线红石
通用外设与红石Ender IO束线红石
工业、能源与物流Mekanism机器、多方块与 QIO
工业、能源与物流PneumaticCraft气动机器与无人机
工业、能源与物流Powah通过 AP 读取发电与储能
工业、能源与物流Draconic Evolution能量与反应堆
工业、能源与物流Energy Meter能量速率与累计值
工业、能源与物流LogisticsNetworks网络、通道与流量
机械动力与航空Create动力、物流、铁路与显示
机械动力与航空Create: New Age发电与电动机
机械动力与航空Create Bits ’n’ BobsHeadlamp
机械动力与航空Simulated基础传感器、导航与停靠
机械动力与航空CC: Sable船体状态与物理环境
机械动力与航空Create: Avionics扩展仪表与船载桥接
机械动力与航空Gadgets & GizmosACC、输入与航空控制
机械动力与航空Create Propulsion推进器
机械动力与航空Create: Radars雷达航迹
魔法与其他外设Neo Vitae祭坛、仪式与精华
魔法与其他外设SupplementariesSpeaker 与 Cannon

联动实践路线

  1. 箱子库存总数 → 屏幕。
  2. AP 电流与电池容量 → 低电提示。
  3. ME/RS 单品库存 → 单次合成测试。
  4. 机器状态采集 → CC 红石启停控制。
  5. 船上位置/速度/高度 → 驾驶舱看板。
  6. 雷达原始航迹 → 数量与更新时间。

2.1

通用外设与红石

Advanced Peripherals:探测器、海龟升级与 AE2 / RS 存储桥

设备名与用途
设备常见 type用途/方法
Chat Boxchat_boxsendMessage / sendMessageToPlayer;聊天通知
Energy Detectorenergy_detectorgetTransferRate / getTransferRateLimit / setTransferRateLimit
Player Detectorplayer_detectorgetOnlinePlayers / getPlayersInRange / getPlayerPos
Environment Detectorenvironment_detector时间、天气、维度与环境信息
Inventory Managerinventory_manager绑定玩家;getOwner / getItems / getArmor
Block Readerblock_reader读取目标方块与方块实体信息
Geo Scannergeo_scannerscan(radius)、冷却、扫描消耗
NBT Storagenbt_storage读写结构化存储数据
ME Bridge / RS Bridgeme_bridge / rs_bridgeMinecraft 1.21.1 使用下划线名称

Minecraft 1.21.1 的 AP 类型使用下划线命名。通过类型查找设备,或使用外设名称绑定指定设备。

流量计:读数与限流

把 Energy Detector 串接在供电路径;相邻电脑或有线共享其外设。下面只读取,不修改供电。

local d = assert(peripheral.find("energy_detector"), "Check detector type")
print("Flow FE/t:", d.getTransferRate())
print("Limit FE/t:", d.getTransferRateLimit())
-- Optional write after checking your energy network:
-- d.setTransferRateLimit(10000)
聊天通知与玩家检测

聊天框通知要控制频率,适合状态变化时发送。玩家探测器可读取在线和范围信息,范围受服务端配置约束。

local chat = peripheral.find("chat_box")
if chat then chat.sendMessage("Factory ready", "Factory") end
local detector = peripheral.find("player_detector")
if detector then
  print(textutils.serialize(detector.getOnlinePlayers()))
  print(textutils.serialize(detector.getPlayersInRange(32)))
end
背包、方块与扫描:不同设备负责什么

Inventory Manager 先绑定玩家;用 getOwner / getItems / getArmor 读取,再考虑向背包放入或取出。它不同于普通箱子的槽位接口。

Block Reader 读取相邻目标方块信息,适合检查机器状态;返回内容随方块而变。Geo Scanner 按半径扫描方块,受燃料、冷却与范围限制;先检查对应方法和 scan 的失败返回。

NBT Storage 存储结构化数据,不会自动提供所有机器的内部信息。

外设被配置禁用时

AP 可能仍允许 wrap 一个被禁用的设备,但执行方法时抛错。部分版本通过额外的 peripheralDisabled 成员标记禁用状态。

local p = peripheral.find("chat_box")
if not p then error("No chat box") end
if p.peripheralDisabled then error("Chat box disabled by config") end
print("Chat box connected")
AP 的信标与音符盒接口

AP 还可把原版信标和音符盒作为专用外设。信标提供 getLevel()、getPrimaryEffect()、getSecondaryEffect()。

音符盒提供 getNote()、changeNote()、changeNoteBy(offset) 与 playNote()。这组方法控制方块自身的音高;CC Speaker 的 playNote 则接收乐器、音量与音高参数。

AP 海龟升级

AP 提供聊天、环境、玩家、地质扫描、Chunky 与自动机核心等扩展。安装升级后,可通过外设接口使用相应能力。

Chunky Turtle 可在移动时保持周围区块加载。自动机操作带冷却与消耗,不适合无延迟轮询。不要把区块加载理解成服务器关机后继续运行。

AP 0.7.62b · Minecraft 1.21.1 接口

AP 0.7.62b(Minecraft 1.21.1)采用新版存储系统。ME 桥类型 me_bridge,RS 桥类型 rs_bridge。查询使用 getItems({});合成检查使用 isCraftable / isCrafting。

旧版接口Minecraft 1.21.1 接口
meBridge / rsBridgeme_bridge / rs_bridge
listItems()getItems({})
isItemCraftable / isItemCraftingisCraftable / isCrafting
getEnergyStorage()getStoredEnergy()
exportItemToPeripheral(...)exportItem(filter, target)
craftItem 返回布尔值返回任务对象;下单与完成是不同阶段
桥需要接入供电正常的 AE2 / RS 网络;ME 桥占用 AE2 通道。
先确认在线并查询库存

这段只读程序同时支持 ME 与 RS。先观察完整返回结构,再决定看板需要哪些字段。

local bridge = peripheral.find("me_bridge")
  or peripheral.find("rs_bridge")
assert(bridge, "No ME/RS bridge")
assert(bridge.isConnected(), "No storage network")
assert(bridge.isOnline(), "Network offline")
local item, err = bridge.getItem({name="minecraft:iron_ingot"})
if item then print(textutils.serialize(item))
else print(err or "No matching item") end
local items, listErr = bridge.getItems({})
if items then print("Entries:", #items) else print(listErr) end
导入与导出:方向看桥

下面向网络名称指定的箱子导出最多 16 个铁锭。目标箱子需要在电脑可访问的有线网络中。若用方向字符串,目标容器放在桥旁边,方向参照桥。

local bridge = assert(peripheral.find("me_bridge"), "No ME bridge")
local target = "minecraft:chest_1" -- change me
local result, err = bridge.exportItem(
  {name="minecraft:iron_ingot", count=16}, target)
if result == nil then print(err)
else print(textutils.serialize(result)) end
-- Import is from target inventory INTO storage:
-- bridge.importItem({name="minecraft:iron_ingot", count=16}, target)
合成任务:先单次验证

AE2/RS 中先配置有效样板、材料与合成设施。count 是本次申请数量。不要用“请求成功”当成物品已经入库。

local bridge = assert(peripheral.find("me_bridge"), "No ME bridge")
local filter = {name="minecraft:iron_block", count=1}
local craftable, err = bridge.isCraftable(filter)
if craftable == nil then error(tostring(err)) end
if not craftable then error("No usable pattern") end
local busy, busyErr = bridge.isCrafting(filter)
if busy == nil then error(tostring(busyErr)) end
if busy then error("Already crafting") end
local job, jobErr = bridge.craftItem(filter)
if job == nil then error(tostring(jobErr)) end
print("Request created; check task status and inventory.")
print(textutils.serialize(job))
做自动补货前先解决这四件事
  1. 明确库存返回字段和不足阈值,保留高低水位差。
  2. 查询 isCrafting,防止重复申请同种物品。
  3. 跟踪 getCraftingTasks() 与任务对象状态;错误、缺料和取消要显示。
  4. 重启后先查询现有任务,再恢复调度。

事件常见名称为 me_crafting / rs_crafting;用通用事件探测打印实际参数。长周期库存复核仍然必要。

流体、化学品与容量

两种桥均提供 getFluid / getFluids、getChemical / getChemicals 与相应 import / export / craft 方法。化学品仍依赖 Mekanism 以及网络侧的兼容能力。

getStoredEnergy、getEnergyCapacity、getEnergyUsage 查询网络能量。内部盘与外部存储的容量统计需要分别处理;AE2 的字节容量不能直接标成“物品个数”。

More Red × CC:束线红石

More Red × CC:16 色束线

More Red × CC:Tweaked Compat 将 More Red 的彩线和束线接入 CC 标准红石能力。通过 redstone.setBundledOutput 与颜色位掩码。

local channels = colors.combine(colors.red, colors.blue)
redstone.setBundledOutput("back", channels)
local incoming = redstone.getBundledInput("front")
print("Red input:", colors.test(incoming, colors.red))
sleep(2)
redstone.setBundledOutput("back", 0)

Ender IO:束线红石

Ender IO 束线红石接口

Ender IO 8.2.12-beta 含 CC 束线红石兼容,可配合标准 bundled redstone API 使用;先确认管道颜色通道和侧面连接。

2.2

工业、能源与物流

Mekanism:机器、多方块与 QIO

Mekanism 原生接口

将 modem 接到机器或有效的多方块端口,运行 inspect.lua。部分机器需要启用计算机访问,并设置为允许外部控制的安全模式。

方法随机器变化:加工设备、感应矩阵、反应堆与涡轮不能共用一份方法表。返回值还可能是嵌套表。核对能量、温度和速率单位后再画图或做阈值。

Mekanism 官方源码
Mekanism 10.7:通用机器接口

机器常见查询包括 getEnergy()、getMaxEnergy()、getEnergyFilledPercentage()、getDirection() 和 getRedstoneMode()。侧面配置组件提供 getMode / setMode,自动输出组件提供 isEjecting / setEjecting。

使用 computerEnergyHelper.feToJoules 与 joulesToFE 转换 FE 和 Mekanism 焦耳;显示能量前统一单位。Mekanism 原生槽位方法可从 0 编号,CC 通用 inventory 槽位从 1 编号。

local machine = assert(peripheral.wrap("left"), "Connect Mekanism machine")
print("Energy:", machine.getEnergy(), "/", machine.getMaxEnergy())
print("Direction:", machine.getDirection())
print("Redstone mode:", machine.getRedstoneMode())
Mekanism 多方块、QIO 与数字采矿机
设备查询与控制示例
感应矩阵getLastInput / getLastOutput / getTransferCap / getInstalledCells
工业涡轮getFlowRate / getProductionRate / getSteam / getMaxFlowRate
裂变反应堆getStatus / getTemperature / getDamagePercent / getActualBurnRate
数字采矿机getState / getToMine / getFilters / isRunning / start / stop / reset
QIO Drive ArraygetFrequencyItemCount / getFrequencyItemCapacity / getDriveStatus
热力锅炉getWater / getSteam / getTemperature / getBoilRate

多方块先完成组装,再连接对应端口。采矿机修改半径、高度和过滤器前需停止并重置。QIO 统计要求先选择频率。

裂变反应堆温度为 K;activate、scram 和 setBurnRate 是控制方法,与只读遥测分开使用。

Mekanism 官方方法索引

Mekanism 的方法按机器及组件列出。一台机器可同时拥有通用、能量、配方进度、安全、升级与侧面配置组件的方法。

查询完整接口时,先找机器条目,再看它具备的公共组件。化学品和流体返回结构使用各自的堆叠表。

Mekanism 10.7 电脑方法文档

PneumaticCraft:气动机器与无人机

PneumaticCraft:压力与机器接口

气动机器通过原生动态外设连接 CC。气压处理设备提供 getPressure()、getDangerPressure()、getCriticalPressure() 与 getDefaultVolume();有最低工作气压要求的机器还提供 getMinWorkingPressure()。

空气炮、电梯和万能传感器还提供各自的方法。压力监测可以与显示器、计时器和红石控制组合。

local machine = assert(peripheral.wrap("left"), "Connect pneumatic machine")
print("Pressure:", machine.getPressure())
if machine.getMinWorkingPressure then
  print("Working minimum:", machine.getMinWorkingPressure())
end
print("Danger:", machine.getDangerPressure())
print("Critical:", machine.getCriticalPressure())
气动无人机:Drone Interface

在无人机程序中加入 Computer Control 拼图,并把 Drone Interface 放进该拼图指定的区域。无人机执行到此处后连接接口,一个接口同时控制一架无人机。

用途方法
连接与位置isConnectedToDrone / getDronePositionVec / getDronePressure
动作getAllActions / setAction / getAction / isActionDone / abortAction
工作范围clearArea / addArea / removeArea / showArea / hideArea
物品与数量addWhitelistItemFilter / setUseCount / setCount
变量getVariable / setVariable

setAction 提交动作后异步执行;先等待 isActionDone,再修改范围或开始下一步。只有当前存在动作时才查询完成状态。

无人机只读连接检查

把 left 替换为 Drone Interface 名称。此例查询连接、位置和可用动作,不启动挖掘或移动。

local drone = assert(peripheral.wrap("left"), "Connect Drone Interface")
if not drone.isConnectedToDrone() then
  error("Drone has not reached Computer Control")
end
print(textutils.serialize(drone.getDronePositionVec()))
print("Pressure:", drone.getDronePressure())
print(textutils.serialize(drone.getAllActions()))
local action = drone.getAction()
if action ~= nil then
  print("Action:", action, "Done:", drone.isActionDone())
end
无人机任务的配置顺序
  1. 确认无人机已连接,并结束或中止上一动作。
  2. 清空旧区域,设置新的区域、过滤器、操作面和数量限制。
  3. 用 getAllActions 选择动作,再调用 setAction。
  4. 等待完成,随后切换下一动作或 standby。

区域和过滤器会影响后续动作。setUseCount(true) 与 setCount(amount) 配对使用;动作次数限制由 setUseMaxActions / setMaxActions 控制。

PneumaticCraft 官方仓库与内置手册

Powah:通过 AP 读取发电与储能

Powah:通过 Advanced Peripherals 读发电与储能

Advanced Peripherals 为 Powah 方块补充专用接口。将目标方块接到电脑或有线网络,即可查询发电机、能量单元与反应堆。

设备方法
Energy CellgetStoredEnergy / getMaxEnergy
Ender CellgetStoredEnergy / getMaxEnergy / getChannel / setChannel / getMaxChannels
FurnatorisBurning / getCarbon / getFuelSlot
MagmatorisBurning / getFuelTank
Thermo GeneratorgetCoolantTank
Solar PanelcanSeeSky
ReactorisRunning / getFuel / getCarbon / getRedstone / getTemperature

发电设备也提供 getStoredEnergy / getMaxEnergy。这里的命名属于 AP 的 Powah 集成;CC 通用 energy_storage 接口使用 getEnergy / getEnergyCapacity。

Powah 储能读数示例

将 left 改为 Powah 设备名称。可直接复用显示器章节的文字输出,把储能比例写到屏幕。

local p = assert(peripheral.wrap("left"), "Connect Powah device")
local stored = p.getStoredEnergy()
local capacity = p.getMaxEnergy()
print("Energy:", stored, "/", capacity)
if capacity > 0 then
  print(("Filled: %.1f%%"):format(stored / capacity * 100))
end

Draconic Evolution:能量与反应堆

龙之进化 3.1.4.633

Energy Pylon 提供 getEnergyStored、getMaxEnergyStored、getInputPerTick、getOutputPerTick。大数可使用 getEnergyStoredInNotation 等方法读取,避免显示时丢精度。

Flow / Flux / Fluid Gate 提供流量与 override 控制;反应堆组件可用 getReactorInfo() 观察状态,也提供充能、启动和停止方法。先只读核对结构与单位,再编写专用控制逻辑。

Energy Meter:能量速率与累计值

Energy Meter 0.5.3

Energy Meter 提供专用能量计外设,读数包括 getEnergyRate()、getTotalEnergy()、getTransferLimit()、getConnectionStatus()、getMeasureInterval() 与汇总 getData()。

它与 AP Energy Detector 是两个模组的设备。区分本周期速率、累计能量与采样间隔,避免把累计值画成瞬时功率。

local meter = assert(peripheral.wrap("left"), "Connect Energy Meter")
assert(type(meter.getData) == "function", "Wrong peripheral")
print(textutils.serialize(meter.getData()))

LogisticsNetworks:网络、通道与流量

LogisticsNetworks 1.17.2

专用 Computer 方块可作为 CC 外设。方法包括 listNetworks()、getChannels(network)、getNodes(network)、getGraph(network),以及 watch / unwatch / getFlow。

适合制作物流网络拓扑与流量看板。先用 listNetworks 得到真实标识,再查询通道和节点。watch 涉及跟踪生命周期,结束监控时应 unwatch。

local p = assert(peripheral.wrap("left"), "Connect LogisticsNetworks Computer")
assert(type(p.listNetworks) == "function", "Wrong peripheral")
print(textutils.serialize(p.listNetworks()))

2.3

机械动力与航空

Create:动力、物流、铁路与显示

Create 原生就有 CC 集成

Create 不需要额外 CC:C Bridge 才能读转速。常用外设包括转速控制器、转速表、应力表、程序齿轮箱、显示链接器与列车站。

类型常用方法
Create_RotationSpeedControllergetTargetSpeed / setTargetSpeed
Create_SpeedometergetSpeed
Create_StressometergetStress / getStressCapacity
Create_SequencedGearshiftrotate / move / isRunning
Create_DisplayLink显示链接器写入与更新;先检查方法列表
Create_Station车站状态与时刻表;先检查方法列表
Avionics 可能扩展或替换相同外设表面。转速控制器只改变已有动力传动的设定,不会凭空提供动力。
转速表与可选设定

先读取,确认设备与动力系统,再取消注释启用控制。

local speed = peripheral.find("Create_Speedometer")
if speed then print("RPM:", speed.getSpeed()) end
local control = peripheral.find("Create_RotationSpeedController")
if control then
  print("Target RPM:", control.getTargetSpeed())
  -- control.setTargetSpeed(32)
end
local stress = peripheral.find("Create_Stressometer")
if stress then
  print("Stress:", stress.getStress(), "/", stress.getStressCapacity())
end
Create 6:物流、铁路与显示接口
方块主要方法
Stock Ticker 库存终端stock / getStockItemDetail / requestFiltered
Packager / Re-PackagergetPackage / makePackage / getAddress / setAddress
Redstone RequestergetRequest / setRequest / setCraftingRequest / request
Frogport / PostboxgetAddress / setAddress / getConfiguration / setConfiguration
Table Cloth 商店isShop / getWares / getPriceTagItem / getPriceTagCount
Station 车站isTrainPresent / getTrainName / getSchedule / setSchedule
Signal 信号机getState / listBlockingTrainNames / setForcedRed
Track ObservergetPassingTrainName
Display LinksetCursorPos / write / clear / update
Nixie TubesetText / setTextColor / setSignal
StickerisExtended / isAttachedToBlock / extend / retract / toggle
库存终端:列出物流网络库存

stock() 查询连接的物流网络;stock(true) 包含更详细的物品信息。终端本身的 list() 是支付库存,不能用它代替网络库存查询。

local ticker = assert(peripheral.find("Create_StockTicker"), "Connect stock ticker")
for _, item in ipairs(ticker.stock()) do
  print(item.name, item.count)
end
-- Detailed data:
-- print(textutils.serialize(ticker.stock(true)))
库存终端:向地址请求物品

requestFiltered(address, filter1, ...) 按过滤条件创建物流请求。过滤器中的 name 匹配物品 ID,_requestCount 限制请求数量。

地址应与配送网络中的目标一致。返回请求数量不代表包裹已经送达;需要同时检查供货库存、打包机和运输路径。

local ticker = assert(peripheral.find("Create_StockTicker"), "Connect stock ticker")
local requested = ticker.requestFiltered("Workshop", {
  name="minecraft:iron_ingot",
  _requestCount=16
})
print("Requested:", requested)
打包、请求与配送端

Packager / Re-Packager 通过 getPackage() 查询当前包裹,makePackage() 尝试打包。包裹对象通过方法访问,不能假设它只是一个物品表。

Redstone Requester 的 getRequest() 读取已配置请求,request() 发出请求;setRequest 和 setCraftingRequest 用于修改请求内容。

Frogport 与 Postbox 用 getAddress / setAddress 管理配送地址,用 getConfiguration / setConfiguration 管理工作配置。Table Cloth 商店另有商品、价格物品和数量接口。

列车站:到站状态与时刻表

车站可以读取名称、到站/将到站/行进中状态、列车名称与时刻表。getSchedule() 返回时刻表结构,setSchedule(table) 写回。

assemble / disassemble 控制列车装配;读取列车名称与时刻表前先判断列车是否存在。

local station = assert(peripheral.find("Create_Station"), "Connect station")
print("Station:", station.getStationName())
if station.isTrainPresent() then
  print("Train:", station.getTrainName())
  if station.hasSchedule() then
    print(textutils.serialize(station.getSchedule()))
  end
else
  print("No train at platform")
end
铁路信号与轨道观察器

信号机 getState() 查询状态,listBlockingTrainNames() 查询阻塞区段的列车,isForcedRed() / setForcedRed(boolean) 读写强制红灯。

轨道观察器通过 getPassingTrainName() 读取经过列车名称。适合制作站台到发牌与区段占用看板。

显示链接器:写入后 update

Display Link 不是 monitor 外设。它维护供目标显示设备读取的文本缓冲区,write 后调用 update() 提交。

local display = assert(peripheral.find("Create_DisplayLink"), "Connect display link")
local width, height = display.getSize()
display.clear()
display.setCursorPos(1, 1)
display.write(("FACTORY READY"):sub(1, width))
display.update()
辉光管与黏着器

Nixie Tube 的 setText 写入文字,setTextColor / setTextColour 设置文字颜色,setSignal 显示红石数值。

Sticker 提供伸出、缩回和切换动作,isExtended 读取伸出状态,isAttachedToBlock 判断是否连接方块。这些直接动作可以由电脑事件或按钮触发。

Create 官方 CC 集成文档

Create: New Age:发电与电动机

Create: New Age 1.2.0

Create: New Age 提供电刷、充能器与电动机专用外设。电刷 getOutput() 查询输出;充能器 getTier()、getMaxEnergy()、getCurrentEnergy() 查询等级与储能;电动机有 getTier()。

这些是 New Age 自带集成,不要求再安装一个 CC 附属。不要把所有发电设备都套成同一个通用能量类型。

Create Bits ’n’ Bobs:Headlamp

Create Bits ’n’ Bobs 2.3.5

Bits ’n’ Bobs 提供 Headlamp 专用外设,提供 setLamp(int, int, boolean),可以做受程序控制的灯光。参数含义和范围在使用前查对应版本说明,并由 inspect.lua 确认名称。

这与 CC 显示器的字符输出不是同一种图形接口;不要把显示器绘图函数传给头灯。

Simulated:基础传感器、导航与停靠

Simulated 1.3.2:基础航空接口

Simulated 自带一组 CC 外设,可以直接读取仪表、导航和连接状态。Avionics 与 Gadgets & Gizmos 在此基础上扩展更多方法。

类型原生方法
altitude_sensorgetHeight / getAirPressure
velocity_sensorgetVelocity
gimbal_sensorgetAngles / getAnglesRad
optical_sensorhasHit / getDistance / getBlock / getRange / setRange
navigation_tablegetRelativeAngle / getRelativeAngleRad
docking_connectorgetConnectedName
linked_typewritergetPressedKeyCodes
swivel_bearinggetTargetAngle / getTargetAngleRad
torsion_springgetAngle / getAngleRad / getLimit / setLimit / isRunning

带 Rad 后缀的方法返回弧度。安装扩展后,同一设备可能增加更多方法,原生接口和扩展接口可以同时使用。

光学传感器:测距与方块识别

先用 hasHit 判断是否命中,再读取距离和方块。检测沿传感器朝向进行;测量范围通过 getRange 查询。

local sensor = assert(peripheral.find("optical_sensor"), "Connect optical sensor")
if sensor.hasHit() then
  print("Distance:", sensor.getDistance())
  print("Block:", sensor.getBlock())
else
  print("No hit")
end
print("Range:", sensor.getRange())
停靠、导航与输入设备

Docking Connector 的 getConnectedName() 读取当前连接名称;Navigation Table 的 getRelativeAngle() 读取相对导航角。高级目标、槽位和状态接口由扩展模组提供。

Linked Typewriter 的 getPressedKeyCodes() 返回正在按下的按键代码,可用于驾驶输入与控制台。它的按键代码应按设备输入接口处理,不直接假定与 CC keys 常量相同。

方向链接、名称牌与机械约束

Directional Link 提供 getClosestAngle() / getClosestAngleRad();Modulating Link 提供 getClosestDistance(),用于读取链接的相对测量。

Name Plate 可用 getName() / setName(name);Swivel Bearing 读取目标转角,Torsion Spring 可读取角度、运行状态并调整限制。

CC: Sable:船体状态与物理环境

全局 API,不是外设类型

CC: Sable 提供全局 sublevel 与 aero,不是 peripheral.find("ship")。船体查询要求电脑位于已组装的物理子空间上。

CC: Sable 1.3.4 的 sublevel API 将 position、scale、rotationPoint 转为 vector,将 orientation 转为 quaternion。角速度与位置的坐标系不能凭外观推断;控制算法先做轴向测试。

if not sublevel then error("CC: Sable API missing") end
if not sublevel.isInPlotGrid() then
  error("Place this computer on an assembled physics ship")
end
print("Ship:", sublevel.getName())
print("Mass:", sublevel.getMass())
print("Velocity:", tostring(sublevel.getLinearVelocity()))
船体查询速查
方法返回/用途
isInPlotGrid()是否位于 Sub-Level
getUniqueId() / getName()船体 UUID 与名称
getLogicalPose() / getLastPose()逻辑姿态/上一姿态
getVelocity() / getLinearVelocity()全局速度/最新线速度
getAngularVelocity()角速度向量
getCenterOfMass() / getMass()质心/质量
getInertiaTensor()惯性张量矩阵
setName(name)修改船体名称
船载遥测 · 保存为 ship_status.lua

放在已组装的船上运行。优先输出终端,避免第一步同时调试显示器和船体。先只读,再添加操纵。

assert(sublevel, "CC: Sable not loaded")
while true do
  term.clear()
  term.setCursorPos(1, 1)
  if sublevel.isInPlotGrid() then
    local pose = sublevel.getLogicalPose()
    local p = pose.position
    local v = sublevel.getLinearVelocity()
    print(sublevel.getName())
    print(("XYZ: %.1f %.1f %.1f"):format(p.x, p.y, p.z))
    print(("Speed: %.2f"):format(v:length()))
    print("Mass:", sublevel.getMass())
  else
    print("No assembled ship")
  end
  sleep(0.5)
end
大气环境与数学工具

aero.getGravity()、getMagneticNorth() 返回向量;getAirPressure(vector) 需要 CC vector 对象。另有 getUniversalDrag()、getRaw()、getDefault()。

CC: Sable 提供 quaternion、matrix 与 advanced_math 数学工具。不要把四元数分量直接当欧拉角;变换前明确局部轴、世界轴、角度单位和旋转顺序。

if aero then
  print("Gravity:", tostring(aero.getGravity()))
  if sublevel and sublevel.isInPlotGrid() then
    local p = sublevel.getLogicalPose().position
    print("Pressure:", aero.getAirPressure(p))
  end
end
从遥测走向控制

建议顺序:只读仪表 → 手动有限幅度输出 → 断线/退出清零 → 单轴控制 → 完整闭环。

先记录轴向、单位、采样间隔、饱和上下限和失联行为。不要把 PID 参数跨船照搬;质量、重心、螺旋桨布局与延迟都会改变响应。CC: Sable 的遥测与 Avionics 的操纵属于不同接口来源。

Create: Avionics:扩展仪表与船载桥接

先接单设备,再用船载桥

Avionics 0.6.0 为 Create / Simulated / Aero 方块扩展接口,也提供自有的航电控制器与仪表。先通过邻接/有线方式验证单个外设,再按照对应版本的航电控制器说明接入整船。

控制器发布的船载外设通常以 ship_ 开头;重启会保留编号,变更船首或移除重放设备可能改变名称,应重新探测。下面类型来自官方文档;具体能否找到取决于方块存在、装配状态和连接方式。

Avionics 官方船桥说明(也可从文档首页导航)
传感器接口速查
type方法与读数
altitude_sensorgetHeight() / getAirPressure() / getVerticalSpeed()
velocity_sensorgetVelocity() / getAxis()
gimbal_sensorgetAngles() / getAnglesRad();getAngularRates / getAngularRatesRad
gimbal_sensorgetGravity() / getLinearAcceleration()
throttle_levergetState() / setSignal(int)
portable_enginegetRpm() 等;用探测器确认扩展方法
getAngles 返回列表,不能假定是 {pitch=..., roll=...} 命名字段。角度、弧度与各轴顺序按对应传感器文档和实测确定。
高度与姿态只读采样

外设未找到时直接停止。姿态输出原始表,不在还没核对轴顺序时擅自标成俯仰/横滚。

local alt = assert(peripheral.find("altitude_sensor"), "No altitude sensor")
local imu = assert(peripheral.find("gimbal_sensor"), "No gimbal sensor")
while true do
  print("Height:", alt.getHeight())
  print("Vertical:", alt.getVerticalSpeed())
  print("Angles:", textutils.serialize(imu.getAngles()))
  print("Rates:", textutils.serialize(imu.getAngularRates()))
  sleep(0.5)
end
执行机构与扩展机械

Avionics 还提供螺旋桨/螺旋桨轴承、陀螺螺旋桨轴承、燃气供给、万向轴承、绳索绞盘、车轮、电梯、活塞、龙门轴、机械轴承等外设类。

例如 propeller_bearing 提供推力、气流、角速度、装配状态与装配/拆卸;gas_provider 可读气球气体混合与浮力。组装和拆卸会改变物理实体,先读状态,再执行动作。

船载桥接的实际用法

在已组装船体上放置 Avionics Controller,再连接电脑与有线网络。控制器可把船上可共享的传感器、容器和执行机构发布到网络;在地面上不会桥接整船。

发布名称通常为 ship_类型_编号,方向传感器可能含 forward / vertical / lateral 等方向。更改船首会影响方向相关名称;先探测,再固定到配置。

local sensor = peripheral.wrap("ship_altitude_sensor_0")
assert(sensor, "Check ship controller and discovered names")
print("Height:", sensor.getHeight())
让出执行权的 setter

部分 Avionics 写操作在主线程调度并等待。若同时读取键盘/触摸与更新执行机构,可用 parallel 分成输入任务和控制任务,并让控制任务适当限频。

不要在事件处理器中加入没有上限的等待动作;调试时先把输出限制在小幅度,保留物理开关和清零路径。

Gadgets & Gizmos:ACC、输入与航空控制

联动范围与版本

Create Gadgets & Gizmos 2.0-pre-release-3 提供控制器、摇杆、推进器、轴承、导航台、机械爪和显示器等 CC 外设,并附带 ACC 图程序的 Lua 模块。

电脑可以直接读写设备,也可以通过 ACC 的图程序、变量和命名事件组织控制逻辑。普通外设用点号调用;高级 ACC 模块返回的对象使用冒号调用。

外设类型速查
功能外设 type常用接口
高级控制器 ACCadvanced_contraption_controller图程序、变量、命名事件与输入通道
模拟控制器analogue_contraption_controllerlistInputs / getInput / setInput / resetInput
模拟摇杆analogue_joystickgetTilt / getRedstone / isHeld
推进器 / RCSthruster / rcs_thruster油门、推力、燃料与控制模式
推进器轴承thruster_bearinglistThrusters / setThrottle / getThrusterStatus
矢量 / 副翼轴承vector_bearing / aileron_bearing角度、装配状态与控制模式
导航台navigation_tablegetSelectedMapInfo / getTarget / getTargetDistance
陀螺链接 / 数据链接gyroscope_link / advanced_data_linkgetStatus / getTarget / getAngles
机械爪 / 绞盘缆绳claw / rope_winch_cable连接器选择、抓取状态与释放
虚拟姿态源virtual_orientation_sourcesetAngles / setAnglesDegrees / setDirection
车轮控制wheel_mountsetControls / setBrake / clearControls
ACC 显示器 / 通用显示适配器monitor标准终端输出、调色板、光标与缩放
游戏内接口手册:ctdocs

运行 ctdocs 打开接口浏览器,可按外设或方法搜索。方向键导航,/ 搜索,Q 退出。常见专用外设还提供 methods() 和 help(method)。

ctdocs
ctdocs thruster
ctdocs advanced_contraption_controller
local p = assert(peripheral.find("thruster"), "Connect a thruster")
print(textutils.serialize(p.methods()))
print(p.help("setThrottle"))
连接 ACC:原始外设与高级模块

将 Advanced Contraption Controller 接到电脑或有线网络。gadgetsandgizmos.acc 封装图编辑、变量和事件操作,gng.acc 是简写。原始外设保留在 acc.raw。

local acc = require("gadgetsandgizmos.acc").find()
print("Graph API:", acc:version())
print(textutils.serialize(acc:status()))
print(textutils.serialize(acc:get("active")))
-- Named device: require("gng.acc").wrap("left")
图程序:草稿、验证与应用

draft 是可编辑草稿,active 是运行图。编辑流程为:读取草稿 → 修改 → commit 保存 → validate 验证 → apply 应用。

高级模块作用
acc:edit()读取草稿及 revision,创建编辑对象
graph:addNode / graph:wire添加节点与连接端口
graph:setVariable(name, value)在草稿中设置变量
graph:commit()提交编辑批次;检查 saved 与 revision
acc:validate()检查 valid 与 diagnostics
acc:apply(revision)按指定版本应用;检查 applied
acc:nodeTypes() / acc:help(method)查看节点类型、端口与桥接说明
acc:exportLua("active")导出运行图的 Lua 表示

revision 用于检测并发编辑冲突。保存草稿后,运行图不会自动切换;应用失败时查看返回的 code、message 与 diagnostics。

示例:保存并应用一个图变量

此例在草稿中加入 target_altitude,验证后应用。它会应用当前整份草稿,包括已有编辑;建议在练习用 ACC 上运行。

local acc = require("gng.acc").find()
local graph = acc:edit()
graph:setVariable("target_altitude", 120)
local saved = graph:commit()
assert(saved.saved, tostring(saved.message or saved.code))
local validation = acc:validate()
if not validation.valid then
  print(textutils.serialize(validation.diagnostics))
  error("Draft validation failed")
end
local result = acc:apply(saved.revision)
assert(result.applied, tostring(result.message or result.code))
print("Applied revision:", result.revision)
运行变量与节点实时输出

图运行后,通过变量句柄读取或更新已定义变量;acc:node(alias) 定位运行图节点,原始接口 getGraphNodeOutputs 读取公开输出端口。节点 ID 与别名用于定位,不等同于变量名。

local acc = require("gng.acc").find()
local altitude = acc:variable("target_altitude")
print("Target:", textutils.serialize(altitude:get()))
-- altitude:set(140)
print(textutils.serialize(acc.raw.listGraphVariables()))
-- Read a configured node alias:
-- print(textutils.serialize(acc.raw.getGraphNodeOutputs("altitude_sensor")))
命名事件与 Rednet

ACC 图的命名事件可与 Rednet 协议名对应。电脑打开无线 modem 后,通过 rednet.broadcast(payload, eventName) 向附近 ACC 广播;接收使用 rednet.receive(eventName)。

这种无线通信不要求把 ACC 接成电脑外设;直接访问图程序和变量则需要外设连接。rednet.send 的定向消息用于电脑间通信,ACC 事件入口使用广播。

-- Computer: open the wireless modem attached on top
rednet.open("top")
rednet.broadcast({speed=18.5, altitude=120}, "ship:telemetry")
local sender, payload = rednet.receive("ship:reply", 5)
if sender then print(sender, textutils.serialize(payload)) end
rednet.close("top")
直接发布事件与注入事件

连接 ACC 外设后,acc:publish(name, data, maximumDistance) 发布命名事件;acc:receive(name, data) 只向当前 ACC 注入事件,不重新广播。转发外部消息时使用 receive,可避免消息循环。

local acc = require("gng.acc").find()
acc:receive("telemetry:update", {speed=12, altitude=120})
-- Publish to the named-event transport:
-- acc:publish("ship:ready", {ready=true}, 64)
模拟控制器:输入与通道

listInputIds() 返回已配置输入的 ID;getInput / getInputValue 查询状态,setInput(id, value) 写入,resetInput(id) 复位。另有按键、轴、通道与频率接口。

先在控制器中配置输入,再使用 ID 或标签访问。输入的值域与动作由其配置决定;标签用于辨认,正式程序应固定目标输入。

local c = assert(peripheral.find("analogue_contraption_controller"),
  "Connect an analogue controller")
for _, id in ipairs(c.listInputIds()) do
  print(id, textutils.serialize(c.getInput(id)))
end
print(textutils.serialize(c.listChannels()))
模拟摇杆:读取驾驶输入

getTilt() 返回 x、z、magnitude、held、active 等字段;getRedstone() 返回各方向红石输出。可以将输入显示到仪表,或交给程序计算控制量。

local j = assert(peripheral.find("analogue_joystick"), "Connect joystick")
while true do
  local tilt = j.getTilt()
  term.clear()
  term.setCursorPos(1, 1)
  print(("X %.2f | Z %.2f"):format(tilt.x, tilt.z))
  print("Held:", tilt.held, "Active:", tilt.active)
  print(textutils.serialize(j.getRedstone()))
  sleep(0.1)
end
推进器:油门与控制模式

thruster 提供 getStatus()、推力、燃料和油门读数。setThrottle(value) 使用 0~1;clearThrottleOverride() 解除电脑油门覆盖。控制模式为 auto / redstone / computer。

Gadgets & Gizmos 的推进器与 Propulsion 的推进器拥有不同方法;此处使用 setThrottle,不是 setPower。

local t = assert(peripheral.find("thruster"), "Connect G&G thruster")
print(textutils.serialize(t.getStatus()))
print("Mode:", t.getControlMode())
print("Fuel:", t.getFuel(), "/", t.getFuelCapacity())
-- On a prepared test device:
-- t.setThrottle(0.2)
-- t.clearThrottleOverride()
推进器轴承与 RCS

thruster_bearing 管理所属推进器,使用 ID 或 "all" 查询和设置油门;listThrusters()、listRcsThrusters() 列出两类设备。轴承本身还提供转向角与控制模式。

rcs_thruster 按 north / east / south / west 喷口分别控制,setThrottle(nozzle, value) 的油门为 0~1;clearAllThrottles() 清除各喷口覆盖。

local b = assert(peripheral.find("thruster_bearing"), "Connect bearing")
print(textutils.serialize(b.listThrusters()))
print(textutils.serialize(b.getThrusterStatus("all")))
print("Total thrust:", b.getTotalRealThrust())
-- b.setThrottle("all", 0.2)
-- b.clearThrottleOverride("all")
矢量轴承、副翼与姿态源
类型主要方法角度说明
vector_bearinggetAngles / setAngles(x,z) / clearAngles / assemble角度参数为度
aileron_bearinggetAngles / setAngles(primary,secondary) / setHeadRange分头控制角度与范围
virtual_orientation_sourcesetAngles(x,z) / setAnglesDegrees(x,z) / setDirectionsetAngles 为弧度;Degrees 版本为度
gyroscope_link / advanced_data_linkgetStatus / getAngles / getTarget / setTarget / clearTarget目标位置、方向与模式
vector_thruster / liquid_vector_thrustergetVectorAngles / setVectorAngles / clearVectorAngles扩展 Propulsion 矢量推进器的角度接口

矢量轴承的装配与目标角度是不同操作。读取实际状态后再调整;方向量和欧拉角也应分开处理。

导航台:读取选中目标

navigation_table 提供槽位列表、选中地图、目标位置和距离。listSlots() / getSelectedSlot() 用于槽位查询,hasTarget() 判断是否存在目标,start / pause / stop 控制导航状态。

local nav = assert(peripheral.find("navigation_table"), "Connect navigation table")
print("State:", nav.getState())
print("Slot:", nav.getSelectedSlot())
print(textutils.serialize(nav.getSelectedMapInfo()))
if nav.hasTarget() then
  print("Distance:", nav.getTargetDistance())
  print(textutils.serialize(nav.getTargetPosition()))
end
机械爪、缆绳与车轮

claw 与 rope_winch_cable 可查询附近连接器、选择目标、读取抓取状态并释放。世界坐标目标用 selectConnector(x,y,z);船体局部引用用 selectConnectorReference(localX,localY,localZ,subLevelId)。

wheel_mount 的 setControls(left,right,brake) 设置左右输入与制动,clearControls() 清除覆盖。机械爪的 clearSignalOverride 与车轮的 clearControls 都用于交还控制。

ACC 显示器与通用显示适配器

ACC Display 和 Universal Display Adapter 以标准 monitor 类型提供终端显示。可以复用本手册的光标、颜色、缩放和看板代码;多屏时使用名称绑定指定显示器。

交互通过对应的显示器/鼠标事件传回。Diagnostic Tablet 的 RDP 应用还可查看受支持电脑的现有终端并传递输入。

local m = assert(peripheral.find("monitor"), "Connect display")
m.setTextScale(0.5)
m.setBackgroundColor(colors.black)
m.setTextColor(colors.lime)
m.clear()
m.setCursorPos(1, 1)
m.write("G&G ONLINE")
Create: Connected 及其他设备扩展

Gadgets & Gizmos 为部分 Create: Connected 方块提供 create_connected_* 类型,可查询转速、应力、动力网络和设备控制项。listControls() 列出控制项,getControl(name) / setControl(name,value) 访问指定项。

此外还有双向齿轮箱、方向齿轮箱、伺服轴承、油门杆及传感设备接口。不同设备的方法集以 ctdocs 中的类型条目为索引。

Gadgets & Gizmos 官方 CC 指南

Create Propulsion:推进器

Propulsion 1.1.5:推进器接口

液体、固体燃料、离子和创造推进器提供功率与推力查询;不同型号还暴露燃料、电量、阻挡与气流。矢量型号增加向量控制接口。

方法族方法示例
功率setPower(int) / setPowerNormalized(double) / getPower()
推力getCurrentThrustPN / getCurrentThrustKN
燃料/能量getFuelAmountMb / getFuelCapacityMb 或 getEnergyAmountFe
矢量setVector(x,y) / getVectorX / getVectorY
供料部分型号有 tanks / pushFluid / pullFluid 或物品接口
不同型号的量纲、范围与默认控制来源要分别核对。PN 与 KN 等后缀按模组自己的单位解释,不能仅凭字母当作现实 SI 单位。
推进器只读检查

将 left 改为目标推进器名称。此示例不会启动推力;先检查实际支持哪些读数。

local p = assert(peripheral.wrap("left"), "Connect thruster")
for _, name in ipairs({"getPower", "getCurrentThrustKN",
  "getFuelAmountMb", "getEnergyAmountFe", "getObstruction"}) do
  if type(p[name]) == "function" then
    local ok, result = pcall(p[name])
    print(name, ok and tostring(result) or ("ERROR: " .. tostring(result)))
  end
end

Create: Radars:雷达航迹

Create: Radars 与 Avionics 雷达要分开

Create: Radars 0.4.9.4 的 PlaneRadar 与 RadarBearing 暴露 getTracks();还可读范围与位置,轴承另有旋转角、转速和碟数。雷达显示器可读选中航迹。

Avionics 也有自己的 radar 外设。不要把两套雷达的返回字段混用。以下按指定网络名称运行,避免 find 找错设备。

local radar = assert(peripheral.wrap("left"), "Connect radar")
assert(type(radar.getTracks) == "function", "No getTracks method")
while true do
  local tracks = radar.getTracks()
  print(textutils.serialize(tracks))
  sleep(1)
end

2.4

魔法与其他外设

Neo Vitae:祭坛、仪式与精华

Neo Vitae 1.1.48

Neo Vitae 提供祭坛、Athanor、Hellfire Forge、仪式石、Vitae Link、Orb Link、Sanguine Crafter、Spiritus Storage、Tabula Vitae 外设。

对象查询方法示例
Ara VitaegetEssence / getCapacity / getTier / getProgress
Athanor / TabulagetProgress / getIdleReason
仪式石isActive / isSuspended / getRitual / getOwnerAnima
Spiritus 储存getSpiritus / getSpiritusCapacity / getSpiritusType
Sanguine CraftergetProgress / getStatus / getMode / isFormed

适合看板显示精华、仪式状态与合成进度。每个方块拥有自己的方法集,不应把查询函数全部调用一遍。

Supplementaries:Speaker 与 Cannon

Supplementaries 4.0.2

Supplementaries 提供 Speaker 与 Cannon 外设。Speaker 可读写 message、name、volume 并 activate;它不是 CC 本体的音频扬声器。

Cannon 可读写 yaw、pitch、power 并 ignite。手册仅列出集成范围;具体角度与功率约束按方块方法核对。

联动常见问题

跨模组连接与状态排错

现象排查路径
find 找不到 AP 桥Minecraft 1.21.1 使用 me_bridge / rs_bridge;旧版接口使用 camelCase。
AP 桥连上但不能查库存CC 可见与 AE2/RS 在线是两回事;检查网络供电、通道及桥连接面。
合成不断重复下单先查 isCrafting,记录任务并设置滞回/冷却;重启后先恢复任务状态。
sublevel 报不在船上电脑要位于已组装的物理船体;地面电脑不能直接读取另一艘船体。
姿态读数看起来不对核对列表顺序、度/弧度、传感器朝向与局部/世界坐标系。
设置开了仍无功能客户端配置不代表服务端;还有模组依赖、配方和服务端权限条件。
↑ 顶部