本篇教程由作者设定未经允许禁止转载。

前言

注意:本文仅讲思路,暂时不放代码

想必大家在玩GTNH的时候,一定搜过装配线自动化的教程当然我也搜过

但是现有的教程我看不懂,太过复杂,太笨无法理解都无法满足我的需求


完美装配线样板自动化就此诞生

物资准备

本教程所有使用物品都可以在IV阶段完成没到IV你玩啥装配线

开放式电脑:

  1. 转运器若干

  2. 机架1个,不要用普通电脑,因为组件太多了

  3. 服务器及其硬件2个,物品一个流体一个,

  4. 红石I/O端口2个

  5. 线缆若干

史蒂夫工厂:

  1. 工厂管理器2个

  2. 工厂线缆若干

  3. 红石信号接收器2个

GTHN和其他:

首先起码要升级GTNH到一定版本,并且有这个方块

基于OpenComputer的装配线自动化-第1张图片

  1. 大型原材料缓存仓1个

  2. 多流体储罐若干

  3. 箱子若干

  4. 单流体储罐若干

后面会讲该怎么用

原理概述

本装置意在实现最稳定,最通用,最方便的装配线自动化

GTNH更新了AE2FC,大大简化了具有流体的自动化,比如装配线的样板可以这么写基于OpenComputer的装配线自动化-第2张图片

将流体装入样板是本装置的核心实现

当所有物品流体材料进入大型材料缓存仓,OpenComputer系统会监测所有来自转运器下方的物品/流体容器(标记为Input),并将下方容器内第一格的物品/流体加入输入总线/仓,其他格子的物品/流体将进入侧面的容器(标记为Next)以供下次循环使用

更改版本:如果第一片输入总线有任何物品,不应该运行循环

当上述操作完成,激活红石,给史蒂夫工厂的红石脉冲,将上一片已完成转运的Next容器全部传输到本片Input容器

基于OpenComputer的装配线自动化-第3张图片

基于OpenComputer的装配线自动化-第4张图片

继续上述循环以完成装配线的自动化最难点:每个格子材料的的去向准确性的问题

并且与一般物流模组筛选功能比较,本装置更具备通用型

搭建及注意事项

本系统不需要很大的空间

每一片大致结构:

    装配线结构                    输入总线(嘴冲下)                                                                     输入仓

    标记为Next的箱子         转运器                                                                                          单流体储罐(物流到上方输入仓,随便物流,不一定要史蒂夫工厂)

    史蒂夫工厂线缆             第一片为大型材料缓冲,其他则为标记为Input的箱子                  转运器                                                                        在流体系统被标记为Next的多流体储罐

                                                                                                                                              第一片为空,其他则为在流体系统被标记为Input的多流体储罐

结构讲解:

    在本结构之外不能有任何其他的缓存箱子/储罐(第一片转运器必须贴在大型缓冲仓)

    流体系统第一片Input在侧面的大型材料缓冲仓,其余的仍然是在下方,目的是保证代码的可读性

    一定要以红石信号来触发史蒂夫工厂,进行Next到下一片Input的操作

    转运器是目前唯一应该可以按格子的物流

    触发史蒂夫工厂的红石信号一定要在所有下一片材料都已经进入到了Next容器里再触发,用OpenComputer控制

    史蒂夫工厂是我能找到的最适用本装置的物流,它可以保证瞬间多组不限量的物流,并且占用空间极小

    贴在大型材料缓存仓的二合一接口必须开启阻挡模式,仍然是保证材料的顺序

不足点

既然有好处就有不足

本装置可能存在大批量合成后输入总线/仓爆满的问题,可能的解决方案:

  1. 在输入总线/仓与转运器之间设定缓存箱

  2. 使用超级输入总线与四重输入仓(未测试)

本装置无法进行相同物品并且加起来不满一组的分格子的装配,如下图配方基于OpenComputer的装配线自动化-第5张图片

该配方具有两个格子的5*时空板,史蒂夫工厂在物流的时候会将他归为一组

可能的解决方案:

    1. 改不同的名字

    2. 更改NBT

    3. 任何可以将物品的equals判断打乱的方法

开放式电脑代码与史蒂夫工厂配置

暂时不放

至于为什么我好不容易在生存档做出了这个玩意,写样板的时候发现我居然没有钐做不了LUV的组件,没办法测试,并且我还有不上天挑战,我需要做完整个氟碳镧铈矿到钐粉的一共18步骤的自动化并且测试装配线后再发代码

目前生存档的装置已经经受住大量的考验,比如准备好材料后连续制作20个LUV能源仓,现在开放我在使用的代码

物品控制代码

如下:

local component = require("component")
local thread = require("thread")
local term = require("term")

local transposerArray = {}
local whileFlag = true
local redstone = ""

-- direction
-- 0:Down
-- 1:Up
-- 2:N
-- 3:S
-- 4:W
-- 5:E

-- 可更改参数
local input = 0 -- 标记为input箱子的方向值
local output = 1 -- 输入总线的方向值
local next = 4 -- 标记为next箱子的方向值
local rs = 0 -- 激活史蒂夫工厂的方向值
local primeAddr = "907b3114" -- 第一片转运器的地址值的开头,随便几位都行


