物品介绍
Factory Manager(工厂管理器)
工厂管理器是工厂的核心,通过编程控制整个工厂,可以多核。
放入磁盘后,点击Edit按钮进行编程,Reset按钮清除储存的程序和标签。
Inventory Cable(存储线缆)
连接工厂各部分,有任意一面相连即可,编程时可以指定IO(输入输出)方向。
Factory Manager Program Disk(工厂管理程序磁盘)
放入工厂管理器中,储存程序和标签。
Label Gun(标签枪)
给方块添加标签,标签用于在编程时选择对象,一个标签可以有多个方块,一个方块可以有多个标签。
右键空气时,打开gui,可选择标签。
右键方块时,为方块添加标签,如果方块已有该标签则移除。
Shift+滚动滚轮时,在标签之间切换。
Ctrl+右键方块时,为所有相连的相同方块添加标签,如果方块已有该标签则移除。
Shift+右键方块时,移除该方块所有标签。
右键工厂管理器时,将标签写入磁盘。
Shift+右键工厂管理器时,从磁盘读取标签。
Network Tool(网络工具)
手持时,高亮所有线缆。右键方块时,获取该方块信息和当前方块可用的input示例(包含物品、流体、能量、化学等,方向为点击时的方向)。
Water Tank(水罐)
至少有两个面接触水源时,供给水,相连的水罐视作一个整体,每个水罐提高1000mB/t的抽取量。
编程
在物品栏界面按Ctrl+I键,可显示物品栏槽位,点击左上角的Export Inspector按钮将显示可用的输出的示例。
抽象语法树。
将磁盘放入工厂管理器,用存储线缆连接各工作方块,用标签枪标记后右键工厂管理器存入标签,点击Edit按钮或Ctrl+E开始编程。
--为注释符,在注释符后的内容不会被执行,Ctrl+/可切换行注释。
教程语法说明:
[]可选项。
<>必填项。
*可复数填写。
|或。
Trigger(触发器)
name <string>
为磁盘物品命名,string为字符串。
every <number> (ticks|seconds) do [block] end
每隔number刻(ticks)或秒(seconds)运行里面的内容,number为int类型。
计时单位为ticks时,number至少为20,仅包含能量IO时至少为1,可以在config/sfm-common.toml里修改。
计时单位为seconds时,number至少为1。
every redstone pulse do [block] end
每次红石脉冲(上升沿)时运行里面的内容,同tick里可多次激活,接入高频脉冲可解决最小只能20ticks的限制。
IO(输入输出)
input [resourceid]* from <label>*
从label*里匹配*resourceid的对象输入到工厂里,对象还留在原方块里,只有在输出时才会进行转移。
可以用,(逗号)分割多个目标,这些目标将视作一个整体,一个label的多个方块视作一个整体,resourceid默认为sfm:item:[modid]:[name],比如钻石为minecraft:diamond,用*(星号/乘号/通配符)匹配任意字符串任意次,在解析时会将::替换为:*:,:$替换为:*,所以::与:*:*等价原来是正则表达式。
output [resourceid]* to <label>*
从工厂输出匹配resourceid*的对象到label*,转移数量没有限制。
input [[number] [retain <number>] [resourceid]]* [except <resourceid>*] from [each] <label>*
从label*里输出number个但保留number_个匹配的对象但排除resourceid_*对象到工厂,此处的number均为long型。
如果为each,则多个标签与标签下多个方块都独立计算。
output [[number] [retain<number>] [resourceid]]* [except <resourceid>*] to [each] <label>*
从工厂输出number个但输出对象至多有number_个匹配的对象但排除resourceid_*对象到label*,此处的number均为long型。
如果为each,则多个标签与标签下多个方块都独立计算。
4.19.0版本加入。
(input|output) [[resourceid] [(with|without) [tag] <withClause>]]* [except <resourceid>*] (from|to) <label>*
匹配标签。未指定命名空间时,匹配所有命名空间。tag关键字和#号至少填写一个。通配符匹配当前深度,使用双通配符**匹配任意深度。
注:当前4.19.0版本语法通过但未实现not、and、or功能,without与with效果一致。
forget [label]*
遗忘label*的输入,不添加参数时为遗忘所有输入。
input from [each] <label>* [round robin by (block|label)] [<side> side] [slots <range>*]
从label*里以方块(block)或标签(label)循环的在range*范围内的槽位在side面输入到工厂。
each与round robin同时存在时与each一致。
side为top | bottom | north | east | south | west,即顶面 | 底面 | 北面 | 东面 | 南面 | 西面。
side未指定时可能无法IO。
range可以是数值或范围,如5, 0-3,数据类型均为long型。
output to [each] <label>* [round robin by (block|label)] [<side> side] [slots <range>*]
从工厂输出到label*里以方块(block)或标签(label)循环的目标以side面输入到range*的槽位里。
each与round robin同时存在时与each一致。
resourceid为sfm:[resourceTypes]:[modid]:[name]。
可用的resourceTypes有item(物品,默认选项)、forge_energy(能量)、fluid(流体)、chemical(化学,mc1.21.1及以上版本)、gas(气体)、infusion(灌注)、slurry(浆液)、pigment(颜料)。通常需要指定side。
fe、rf、energy、power是forge_energy的别名。
gas、infusion、slurry、pigment是chemical的别名(mc1.21.1及以上版本)。
将上文全部结合起来可得
(input|output) [[number] [retain <number>] [resourceid] [(with|without) [tag] <withClause>]]* [except <resourceid>*] (from|to) [each] <label>* [round robin by (block|label)] [<side> side] [slots <range>*]
If(逻辑判断)
if <boolexpr> then [block] end
如果boolexpr的结果为true则运行里面的内容,boolexpr如下:
true|false
真值|假值
( <boolexpr> )
优先运算。
not <boolexpr>
逻辑非,反转boolexpr的结果。
<boolexpr> and <boolexpr>
逻辑与,都为true时才为true。
<boolexpr> or <boolexpr>
逻辑或,至少有一个为true时为true。
redstone [<comparisonOp> <number>]
不加参数时redstone表示本身是否有红石信号。
添加参数时,红石信号数值与number进行comparisonOp比较。
comparisonOp可以输入:
>、gt 大于
<、lt小于
=、eq 等于
<=、le小于或等于
>=、ge大于或等于。
[setOp] <label>* has <comparisonOp> <number> [resourceid]
setOp:every所有个体都满足
each同every
some至少有一个以上个体满足
one只有一个个体满足
lone零个或一个个体满足
overall整体满足,默认选项
if <boolexpr> then [block]
else if <boolexpr> then [block]
else [block]
end
支持if...else if...else...end表达式和嵌套if。
实例
有机灌注器阵列
以热力系列+神秘农业的精华产线为例,Ctrl+右键快速标记所有有机灌注器。
输入能量、水、种子、肥料,产出精华和种子。
在物品接口标记肥料(植育一号),从水罐抽水到流体储罐缓存水,将有机灌注器的顶部设置为输入/输出。
Mek聚变反应堆自适应速率
聚变反应堆可以直接通入氘氚燃料,燃料速率为1-1000mB/t0就直接停机了,用终极化学品储罐储存燃料,设计目标为储罐拥有8,000,000mB燃料时速率达到1000mB/t,且燃料速率随着燃料储量降低而降低,需要一直输入燃料避免停机,所以每tick都必须运行一次,使用every redstone pulse触发器和1tick脉冲发生器。
所有活塞均为粘性活塞。
做好标记,设置好输入/输出面,temp是一个空的终极化学品储罐。