Prevent spawning in rivers with valleys mapgen. Remove unecessary whitespace.
parent
a58c0f458d
commit
752d820206
|
@ -185,19 +185,19 @@ MapgenValleys::~MapgenValleys()
|
||||||
MapgenValleysParams::MapgenValleysParams()
|
MapgenValleysParams::MapgenValleysParams()
|
||||||
{
|
{
|
||||||
spflags = MG_VALLEYS_CLIFFS | MG_VALLEYS_RUGGED
|
spflags = MG_VALLEYS_CLIFFS | MG_VALLEYS_RUGGED
|
||||||
| MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL;
|
| MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL;
|
||||||
|
|
||||||
altitude_chill = 90; // The altitude at which temperature drops by 20C.
|
altitude_chill = 90; // The altitude at which temperature drops by 20C.
|
||||||
// Water in caves will never be higher than this.
|
// Water in caves will never be higher than this.
|
||||||
cave_water_max_height = MAX_MAP_GENERATION_LIMIT;
|
cave_water_max_height = MAX_MAP_GENERATION_LIMIT;
|
||||||
humidity = 50;
|
humidity = 50;
|
||||||
// the maximum humidity around rivers in otherwise dry areas
|
// the maximum humidity around rivers in otherwise dry areas
|
||||||
humidity_break_point = 65;
|
humidity_break_point = 65;
|
||||||
lava_max_height = 0; // Lava will never be higher than this.
|
lava_max_height = 0; // Lava will never be higher than this.
|
||||||
river_depth = 4; // How deep to carve river channels.
|
river_depth = 4; // How deep to carve river channels.
|
||||||
river_size = 5; // How wide to make rivers.
|
river_size = 5; // How wide to make rivers.
|
||||||
temperature = 50;
|
temperature = 50;
|
||||||
water_features = 3; // How often water will occur in caves.
|
water_features = 3; // How often water will occur in caves.
|
||||||
|
|
||||||
np_cliffs = NoiseParams(0.f, 1.f, v3f(750, 750, 750), 8445, 5, 1.f, 2.f);
|
np_cliffs = NoiseParams(0.f, 1.f, v3f(750, 750, 750), 8445, 5, 1.f, 2.f);
|
||||||
np_corr = NoiseParams(0.f, 1.f, v3f(40, 40, 40), -3536, 4, 1.f, 2.f);
|
np_corr = NoiseParams(0.f, 1.f, v3f(40, 40, 40), -3536, 4, 1.f, 2.f);
|
||||||
|
@ -285,7 +285,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
|
||||||
data->blockpos_requested.Z <= data->blockpos_max.Z);
|
data->blockpos_requested.Z <= data->blockpos_max.Z);
|
||||||
|
|
||||||
this->generating = true;
|
this->generating = true;
|
||||||
this->vm = data->vmanip;
|
this->vm = data->vmanip;
|
||||||
this->ndef = data->nodedef;
|
this->ndef = data->nodedef;
|
||||||
|
|
||||||
//TimeTaker t("makeChunk");
|
//TimeTaker t("makeChunk");
|
||||||
|
@ -375,9 +375,9 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
|
||||||
|
|
||||||
if (flags & MG_LIGHT)
|
if (flags & MG_LIGHT)
|
||||||
calcLighting(
|
calcLighting(
|
||||||
node_min - v3s16(0, 1, 0),
|
node_min - v3s16(0, 1, 0),
|
||||||
node_max + v3s16(0, 1, 0),
|
node_max + v3s16(0, 1, 0),
|
||||||
full_node_min,
|
full_node_min,
|
||||||
full_node_max);
|
full_node_max);
|
||||||
|
|
||||||
//mapgen_profiler->avg("liquid_lighting", tll.stop() / 1000.f);
|
//mapgen_profiler->avg("liquid_lighting", tll.stop() / 1000.f);
|
||||||
|
@ -535,7 +535,7 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fast_terrain) {
|
if (fast_terrain) {
|
||||||
// The penultimate step builds up the heights, but we reduce it
|
// The penultimate step builds up the heights, but we reduce it
|
||||||
// occasionally to create cliffs.
|
// occasionally to create cliffs.
|
||||||
float delta = sin(tn->inter_valley_fill) * *tn->slope;
|
float delta = sin(tn->inter_valley_fill) * *tn->slope;
|
||||||
if (cliff_terrain && tn->cliffs >= 0.2f)
|
if (cliff_terrain && tn->cliffs >= 0.2f)
|
||||||
|
@ -544,8 +544,8 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
|
||||||
mount += delta;
|
mount += delta;
|
||||||
|
|
||||||
// Use yet another noise to make the heights look more rugged.
|
// Use yet another noise to make the heights look more rugged.
|
||||||
if (rugged_terrain
|
if (rugged_terrain
|
||||||
&& mount > water_level
|
&& mount > water_level
|
||||||
&& fabs(inter_valley_slope * tn->inter_valley_fill) < 0.3f)
|
&& fabs(inter_valley_slope * tn->inter_valley_fill) < 0.3f)
|
||||||
mount += ((delta < 0.f) ? -1.f : 1.f) * pow(fabs(delta), 0.5f) * fabs(sin(tn->corr));
|
mount += ((delta < 0.f) ? -1.f : 1.f) * pow(fabs(delta), 0.5f) * fabs(sin(tn->corr));
|
||||||
}
|
}
|
||||||
|
@ -576,9 +576,9 @@ float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn)
|
||||||
|
|
||||||
|
|
||||||
float MapgenValleys::humidityByTerrain(
|
float MapgenValleys::humidityByTerrain(
|
||||||
float humidity_base,
|
float humidity_base,
|
||||||
float mount,
|
float mount,
|
||||||
float rivers,
|
float rivers,
|
||||||
float valley)
|
float valley)
|
||||||
{
|
{
|
||||||
// Although the original valleys adjusts humidity by distance
|
// Although the original valleys adjusts humidity by distance
|
||||||
|
@ -603,9 +603,23 @@ float MapgenValleys::humidityByTerrain(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline int MapgenValleys::getGroundLevelAtPoint(v2s16 p)
|
int MapgenValleys::getGroundLevelAtPoint(v2s16 p)
|
||||||
{
|
{
|
||||||
// Base terrain calculation
|
// ***********************************************
|
||||||
|
// This method (deliberately) does not return correct
|
||||||
|
// terrain values. This may be a problem in the future.
|
||||||
|
// ***********************************************
|
||||||
|
|
||||||
|
// Since MT doesn't normally deal with rivers, check
|
||||||
|
// to make sure this isn't a request for a location
|
||||||
|
// in a river.
|
||||||
|
float rivers = NoisePerlin2D(&noise_rivers->np, p.X, p.Y, seed);
|
||||||
|
|
||||||
|
// If it's wet, return an unusable number.
|
||||||
|
if (fabs(rivers) < river_size)
|
||||||
|
return MAX_MAP_GENERATION_LIMIT;
|
||||||
|
|
||||||
|
// Otherwise, return the real result.
|
||||||
return terrainLevelAtPoint(p.X, p.Y);
|
return terrainLevelAtPoint(p.X, p.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,14 +723,14 @@ int MapgenValleys::generateTerrain()
|
||||||
if (!fast_terrain) {
|
if (!fast_terrain) {
|
||||||
// Assign the humidity adjusted by water proximity.
|
// Assign the humidity adjusted by water proximity.
|
||||||
noise_humidity->result[index_2d] = humidityByTerrain(
|
noise_humidity->result[index_2d] = humidityByTerrain(
|
||||||
noise_humidity->result[index_2d],
|
noise_humidity->result[index_2d],
|
||||||
surface_max_y,
|
surface_max_y,
|
||||||
noise_rivers->result[index_2d],
|
noise_rivers->result[index_2d],
|
||||||
noise_valley_depth->result[index_2d]);
|
noise_valley_depth->result[index_2d]);
|
||||||
|
|
||||||
// Assign the heat adjusted by altitude. See humidity, above.
|
// Assign the heat adjusted by altitude. See humidity, above.
|
||||||
if (use_altitude_chill && surface_max_y > 0)
|
if (use_altitude_chill && surface_max_y > 0)
|
||||||
noise_heat->result[index_2d]
|
noise_heat->result[index_2d]
|
||||||
*= pow(0.5f, (surface_max_y - altitude_chill / 3.f) / altitude_chill);
|
*= pow(0.5f, (surface_max_y - altitude_chill / 3.f) / altitude_chill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -759,15 +773,15 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
|
||||||
// 1. At the surface of stone below air or water.
|
// 1. At the surface of stone below air or water.
|
||||||
// 2. At the surface of water below air.
|
// 2. At the surface of water below air.
|
||||||
// 3. When stone or water is detected but biome has not yet been calculated.
|
// 3. When stone or water is detected but biome has not yet been calculated.
|
||||||
if ((c == c_stone && (air_above || water_above || !biome))
|
if ((c == c_stone && (air_above || water_above || !biome))
|
||||||
|| ((c == c_water_source || c == c_river_water_source)
|
|| ((c == c_water_source || c == c_river_water_source)
|
||||||
&& (air_above || !biome))) {
|
&& (air_above || !biome))) {
|
||||||
// Both heat and humidity have already been adjusted for altitude.
|
// Both heat and humidity have already been adjusted for altitude.
|
||||||
biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
|
biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
|
||||||
|
|
||||||
depth_top = biome->depth_top;
|
depth_top = biome->depth_top;
|
||||||
base_filler = MYMAX(depth_top
|
base_filler = MYMAX(depth_top
|
||||||
+ biome->depth_filler
|
+ biome->depth_filler
|
||||||
+ noise_filler_depth->result[index], 0.f);
|
+ noise_filler_depth->result[index], 0.f);
|
||||||
depth_water_top = biome->depth_water_top;
|
depth_water_top = biome->depth_water_top;
|
||||||
|
|
||||||
|
@ -787,8 +801,8 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
|
||||||
// any top/filler nodes above are structurally supported.
|
// any top/filler nodes above are structurally supported.
|
||||||
// This is done by aborting the cycle of top/filler placement
|
// This is done by aborting the cycle of top/filler placement
|
||||||
// immediately by forcing nplaced to stone level.
|
// immediately by forcing nplaced to stone level.
|
||||||
if (c_below == CONTENT_AIR
|
if (c_below == CONTENT_AIR
|
||||||
|| c_below == c_water_source
|
|| c_below == c_water_source
|
||||||
|| c_below == c_river_water_source)
|
|| c_below == c_river_water_source)
|
||||||
nplaced = U16_MAX;
|
nplaced = U16_MAX;
|
||||||
|
|
||||||
|
@ -805,7 +819,7 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
|
||||||
air_above = false;
|
air_above = false;
|
||||||
water_above = false;
|
water_above = false;
|
||||||
} else if (c == c_water_source) {
|
} else if (c == c_water_source) {
|
||||||
vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
|
vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
|
||||||
? biome->c_water_top : biome->c_water);
|
? biome->c_water_top : biome->c_water);
|
||||||
nplaced = 0; // Enable top/filler placement for next surface
|
nplaced = 0; // Enable top/filler placement for next surface
|
||||||
air_above = false;
|
air_above = false;
|
||||||
|
@ -910,8 +924,8 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
|
||||||
index_3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride + (x - node_min.X);
|
index_3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride + (x - node_min.X);
|
||||||
|
|
||||||
// Dig caves on down loop to check for air above.
|
// Dig caves on down loop to check for air above.
|
||||||
for (s16 y = node_max.Y + 1;
|
for (s16 y = node_max.Y + 1;
|
||||||
y >= node_min.Y - 1;
|
y >= node_min.Y - 1;
|
||||||
y--, index_3d -= ystride, vm->m_area.add_y(em, index_data, -1)) {
|
y--, index_3d -= ystride, vm->m_area.add_y(em, index_data, -1)) {
|
||||||
float terrain = noise_terrain_height->result[index_2d];
|
float terrain = noise_terrain_height->result[index_2d];
|
||||||
|
|
||||||
|
@ -936,7 +950,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
|
||||||
// When both n's are true, we're in a cave.
|
// When both n's are true, we're in a cave.
|
||||||
vm->m_data[index_data] = n_air;
|
vm->m_data[index_data] = n_air;
|
||||||
air_above = true;
|
air_above = true;
|
||||||
} else if (air_above
|
} else if (air_above
|
||||||
&& (c == c_stone || c == c_sandstone || c == c_desert_stone)) {
|
&& (c == c_stone || c == c_sandstone || c == c_desert_stone)) {
|
||||||
// At the cave floor
|
// At the cave floor
|
||||||
s16 sr = ps.next() & 1023;
|
s16 sr = ps.next() & 1023;
|
||||||
|
@ -959,7 +973,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (base_water_chance > 0 && y <= cave_water_max_height) {
|
if (base_water_chance > 0 && y <= cave_water_max_height) {
|
||||||
s16 water_chance = base_water_chance
|
s16 water_chance = base_water_chance
|
||||||
- (abs(y - water_level) / (water_features * 1000));
|
- (abs(y - water_level) / (water_features * 1000));
|
||||||
|
|
||||||
// Waterfalls may get out of control above ground.
|
// Waterfalls may get out of control above ground.
|
||||||
|
|
|
@ -81,15 +81,15 @@ struct MapgenValleysParams : public MapgenSpecificParams {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TerrainNoise {
|
struct TerrainNoise {
|
||||||
s16 x;
|
s16 x;
|
||||||
s16 z;
|
s16 z;
|
||||||
float terrain_height;
|
float terrain_height;
|
||||||
float *rivers;
|
float *rivers;
|
||||||
float *valley;
|
float *valley;
|
||||||
float valley_profile;
|
float valley_profile;
|
||||||
float *slope;
|
float *slope;
|
||||||
float inter_valley_fill;
|
float inter_valley_fill;
|
||||||
float cliffs;
|
float cliffs;
|
||||||
float corr;
|
float corr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ public:
|
||||||
~MapgenValleys();
|
~MapgenValleys();
|
||||||
|
|
||||||
virtual void makeChunk(BlockMakeData *data);
|
virtual void makeChunk(BlockMakeData *data);
|
||||||
inline int getGroundLevelAtPoint(v2s16 p);
|
int getGroundLevelAtPoint(v2s16 p);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EmergeManager *m_emerge;
|
EmergeManager *m_emerge;
|
||||||
|
|
Loading…
Reference in New Issue