3 #include "environment.h"
5 #include "server/biomes.h"
6 #include "server/mapgen.h"
7 #include "server/server_map.h"
10 void mapgen_set_node(v3s32 pos, MapNode node, MapgenStage mgs, List *changed_blocks)
12 MapgenSetNodeArg arg = {
14 .changed_blocks = changed_blocks,
16 map_set_node(server_map.map, pos, node, true, &arg);
19 // generate a block (does not manage block state or threading)
20 void mapgen_generate_block(MapBlock *block, List *changed_blocks)
22 MapBlockExtraData *extra = block->extra;
24 v3s32 block_node_pos = {block->pos.x * MAPBLOCK_SIZE, block->pos.y * MAPBLOCK_SIZE, block->pos.z * MAPBLOCK_SIZE};
26 char *block_data[BIOME_COUNT] = {NULL};
27 bool preprocessed_block[BIOME_COUNT];
29 for (u8 x = 0; x < MAPBLOCK_SIZE; x++) {
30 s32 pos_x = block_node_pos.x + x;
32 for (u8 z = 0; z < MAPBLOCK_SIZE; z++) {
33 v2s32 pos_horizontal = {pos_x, block_node_pos.z + z};
35 s32 height = (pnoise2d(U32(pos_horizontal.x) / 32.0, U32(pos_horizontal.y) / 32.0, 0.45, 5, seed + SO_HEIGHT) * 16.0)
36 * (pnoise2d(U32(pos_horizontal.x) / 256.0, U32(pos_horizontal.y) / 256.0, 0.45, 5, seed + SO_HILLYNESS) * 0.5 + 0.5)
40 Biome biome = get_biome(pos_horizontal, &factor);
41 BiomeDef *biome_def = &biomes[biome];
43 if (biome_def->block_data_size > 0 && ! block_data[biome])
44 block_data[biome] = malloc(biome_def->block_data_size);
46 if (biome_def->preprocess_block && ! preprocessed_block[biome]) {
47 biome_def->preprocess_block(block, changed_blocks, block_data[biome]);
48 preprocessed_block[biome] = true;
51 char row_data[biome_def->row_data_size];
53 if (biome_def->preprocess_row)
54 biome_def->preprocess_row(pos_horizontal, height, factor, row_data, block_data[biome]);
56 height = biome_def->height(pos_horizontal, factor, height, row_data, block_data[biome]);
58 for (u8 y = 0; y < MAPBLOCK_SIZE; y++) {
59 v3s32 pos = {pos_horizontal.x, block_node_pos.y + y, pos_horizontal.y};
61 f64 humidity = get_humidity(pos);
62 f64 temperature = get_temperature(pos);
64 s32 diff = pos.y - height;
66 Node node = biome_def->generate(pos, diff, humidity, temperature, factor, block, changed_blocks, row_data, block_data[biome]);
68 if (biome_def->snow && diff <= 1 && temperature < 0.0 && node == NODE_AIR)
71 pthread_mutex_lock(&block->mtx);
72 if (extra->mgs_buffer[x][y][z] <= MGS_TERRAIN) {
73 block->data[x][y][z] = map_node_create(node);
74 extra->mgs_buffer[x][y][z] = MGS_TERRAIN;
76 pthread_mutex_unlock(&block->mtx);
81 for (Biome i = 0; i < BIOME_COUNT; i++) {