Chunk Generator Chunk Gen Section - ShaneBeee/SkBee GitHub Wiki

Time to generate a chunk.
This section is called once per chunk.

EXPRESSIONS:

Let's look at some available expression you can use in this section.

ChunkData Biome:

chunk[ ]data biome at %vector%

This expression is used to get a biome at a specific point in the chunk.
You may want this to decide which block to place.
The vector represents a position in the chunk not a position in the world. (ie: x/z values are from 0-15)

ChunkData Block:

chunk[ ]data block[data] at %vector%

This expression is used to set a block in a chunk during generation.
Same as the biome expression, the vector represents a position in the chunk not in the world.

ChunkData Blocks:

chunk[ ]data block[data]s (between|within) %vector% (and|to) %vector%

Similar to the ChunkData Block expression, this can be used to quickly fill a bunch of blocks at once.
Same as the above expression, the vector represents a position in the chunk not in the world.

ChunkData Chunk X/Z:

chunk[ ]data chunk (:x|z)

This expression is used to the get X/Z coordinations of a chunk.
You can multiply this number by 16 to help get where in the world a block is located. This can be used to help with noise generation.

EXAMPLES:

Simple Example:

In this example we're simply filling the underground layers with red concrete and setting the top surface layer to red concrete powder.

chunk gen:
	loop 16 times:
		loop 16 times:
			set {_x} to (loop-number-1) - 1
			set {_z} to (loop-number-2) - 1

			# This is a custom expression I have created in my own script, this is not from SkBee
			# This is just meant to give you an idea of how noise works
			set {_n} to biome noise at vector({_x} + (chunkdata chunk x * 16), 1, {_z} + (chunkdata chunk z * 16))
			# Now we set the blocks from 0 to our noise level filling in our world
			set chunkdata blocks within vector({_x}, 0, {_z}) and vector({_x}, {_n}, {_z}) to red_concrete[]
			# Now we set our surface layer
			set chunkdata block at vector({_x}, {_n}, {_z}) to red_concrete_powder[]

Visual:

Here is how it looks in the world.

Complex Example:

In this example we're doing a heck of a lot more work. Again using noise maps to be able to determine where blocks are going.
Also used in conjunction with a biome map to determine which blocks are placed per different types of biomes.
We also have an ocean/water layer in this as well.

chunk gen:
	loop 16 times:
		loop 16 times:
			set {_x} to (loop-number-1) - 1
			set {_z} to (loop-number-2) - 1
			set {_n} to block noise at ({_x} + (16 * chunkdata chunk x)), ({_z} + (16 * chunkdata chunk z))

			set {_top} to {_n} if {_n} > 64 else 64

			# Fill stone
			set chunkdata blocks between vector({_x},-64,{_z}) and vector(({_x}),({_n}),({_z})) to stone[]
			

			# Place surface
			loop integers between {_n} and {_top}:
				set {_y} to loop-number-3
				set {_biome} to calculated biome at vector({_x} + (16 * chunkdata chunk x), {_y}, {_z} + (16 * chunkdata chunk z))
				
				# Surface
				if {_y} = {_n}:
					if {_y} > 64:
						if {_biome} = desert, badlands or beach:
							set {_data} to sand[]
						else if all:
							{_biome} = mangrove swamp
							chance of 45%
						then:
							set {_data} to mud[]
						else:
							set {_data} to grass_block[]
					else:
						set {_data} to sand[]

				# Water
				else if all:
					{_y} > {_n}
					{_y} < 64
				then:
					set {_data} to water[]

				if {_data} is set:
					set chunkdata block at vector({_x}, {_y}, {_z}) to {_data}
					if {_data} is grass_block[] or mud[]:
						set {_below} to dirt[]
					else if {_data} is sand[]:
						set {_below} to sandstone[]
					if {_below} is set:
						loop 3 times:
							set {_yy} to loop-number-4
							set chunkdata block at vector({_x}, {_y} - {_yy}, {_z}) to {_below}
					delete {_data}
					delete {_below}

Visual:

Here is how it looks in game: