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 的封装。
相关条目
- NEI 与 WAILA 集成 - 另一组集成
- Error Sensor Cover - 同一批错误状态的红石导出版