Super Factory Manager · SFML

Minecraft SFM 中文语法速查表

从能运行的最小程序,到资源筛选、配额、标签、侧面、槽位、条件、红石、Tag 与轮询。按官方发布版语法整理,可离线使用。

SFM v4.34.0 Minecraft 26.1.2 核对日期 2026-07-27 大小写不敏感
SFM 主题方块物流工坊插画:管理器通过普通 Cable 整方块线缆连接工厂设备,线缆呈近黑蓝紫色像素条带纹理
AI 主题插画 · 非游戏截图

30 秒上手

最小可用程序:把 source 的资源送到 storage

NAME "基础搬运"

EVERY 20 TICKS DO
    INPUT FROM source
    OUTPUT TO storage
END
  1. 用标签枪把来源方块标为 source,目的地方块标为 storage。
  2. 线缆接入 Manager;把程序写入磁盘并放进 Manager。
  3. INPUT 只登记可用来源;遇到 OUTPUT 时才真正搬运。
心智模型:一个触发器块里,多个 INPUT 会累积成“当前输入池”;后续 OUTPUT 从这个池里取。用 FORGET 清空或局部移除。

程序结构与触发器

基础词法

  • NAME "名称" 可选,且只能放在程序开头。
  • 关键字大小写不敏感;推荐统一大写。
  • -- 到行末是注释;没有分号。
  • 字符串使用双引号;内部双引号写作 \"。
  • 标签有空格、特殊字符或撞上关键字时,请加引号。
NAME "仓库 \"A\""
-- 这是一行注释
every 20 ticks do
    input from "main storage"
end

计时触发器

EVERY TICK DO END
EVERY 20 TICKS DO END
EVERY 5 SECONDS DO END

-- 使用世界时钟对齐
EVERY 20 GLOBAL TICKS DO END
EVERY 20G TICKS DO END

-- 偏移量与前面的单位相同
EVERY 20 PLUS 5 TICKS DO END
EVERY 20G+5 TICKS DO END
  • 省略数字等于 1;SECOND(S) 会乘以 20 tick。
  • 默认使用 Manager 的本地时钟;GLOBAL/G 使用世界时钟。
  • PLUS 与 + 等价。偏移也会按秒换算。
最小周期由服务器配置决定;仅搬运 Forge Energy 的程序可使用另一项更低的最小周期配置。

红石脉冲触发器

EVERY REDSTONE PULSE DO
    INPUT FROM source
    OUTPUT TO storage
END

Manager 每收到一次红石脉冲就执行一次。它与周期触发器可以同时存在于同一程序中。

程序骨架

NAME "可选名称"

EVERY 20 TICKS DO
    -- 语句列表
END

EVERY REDSTONE PULSE DO
    -- 另一组独立语句
END

一个程序可有任意多个触发器。每个触发器都有独立的 DO … END 语句块。

INPUT / OUTPUT

INPUT:登记来源

下面两种顺序完全等价:

INPUT 16 iron_ingot FROM source
FROM source INPUT 16 iron_ingot

省略资源限制时,默认匹配所有物品、数量无限、来源保留量为 0。

OUTPUT:执行搬运

下面两种顺序完全等价:

OUTPUT 16 iron_ingot TO storage
TO storage OUTPUT 16 iron_ingot

省略资源限制时,默认接受全部资源、搬运量无限、目的地上限无限。

目标前的 EACH:每个方块独立计算

INPUT 8 FROM EACH chest
OUTPUT RETAIN 32 TO EACH machine

FROM EACH / TO EACH 为每个匹配方块创建独立配额追踪器;不写时,同一语句命中的所有方块共享配额。

它和数量后面的 8 EACH *ingot* 不是一回事:前者按方块展开,后者按匹配到的资源 ID 展开。

只输出到空槽

OUTPUT TO EMPTY SLOTS IN storage
OUTPUT 1 iron_ingot TO EMPTY SLOT IN buffer

