Heightmap Noise

experimental

tutorial

TIP

This tutorial assumes you have a basic understanding of molang, features and feature rules.

In this tutorial we're gonna see how we can make noise based terrain using the q.noise molang query.

Single Block Feature

First we will define the single block feature. It will define the block that is going to be generated. For this tutorial I'll use stone.

BP/features/stone_feature.jsonCopy
json
{
	"format_version": "1.13.0",
	"minecraft:single_block_feature": {
		"description": {
			"identifier": "wiki:stone_feature"
		},
		"places_block": "minecraft:stone",
		"enforce_survivability_rules": false,
		"enforce_placement_rules": false
	}
}
1
2
3
4
5
6
7
8
9
10
11

Scatter Feature

The scatter feature is the main feature which we'll be using to generate the terrain.

BP/features/column.jsonCopy
json
{
	"format_version": "1.13.0",
	"minecraft:scatter_feature": {
		"description": {
			"identifier": "wiki:column"
		},
		"iterations": "t.height=64+(q.noise(v.originz/64,v.originx/64))*16; return t.height;",
		"places_feature": "wiki:stone_feature",
		"x": 0,
		"z": 0,
		"y": {
			"extent": [-64, "t.height"],
			"distribution": "fixed_grid"
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Let me explain whats happening in the iterations: In the iterations we've defined a temp t.height in which we've defined our main noise function. In t.height the value that we're adding first is the base height, basically the height at which the function starts. After that we're querying perlin using the q.noise query which returns values ranging from -1 to 1 and dividing that by a value which smooths out the function. Then we're multiplying the whole function by a value which in simple words is basically the variation in the terrain.

So what's happening here is that we are getting values from the t.height temp and assigning them to the y extent ranging from -64 to the value thus generating a column. Now this value is going to vary column by column but not in a random way as q.noise queryies Perlin noise, meaning the values are relative to each other. So instead of getting values like 64,69,45,100,7,56 we are getting values like 64,65,66,68,69,68,66,65 and so on.

Feature Rule

BP/feature_rules/column_grid_placement.jsonCopy
json
{
	"format_version": "1.13.0",
	"minecraft:feature_rules": {
		"description": {
			"identifier": "wiki:column_grid_placement",
			"places_feature": "wiki:column"
		},
		"conditions": {
			"placement_pass": "first_pass",
			"minecraft:biome_filter": {
				"any_of": [
					{
						"test": "has_biome_tag",
						"value": "overworld"
					},
					{
						"test": "has_biome_tag",
						"value": "overworld_generation"
					}
				]
			}
		},
		"distribution": {
			"iterations": 256,
			"x": {
				"extent": [0, 15],
				"distribution": "fixed_grid"
			},
			"y": 0,
			"z": {
				"extent": [0, 15],
				"distribution": "fixed_grid"
			}
		}
	}
}
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

In this we have set the iteration to 256 as the area of a whole chunk is 256 (16x16) to make the columns generate in the whole chunk.

And our custom noise based terrain is finished! Feel free to mess with the values.

Contributors