BuildCraftBuilder 模块(appeng.integration.modules.BuildCraftBuilder)

基本信息

属性 值
源码 appeng/integration/modules/BuildCraftBuilder.java
类声明 44,public class
实现接口 只有 IIntegrationModule(不实现任何 abstraction 接口)
静态单例 public static BuildCraftBuilder instance
modID BuildCraft|Builders(IntegrationType.java:25,显示名 BuildCraft Builders)
side BOTH
本 wiki 收录情况 BuildCraft 未被本 wiki 收录 —— 写全名 BuildCraft

职责

让 BC 的建筑师能正确摆放 AE2 自己的方块。 不注入任何 AE2 内容 —— 注入的是「AE2 方块 → BC 蓝图」的登记信息。

生命周期

阶段 行号 动作
init() 59 try { initBuilderSupport(); } catch (Exception e) { /* not supported? */ }(:60-64)
postInit() 68 空 {}

⚠️ 整个 init() 被 try / catch (Exception) 包住, catch 块只有注释 // not supported?(:63)—— 任何异常都被静默吞掉,连日志都没有。若 BC Builders 版本不兼容, 本目标会「成功」但什么都没做。

initBuilderSupport() 的做法

BuildCraftBuilder.java:70-:

final ISchematicRegistry schematicRegistry = BuilderAPI.schematicRegistry;   // :71
final IBlocks blocks = AEApi.instance().definitions().blocks();               // :73
final IBlockDefinition maybeMultiPart = blocks.multiPart();                   // :74

for (final Method blockDefinition : blocks.getClass().getMethods()) {         // :76
    final IBlockDefinition def = (IBlockDefinition) blockDefinition.invoke(blocks);   // :78
    final Optional<Block> maybeBlock = def.maybeBlock();                      // :79
    if (!maybeBlock.isPresent()) { continue; }                               // :80-82
    final Block block = maybeBlock.get();                                     // :84
    if (block instanceof IOrientableBlock && ((IOrientableBlock) block).usesMetadata()
            && !(def instanceof ITileDefinition)) {                          // :85-86
        ...

关键设计:反射遍历 IBlocks 的所有 getter(:76), 逐个取 IBlockDefinition → maybeBlock() → 过滤条件 → 登记。

过滤条件

登记的方块必须同时满足:

  1. block instanceof IOrientableBlock(:85)—— 可定向
  2. ((IOrientableBlock) block).usesMetadata() —— 用 metadata 存朝向(:85)
  3. !(def instanceof ITileDefinition) —— 不是带 tile 的方块(:86)

IOrientableBlock 定义在 appeng/api/util/IOrientableBlock.java(不在本分片)。

用到的 BC API

类型 用途 位置
buildcraft.api.blueprints.BuilderAPI 取 schematicRegistry 静态字段 BuildCraftBuilder.java:24 import
buildcraft.api.blueprints.ISchematicRegistry 蓝图注册表 :25 import,:71 使用

用到的 AE2 API

类型 用途 位置
IBlocks 全部方块定义 :16 import
IBlockDefinition / ITileDefinition 单个方块定义 :17 / :18 import
IOrientableBlock 可定向判定 :19 import

mod 没装时是否安全跳过

是,但有双保险:

  1. BuildCraft|Builders 未装 → IntegrationNode 的 Loader.isModLoaded 判为 false → ModNotInstalled → FAILED
  2. 即使装了但 BuilderAPI 不可用 → :62 的 catch (Exception) 静默吞掉

⚠️ 第二条保险没有日志,出问题时无法从日志判断 BC Builders 兼容是否生效。

相关条目