本篇教程由作者设定使用 CC BY-NC 协议。

介绍

- 该教程主要面向希望使用图形化编程进行物流或合成控制的玩家。

- 你可以通过该模组进行自动合成,储物判断,物品/流体传输,跨维度发送消息,图形化交互等工作。

千里之行,始于足下

- 如果你看到“可选”的备注,我可能会在需要使用时才会进行讲解。

物资准备工作

  1. 编程器:进行编程的设备,并且将程序写入程序卡中。保存程序请参照编程器中的“程序卡放置区”说明。

  2. 程序卡:存储写好的程序。

  3. 处理器:将程序卡放入处理器中运行。

  4. 处理器核心(CPU):处理器运行程序时需要CPU进行运算。每个事件型操作码线程占用一个CPU。

  5. 网卡(可选):用来连接合成站节点时需要使用网卡获取到这些设备的坐标。

  6. 内存条(可选):提供用来保存数据的变量。

  7. 多容储罐(可选):进行流体操作时需要在处理器邻近区域放置最起码一个多容储罐,每个多容储罐提供4个流体索引槽位。

  8. 显卡(可选):进行图形化操作时需要的模块。

  9. 网络标识(可选):提供处理器与处理器之间的交互支持,支持跨维度。

基本概念

坐标

编程器的编程区从左上角开始,以[x, y]排列;下图的数字指令就是处于[0,0]位置。

- “y”轴是越向下数值越大,下图的两数相加指令就是处于[0, 1]位置。

- “x”轴是越向右数值越大,下图的两数相减指令就是处于[1, 0]位置。

- 坐标的用途:当程序运行时或编写时出现错误时,报错是以“坐标 + 异常名称 + 处理器核心索引”显示的。比如:[6, 2] Internal error (0)

RFTools图形化编程从入门到入坑-第1张图片

程序进入下一步

- 在操作码四个边的任意灰点双击会变为绿色,表示这个指令运行结束后,下一个执行的指令在绿色方向。当操作码的下一个坐标没有操作码的场合,程序自动停止。

RFTools图形化编程从入门到入坑-第2张图片

返回值

- 绝大部分操作码都会有返回值。

- 如果你不了解编程语言,那么你只需要理解,你告诉了一个计算器两个数值(比如“1”和“2”),而计算器就会告诉你这两个数值的运算结果(比如“1 + 2 = 3”),这就是返回值。

- 下图的程序是输出一个字符串到命令行界面,能帮助你理解“返回值”的含义。

  1. 黄色的操作码是计时器,它每隔一段时间执行一次程序。

  2. 蓝色的操作码是字符串,它记录一个字符串,然后返回记录的字符串。返回的字符串就像接力棒一样交给下一个操作码使用(下一个操作码要不要使用就与字符串操作码无关了)。

  3. 绿色的操作码是日志信息。调整到“last_str”模式,就会使用上一个操作码传输过来的内容,并且转换为字符串输出到命令行界面。

RFTools图形化编程从入门到入坑-第3张图片

操作码

- 操作码也称为“指令”或“opcodes”,它有如下几种分类:

    事件型操作码:事件型操作码在程序中最少要存在一个,它在该模组中代表一个程序的开始。发生事件时程序才会开始运行,事件可以是一个红石信号,计时器,物品合成请求等。RF工具|控制手册第27页。

  1. 下图是红石信号开启事件型操作码,它表示处理器接收到红石信号后执行程序。

RFTools图形化编程从入门到入坑-第4张图片

    操作型操作码:用来进行标准操作的指令,比如我想要处理器朝某个方向发出红石信号,就需要使用操作型的红石输出指令。

  1. 下图是红石输出操作型操作码,它表示程序执行到该指令时,处理器/节点会向该指令的指定方向发出一个红石信号。

RFTools图形化编程从入门到入坑-第5张图片

    赋值型操作码(可选):一般是做一些计算或者检查,将结果提交给下一个操作码使用。比如我想要获取一个容器中的物品数量,就需要使用赋值型的容器储量计算指令。RF工具|控制手册第28页。

  1. 下图是读取红石信号赋值型操作码,它表示读取处理器/节点指定方向的红石信号。

  2. 赋值型操作码都会返回它操作的数据,比如读取红石信号操作码就会返回一个整数型表示读取到的红石信号等级。

