多方块结构
基本信息
| 属性 | 值 |
|---|---|
| 注册类 | 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) |