val stairAltar = DenseMultiblock(
pattern = arrayOf(
arrayOf(
" WWW ",
"N S",
"N 0 S",
"N S",
" EEE "
)
),
mapping = mapOf(
' ' to StateMatcher.ANY,
'0' to StringStateMatcher.parse("minecraft:lapis_block"),
'N' to StringStateMatcher.parse("minecraft:oak_stairs[facing=south]"),
'S' to StringStateMatcher.parse("minecraft:oak_stairs[facing=north]"),
'W' to StringStateMatcher.parse("minecraft:oak_stairs[facing=east]"),
'E' to StringStateMatcher.parse("minecraft:oak_stairs[facing=west]"),
)
).apply { symmetrical = true }
包含流体和含水方块
val fluidStructure = DenseMultiblock(
pattern = arrayOf(
arrayOf(
"GGGGGGG",
" LLLLLG",
"GGGGGGG",
" WW0WWG",
"GGGGGGG",
)
),
mapping = mapOf(
' ' to StateMatcher.ANY,
'0' to StringStateMatcher.parse("minecraft:lapis_block"),
'G' to StringStateMatcher.parse("minecraft:bricks"),
'W' to StringStateMatcher.parse("minecraft:water"),
'L' to StringStateMatcher.parse("minecraft:lava"),
)
)
稀疏型多方块
val fourPillars = SparseMultiblock(
blocks = buildMap {
val pillar = StringStateMatcher.parse("minecraft:stone_bricks")
for (x in listOf(-3, 3)) {
for (z in listOf(-3, 3)) {
for (y in 0..2) {
put(BlockPos(x, y, z), pillar)
}
}
}
put(BlockPos(0, 0, 0), StringStateMatcher.parse("minecraft:diamond_block"))
}
)
验证结构
val anchor = BlockPos(block.x, block.y, block.z)
// 自动尝试所有旋转(非对称 = 4 方向,对称 = 1 方向)
val rotation = multiblock.validate(world, anchor)
if (rotation != null) {
// 匹配成功,rotation 为匹配时的旋转方向
}
进度检测
val results = multiblock.simulate(anchor, rotation)
for (result in results) {
val pos = result.worldPosition
val block = world.getBlockAt(pos.x, pos.y, pos.z)
if (!result.stateMatcher.test(block)) {
println("缺失: $pos 需要 ${result.stateMatcher.displayName}")
}
}
自定义匹配器
val mapping = mapOf(
'F' to StateMatcher.fromMaterial(Material.FURNACE),
'I' to StateMatcher.fromPredicate("iron_or_gold") { block ->
block.type == Material.IRON_BLOCK || block.type == Material.GOLD_BLOCK
},
'W' to StringStateMatcher.parse("#minecraft:planks"),
'T' to StringStateMatcher.parse("#minecraft:logs"),
)