RFTools图形化编程从入门到入坑-第6张图片

    测试型操作码(可选):执行布尔值测试,并在此测试上生成一个分支. 因此这些操作码有两个输出(绿色和红色输出)。比如我想要处理器在容器A储量大于容器B时移动物品,就需要使用大于指令。RF工具|控制手册第28页。

  1. 下图是大于测试型操作码,他表示当“V1 > V2”时,执行绿色方向的指令,否则执行红色方向的指令。

RFTools图形化编程从入门到入坑-第7张图片

指令的配置

- 绝大部分操作码都会具备指令配置,需要配置好方向等设定时才可以使用。当你放置一个操作码时,点击该操作码会在物品栏左边显示一些按钮,点击后即可打开该指令的特定功能配置界面。请参照编程器的指令配置说明。

  1. 需要参照各个指令中的介绍设定,通过超链接或百科中的游戏设定页面找到对应指令了解配置要求,程序解释一般只解释运行逻辑。

  2. 下图为红石信号开启的配置图。它的配置是检测处理器的上方(只显示方向的首字母),并且该程序只允许存在一个实例。

RFTools图形化编程从入门到入坑-第8张图片

网络

- 可能玩家已经通过节点网卡还有处理器的介绍了解到怎么搭建一个网络了。但是在这里我会继续当作读者不了解来讲解。

  1. 网络需要由网卡节点处理器网络标识合成站等多种模块/设备组成,但是部分模块/设备不是必须的。

  2. 一个最基础的网络只需要处理器、网卡、节点。

- 在编程时,一般我们指定容器、或者操作方向时会有一个“Node name”的属性可以让玩家配置,这里是用来输入节点的名称的。

第一步:在节点设置好网络频道和节点名称。(输入字符串)

第二步:处理器的模块放置区最起码要存在一个网卡

第三步:在安装有网卡的处理器中输入“net setup <name>”来连接这个网络。(<name>表示网络频道。)

  1. 执行该指令后,处理器也会获取网卡范围内的合成站。此时合成站可以通过程序中的合成事件型指令获取到工作台中的合成表。

  2. 关于“net”命令的其他参数,请参阅处理器中的“2.5.1 net”篇

至此,一个基本的网络就算搭建完成了。

驽马十驾,功在不舍

一、红石输出

“开始了的小小冒险。”

- 无论如何,输出一个红石信号总是很适合作为开始,就像“Hello Word”一样经典。

- 所需指令:红石信号开启红石输出

- 程序解释:

  1. 处理器通过红石信号开启指令检测指定方向或任意方向的红石信号。如果指定方向有红石信号,那么程序就会进入下一步(需要在红石输出中配置好输出方向和输出等级)。

  2. 执行红石输出指令。从配置图中可以看到,方向(Side)为处理器的东面,信号等级(Level)为12。也就是说处理器朝向东方输出一个等级为12的红石信号。

- 刚放下的指令右上角会显示一个闪烁的红点,这时候需要你进行程序的配置,下图为红石输出的配置图:

  1. 打开配置GUI。

  2. 指定一个输出方向。

RFTools图形化编程从入门到入坑-第9张图片

- 程序如下图:RFTools图形化编程从入门到入坑-第10张图片

二、红石输出善后

- 当我们做完第一步会发现,程序执行并输出红石信号之后一直没有停止输出红石信号。这时候我们需要关闭红石信号的输出。

- 所需指令:等待

- 程序解释:我们给第一步的程序增加了一个80Ticks的延迟,然后再重新输出一遍红石信号,这次输出的红石信号等级设为0。这样处理器就做到了一个按钮的功能,它会在4秒后输出一个信号等级为0的红石信号。

RFTools图形化编程从入门到入坑-第11张图片

三、物品传输

“然后,春天再次来临。”

- 需求:定时检测物品,如果容器A的圆石大于一定数量,就移动到容器B。

- 所需指令:计时器容器储量计算取出物品存入物品大于连线

- 处理器索引分配:最起码要分配一个物品缓冲区索引。配置方式请参照处理器的物品缓冲区说明。