EMPTY SLOT(S) IN 放在 TO 后、EACH 与标签前。它只选择完全为空的目的槽,不会给已有堆叠补货。

输入池与 FORGET

EVERY 20 TICKS DO
    INPUT FROM ore_chest
    OUTPUT 8 TO furnace

    INPUT FROM fuel_chest       -- ore_chest 仍在输入池中
    OUTPUT 8 coal TO furnace

    FORGET ore_chest            -- 只忘掉这个来源标签
    FORGET fuel_chest,

    INPUT FROM furnace
    OUTPUT TO result_chest

    FORGET                      -- 清空全部当前输入
END

FORGET label1, label2 移除来自指定标签的活动输入;裸 FORGET 清空。标签列表允许尾逗号。

数量、RETAIN 与规则组合

数量:本次最多搬多少

INPUT 16 iron_ingot FROM source
OUTPUT 8 iron_ingot TO dest

数字是该语句本次执行的最大转移量。输入上限与输出上限都会参与限制,实际移动量取可行的较小值。

RETAIN:在 INPUT 与 OUTPUT 中含义不同

-- 来源合计至少留下 32 个
INPUT RETAIN 32 cobblestone FROM source

-- 目的地合计最多保有 64 个
OUTPUT RETAIN 64 cobblestone TO buffer

INPUT RETAIN 是来源保留量;OUTPUT RETAIN 是目的地最终容量上限。

数量/保留量后的 EACH:按资源展开

-- 每种匹配的锭最多输入 5 个
INPUT 5 EACH *ingot* FROM chest

-- 每种匹配的种子在目的地最多保有 8 个
OUTPUT RETAIN 8 EACH *seed* TO drawer

-- 数量与保留可以分别选择是否展开
INPUT 5 EACH RETAIN 3 EACH *ingot* FROM chest

不写 EACH 时,模式展开出的所有资源共享那个数字;写在数字后则每种实际资源各有一份配额。

逗号与 OR:两种组合语义

INPUT
    5 stone OR dirt,  -- 石头与泥土合计最多 5
    3 iron_ingot,     -- 独立规则,最多 3
    cobblestone,      -- 默认无限
FROM chest
  • OR:同一条规则内的资源析取,共享数量/RETAIN/WITH。
  • 逗号:分隔多条独立资源规则;末尾逗号合法。

资源规则可以只写限制、只写 WITH,或显式写资源

INPUT
    16,                              -- 所有资源合计最多 16
    RETAIN 4,                        -- 匹配所有,来源保留 4
    WITH #forge:ingots,              -- 匹配所有物品,再按 Tag 筛选
    8 RETAIN 2 iron_ingot OR gold_ingot WITH #forge:ingots,
EXCEPT copper_ingot
FROM source

EXCEPT 是整条 INPUT/OUTPUT 语句级排除器,不是只作用于前一行规则。

资源 ID、模式与 Tag

资源 ID 的 1~4 段形式

写法展开后的含义例子
namesfm:item:*:nameiron_ingot:任意命名空间的同名物品
namespace:namesfm:item:namespace:nameminecraft:stone
type:namespace:namesfm:type:namespace:namefluid:minecraft:water
typeNS:type:resNS:name完整四段格式sfm:item:minecraft:stone
INPUT stone FROM a
INPUT minecraft:stone FROM a
INPUT sfm:item:minecraft:stone FROM a

INPUT fluid:: FROM tank            -- sfm:fluid:*:*
INPUT fluid::water FROM tank       -- sfm:fluid:*:water
INPUT minecraft: FROM chest        -- sfm:item:minecraft:*

当前内置资源类型与别名

类型常用写法
物品item::(默认,可省略)
流体fluid::
Forge Energyforge_energy::;别名 fe::、rf::、energy::、power::
红石信号资源redstone::
Mekanism 化学品*chemical::、gas::、infusion::、pigment::、slurry::

