跳转至

通过结构模板地物生成结构

结构模板地物(structure_template_feature)是将.mcstructure文件放置入世界的最基础方式。本教程涵盖五种常见的结构放置场景:地表结构、地下结构、漂浮结构、水下结构与水面结构。

实验性玩法

本教程涉及的功能需要在世界设置中启用"自定义生物群系"实验性玩法开关。

Android设备

从基岩版1.21.130起,Android设备无法导出.mcstructure文件。

准备结构文件

.mcstructure文件放置在行为包的structures/目录中。第一层子文件夹名作为命名空间,例如BP/structures/wiki/house.mcstructure的结构名称为wiki:house

拼图结构

若需要支持/locate structure命令的复杂多段结构,请参阅生成拼图结构

地表结构

地表结构生成在地面上,如房屋、村庄等。

BP/features/wiki_house_feature.json
{
    "format_version": "1.13.0",
    "minecraft:structure_template_feature": {
        "description": {
            "identifier": "wiki:house_feature"
        },
        "structure_name": "wiki:house",
        "adjustment_radius": 4,
        "facing_direction": "random",
        "constraints": {
            "grounded": {},
            "unburied": {},
            "block_intersection": {
                "block_allowlist": ["minecraft:air"]
            }
        }
    }
}
adjustment_radius
放置时允许的Y轴调整范围(方块数)。游戏在该半径内寻找合适的放置高度以使结构贴合地形。值越大结构对不规则地形的适应性越强。
facing_direction
结构朝向。random表示随机旋转,可选值包括northsoutheastwest
constraints.grounded
要求结构底部与地面接触,防止结构悬空。
constraints.unburied
要求结构顶部不被方块覆盖,防止结构被埋入地下。
constraints.block_intersection.block_allowlist
结构允许替换的方块列表。设为minecraft:air则结构只会放置在空气中,不会切割地形。
BP/feature_rules/wiki_plains_house_feature.json
{
    "format_version": "1.13.0",
    "minecraft:feature_rules": {
        "description": {
            "identifier": "wiki:plains_house_feature",
            "places_feature": "wiki:house_feature"
        },
        "conditions": {
            "placement_pass": "first_pass",
            "minecraft:biome_filter": {
                "test": "has_biome_tag",
                "operator": "==",
                "value": "plains"
            }
        },
        "distribution": {
            "iterations": 1,
            "x": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "y": "q.heightmap(v.worldx, v.worldz)",
            "z": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "scatter_chance": {
                "numerator": 1,
                "denominator": 25
            }
        }
    }
}

y使用q.heightmap将地物的起始Y坐标设为该列最高实体方块的高度,结合adjustment_radius可以使结构贴合地表。scatter_chance设为1/25,每区块约4%概率尝试生成。

地下结构

地下结构(如地下掩体、矿洞房间等)需要去掉groundedunburied约束,并在block_allowlist中允许石头等地下方块:

BP/features/wiki_bunker_feature.json
{
    "format_version": "1.13.0",
    "minecraft:structure_template_feature": {
        "description": {
            "identifier": "wiki:bunker_feature"
        },
        "structure_name": "wiki:bunker",
        "adjustment_radius": 4,
        "facing_direction": "random",
        "constraints": {
            "block_intersection": {
                "block_allowlist": ["minecraft:air", "minecraft:stone"]
            }
        }
    }
}
BP/feature_rules/wiki_overworld_bunker_feature.json
{
    "format_version": "1.13.0",
    "minecraft:feature_rules": {
        "description": {
            "identifier": "wiki:overworld_bunker_feature",
            "places_feature": "wiki:bunker_feature"
        },
        "conditions": {
            "placement_pass": "first_pass",
            "minecraft:biome_filter": {
                "test": "has_biome_tag",
                "operator": "==",
                "value": "overworld"
            }
        },
        "distribution": {
            "iterations": 1,
            "x": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "y": {
                "extent": [11, 50],
                "distribution": "uniform"
            },
            "z": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "scatter_chance": {
                "numerator": 1,
                "denominator": 15
            }
        }
    }
}

y.extent固定在[11, 50]之间,将结构限制在Y坐标11至50的深度范围内。

漂浮结构

漂浮结构(如空中岛屿、飞行船等)需要将Y轴设在地表之上:

