예제 #1
0
int MapgenV7::generateTerrain() {
	int ymax = generateBaseTerrain();

	if (spflags & MGV7_MOUNTAINS)
		generateMountainTerrain();

	if (spflags & MGV7_RIDGES)
		generateRidgeTerrain();

	return ymax;
}
예제 #2
0
int MapgenV7::generateTerrain()
{
	s16 stone_surface_min_y;
	s16 stone_surface_max_y;

	generateBaseTerrain(&stone_surface_min_y, &stone_surface_max_y);

	if ((spflags & MGV7_MOUNTAINS) && stone_surface_min_y < node_max.Y)
		stone_surface_max_y = generateMountainTerrain(stone_surface_max_y);

	if (spflags & MGV7_RIDGES)
		generateRidgeTerrain();

	return stone_surface_max_y;
}
예제 #3
0
void MapgenV5::makeChunk(BlockMakeData *data)
{
    // Pre-conditions
    assert(data->vmanip);
    assert(data->nodedef);
    assert(data->blockpos_requested.X >= data->blockpos_min.X &&
           data->blockpos_requested.Y >= data->blockpos_min.Y &&
           data->blockpos_requested.Z >= data->blockpos_min.Z);
    assert(data->blockpos_requested.X <= data->blockpos_max.X &&
           data->blockpos_requested.Y <= data->blockpos_max.Y &&
           data->blockpos_requested.Z <= data->blockpos_max.Z);

    this->generating = true;
    this->vm   = data->vmanip;
    this->ndef = data->nodedef;
    //TimeTaker t("makeChunk");

    v3s16 blockpos_min = data->blockpos_min;
    v3s16 blockpos_max = data->blockpos_max;
    node_min = blockpos_min * MAP_BLOCKSIZE;
    node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
    full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
    full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);

    // Create a block-specific seed
    blockseed = getBlockSeed2(full_node_min, seed);


    //freeminer:
    if (float_islands && node_max.Y >= float_islands) {
        float_islands_prepare(node_min, node_max, float_islands);
    }

    layers_prepare(node_min, node_max);
    //==========

    // Generate base terrain
    s16 stone_surface_max_y = generateBaseTerrain();

    // Create heightmap
    updateHeightmap(node_min, node_max);

    // Init biome generator, place biome-specific nodes, and build biomemap
    biomegen->calcBiomeNoise(node_min);
    MgStoneType stone_type = generateBiomes();

    // Generate caves
    if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
        generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);

    // Generate dungeons and desert temples
    if (flags & MG_DUNGEONS)
        generateDungeons(stone_surface_max_y, stone_type);

    // Generate the registered decorations
    if (flags & MG_DECORATIONS)
        m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

    // Generate the registered ores
    m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

    // Sprinkle some dust on top after everything else was generated
    dustTopNodes();

    //printf("makeChunk: %dms\n", t.stop());

    // Add top and bottom side of water to transforming_liquid queue
    updateLiquid(full_node_min, full_node_max);

    // Calculate lighting
    if (flags & MG_LIGHT) {
        calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
                     full_node_min, full_node_max);
    }

    this->generating = false;
}
예제 #4
0
void MapgenV5::makeChunk(BlockMakeData *data)
{
	// Pre-conditions
	assert(data->vmanip);
	assert(data->nodedef);
	assert(data->blockpos_requested.X >= data->blockpos_min.X &&
		data->blockpos_requested.Y >= data->blockpos_min.Y &&
		data->blockpos_requested.Z >= data->blockpos_min.Z);
	assert(data->blockpos_requested.X <= data->blockpos_max.X &&
		data->blockpos_requested.Y <= data->blockpos_max.Y &&
		data->blockpos_requested.Z <= data->blockpos_max.Z);

	generating = true;
	vm   = data->vmanip;
	ndef = data->nodedef;
	//TimeTaker t("makeChunk");

	v3s16 blockpos_min = data->blockpos_min;
	v3s16 blockpos_max = data->blockpos_max;
	node_min = blockpos_min * MAP_BLOCKSIZE;
	node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
	full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
	full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);

	// Create a block-specific seed
	blockseed = getBlockSeed2(full_node_min, seed);

	// Make some noise
	calculateNoise();

	// Generate base terrain
	s16 stone_surface_max_y = generateBaseTerrain();

	// Create heightmap
	updateHeightmap(node_min, node_max);

	// Create biomemap at heightmap surface
	bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
		noise_humidity->result, heightmap, biomemap);

	// Actually place the biome-specific nodes
	MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);

	// Generate caves
	if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
		generateCaves(stone_surface_max_y);

	// Generate dungeons and desert temples
	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
		DungeonParams dp;

		dp.np_rarity  = nparams_dungeon_rarity;
		dp.np_density = nparams_dungeon_density;
		dp.np_wetness = nparams_dungeon_wetness;
		dp.c_water    = c_water_source;
		if (stone_type == STONE) {
			dp.c_cobble = c_cobble;
			dp.c_moss   = c_mossycobble;
			dp.c_stair  = c_stair_cobble;

			dp.diagonal_dirs = false;
			dp.mossratio     = 3.0;
			dp.holesize      = v3s16(1, 2, 1);
			dp.roomsize      = v3s16(0, 0, 0);
			dp.notifytype    = GENNOTIFY_DUNGEON;
		} else if (stone_type == DESERT_STONE) {
			dp.c_cobble = c_desert_stone;
			dp.c_moss   = c_desert_stone;
			dp.c_stair  = c_desert_stone;

			dp.diagonal_dirs = true;
			dp.mossratio     = 0.0;
			dp.holesize      = v3s16(2, 3, 2);
			dp.roomsize      = v3s16(2, 5, 2);
			dp.notifytype    = GENNOTIFY_TEMPLE;
		} else if (stone_type == SANDSTONE) {
			dp.c_cobble = c_sandstonebrick;
			dp.c_moss   = c_sandstonebrick;
			dp.c_stair  = c_sandstonebrick;

			dp.diagonal_dirs = false;
			dp.mossratio     = 0.0;
			dp.holesize      = v3s16(2, 2, 2);
			dp.roomsize      = v3s16(2, 0, 2);
			dp.notifytype    = GENNOTIFY_DUNGEON;
		}

		DungeonGen dgen(this, &dp);
		dgen.generate(blockseed, full_node_min, full_node_max);
	}

	// Generate the registered decorations
	m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

	// Generate the registered ores
	m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

	// Sprinkle some dust on top after everything else was generated
	dustTopNodes();

	//printf("makeChunk: %dms\n", t.stop());

	// Add top and bottom side of water to transforming_liquid queue
	updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);

	// Calculate lighting
	if (flags & MG_LIGHT) {
		calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
			full_node_min, full_node_max);
	}

	this->generating = false;
}
예제 #5
0
void MapgenV5::makeChunk(BlockMakeData *data)
{
	// Pre-conditions
	assert(data->vmanip);
	assert(data->nodedef);
	assert(data->blockpos_requested.X >= data->blockpos_min.X &&
		data->blockpos_requested.Y >= data->blockpos_min.Y &&
		data->blockpos_requested.Z >= data->blockpos_min.Z);
	assert(data->blockpos_requested.X <= data->blockpos_max.X &&
		data->blockpos_requested.Y <= data->blockpos_max.Y &&
		data->blockpos_requested.Z <= data->blockpos_max.Z);

	this->generating = true;
	this->vm   = data->vmanip;
	this->ndef = data->nodedef;
	//TimeTaker t("makeChunk");

	v3s16 blockpos_min = data->blockpos_min;
	v3s16 blockpos_max = data->blockpos_max;
	node_min = blockpos_min * MAP_BLOCKSIZE;
	node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
	full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
	full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);

	// Create a block-specific seed
	blockseed = getBlockSeed2(full_node_min, seed);

	// Generate base terrain
	s16 stone_surface_max_y = generateBaseTerrain();

	// Create heightmap
	updateHeightmap(node_min, node_max);

	// Init biome generator, place biome-specific nodes, and build biomemap
	biomegen->calcBiomeNoise(node_min);
	generateBiomes();

	// Generate tunnels, caverns and large randomwalk caves
	if (flags & MG_CAVES) {
		// Generate tunnels first as caverns confuse them
		generateCavesNoiseIntersection(stone_surface_max_y);

		// Generate caverns
		bool near_cavern = false;
		if (spflags & MGV5_CAVERNS)
			near_cavern = generateCavernsNoise(stone_surface_max_y);

		// Generate large randomwalk caves
		if (near_cavern)
			// Disable large randomwalk caves in this mapchunk by setting
			// 'large cave depth' to world base. Avoids excessive liquid in
			// large caverns and floating blobs of overgenerated liquid.
			generateCavesRandomWalk(stone_surface_max_y,
				-MAX_MAP_GENERATION_LIMIT);
		else
			generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
	}

	// Generate dungeons and desert temples
	if ((flags & MG_DUNGEONS) && full_node_min.Y >= dungeon_ymin &&
			full_node_max.Y <= dungeon_ymax)
		generateDungeons(stone_surface_max_y);

	// Generate the registered decorations
	if (flags & MG_DECORATIONS)
		m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

	// Generate the registered ores
	m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

	// Sprinkle some dust on top after everything else was generated
	dustTopNodes();

	//printf("makeChunk: %dms\n", t.stop());

	// Add top and bottom side of water to transforming_liquid queue
	updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);

	// Calculate lighting
	if (flags & MG_LIGHT) {
		calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
			full_node_min, full_node_max);
	}

	this->generating = false;
}