* 仅在加载 Mekanism 时注册;这些兼容名称使用当前 Chemical 能力。整合包还可通过扩展注册额外资源类型。

通配符与正则

INPUT *ingot* FROM chest
INPUT minecraft:*_log FROM chest

-- 引号内按完整正则表达式处理
INPUT ".*ingot.*" FROM chest
INPUT "sfm:item:(minecraft|mekanism):.*_ingot" FROM chest
  • 未加引号的 * 会自动转换为 .*。
  • 引号形式可写完整正则,也适合包含普通标识符不允许字符的资源表达式。
  • 资源类型本身必须是字面量,不能用通配符。

EXCEPT:语句级资源排除

INPUT *ingot*
EXCEPT iron_ingot, gold_ingot,
FROM source

OUTPUT 5 EXCEPT copper_ingot TO dest

EXCEPT 接受逗号分隔的资源 ID/模式,可有尾逗号;不支持在其中写 WITH。

WITH / WITHOUT:按物品 Tag 过滤

INPUT WITH #forge:ingots FROM chest
INPUT WITH TAG #minecraft:logs FROM chest
INPUT *a* WITH TAG minecraft:mineable/shovel FROM chest

-- 省略命名空间 = 匹配任意命名空间
INPUT WITH #ingots FROM chest       -- 等价于 *:ingots

-- Tag 路径支持 *;多层剩余路径常写 **
INPUT WITH #tools/*/*_matter FROM chest
INPUT WITH #the_bumblezone:essence/** FROM chest

