BuildCraft 触发器

基本信息

属性 值
实现 compat/triggers/(TriggerProvider / PowerTriggers / TriggerWorking / ForestryErrorTriggers / BaseTrigger)
注册时机 Gendustry.scala:87-88:if (Misc.haveModVersion("BuildCraftAPI|statements")) TriggerProvider.registerTriggers()
注册位置 preInit 阶段,在 Fluids.load() / Blocks.load() / Items.load() / Machines.load() 之前
BuildCraft 依赖 after:BuildCraft|energy 与 after:BuildCraft|Silicon(软依赖,@Mod(dependencies))
编译期依赖 dependencies.gradle 中 BuildCraft 为 api

硬前提

整个机制包在 Misc.haveModVersion("BuildCraftAPI|statements") 判定里。未安装带 statements API 的 BuildCraft 时,一个触发器都不会注册 —— 且这条判定在 preInit 最早期执行,此时机器尚未注册,因此只能是基于类的 isInstanceOf 判定而非实例查询。

触发器发现机制

TriggerProvider.getExternalTriggers(side, tile) 按 TileEntity 实现的接口返回可用触发器:

判定条件 返回的触发器
tile.isInstanceOf[IErrorLogicSource] ForestryErrorTriggers.triggers
tile.isInstanceOf[TilePowered] PowerTriggers.triggers(5 个)
tile.isInstanceOf[TileBaseProcessor] TriggerWorking(1 个)

三条判定独立而非互斥 —— 一台机器可同时命中多组(例如 Industrial Apiary 既是 TilePowered 又是 IErrorLogicSource)。getInternalTriggers 返回 null(Gendustry 不提供内部方块触发器)。

BaseTrigger 的第二个构造参数是排序键:

触发器 唯一名 排序键 类型
TriggerWorking working x TileBaseProcessor
TriggerPower0 power0 z1 TilePowered
TriggerPower25 power25 z2 TilePowered
TriggerPower50 power50 z3 TilePowered
TriggerPower75 power75 z4 TilePowered
TriggerPower100 power100 z5 TilePowered

5 个电力触发器

判定式为 tile.power.stored / tile.power.capacity 的阈值比较(储能占比,不是绝对值):

触发器 条件 等价储能占比
power0 stored == 0 精确等于 0(不是 <= 0.25)
power25 >= 0.25 1/4
power50 >= 0.5 1/2
power75 >= 0.75 3/4
power100 >= 1 满储能

power0 用的是精确等值判定,与其余四个的阈值语义不同 —— 任何非零储能(含 0.1%)都会让 power0 失效但 power25 也不激活。

Working 触发器

TriggerWorking 判定 tile.isWorking。全模组只有 3 处 def isWorking 实现(grep -rn 'def isWorking' src/ = 3),且三者判定式完全相同:

机器 父类 isWorking 实现
Mutagen Producer TileBaseProcessor output > 0
Protein Liquifier TileBaseProcessor output > 0
DNA Extractor TileBaseProcessor output > 0

这三台恰好就是继承 TileBaseProcessor 的机器。其余 7 台机器中,5 台物品加工机继承的是 TileItemProcessor、Industrial Apiary 继承的是 TileExtended —— 均不是 TileBaseProcessor,因此 working 触发器对它们不生效(getExternalTriggers 的第三条判定不命中)。

液体转化机用 output 数据槽(待注入的液体量)是否大于 0 表示工作中,不表示储罐是否已满 —— 因此储罐满导致挂起时 working 仍为真。

Forestry 错误触发器

ForestryErrorTriggers 依据 ForestryAPI.errorStateRegistry 动态生成 —— 数量取决于运行时已注册的 Forestry 错误状态,与 Error Sensor Cover 的 14 个传感器同源。BaseTrigger 提供 getState 的默认实现与 isActive 的封装。

相关条目