特征(Feature)的方块条件
experimental
有时您可能需要根据下方或上方的方块来有条件地放置某个特征(Feature)。虽然很多特征本身不具备这种条件性放置的选项,但通过一个简单的技巧,我们可以将其应用于任何特征。
TIP
本技巧利用了 aggregate_feature 和 single_block_feature 特征。如需了解更多,请参阅特征类型一文。
文件
特征
这个特征会放置一个 single_block_feature,我们可以为其他特征指定所需的方块条件。如果这个方块不会干扰您想要的特征,可以保留它,但我们会在下一个特征中将其替换为空气,以避免后续出现问题。这个特征充当“虚拟”特征,因为我们只需要它的条件部分,而不需要它实际放置任何方块。
BP/features/block_condition_feature.json
json
{
"format_version": "1.18.0",
"minecraft:single_block_feature": {
"description": {
"identifier": "wiki:block_condition_feature"
},
"places_block": "minecraft:cobblestone", //可以是任何不在"may_replace"列表中的方块。
"enforce_placement_rules": false,
"enforce_survivability_rules": false,
"may_replace": ["minecraft:air"], //仅允许特征放置在空气方块中。
"may_attach_to": { //附着条件——特征放置时周围允许的方块
"bottom": ["minecraft:grass"] //仅允许特征放置在草方块上方。
}
}
}
//这个“虚拟”特征将只允许特征在空气方块中生成,并且必须位于草方块正上方。下一个特征会将圆石替换为原本存在的空气方块。如果您选择保留某个方块或该方块不会造成问题,则可以省略此特征。
BP/features/block_replacement_feature.json
json
{
"format_version": "1.18.0",
"minecraft:single_block_feature": {
"description": {
"identifier": "wiki:block_replacement_feature"
},
"places_block": "minecraft:air", //将方块替换为不会造成问题的空气方块。
"enforce_placement_rules": false,
"enforce_survivability_rules": false,
"may_replace": ["minecraft:cobblestone"] //上一个特征中指定的方块。
}
}
//此特征会将方块替换为原本存在的空气方块,从而避免后续问题。这是一个组合特征,它会依次放置“虚拟”条件特征、用于移除“虚拟”方块的特征,以及我们实际需要有条件放置的特征。它使用 early_out 并设置为 first_failure,以确保在条件性放置失败时停止执行后续特征。该特征由特征规则(feature rule)调用。
BP/features/aggregate_placement_rock_feature.json
json
{
"format_version": "1.18.0",
"minecraft:aggregate_feature": {
"description": {
"identifier": "wiki:aggregate_placement_rock_feature"
},
"features": [
"wiki:block_condition_feature", //用作条件的“虚拟”方块特征。
"wiki:block_replacement_feature", //此特征会移除上方特征放置的“虚拟”方块,避免后续问题。
//从此处开始放置我们实际需要的特征。
"wiki:rock_ore_feature"
],
"early_out": "first_failure" //确保如果某个特征失败,将不再继续执行列表中的其他特征。
}
}
//此特征会按顺序依次放置所有特征,并由特征规则调用。这是我们实际需要有条件放置的特征。它是一个 ore_feature,本身不具备“仅允许在空气方块中且位于草方块上方”的条件,因此本技巧帮助我们实现了这一目标。
BP/features/rock_ore_feature.json
json
{
"format_version": "1.18.0",
"minecraft:ore_feature": {
"description": {
"identifier": "wiki:rock_ore_feature"
},
"count": 12,
"replace_rules": [
{
"places_block": "minecraft:stone",
"may_replace": ["minecraft:air","minecraft:grass"]
},
{
"places_block": {
"name": "minecraft:dirt",
"states": {
"dirt_type": "coarse"
}
},
"may_replace": ["minecraft:dirt"]
}
]
}
}TIP
如需了解更多关于矿石特征的内容,请参阅生成自定义矿石教程。
特征规则
BP/feature_rules/overworld_after_surface_rock_feature.json
json
{
"format_version": "1.18.0",
"minecraft:feature_rules": {
"description": {
"identifier": "wiki:overworld_after_surface_rock_feature",
"places_feature": "wiki:aggregate_placement_rock_feature"
},
"conditions": {
//在主世界生物群系中,与after_surface_pass中的特征一起放置
"placement_pass": "after_surface_pass",
"minecraft:biome_filter": [
{
"any_of": [
{
"test": "has_biome_tag",
"operator": "==",
"value": "overworld"
},
{
"test": "has_biome_tag",
"operator": "==",
"value": "overworld_generation"
}
]
}
]
},
"distribution": {
//每个区块有1/3的概率尝试放置1次
"scatter_chance": 33,
"iterations": 1,
"coordinate_eval_order": "xzy",
"x": {
"distribution": "uniform",
"extent": [0, 15]
},
//根据高度图放置特征
"y": "q.heightmap(v.worldx,v.worldz)",
"z": {
"distribution": "uniform",
"extent": [0, 15]
}
}
}
}总结
阅读本教程后,您应该能够为任何特征添加方块条件。虽然这是一个非常基础的示例,但此技巧可用于更复杂的创作,并适用于任何特征。
通过这种方法,我们创建了一个只能在空气方块中且位于草方块上方生成的岩石特征。
生成效果截图:



