CC: Tweaked 能做什么?
CC: Tweaked 在 Minecraft 中提供可编程电脑与海龟,使用 Lua 编写程序。电脑可连接箱子、显示器、调制解调器及兼容机器,读取状态、搬运物品、响应事件并输出控制信号。
从基础 Lua、外设连接与事件处理开始,逐步完成库存看板、自动合成、红石控制和船载仪表。
COMPUTERCRAFT / FACTORY FIELD GUIDE
先掌握 CC: Tweaked 本体,再按模组查阅联动接口。从 Lua、外设与海龟,到工业自动化和船载仪表。
PART 01 / CORE
从终端与 Lua 开始,依次掌握外设、显示、事件、网络和海龟。
CC: Tweaked 在 Minecraft 中提供可编程电脑与海龟,使用 Lua 编写程序。电脑可连接箱子、显示器、调制解调器及兼容机器,读取状态、搬运物品、响应事件并输出控制信号。
从基础 Lua、外设连接与事件处理开始,逐步完成库存看板、自动合成、红石控制和船载仪表。
页面中的示例独立使用;带“改名”的代码先换成探测器打印的外设名称。游戏终端文本统一使用 ASCII,避免字体不支持中文。
右键电脑,依次输入以下命令。编辑器中写入代码后,通过 Ctrl 打开菜单,选择 Save 与 Exit。
label set Factory
edit hello.lua
helloprint("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 是否可用由服务端决定,无法访问时检查域名规则与配置。
wget https://example.com/program.lua program.lua上面的地址仅展示命令格式。下载的程序先打开检查,再执行。离线手册不依赖下载或在线脚本。
用 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)
endpcall 的第一个返回值只表示调用有没有抛异常。外设仍可能正常返回 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外设接口有三种常见来源:CC 的通用容器能力、机器模组提供的原生集成,以及附属模组增加的专用接口。同一个方块可以同时提供多种能力。
用 peripheral.getNames() 获取设备名称,getType(name) 查看类型,getMethods(name) 列出可调用方法。程序通过名称绑定设备,再调用它提供的方法。
有线网络里的名称如 minecraft:chest_0 是设备名称;inventory 是类型,不能混用。
连接未知机器、附属方块或船载控制器时,先跑这个程序。结果写入 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) 打开电脑左侧红石输出。
机器自身还可能有“前面/输入面/输出面”。改动摆放方向后,先用小批量物品验证。红石开关的启停逻辑也由机器配置决定。
| 调用 | 说明 |
|---|---|
size() | 总槽数 |
list() | 仅非空槽:name、count 等 |
getItemDetail(slot) | 单槽详细资料或 nil |
getItemLimit(slot) | 槽位堆叠限制 |
pushItems(toName, fromSlot, limit?, toSlot?) | 从当前容器送出 |
pullItems(fromName, fromSlot, limit?, toSlot?) | 向当前容器拉入 |
两个箱子接入同一有线网络。把名称换成探测结果;每轮最多逐槽请求 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)
endtanks() 查询槽内流体;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| 方法 | 用途 |
|---|---|
setTextScale(0.5 .. 5) | 显示器字符缩放,步进 0.5 |
getSize() | 当前字符宽高 |
setCursorPos(x, y) | 光标从 1,1 起算 |
setTextColor / setBackgroundColor | 设置颜色,高级显示器支持彩色 |
clear / clearLine / write | 清屏/清行/写字 |
monitor_touch | 高级显示器触摸事件:外设名称、x、y |
需要一个显示器和一个箱子;修改箱子名称。每次先取实际宽度,避免文字越界。
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
endos.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
endwaitForAny 在一个任务结束时结束整体;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)两台电脑都安装 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.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") endtextutils.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| 操作 | 方法 |
|---|---|
| 移动 | forward / back / up / down / turnLeft / turnRight |
| 检测 | detect / inspect,另有 Up / Down 变体 |
| 挖掘/放置 | dig / place,需要合适工具与选中物品 |
| 背包 | select / getItemDetail / getItemCount / transferTo |
| 外部交换 | suck / drop,另有 Up / Down 变体 |
| 燃料 | getFuelLevel / getFuelLimit / refuel |
将海龟放在平整测试平台,前方至少留 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 可以辅助校准位置,但不直接给出朝向。无法确认状态时停机。
电脑、海龟、目标设备及连接路径所在的区块需要保持加载,程序才能持续工作。
观察程序收到的事件及其参数。事件数据可能很多,仅在调试时运行。
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 的偶然返回顺序当成设备身份。
每个控制看板至少显示设备在线状态、读数时间、当前模式与最近一次错误。屏幕内容再漂亮,也需要能辨别设备断线。
| 现象 | 排查路径 |
|---|---|
| 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’ Bobs | Headlamp |
| 机械动力与航空 | Simulated | 基础传感器、导航与停靠 |
| 机械动力与航空 | CC: Sable | 船体状态与物理环境 |
| 机械动力与航空 | Create: Avionics | 扩展仪表与船载桥接 |
| 机械动力与航空 | Gadgets & Gizmos | ACC、输入与航空控制 |
| 机械动力与航空 | Create Propulsion | 推进器 |
| 机械动力与航空 | Create: Radars | 雷达航迹 |
| 魔法与其他外设 | Neo Vitae | 祭坛、仪式与精华 |
| 魔法与其他外设 | Supplementaries | Speaker 与 Cannon |
2.1
| 设备 | 常见 type | 用途/方法 |
|---|---|---|
| Chat Box | chat_box | sendMessage / sendMessageToPlayer;聊天通知 |
| Energy Detector | energy_detector | getTransferRate / getTransferRateLimit / setTransferRateLimit |
| Player Detector | player_detector | getOnlinePlayers / getPlayersInRange / getPlayerPos |
| Environment Detector | environment_detector | 时间、天气、维度与环境信息 |
| Inventory Manager | inventory_manager | 绑定玩家;getOwner / getItems / getArmor |
| Block Reader | block_reader | 读取目标方块与方块实体信息 |
| Geo Scanner | geo_scanner | scan(radius)、冷却、扫描消耗 |
| NBT Storage | nbt_storage | 读写结构化存储数据 |
| ME Bridge / RS Bridge | me_bridge / rs_bridge | Minecraft 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)))
endInventory 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 还可把原版信标和音符盒作为专用外设。信标提供 getLevel()、getPrimaryEffect()、getSecondaryEffect()。
音符盒提供 getNote()、changeNote()、changeNoteBy(offset) 与 playNote()。这组方法控制方块自身的音高;CC Speaker 的 playNote 则接收乐器、音量与音高参数。
AP 提供聊天、环境、玩家、地质扫描、Chunky 与自动机核心等扩展。安装升级后,可通过外设接口使用相应能力。
Chunky Turtle 可在移动时保持周围区块加载。自动机操作带冷却与消耗,不适合无延迟轮询。不要把区块加载理解成服务器关机后继续运行。
AP 0.7.62b(Minecraft 1.21.1)采用新版存储系统。ME 桥类型 me_bridge,RS 桥类型 rs_bridge。查询使用 getItems({});合成检查使用 isCraftable / isCrafting。
| 旧版接口 | Minecraft 1.21.1 接口 |
|---|---|
| meBridge / rsBridge | me_bridge / rs_bridge |
| listItems() | getItems({}) |
| isItemCraftable / isItemCrafting | isCraftable / isCrafting |
| getEnergyStorage() | getStoredEnergy() |
| exportItemToPeripheral(...) | exportItem(filter, target) |
| craftItem 返回布尔值 | 返回任务对象;下单与完成是不同阶段 |
这段只读程序同时支持 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))isCrafting,防止重复申请同种物品。getCraftingTasks() 与任务对象状态;错误、缺料和取消要显示。事件常见名称为 me_crafting / rs_crafting;用通用事件探测打印实际参数。长周期库存复核仍然必要。
两种桥均提供 getFluid / getFluids、getChemical / getChemicals 与相应 import / export / craft 方法。化学品仍依赖 Mekanism 以及网络侧的兼容能力。
getStoredEnergy、getEnergyCapacity、getEnergyUsage 查询网络能量。内部盘与外部存储的容量统计需要分别处理;AE2 的字节容量不能直接标成“物品个数”。
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 8.2.12-beta 含 CC 束线红石兼容,可配合标准 bundled redstone API 使用;先确认管道颜色通道和侧面连接。
2.2
将 modem 接到机器或有效的多方块端口,运行 inspect.lua。部分机器需要启用计算机访问,并设置为允许外部控制的安全模式。
方法随机器变化:加工设备、感应矩阵、反应堆与涡轮不能共用一份方法表。返回值还可能是嵌套表。核对能量、温度和速率单位后再画图或做阈值。
Mekanism 官方源码机器常见查询包括 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())| 设备 | 查询与控制示例 |
|---|---|
| 感应矩阵 | getLastInput / getLastOutput / getTransferCap / getInstalledCells |
| 工业涡轮 | getFlowRate / getProductionRate / getSteam / getMaxFlowRate |
| 裂变反应堆 | getStatus / getTemperature / getDamagePercent / getActualBurnRate |
| 数字采矿机 | getState / getToMine / getFilters / isRunning / start / stop / reset |
| QIO Drive Array | getFrequencyItemCount / getFrequencyItemCapacity / getDriveStatus |
| 热力锅炉 | getWater / getSteam / getTemperature / getBoilRate |
多方块先完成组装,再连接对应端口。采矿机修改半径、高度和过滤器前需停止并重置。QIO 统计要求先选择频率。
裂变反应堆温度为 K;activate、scram 和 setBurnRate 是控制方法,与只读遥测分开使用。
Mekanism 的方法按机器及组件列出。一台机器可同时拥有通用、能量、配方进度、安全、升级与侧面配置组件的方法。
查询完整接口时,先找机器条目,再看它具备的公共组件。化学品和流体返回结构使用各自的堆叠表。
Mekanism 10.7 电脑方法文档气动机器通过原生动态外设连接 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())在无人机程序中加入 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区域和过滤器会影响后续动作。setUseCount(true) 与 setCount(amount) 配对使用;动作次数限制由 setUseMaxActions / setMaxActions 控制。
PneumaticCraft 官方仓库与内置手册Advanced Peripherals 为 Powah 方块补充专用接口。将目标方块接到电脑或有线网络,即可查询发电机、能量单元与反应堆。
| 设备 | 方法 |
|---|---|
| Energy Cell | getStoredEnergy / getMaxEnergy |
| Ender Cell | getStoredEnergy / getMaxEnergy / getChannel / setChannel / getMaxChannels |
| Furnator | isBurning / getCarbon / getFuelSlot |
| Magmator | isBurning / getFuelTank |
| Thermo Generator | getCoolantTank |
| Solar Panel | canSeeSky |
| Reactor | isRunning / getFuel / getCarbon / getRedstone / getTemperature |
发电设备也提供 getStoredEnergy / getMaxEnergy。这里的命名属于 AP 的 Powah 集成;CC 通用 energy_storage 接口使用 getEnergy / getEnergyCapacity。
将 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))
endEnergy Pylon 提供 getEnergyStored、getMaxEnergyStored、getInputPerTick、getOutputPerTick。大数可使用 getEnergyStoredInNotation 等方法读取,避免显示时丢精度。
Flow / Flux / Fluid Gate 提供流量与 override 控制;反应堆组件可用 getReactorInfo() 观察状态,也提供充能、启动和停止方法。先只读核对结构与单位,再编写专用控制逻辑。
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()))专用 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 不需要额外 CC:C Bridge 才能读转速。常用外设包括转速控制器、转速表、应力表、程序齿轮箱、显示链接器与列车站。
| 类型 | 常用方法 |
|---|---|
| Create_RotationSpeedController | getTargetSpeed / setTargetSpeed |
| Create_Speedometer | getSpeed |
| Create_Stressometer | getStress / getStressCapacity |
| Create_SequencedGearshift | rotate / move / isRunning |
| Create_DisplayLink | 显示链接器写入与更新;先检查方法列表 |
| Create_Station | 车站状态与时刻表;先检查方法列表 |
先读取,确认设备与动力系统,再取消注释启用控制。
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| 方块 | 主要方法 |
|---|---|
| Stock Ticker 库存终端 | stock / getStockItemDetail / requestFiltered |
| Packager / Re-Packager | getPackage / makePackage / getAddress / setAddress |
| Redstone Requester | getRequest / setRequest / setCraftingRequest / request |
| Frogport / Postbox | getAddress / setAddress / getConfiguration / setConfiguration |
| Table Cloth 商店 | isShop / getWares / getPriceTagItem / getPriceTagCount |
| Station 车站 | isTrainPresent / getTrainName / getSchedule / setSchedule |
| Signal 信号机 | getState / listBlockingTrainNames / setForcedRed |
| Track Observer | getPassingTrainName |
| Display Link | setCursorPos / write / clear / update |
| Nixie Tube | setText / setTextColor / setSignal |
| Sticker | isExtended / 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() 读取经过列车名称。适合制作站台到发牌与区段占用看板。
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 提供电刷、充能器与电动机专用外设。电刷 getOutput() 查询输出;充能器 getTier()、getMaxEnergy()、getCurrentEnergy() 查询等级与储能;电动机有 getTier()。
这些是 New Age 自带集成,不要求再安装一个 CC 附属。不要把所有发电设备都套成同一个通用能量类型。
Bits ’n’ Bobs 提供 Headlamp 专用外设,提供 setLamp(int, int, boolean),可以做受程序控制的灯光。参数含义和范围在使用前查对应版本说明,并由 inspect.lua 确认名称。
这与 CC 显示器的字符输出不是同一种图形接口;不要把显示器绘图函数传给头灯。
Simulated 自带一组 CC 外设,可以直接读取仪表、导航和连接状态。Avionics 与 Gadgets & Gizmos 在此基础上扩展更多方法。
| 类型 | 原生方法 |
|---|---|
| altitude_sensor | getHeight / getAirPressure |
| velocity_sensor | getVelocity |
| gimbal_sensor | getAngles / getAnglesRad |
| optical_sensor | hasHit / getDistance / getBlock / getRange / setRange |
| navigation_table | getRelativeAngle / getRelativeAngleRad |
| docking_connector | getConnectedName |
| linked_typewriter | getPressedKeyCodes |
| swivel_bearing | getTargetAngle / getTargetAngleRad |
| torsion_spring | getAngle / 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 提供全局 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) | 修改船体名称 |
放在已组装的船上运行。优先输出终端,避免第一步同时调试显示器和船体。先只读,再添加操纵。
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)
endaero.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 的操纵属于不同接口来源。
Avionics 0.6.0 为 Create / Simulated / Aero 方块扩展接口,也提供自有的航电控制器与仪表。先通过邻接/有线方式验证单个外设,再按照对应版本的航电控制器说明接入整船。
控制器发布的船载外设通常以 ship_ 开头;重启会保留编号,变更船首或移除重放设备可能改变名称,应重新探测。下面类型来自官方文档;具体能否找到取决于方块存在、装配状态和连接方式。
Avionics 官方船桥说明(也可从文档首页导航)| type | 方法与读数 |
|---|---|
| altitude_sensor | getHeight() / getAirPressure() / getVerticalSpeed() |
| velocity_sensor | getVelocity() / getAxis() |
| gimbal_sensor | getAngles() / getAnglesRad();getAngularRates / getAngularRatesRad |
| gimbal_sensor | getGravity() / getLinearAcceleration() |
| throttle_lever | getState() / setSignal(int) |
| portable_engine | getRpm() 等;用探测器确认扩展方法 |
外设未找到时直接停止。姿态输出原始表,不在还没核对轴顺序时擅自标成俯仰/横滚。
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)
endAvionics 还提供螺旋桨/螺旋桨轴承、陀螺螺旋桨轴承、燃气供给、万向轴承、绳索绞盘、车轮、电梯、活塞、龙门轴、机械轴承等外设类。
例如 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())部分 Avionics 写操作在主线程调度并等待。若同时读取键盘/触摸与更新执行机构,可用 parallel 分成输入任务和控制任务,并让控制任务适当限频。
不要在事件处理器中加入没有上限的等待动作;调试时先把输出限制在小幅度,保留物理开关和清零路径。
Create Gadgets & Gizmos 2.0-pre-release-3 提供控制器、摇杆、推进器、轴承、导航台、机械爪和显示器等 CC 外设,并附带 ACC 图程序的 Lua 模块。
电脑可以直接读写设备,也可以通过 ACC 的图程序、变量和命名事件组织控制逻辑。普通外设用点号调用;高级 ACC 模块返回的对象使用冒号调用。
| 功能 | 外设 type | 常用接口 |
|---|---|---|
| 高级控制器 ACC | advanced_contraption_controller | 图程序、变量、命名事件与输入通道 |
| 模拟控制器 | analogue_contraption_controller | listInputs / getInput / setInput / resetInput |
| 模拟摇杆 | analogue_joystick | getTilt / getRedstone / isHeld |
| 推进器 / RCS | thruster / rcs_thruster | 油门、推力、燃料与控制模式 |
| 推进器轴承 | thruster_bearing | listThrusters / setThrottle / getThrusterStatus |
| 矢量 / 副翼轴承 | vector_bearing / aileron_bearing | 角度、装配状态与控制模式 |
| 导航台 | navigation_table | getSelectedMapInfo / getTarget / getTargetDistance |
| 陀螺链接 / 数据链接 | gyroscope_link / advanced_data_link | getStatus / getTarget / getAngles |
| 机械爪 / 绞盘缆绳 | claw / rope_winch_cable | 连接器选择、抓取状态与释放 |
| 虚拟姿态源 | virtual_orientation_source | setAngles / setAnglesDegrees / setDirection |
| 车轮控制 | wheel_mount | setControls / setBrake / clearControls |
| ACC 显示器 / 通用显示适配器 | monitor | 标准终端输出、调色板、光标与缩放 |
运行 ctdocs 打开接口浏览器,可按外设或方法搜索。方向键导航,/ 搜索,Q 退出。常见专用外设还提供 methods() 和 help(method)。
ctdocs
ctdocs thruster
ctdocs advanced_contraption_controllerlocal p = assert(peripheral.find("thruster"), "Connect a thruster")
print(textutils.serialize(p.methods()))
print(p.help("setThrottle"))将 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")))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)
endthruster 提供 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()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_bearing | getAngles / setAngles(x,z) / clearAngles / assemble | 角度参数为度 |
| aileron_bearing | getAngles / setAngles(primary,secondary) / setHeadRange | 分头控制角度与范围 |
| virtual_orientation_source | setAngles(x,z) / setAnglesDegrees(x,z) / setDirection | setAngles 为弧度;Degrees 版本为度 |
| gyroscope_link / advanced_data_link | getStatus / getAngles / getTarget / setTarget / clearTarget | 目标位置、方向与模式 |
| vector_thruster / liquid_vector_thruster | getVectorAngles / 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()))
endclaw 与 rope_winch_cable 可查询附近连接器、选择目标、读取抓取状态并释放。世界坐标目标用 selectConnector(x,y,z);船体局部引用用 selectConnectorReference(localX,localY,localZ,subLevelId)。
wheel_mount 的 setControls(left,right,brake) 设置左右输入与制动,clearControls() 清除覆盖。机械爪的 clearSignalOverride 与车轮的 clearControls 都用于交还控制。
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")Gadgets & Gizmos 为部分 Create: Connected 方块提供 create_connected_* 类型,可查询转速、应力、动力网络和设备控制项。listControls() 列出控制项,getControl(name) / setControl(name,value) 访问指定项。
此外还有双向齿轮箱、方向齿轮箱、伺服轴承、油门杆及传感设备接口。不同设备的方法集以 ctdocs 中的类型条目为索引。
液体、固体燃料、离子和创造推进器提供功率与推力查询;不同型号还暴露燃料、电量、阻挡与气流。矢量型号增加向量控制接口。
| 方法族 | 方法示例 |
|---|---|
| 功率 | setPower(int) / setPowerNormalized(double) / getPower() |
| 推力 | getCurrentThrustPN / getCurrentThrustKN |
| 燃料/能量 | getFuelAmountMb / getFuelCapacityMb 或 getEnergyAmountFe |
| 矢量 | setVector(x,y) / getVectorX / getVectorY |
| 供料 | 部分型号有 tanks / pushFluid / pullFluid 或物品接口 |
将 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
endCreate: 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)
end2.4
Neo Vitae 提供祭坛、Athanor、Hellfire Forge、仪式石、Vitae Link、Orb Link、Sanguine Crafter、Spiritus Storage、Tabula Vitae 外设。
| 对象 | 查询方法示例 |
|---|---|
| Ara Vitae | getEssence / getCapacity / getTier / getProgress |
| Athanor / Tabula | getProgress / getIdleReason |
| 仪式石 | isActive / isSuspended / getRitual / getOwnerAnima |
| Spiritus 储存 | getSpiritus / getSpiritusCapacity / getSpiritusType |
| Sanguine Crafter | getProgress / getStatus / getMode / isFormed |
适合看板显示精华、仪式状态与合成进度。每个方块拥有自己的方法集,不应把查询函数全部调用一遍。
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 报不在船上 | 电脑要位于已组装的物理船体;地面电脑不能直接读取另一艘船体。 |
| 姿态读数看起来不对 | 核对列表顺序、度/弧度、传感器朝向与局部/世界坐标系。 |
| 设置开了仍无功能 | 客户端配置不代表服务端;还有模组依赖、配方和服务端权限条件。 |
没有匹配内容。试试“存储桥”“getTracks”或“海龟”;Esc 清除搜索。