/*
Minetest
-Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com>
-Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2014-2017 paramat
+Copyright (C) 2010-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+Copyright (C) 2014-2018 paramat
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
/////////////////////////////////////////////////////////////////////////////
-MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenV6::MapgenV6(MapgenV6Params *params, EmergeManager *emerge)
+ : Mapgen(MAPGEN_V6, params, emerge)
{
m_emerge = emerge;
ystride = csize.X; //////fix this
heightmap = new s16[csize.X * csize.Z];
- spflags = params->spflags;
- freq_desert = params->freq_desert;
- freq_beach = params->freq_beach;
+ spflags = params->spflags;
+ freq_desert = params->freq_desert;
+ freq_beach = params->freq_beach;
+ dungeon_ymin = params->dungeon_ymin;
+ dungeon_ymax = params->dungeon_ymax;
np_cave = ¶ms->np_cave;
np_humidity = ¶ms->np_humidity;
csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
//// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
+ const NodeDefManager *ndef = emerge->ndef;
c_stone = ndef->getId("mapgen_stone");
c_dirt = ndef->getId("mapgen_dirt");
settings->getFlagStrNoEx("mgv6_spflags", spflags, flagdesc_mapgen_v6);
settings->getFloatNoEx("mgv6_freq_desert", freq_desert);
settings->getFloatNoEx("mgv6_freq_beach", freq_beach);
+ settings->getS16NoEx("mgv6_dungeon_ymin", dungeon_ymin);
+ settings->getS16NoEx("mgv6_dungeon_ymax", dungeon_ymax);
settings->getNoiseParams("mgv6_np_terrain_base", np_terrain_base);
settings->getNoiseParams("mgv6_np_terrain_higher", np_terrain_higher);
settings->setFlagStr("mgv6_spflags", spflags, flagdesc_mapgen_v6, U32_MAX);
settings->setFloat("mgv6_freq_desert", freq_desert);
settings->setFloat("mgv6_freq_beach", freq_beach);
+ settings->setS16("mgv6_dungeon_ymin", dungeon_ymin);
+ settings->setS16("mgv6_dungeon_ymax", dungeon_ymax);
settings->setNoiseParams("mgv6_np_terrain_base", np_terrain_base);
settings->setNoiseParams("mgv6_np_terrain_higher", np_terrain_higher);
if (c != CONTENT_IGNORE && (c == c_stone || c == c_desert_stone))
break;
- vm->m_area.add_y(em, i, -1);
+ VoxelArea::add_y(em, i, -1);
}
return (y >= y_nodes_min) ? y : y_nodes_min - 1;
}
updateHeightmap(node_min, node_max);
// Add dungeons
- if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
+ if ((flags & MG_DUNGEONS) && stone_surface_max_y >= node_min.Y &&
+ full_node_min.Y >= dungeon_ymin && full_node_max.Y <= dungeon_ymax) {
DungeonParams dp;
dp.seed = seed;
- dp.c_water = c_water_source;
- dp.c_river_water = c_water_source;
-
dp.only_in_ground = true;
dp.corridor_len_min = 1;
dp.corridor_len_max = 13;
dp.rooms_min = 2;
dp.rooms_max = 16;
- dp.y_min = -MAX_MAP_GENERATION_LIMIT;
- dp.y_max = MAX_MAP_GENERATION_LIMIT;
dp.np_density
= NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
vm->m_data[i] = n_air;
}
}
- vm->m_area.add_y(em, i, 1);
+ VoxelArea::add_y(em, i, 1);
}
}
vm->m_data[i] = addnode;
mudcount++;
- vm->m_area.add_y(em, i, 1);
+ VoxelArea::add_y(em, i, 1);
}
}
}
n->getContent() == c_gravel)
break;
- vm->m_area.add_y(em, i, -1);
+ VoxelArea::add_y(em, i, -1);
}
// Stop if out of area
// Don't flow it if the stuff under it is not mud
{
u32 i2 = i;
- vm->m_area.add_y(em, i2, -1);
+ VoxelArea::add_y(em, i2, -1);
// Cancel if out of area
if (!vm->m_area.contains(i2))
continue;
}
}
- v3s16 dirs4[4] = {
+ static const v3s16 dirs4[4] = {
v3s16(0, 0, 1), // back
v3s16(1, 0, 0), // right
v3s16(0, 0, -1), // front
// Check that upper is walkable. Cancel
// dropping if upper keeps it in place.
u32 i3 = i;
- vm->m_area.add_y(em, i3, 1);
+ VoxelArea::add_y(em, i3, 1);
MapNode *n3 = NULL;
if (vm->m_area.contains(i3)) {
for (const v3s16 &dirp : dirs4) {
u32 i2 = i;
// Move to side
- vm->m_area.add_p(em, i2, dirp);
+ VoxelArea::add_p(em, i2, dirp);
// Fail if out of area
if (!vm->m_area.contains(i2))
continue;
if (ndef->get(*n2).walkable)
continue;
// Check that under side is air
- vm->m_area.add_y(em, i2, -1);
+ VoxelArea::add_y(em, i2, -1);
if (!vm->m_area.contains(i2))
continue;
n2 = &vm->m_data[i2];
// Loop further down until not air
bool dropped_to_unknown = false;
do {
- vm->m_area.add_y(em, i2, -1);
+ VoxelArea::add_y(em, i2, -1);
n2 = &vm->m_data[i2];
// if out of known area
if (!vm->m_area.contains(i2) ||
}
} while (!ndef->get(*n2).walkable);
// Loop one up so that we're in air
- vm->m_area.add_y(em, i2, 1);
+ VoxelArea::add_y(em, i2, 1);
// Move mud to new place. Outside mapchunk remove
// any decorations above removed or placed mud.
vm->m_data[above_remove_index].getContent() != c_water_source &&
vm->m_data[above_remove_index].getContent() != CONTENT_IGNORE) {
vm->m_data[above_remove_index] = n_air;
- vm->m_area.add_y(em, above_remove_index, 1);
+ VoxelArea::add_y(em, above_remove_index, 1);
}
// Mud placed may have partially-buried a stacked decoration, search
// above and remove.
- vm->m_area.add_y(em, place_index, 1);
+ VoxelArea::add_y(em, place_index, 1);
while (vm->m_area.contains(place_index) &&
vm->m_data[place_index].getContent() != CONTENT_AIR &&
vm->m_data[place_index].getContent() != c_water_source &&
vm->m_data[place_index].getContent() != CONTENT_IGNORE) {
vm->m_data[place_index] = n_air;
- vm->m_area.add_y(em, place_index, 1);
+ VoxelArea::add_y(em, place_index, 1);
}
}
}
u32 vi = vm->m_area.index(x, y, z);
// place on dirt_with_grass, since we know it is exposed to sunlight
if (vm->m_data[vi].getContent() == c_dirt_with_grass) {
- vm->m_area.add_y(em, vi, 1);
+ VoxelArea::add_y(em, vi, 1);
vm->m_data[vi] = n_junglegrass;
}
}
ndef->get(n).liquid_type != LIQUID_NONE ||
n.getContent() == c_ice)
break;
- vm->m_area.add_y(em, i, -1);
+ VoxelArea::add_y(em, i, -1);
}
surface_y = (y >= full_node_min.Y) ? y : full_node_min.Y;
}
} else if (bt == BT_TUNDRA) {
if (c == c_dirt) {
vm->m_data[i] = n_snowblock;
- vm->m_area.add_y(em, i, -1);
+ VoxelArea::add_y(em, i, -1);
vm->m_data[i] = n_dirt_with_snow;
} else if (c == c_stone && surface_y < node_max.Y) {
- vm->m_area.add_y(em, i, 1);
+ VoxelArea::add_y(em, i, 1);
vm->m_data[i] = n_snowblock;
}
} else if (c == c_dirt) {