求CC: Tweaked适配ThermalDynamics导管的存储网络物品转移Lua代码
基于OpenComputers + ThermalDynamics的物品转移Lua实现
前置准备
- 用OpenComputers线缆将计算机分别连接到ThermalDynamics物品管道网络(或网络内任意箱子)和目标存放箱(deposit chest)
- 执行
component.list("inventory")命令,确认所有存储箱和存放箱都被识别,记录存放箱的组件地址(如果只有一个存放箱可跳过手动记录)
核心代码实现
-- 导入组件API local component = require("component") -- 配置项:替换为你的存放箱组件地址(可通过component.list("inventory")获取) local DEPOSIT_CHEST_ADDR = "你的存放箱地址" -- 核心转移函数 -- 参数:itemName(物品注册名,如"minecraft:diamond"),targetQuantity(需要转移的数量) local function transferItemsFromNetwork(itemName, targetQuantity) local transferred = 0 local depositChest = component.proxy(DEPOSIT_CHEST_ADDR) -- 遍历所有已连接的存储容器 for addr, _ in component.list("inventory") do -- 跳过存放箱本身,避免重复操作 if addr ~= DEPOSIT_CHEST_ADDR then local inv = component.proxy(addr) -- 遍历容器内所有槽位 for slot = 1, inv.size() do if transferred >= targetQuantity then break -- 已凑够数量,终止循环 end local stack = inv.getStackInSlot(slot) if stack and stack.name == itemName then -- 计算本次可转移的数量:取槽位剩余数量和目标剩余数量的较小值 local transferAmount = math.min(stack.size, targetQuantity - transferred) -- 执行转移:从当前槽位转移到存放箱的第一个可用槽位 local moved = inv.transferItem(slot, depositChest.address, transferAmount) transferred = transferred + moved end end end if transferred >= targetQuantity then break end end -- 输出结果 print(string.format("已转移 %d/%d 个 %s", transferred, targetQuantity, itemName)) if transferred < targetQuantity then print("警告:存储网络内剩余物品不足") end end -- 示例调用:转移64个钻石到存放箱 -- transferItemsFromNetwork("minecraft:diamond", 64)
针对你之前函数失败的常见原因排查
- 参数无效:ThermalDynamics的Itemduct本身不是
inventory组件,计算机需要连接到网络内的存储箱子或**物品接口(Item Interface)**才能访问存储网络,你之前传入的duct参数无法被识别为可操作的容器 - 物品名错误:必须使用物品的注册名(如
thermalfoundation:ingot而非"钢锭"),可通过inv.getStackInSlot(slot)查看已存在物品的name字段确认 - 逻辑漏洞:未处理空槽位(
stack == nil)的情况,导致代码报错终止;或transferItem参数顺序错误(正确顺序是源槽位, 目标容器地址, 转移数量) - 权限限制:部分服务器/整合包会限制OpenComputers的容器访问权限,需确认计算机拥有对应权限
扩展优化建议
- 可以给函数添加参数,允许指定存放箱的目标槽位
- 加入物品元数据(damage值)判断,支持区分不同耐久/类型的物品(比如不同附魔的工具)
- 实现批量转移的进度提示,适合大量物品转移场景
内容的提问来源于stack exchange,提问作者Tremb1e
相关产品推荐
相关产品推荐