- 程序解释:

  1. 通过计时器指令定时执行一次程序。

  2. 容器储量计算指令计算容器中特定物品的数量并返回计算数值。

  3. 大于大指令的V1配置选择last_number,V2设置为128。表示如果上一个指令返回的数值大于128则执行绿色方向的指令。

  4. 取出物品将容器A的物品移动到处理器物品缓冲区中,然后下一步存入物品指令将物品缓冲区的物品移动到容器B。

  5. 通过连线指令回到容器储量计算,计算移动物品后剩余储量,如果仍旧大于128则继续移动,否则执行红色方向的指令。因为红色方向没有下一步指令,所以程序自动停止。

RFTools图形化编程从入门到入坑-第12张图片

四、合成处理

“天空,大地,艳阳,微风,还有一点点雨滴”

- 需求:通过合成站指定一个合成物品,然后程序自动移动容器中的物品到工作台进行合成操作。

- 所需指令:

  1. 正常运行流程:合成批量存入物品取出材料如果将材料存入工作台取出物品大于标记合成成功

  2. 失败分支1(如果判断指令false结果分支):连线等待

  3. 失败分支2(大于判断指令false结果分支):标记合成失败

- 所需模块或设备:合成站工作台合成卡片网卡模块化存储器/箱子

- 处理器索引分配:指定了处理器物品缓冲区的0 - 8槽位用来放置材料,9槽位放置合成产物。

- 程序解释:

  1. 合成事件型操作码只配置存储合成卡片的容器(一般直接配置工作台,因为工作台需要放有合成卡片)。这个指令会让当前程序加载一个Ticket和一个CraftResult

  2. 将0 - 8槽位的物品全部存入容器中。防止有遗留物品占用材料槽位,导致无法放置部分材料。

  3. 根据指定的合成表将材料从容器中取出,我们在这里设置的“Item”配置是“F:craftresult”,物品是由合成表结果来自动指定。

    RFTools图形化编程从入门到入坑-第13张图片

  4. 判断移动之后材料是否齐全,如果物品齐全则返回true。通过“如果”指令判断。如果为“true”,执行下一步指令。否则执行红色的“false”分支。

    4.1. “false”分支:等待一段时间,回到第“3”步重新移动一次材料再判断材料是否齐全。

  5. 如果指令判断材料是否齐全后,根据合成表将处理器中的物品移动到工作台中。

  6. 将合成产物移动到处理器物品缓冲区中的“9”槽位索引。

  7. 大于大指令判断移动数量,如果大于0,则表示合成成功。小于0则表示合成失败,执行红色的“false”分支。

    7.1. “false”分支:标记合成失败,告诉合成站提交的这个任务合成失败了,让合成站关闭这个任务显示。此时程序结束了。

  8. 标记合成成功,告诉合成站提交的合成任务做完了,让合成站关闭这个任务显示。

  9. 将0 - 9槽位的物品全部存入容器中,防止占用下一次合成任务的槽位。此时程序结束了。

RFTools图形化编程从入门到入坑-第14张图片


五、流体处理

- 这是一个像物品传输一样简单的程序,区别在于它指定的是流体槽位索引。配置方式请参照处理器的流体区说明。

- 需求:将流体容器A中的流体转移到流体容器B。

- 所需模块或设备:多容储罐

- 所需指令:红石信号开启取出流体存入流体

- 处理器索引分配:最起码分配一个流体槽位索引。

- 程序解释:

  1. 红石信号开启指令收到红石信号后开始程序。

  2. 取出流体指令将流体容器A的流体移动到流体槽位索引0中。(配置的第一个索引总是0)

  3. 存入流体指令将流体槽位索引0中的流体移动到容器B中。

RFTools图形化编程从入门到入坑-第15张图片

六、变量/Token的使用

“回去的路就不要送我了”

- 变量与Token都是用来存储数据用的,他们的指令分别是设置变量将数据写入标记符

设置变量将数据写入标记符这两个指令效果一样的,都是将上一个指令返回值写入某个地方,区别在于标记符是物品的形式,变量只存在处理器中。

- 它们的用途:有时候我们的程序可能为了方便配置,或者避免返回值冲突,这时候就需要指定一个存储数据的地方。然后将它们共享给其他程序使用。

- 应用场景:以“四:合成处理”中的程序为例。我们可以看到在这个程序中我们配置了三次存放材料的容器,三次存储合成卡片的容器。如果我们后来改变生产线,那么就需要重新再配置一遍,这是很不方便的。

