Block Conditions for Features

experimental

Sometimes you might need to place any feature conditionally depending on what blocks are below or above it for example. Not many features have the option to conditionally place them like so, but with a simple trick we can use it on anything we want.

TIP

This technique utilizes aggregate_feature and single_block_feature features. If you want to learn more about those, visit Feature Types article.

Files

Features

This feature places a single_block_feature which can be specified with the conditions we need for some other feature. The block can be kept there if it doesn't interrupt your desired features, but we will replace it with air in the next feature so that it doesn't cause any issues later on. This feature acts as a "dummy" feature because we only want its condition part but we don't need it to actually place anything.

BP/features/block_condition_feature.jsonCopy
{
    "format_version": "1.18.0",
    "minecraft:single_block_feature": {
        "description": {
            "identifier": "wiki:block_condition_feature"
        },
        "places_block": "minecraft:cobblestone", //Any block that isn't in "may_replace" list.
        "enforce_placement_rules": false,
        "enforce_survivability_rules": false,
        "may_replace": ["minecraft:air"], //Only blocks the feature is allowed to be placed in.
        "may_attach_to": { //Attchment conditions - what blocks can surround the feature when its being placed
            "bottom": ["minecraft:grass"] //Only blocks the feature can be placed on top of.
        }
    }
}
//This "dummy" feature will only allow the feature to generate in the air, right above a grass block.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

This next feature is the one that is going to replace the cobblestone with the original air block that was there, however it can be ommited if you choose a block you actually want there or if it won't cause you any issues later.

BP/features/block_replacement_feature.jsonCopy
{
    "format_version": "1.18.0",
    "minecraft:single_block_feature": {
        "description": {
            "identifier": "wiki:block_replacement_feature"
        },
        "places_block": "minecraft:air", //Replaces the block with another one which doesn't cause us any issue.
        "enforce_placement_rules": false,
        "enforce_survivability_rules": false,
        "may_replace": ["minecraft:cobblestone"] //The block that we specified in the previous feature.
    }
}
//This feature will replace the block with air that originally was there so it won't cause us any issue.
1
2
3
4
5
6
7
8
9
10
11
12
13

This is a feature that places the condition "dummy" feature, the feature that gets rid of the "dummy" block placed by the condition and after that the actual features we want to conditionally place. It uses early_out with value first_failure to make the aggregate stop if the conditional placement fails. It is the feature placed by a feature rule.

BP/features/aggregate_placement_rock_feature.jsonCopy
{
    "format_version": "1.18.0",
    "minecraft:aggregate_feature": {
        "description": {
            "identifier": "wiki:aggregate_placement_rock_feature"
        },
        "features": [
            "wiki:block_condition_feature", //Single block feature that is used as "dummy" feature to act as our condition.
            "wiki:block_replacement_feature", //This feature replaces the "dummy" block we used in the feature above to not cause us any issues later.
            //Any feature from this point on is what we actually want to place.
            "wiki:rock_ore_feature"
        ],
        "early_out": "first_failure" //This makes sure that if the first(or any) feature fails, it will not continue to place anything else in the list.
    }
}
//This is a feature that places all the features one by one in order and is placed by the feature rule.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

This is the actual feature we want to be conditionally placed. It is ore_feature which doesn't have actual condition for us to allow it to only be placed in air and on a grass block, so this technique has helped us achieve that.

BP/features/rock_ore_feature.jsonCopy
{
	"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"]
			}
		]
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

TIP

If you want to learn more about ore features, you can visit Generating Custom Ores tutorial.

Feature Rule

BP/feature_rules/overworld_after_surface_rock_feature.jsonCopy
{
	"format_version": "1.18.0",
	"minecraft:feature_rules": {
		"description": {
			"identifier": "wiki:overworld_after_surface_rock_feature",
			"places_feature": "wiki:aggregate_placement_rock_feature"
		},
		"conditions": {
			//Places the feature in any overworld biome along with features in the 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 in 3 chance to attempt 1 placement in chunk
            "scatter_chance": 33,
			"iterations": 1, 
			"coordinate_eval_order": "xzy",
			"x": {
				"distribution": "uniform",
				"extent": [0, 15]
			},
			//Places the feature along the heightmap
			"y": "q.heightmap(v.worldx,v.worldz)",
			"z": {
				"distribution": "uniform",
				"extent": [0, 15]
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

Summary

After reading this tutorial you should be able to use block conditions on any feature you want. This was a very basic example as this can be used for far more complex creations and can be used with any feature.

Like that we have made a rock feature that can only be placed in air blocks and above grass blocks.

Generation screenshot:

Contributors