多方块结构

基本信息

属性 值
注册类 vazkii.botania.common.block.ModMultiblocks
注册方式 MultiblockSet,在 ModMultiblocks.init() 中赋值
已注册多方块 4 个
API 包 vazkii.botania.api.lexicon.multiblock(MultiblockSet、Multiblock、BeaconComponent)
百科页面 4 个 PageMultiblock(LexiconData 中使用 4 次)

功能

Botania 的 4 个多方块结构用于一次性判定大型装置是否成型。它们同时被 Lexica Botania 的 PageMultiblock 页面用于在书中渲染结构图。

4 个多方块各自把自己的构造逻辑放在宿主类中,以静态方法 makeMultiblockSet() 暴露,ModMultiblocks.init() 统一调用(ModMultiblocks.java:26-31):

enchanter        = TileEnchanter.makeMultiblockSet();
alfPortal        = TileAlfPortal.makeMultiblockSet();
terrasteelPlate  = TileTerraPlate.makeMultiblockSet();
gaiaRitual       = EntityDoppleganger.makeMultiblockSet();

数值

多方块 字段 定义于 组成
附魔台 enchanter TileEnchanter.java:95 黑曜石骨架(OBSIDIAN_LOCATIONS,每格 y+1)+ 花(Blocks.obsidian, meta 0 之外的方块)
精灵传送门 alfPortal TileAlfPortal.java:104 8 块 Livingwood + 3 块闪烁 Livingwood(meta 5)+ 2 座法阵(meta 1)+ 2 个法力池
泰拉钢板 terrasteelPlate TileTerraPlate.java:49 4 青金石块 + 5 Livingrock + 中心 1 个 ModBlocks.terraPlate(meta 0)
盖亚仪式 gaiaRitual EntityDoppleganger.java:136 4 座法阵(meta 2)+ 3×3 = 9 个 BeaconComponent 信标组件

各结构的坐标定义

泰拉钢板(TileTerraPlate.java:37-43)—— 十字形:

LAPIS_BLOCKS    = { {1,0}, {-1,0}, {0,1}, {0,-1} }              // 4 块,y = 0
LIVINGROCK_BLOCKS = { {0,0}, {1,1}, {1,-1}, {-1,1}, {-1,-1} }   // 5 块,y = 0
mb.addComponent(0, 1, 0, ModBlocks.terraPlate, 0);              // 中心,y = 1

精灵传送门(TileAlfPortal.java:46-60):

LIVINGWOOD_POSITIONS            = 8 格:(-1,0,0) (1,0,0) (-2,1,0) (2,1,0) (-2,3,0) (2,3,0) (-1,4,0) (1,4,0)
GLIMMERING_LIVINGWOOD_POSITIONS = 3 格:(-2,2,0) (2,2,0) (0,4,0)     → ModBlocks.livingwood, meta 5
PYLON_POSITIONS                 = 2 格:(-3,1,3) (3,1,3)              → 取负 → (3,1,-3) (-3,1,-3), ModBlocks.pylon meta 1
POOL_POSITIONS                  = 2 格:(-3,0,3) (3,0,3)

法阵坐标在注册时被取反:mb.addComponent(-p[0], p[1] + 1, -p[2], ModBlocks.pylon, 1)(TileAlfPortal.java:112),即 X 与 Z 同时取反,把两座法阵分置传送门的对角。

盖亚仪式(EntityDoppleganger.java:106-144):

PYLON_LOCATIONS = { {4,1,4}, {4,1,-4}, {-4,1,4}, {-4,1,-4} }   // 4 座 ModBlocks.pylon, meta 2
for(i=0..2) for(j=0..2) mb.addComponent(new BeaconComponent(new ChunkCoordinates(i-1, 0, j-1)));  // 9 个信标

9 个 BeaconComponent 覆盖 3×3 区域(相对坐标 −1…1),全部位于 y = 0;4 座法阵位于 y+1 = 2 层。

一处已记录的实现困难

TileEnchanter.makeMultiblockSet() 的源码注释记录了 StructureLib 的一个限制(TileEnchanter.java:101-103):

//Flowers don't seem to properly work in StructureLib (since they need a block below them)
//This solution also allows the flowers to cycle through each other
//Not sure if there's a better solution for this, but hey it works

即:花朵在 StructureLib 中无法正常工作(因为花朵需要下方有支撑方块),作者用了一个变通方案,同时让花朵可以互相循环替代。

交互

触发 行为
放置 各结构由对应 TileEntity / 实体在放置或激活时判定成型
百科展示 PageMultiblock 页面在 Lexica Botania 中渲染结构(LexiconData 中使用 4 次,与 4 个多方块对应)
StructureLib 依赖 StructureLib(compileOnly,Botania.java:66 检测 structurelib)

相关条目