BP/features/wiki_balloon_feature.json
{
    "format_version": "1.13.0",
    "minecraft:structure_template_feature": {
        "description": {
            "identifier": "wiki:balloon_feature"
        },
        "structure_name": "wiki:balloon",
        "adjustment_radius": 4,
        "facing_direction": "random",
        "constraints": {
            "block_intersection": {
                "block_allowlist": ["minecraft:air"]
            }
        }
    }
}
BP/feature_rules/wiki_overworld_balloon_feature.json
{
    "format_version": "1.13.0",
    "minecraft:feature_rules": {
        "description": {
            "identifier": "wiki:overworld_balloon_feature",
            "places_feature": "wiki:balloon_feature"
        },
        "conditions": {
            "placement_pass": "first_pass",
            "minecraft:biome_filter": {
                "test": "has_biome_tag",
                "operator": "==",
                "value": "overworld"
            }
        },
        "distribution": {
            "iterations": 1,
            "x": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "y": {
                "extent": [100, 200],
                "distribution": "uniform"
            },
            "z": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "scatter_chance": {
                "numerator": 1,
                "denominator": 25
            }
        }
    }
}

y.extent设为[100, 200],使结构生成在云层高度附近。

水下结构

含水处理

Minecraft不会自动对水下结构含水。导出前需手动将结构中所有应含水的方块设为含水状态,否则结构会将水排走,形成空腔。

水下结构需要将block_allowlist设为minecraft:water,并使用q.above_top_solid将Y轴定位到水面以下的最高实体方块处:

BP/features/wiki_aqua_temple_feature.json
{
    "format_version": "1.13.0",
    "minecraft:structure_template_feature": {
        "description": {
            "identifier": "wiki:aqua_temple_feature"
        },
        "structure_name": "wiki:aqua_temple",
        "adjustment_radius": 4,
        "facing_direction": "random",
        "constraints": {
            "block_intersection": {
                "block_allowlist": ["minecraft:water"]
            }
        }
    }
}
BP/feature_rules/wiki_ocean_aqua_temple_feature.json
{
    "format_version": "1.13.0",
    "minecraft:feature_rules": {
        "description": {
            "identifier": "wiki:ocean_aqua_temple_feature",
            "places_feature": "wiki:aqua_temple_feature"
        },
        "conditions": {
            "placement_pass": "first_pass",
            "minecraft:biome_filter": {
                "test": "has_biome_tag",
                "operator": "==",
                "value": "ocean"
            }
        },
        "distribution": {
            "iterations": 1,
            "x": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "y": "q.above_top_solid(v.worldx, v.worldz)",
            "z": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "scatter_chance": {
                "numerator": 1,
                "denominator": 25
            }
        }
    }
}

q.above_top_solid(v.worldx, v.worldz)返回该列最高实体方块上方一格的Y坐标(水面以下),避免结构生成在水面上。

水面结构

水面结构(如木筏、浮岛等)需要block_allowlist同时包含minecraft:waterminecraft:air,并将Y轴固定在水面高度:

BP/features/wiki_raft_feature.json
{
    "format_version": "1.13.0",
    "minecraft:structure_template_feature": {
        "description": {
            "identifier": "wiki:raft_feature"
        },
        "structure_name": "wiki:raft",
        "adjustment_radius": 4,
        "facing_direction": "random",
        "constraints": {
            "block_intersection": {
                "block_allowlist": ["minecraft:water", "minecraft:air"]
            }
        }
    }
}
BP/feature_rules/wiki_ocean_raft_feature.json
{
    "format_version": "1.13.0",
    "minecraft:feature_rules": {
        "description": {
            "identifier": "wiki:ocean_raft_feature",
            "places_feature": "wiki:raft_feature"
        },
        "conditions": {
            "placement_pass": "first_pass",
            "minecraft:biome_filter": {
                "test": "has_biome_tag",
                "operator": "==",
                "value": "ocean"
            }
        },
        "distribution": {
            "iterations": 1,
            "x": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "y": 62,
            "z": {
                "extent": [0, 16],
                "distribution": "uniform"
            },
            "scatter_chance": {
                "numerator": 1,
                "denominator": 25
            }
        }
    }
}

y固定为62(主世界默认水面高度),使结构恰好生成在水面处。

各场景对比

场景 constraints Y轴设置 block_allowlist
地表结构 grounded+unburied q.heightmap air
地下结构 无特殊约束 固定范围 air, stone
漂浮结构 无特殊约束 高Y固定范围 air
水下结构 无特殊约束 q.above_top_solid water
水面结构 无特殊约束 固定为62 water, air