-- 布尔组合
INPUT WITH (#ores/* AND NOT #needs_stone_tool) OR #forge:gems FROM chest
INPUT WITHOUT (#piglin_loved OR #forge:nuggets) FROM chest
  • #tag、TAG tag、TAG #tag 都合法。
  • WITHOUT X 等于 WITH NOT X,它否定整个后续表达式。
  • 优先级:括号 → NOT → AND → OR;复杂表达式建议显式加括号。

标签、侧面、槽位与轮询

标签列表

INPUT FROM chest_a, chest_b
OUTPUT TO "main storage", overflow
FORGET chest_a, chest_b,

多个标签用逗号分隔。标签最长 256 字符;含空格或关键字时用引号。

侧面选择

INPUT FROM machine TOP SIDE
OUTPUT TO machine NORTH, EAST SIDE
OUTPUT fe:: TO battery EACH SIDE

-- 根据方块朝向解析
INPUT FROM machine LEFT SIDE
OUTPUT TO machine RIGHT, FRONT, BACK SIDE

-- 无方向 capability
INPUT FROM source NULL SIDE

绝对面:TOP BOTTOM NORTH EAST SOUTH WEST;相对面:LEFT RIGHT FRONT BACK;EACH SIDE 包含六个方向和 NULL。未写侧面时默认为 NULL。

槽位与范围

INPUT FROM chest SLOTS 0,1,3-4,7-9,21
OUTPUT TO furnace SLOT 2

SLOT 与 SLOTS 等价;槽位编号从 0 开始,可混用单值与闭区间。未指定时选择全部槽位。

GUI 槽位编号不一定等于自动化 capability 的槽位编号;可在游戏内用容器检查器核对。

标签访问修饰符的固定顺序

label1, label2
ROUND ROBIN BY LABEL
TOP, WEST SIDE
SLOTS 0-2,5

完整顺序必须是:标签列表 → ROUND ROBIN → SIDE → SLOTS。这些修饰符也可用于 IF … HAS 的标签访问。

ROUND ROBIN:按标签或方块轮询

INPUT FROM "storage a", "storage b" ROUND ROBIN BY LABEL
OUTPUT 8 bone_meal TO EACH dispenser

FORGET
INPUT FROM source
OUTPUT 128 dirt TO dest ROUND ROBIN BY BLOCK
  • BY LABEL:每次只选择标签列表中的一个标签。
  • BY BLOCK:每次只选择匹配标签下的一个方块。
  • 官方建议优先用 RETAIN 做均衡/限量;轮询会维护轮转状态,通常更慢。

IF 条件与红石判断

IF / ELSE IF / ELSE

IF SOME source HAS GT 10 minecraft:iron_ingot THEN
    INPUT 10 iron_ingot FROM source
    OUTPUT TO dest1
ELSE IF source HAS >= 20 cobblestone THEN
    INPUT 20 cobblestone FROM source
    OUTPUT TO dest2
ELSE
    FORGET
END

条件块可以嵌套;每个 IF 只用一个最终 END 结束,ELSE IF 可重复多次。

比较运算符

单词符号含义
GT>大于
LT<小于
EQ=等于
LE<=小于等于
GE>=大于等于

多方块集合运算符

运算符语义
OVERALL把所有匹配方块的数量相加后比较;默认
SOME至少一个方块满足
EVERY/EACH每个方块都满足
ONE恰好一个方块满足
LONE至多一个方块满足(0 或 1)

HAS 条件的完整形态

IF OVERALL storage HAS GE 64 iron_ingot OR gold_ingot THEN END

IF SOME storage TOP SIDE SLOTS 0-8
   HAS > 0 *ingot*
   WITH #forge:ingots
   EXCEPT copper_ingot
THEN
    -- ...
END

-- 可省略资源 ID:统计全部资源
IF chest HAS EQ 0 THEN END

HAS 后必须有比较符与数字;资源析取、WITH 与 EXCEPT 都可选。

布尔组合

IF TRUE THEN END

IF NOT (source HAS > 20 stone)
   AND source HAS GE 20 cobblestone
   OR REDSTONE GE 12
THEN
    -- ...
END

支持 TRUE、FALSE、括号、NOT、AND、OR。优先级依次为括号、NOT、AND、OR。

读取 Manager 红石强度

IF REDSTONE GE 2 THEN
    INPUT FROM source
    OUTPUT TO dest
END

REDSTONE 条件读取 Manager 方块接收的信号。语法允许省略比较部分,但实现默认是 GE 0,通常恒真,因此建议总是显式写比较符和阈值。

高级组合与实用技巧

流体

INPUT fluid::water FROM source_tank
OUTPUT RETAIN 1000 fluid::water TO EACH machine

流体数量通常以 mB 计;上例让每台机器最多保有 1000 mB 水。

Forge Energy

INPUT fe:: FROM battery
OUTPUT 5000 fe:: TO EACH machine EACH SIDE

没有物品 ID 的能量类型通常写成 fe::;需要时指定侧面。

Mekanism

INPUT chemical:: FROM tank FRONT SIDE
OUTPUT chemical:: TO machine LEFT SIDE

Mekanism 方块强依赖侧面配置;未指定方向时通常只能可靠读取,建议显式写 SIDE。

可直接改的常用配方

熔炉阵列

NAME "熔炉阵列"
EVERY 20 TICKS DO
    INPUT FROM to_smelt
    OUTPUT 8 TO EACH furnace TOP SIDE

    FORGET
    INPUT FROM fuel
    OUTPUT RETAIN 8 coal TO EACH furnace BOTTOM SIDE

    FORGET
    INPUT FROM furnace BOTTOM SIDE
    OUTPUT TO results
END

主仓 + 溢出仓

EVERY 20 TICKS DO
    INPUT FROM incoming
    OUTPUT RETAIN 1024 EACH * TO main_storage
    OUTPUT TO overflow
END

第一个输出尽量填主仓;未搬完的活动输入继续交给第二个输出。

低库存补货

EVERY 20 TICKS DO
    IF buffer HAS LT 32 iron_ingot THEN
        INPUT iron_ingot FROM warehouse
        OUTPUT RETAIN 64 iron_ingot TO buffer
    END
END

Tag 分类器

EVERY 20 TICKS DO
    INPUT FROM incoming
    OUTPUT WITH #forge:ingots TO ingot_storage
    OUTPUT WITH #minecraft:logs TO wood_storage
    OUTPUT TO misc_storage
END

完整语法骨架(压缩 EBNF)

这是官方 SFML.g4 的中文化压缩索引;大括号表示重复,方括号表示可选,竖线表示任选其一。语义细节见上方对应章节。

program
[NAME string] {trigger} EOF
trigger
EVERY interval DO block END
EVERY REDSTONE PULSE DO block END
interval
[number] [GLOBAL|G] [PLUS|+ number] TICK(S)|SECOND(S)
numberG [PLUS|+ number] unit
statement
input | output | if | forget
input
INPUT [limits] [EXCEPT ids] FROM [EACH] access
FROM [EACH] access INPUT [limits] [EXCEPT ids]
output
OUTPUT [limits] [EXCEPT ids] TO [EMPTY SLOT(S) IN] [EACH] access
TO ... access OUTPUT [limits] [EXCEPT ids]
limits
rule {, rule} [,]
rule
[limit] id {OR id} [with]
limit [with] | with
limit
[number [EACH]] [RETAIN number [EACH]]
resource id
part[:part[:part[:part]]] 或 "regex"
with
WITH clause | WITHOUT clause
with clause
(clause) | NOT clause | clause AND clause | clause OR clause | [TAG] [#] tagPattern
tagPattern
[namespace:]path[/path...]
access
label {, label} [roundRobin] [sides] [slots]
roundRobin
ROUND ROBIN BY LABEL|BLOCK
sides
EACH SIDE
side {, side} SIDE
side
TOP|BOTTOM|NORTH|EAST|SOUTH|WEST|LEFT|RIGHT|FRONT|BACK|NULL
slots
SLOT(S) range {, range}
range
number [- number]
forget
FORGET [label {, label} [,]]
if
IF bool THEN block {ELSE IF bool THEN block} [ELSE block] END
bool
TRUE|FALSE|(bool)|NOT bool|bool AND bool|bool OR bool|has|redstone
has
[setOp] access HAS cmp number [id {OR id}] [with] [EXCEPT ids]
redstone
REDSTONE [cmp number]
setOp
OVERALL|SOME|EVERY|EACH|ONE|LONE
cmp
GT|LT|EQ|LE|GE|>|<|=|<=|>=
comment
-- 到行末

常见易错点

语义混淆

  • INPUT 不立即搬运;它只加入输入池。
  • INPUT RETAIN 留在来源;OUTPUT RETAIN 限制目的地总量。
  • FROM/TO EACH 按方块独立;数字后的 EACH 按资源 ID 独立。
  • OR 共享一条规则的配额;逗号创建独立规则。

顺序与默认值

  • 标签修饰顺序固定:轮询 → 侧面 → 槽位。
  • EMPTY SLOT(S) IN 必须紧跟 TO。
  • 未写 SIDE 时是 NULL,并非六面全选。
  • 未写资源类型默认是物品,不是流体或能量。

筛选与逻辑

  • EXCEPT 对整条语句生效,不能在里面放 WITH 条件。
  • WITHOUT A AND B 否定整个 A AND B;复杂逻辑加括号。
  • 裸 IF REDSTONE THEN 默认比较 GE 0,一般恒真。
  • 未加引号的资源模式只允许字母、数字、下划线与 * 等语法字符。

调试建议

  • 先用容器检查器确认资源类型、侧面与自动化槽位。
  • Mekanism 机器务必核对机器自身的侧面 I/O 配置。
  • 编译警告会提示未连接标签、未消费输入、无可用槽位、错误的 EACH/轮询组合等。
  • 需要均匀分配时先尝试 TO EACH ... RETAIN,再考虑轮询。
↑ 顶部