Beispiel #1
0
void MapgenIndev::calculateNoise() {
    MapgenV6::calculateNoise();
    if (!(flags & MG_FLAT)) {
        float_islands_prepare(node_min, node_max, sp->float_islands);
    }

    layers_prepare(node_min, node_max);

    cave_prepare(node_min, node_max, sp->paramsj.get("cave_indev", -100).asInt());
}
Beispiel #2
0
void MapgenV7::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);

	blockseed = getBlockSeed2(full_node_min, seed);

	// Make some noise
	calculateNoise();

	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, mountains, and ridges with initial heightmaps
	s16 stone_surface_max_y = generateTerrain();

	// 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);

	generateExperimental();

	if (flags & MG_CAVES)
		generateCaves(stone_surface_max_y);

	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());

	updateLiquid(full_node_min, full_node_max);

	if (flags & MG_LIGHT)
		calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
			full_node_min, full_node_max);

	//setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
	//			node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);

	this->generating = false;
}
Beispiel #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;
}