- 变量槽位索引分配:存放材料的容器写入变量索引0中,存放合成卡片的容器写入变量索引1中。

- 所需指令:在“四:合成处理”程序的基础上,增加读取容器设置变量

- 所需模块或设备:内存条

- 程序解释:与“四:合成处理”重复的地方不再赘述。

  1. 从程序图可以看到,合成事件型指令执行之后,程序先读取了两个容器并且通过设置变量指令添加入变量槽位索引。

RFTools图形化编程从入门到入坑-第16张图片

  1. 然后后面的操作型指令,关于容器的部分直接选择变量索引模式即可。比如合成处理最后一个指令:批量存入物品,在Inv配置的容器参数直接填写“0”。

RFTools图形化编程从入门到入坑-第17张图片

七、消息 & 信号

“四季更替,轮转往复”

- 信号:多数是配合交互屏幕模块进行工作,由屏幕配置一个按钮发出信号,然后处理器收到信号后工作。由程序自己发出的信号无法传到其他处理器。

- 所需指令:信号日志信息

- 所需模块或设备:交互屏幕模块屏幕屏幕控制器

- 程序解释:

  1. 交互屏幕模块绑定使用该程序的处理器,然后交互屏幕模块配置一个按钮来发出信号。

  2. 信号事件型指令配置的信号名称为“aaaa”,当交互屏幕模块发出信号“aaaa”时执行程序。

  3. 日志信息指令在控制台输出一个字符串表示程序正常执行了。

RFTools图形化编程从入门到入坑-第18张图片RFTools图形化编程从入门到入坑-第19张图片

- 消息:

  1. 收到其他程序发来的消息后执行程序。

  2. 消息可以跨维度发送消息到其他处理器中。

  3. 需要配合网络标识使用。

- 所需指令:消息发送消息信号等待日志信息

- 所需模块或设备:网络标识交互屏幕模块屏幕屏幕控制器

- 程序解释:为了方便,我就都写在同一个处理器中了。

  1. 处理器从交互屏幕模块收到信号后,发送一个消息。

  2. 消息指令收到消息之后,延时发送字符串到命令行界面表示程序正常运行。


RFTools图形化编程从入门到入坑-第20张图片

八、锁

- 锁:该指令用于多线程情况,处理器同时运行多个程序时,可能会同时对同一个变量或同一个缓冲区进行操作,为了避免一个程序在读取,一个程序又同时写入导致的问题而存在。

  1. 解锁命令不能对不同线程的锁使用。也就是说,一个事件型指令使用了一个锁,程序运行结束后必须进行解锁,否则其他程序无法使用该锁。

- 必须的指令:上锁解锁

RFTools图形化编程从入门到入坑-第21张图片

- 程序解释:

  1. A程序执行后进行上锁,延时5秒后发送233字符串。RFTools图形化编程从入门到入坑-第22张图片

  2. B程序在A程序运行时运行,此时B程序会因为A程序正在使用同一个锁,因此B程序进入等待。

  3. 当A程序解锁后,B程序才可以使用该锁并执行程序。B程序发出“RedStone!”字符串。

RFTools图形化编程从入门到入坑-第23张图片

⑨、异常

“跟我一起念:你会弄出错误!”

- 异常 (Exception):该指令会捕获处理器执行程序时出现的错误并执行程序。比如:指定了不存在的节点的场合会抛出:“missing_node”异常。

- 必须的指令:异常

- 程序解释:

  1. A程序卡的程序试图读取一个名为“bba”节点上方的红石信号。但是网络中并不存在该节点,在无捕获该异常的指令时,处理器会显示红字来告诉玩家出现了什么异常。RFTools图形化编程从入门到入坑-第24张图片

  2. 因为B程序卡捕获了“missing_node”异常,所以处理器不会出现红字。RFTools图形化编程从入门到入坑-第25张图片

  3. 异常指令捕获到“missing_node”异常后,发出一个字符串“No!Node!”。

RFTools图形化编程从入门到入坑-第26张图片

感谢

  1. youtube用户:“direwolf20”制作的Mod Spotlight RFTools Control Pt1~3。

  2. MCMOD用户:craftkuro(UUID:68394)补充的指令资料。