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!。