function init()
  for addr,name in pairs(component.list()) do    
    if(name == "transposer") then
      if(string.sub(addr, 1, string.len(primeAddr)) == primeAddr) then
        table.insert(transposerArray, 1, component.proxy(addr))
      else
        table.insert(transposerArray, component.proxy(addr))
      end
    elseif(name == "redstone") then
      redstone = component.proxy(addr)
    end
  end
end

function whileTran()
  while whileFlag do
    for index,item in pairs(transposerArray) do
      if hasItem(item, input) and not(hasItem(item,output)) then
        transferOutput(item)
        transferNext(item)
        redstone.setOutput(rs, 15)
        redstone.setOutput(rs, 0)
      end
    end
    os.sleep(1)
  end
end

function hasItem(transposer, side)
  local stacks = transposer.getAllStacks(side)
  for item in stacks do 
    if(item.size ~= nil and item.size > 0) then
      return true
    end
  end
  return false
end

function nextSlot(transposer, side)
  local stacks = transposer.getAllStacks(side)
  local index = 1
  for item in stacks do
    if item.size == nil then
      return index
    else
      index = index + 1
    end
  end
end

function transferOutput(transposer)
  transposer.transferItem(input, output, 64, 1, nextSlot(transposer, output))
end

function transferNext(transposer)
  local num = 0
  local stacks = transposer.getAllStacks(input)
  for item in stacks do
    if(item.size ~= null) then
      num = num + 1
    end
  end
  for index = 2, num + 1 do
    transposer.transferItem(input, next, 64, index, nextSlot(transposer, next))
  end
end

function listenExit()
  thread.create(function()
      term.clear()
      print("Item Transposer Controller")
      print("Input any string to exit")
      io.read()
      whileFlag = false
    end
  )
end

function debug()
  for index, item in pairs(transposerArray) do
    item.transferItem(output, input, 64, 1, 1)
  end
end

init();
if(io.read() == "debug") then
  debug()
else
  listenExit();
  whileTran();
end

流体控制代码

local component = require("component")
local thread = require("thread")
local term = require("term")

local transposerArray = {}
local whileFlag = true
local redstone = ""

-- direction
-- 0:Down
-- 1:Up
-- 2:N
-- 3:S
-- 4:W
-- 5:E

-- 可更改参数
local firstInput = 4 -- 大型材料缓冲仓的方向值
local input = 0 -- 标记为input储罐的方向值
local output = 1 -- 输入仓的方向值
local next = 5 -- 标记为next储罐的方向值
local rs = 0 -- 激活史蒂夫工厂的方向值


function init()
  for addr,name in pairs(component.list()) do    
    if(name == "transposer") then
      table.insert(transposerArray, component.proxy(addr))
    elseif(name == "redstone") then
      redstone = component.proxy(addr)
    end
  end
end

function whileTran()
  while whileFlag do
    for index,item in pairs(transposerArray) do
      if hasFluid(item) then
        transferOutput(item)
        transferNext(item)
        redstone.setOutput(rs, 15)
        redstone.setOutput(rs, 0)
      end
    end
    os.sleep(1)
  end
end

function getInputSide(transposer)
  local count = transposer.getTankCount(input)
  if(count == 0) then
    return firstInput
  else
    return input
  end
end

function hasFluid(transposer)
  local inputSide = getInputSide(transposer)
  for i = 1,transposer.getTankCount(inputSide) do
    local fluid = transposer.getFluidInTank(inputSide, i)
    if(fluid.amount > 0) then
      return true
    end
  end
  return false
end

function transferOutput(transposer)
  transposer.transferFluid(getInputSide(transposer), output, 2147483647, 0)
end

function transferNext(transposer)
  local count = transposer.getTankCount(getInputSide(transposer))
  for index = 1, count - 1 do
    transposer.transferFluid(getInputSide(transposer), next, 2147483647, index)
  end
end

function listenExit()
  thread.create(function()
      term.clear()
      print("Fluid Transposer Controller")
      print("Input any string to exit")
      io.read()
      whileFlag = false
    end
  )
end

init();
listenExit();
whileTran();

使用方法:

  1. 在OpenComputer电脑中/home文件夹其实哪个文件夹都可以新建Lua文件xxx.lua

  2. 记住系统硬盘的UID地址

  3. 关闭存档别关游戏,打开存档文件夹/opencomputer/硬盘的地址值/home文件夹找到xxx.lua文件

  4. 黏贴代码

  5. 进入游戏更改参数(edit xxx.lua)

  6. 运行文件(lua xxx.lua)

注意:

  1. 物品控制自带debug模式,运行后输入debug自动运行,可自动从输入总线提取物品到input箱子并结束运行,以测试系统的运行状况

  2. 输入任何字符或不输入直接回车运行主程序

  3. 两个脚本自带跳出功能,输入任意字符并回车即可跳出主线程

运行截图:

基于OpenComputer的装配线自动化-第6张图片

基于OpenComputer的装配线自动化-第7张图片

史蒂夫工厂

我懒得截图了,就是从标记为next的箱子/储罐转移到下一片标记为input的箱子/储罐即可,物品设置14片,流体设置3片,记得红石激活就行


GTNH不单单是游戏,更是一种艺术