Railcraft 多方块结构

[!INFO] Git Commit: 93da3e1 | Updated: 2026-10-01

CompatRailcraft(351 行,本 mod 最大的 compat)不涉及物品容器,而是向 StructureLib 的 IMultiblockInfoContainer 注册 6 组 Railcraft 多方块结构信息,使这些多方块在使用 构造触发器 时能显示结构提示并在生存模式下自动建造。

两种信息容器实现

实现类 适用 结构来源
SimpleMultiblockInfoContainer<T> 结构唯一、形状固定 构造时传入的 IStructureDefinition
BoilerMultiblockInfoContainer 结构随通道变化(锅炉有 6 种尺寸) 构造时传入的 IStructureDefinition + 尺寸前缀

两者都实现 IMultiblockInfoContainer<T>,把 construct / survivalConstruct 转调为 IStructureDefinition.buildOrHints(...) 或 survivalBuild(...)。

5 个固定结构

全部用 SimpleMultiblockInfoContainer,形状字符 x 表示"任意非本方块",由本 mod 自己的 notBlock(block, meta) 提供(见 mod 元信息 同目录下的说明,见 StructureUtilityExt.java)。

TileEntity 形状 偏移 A/B/C 允许侧向 描述名
TileCokeOven 5×5 空心 hollow3x3 2 / 2 / 1 是 Coke Oven
TileTankWater 5×5 空心 hollow3x3 2 / 2 / 1 是 Water Tank
TileSteamOven 4×4 xx 边框 1 / 2 / 1 是 Steam Oven
TileRockCrusher 4×4 xx 边框 2 / 2 / 1 否 Rock Crusher
TileBlastFurnace 5×6 xxx 边框 2 / 4 / 1 否 Blast Furnace

Coke Oven 与 Water Tank 共用同一个 hollow3x3(5 行 × 5 列的 ' '/x 边框加 3×3 内部), b 元素为对应 EnumMachineAlpha 方块。

allowSideway 的差异:Coke Oven / Water Tank / Steam Oven 三者传入了 5 参数构造器并显式置 allowSideway = true;Rock Crusher 与 Blast Furnace 走 4 参数(varargs 描述名)构造器, allowSideway 保持默认 false。为 false 时 construct / survivalConstruct 会把朝向传入 noSideWay(aSide):

private static ExtendedFacing noSideWay(ExtendedFacing aSide) {
    return aSide.getDirection().offsetY != 0 ? ExtendedFacing.DEFAULT : aSide;
}

CompatRailcraft.java:202-204。即上下朝向一律回落到 ExtendedFacing.DEFAULT,只保留水平朝向。 原因见 SimpleMultiblockInfoContainer.java:210 的 TODO 注释(描述名无法在资源重载时重新翻译)。

锅炉:6 种尺寸

锅炉是唯一结构随通道数据变化的多方块。BOILER_DIMENSIONS 是全部合法尺寸的 (width, height) 列表,共 6 组(CompatRailcraft.java:41):

public static final int[][] BOILER_DIMENSIONS = { {1,1}, {2,2}, {2,3}, {3,2}, {3,3}, {3,4} };

即 宽 1 只有高 1;宽 2 有高 2 和 3;宽 3 有高 2、3 和 4。形状由代码在 registerBoilerStructureInfo() 中按尺寸动态生成(:162-177):dimension[1] 行 × dimension[0] + 1 列,前 dimension[0] 列填锅炉本体 b,最后一列填整列火箱 (固液两版分别为小写 f / 大写 F),每格重复 dimension[1] 次。

每种尺寸注册成两个 shape,名前缀为 st(固质火箱)与 ft(流体火箱):

shape 名 尺寸索引 火箱类型
st0 – st5 0 – 5 BOILER_FIREBOX_SOLID
ft0 – ft5 0 – 5 BOILER_FIREBOX_FLUID

尺寸索引 i 恰好对应 BOILER_DIMENSIONS[i]。TileBoilerFireboxFluid 与 TileBoilerFireboxSolid 分别绑定 ft 与 st 前缀(:194-199)。

锅炉本体元素 b 用 partitionBy 按子通道分流(:182-192):

子通道 boiler 值 方块
<= 1 BOILER_TANK_LOW_PRESSURE
> 1 BOILER_TANK_HIGH_PRESSURE

即低压 / 高压锅炉罐可以在同一结构内混用,但固质与流体火箱不能混——后者由 shape 前缀的差异实现(固质只读 st* 形状,流体只读 ft* 形状,两者元素字符不同)。

锅炉的 construct / survivalConstruct 从通道读取 width 与 height (ChannelDataAccessor.getChannelData),在 BOILER_DIMENSIONS 中线性查找匹配项, 命中则用 width / 2, height, 0 作为偏移构造;找不到时生存模式向玩家报错并返回 -1 (:333-338),对应翻译键 structureinfo.railcraft.boiler.error.invalid_dimension。 锅炉始终 noSideWay,即不接受上下朝向。

翻译键

en_US.lang 中与本条目相关的 7 个键全部属于锅炉:

键 用途
structureinfo.railcraft.boiler.0 – .5 BoilerMultiblockInfoContainer.getDescription 返回的 6 行描述
structureinfo.railcraft.boiler.error.invalid_dimension 尺寸非法时的报错

其中 .3 提示用子通道 width / height 指定尺寸,.4 声明宽度范围 1–3、高度"一般 1–4", .6(实为 .5 键)提示用子通道 boiler 指定锅炉类型。注意描述名在 getDescription 中通过 StatCollector.translateToLocal 逐条翻译,而非整体翻译一次。

lang 文件中另有 1 个键 structureelement.error.cannot_be_block,由 StructureUtilityExt.notBlock 的 survivalPlaceBlock 使用(StructureUtilityExt.java:58),格式为 (%s, %s, %s) §cCANNOT§r be %s!。