diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-02-03 13:48:17 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-02-03 13:48:17 +0200 |
commit | 71dbee43d005ce39fa17834cc34fe4233945e24f (patch) | |
tree | a96201be57f8e6bf49a85bb474ad12a7d1b90127 /src | |
parent | 9b1b57a52390ecc98c27b2f923052511c387ba3d (diff) | |
download | minetest-71dbee43d005ce39fa17834cc34fe4233945e24f.tar.gz minetest-71dbee43d005ce39fa17834cc34fe4233945e24f.tar.bz2 minetest-71dbee43d005ce39fa17834cc34fe4233945e24f.zip |
some generation-time mud flow tweaking
Diffstat (limited to 'src')
-rw-r--r-- | src/defaultsettings.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 5 | ||||
-rw-r--r-- | src/map.cpp | 183 | ||||
-rw-r--r-- | src/utility.h | 6 | ||||
-rw-r--r-- | src/voxel.h | 4 |
5 files changed, 125 insertions, 75 deletions
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 6d61bdd8a..0665cd02e 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -27,7 +27,7 @@ void set_default_settings() g_settings.setDefault("wanted_fps", "30"); g_settings.setDefault("fps_max", "60"); g_settings.setDefault("viewing_range_nodes_max", "300"); - g_settings.setDefault("viewing_range_nodes_min", "28"); + g_settings.setDefault("viewing_range_nodes_min", "35"); g_settings.setDefault("screenW", "800"); g_settings.setDefault("screenH", "600"); g_settings.setDefault("port", ""); diff --git a/src/main.cpp b/src/main.cpp index e6b55e1bf..728de2800 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -350,6 +350,8 @@ Doing now: - Needs method SyncProcessData
* What is the problem with the server constantly saving one or a few
blocks? List the first saved block, maybe it explains.
+* Water doesn't start flowing after map generation like it should
+* Better water generation
======================================================================
@@ -2775,7 +2777,8 @@ int main(int argc, char *argv[]) if(g_settings.getBool("enable_fog") == true)
{
- f32 range = draw_control.wanted_range * BS;
+ //f32 range = draw_control.wanted_range * BS + MAP_BLOCKSIZE/2*BS;
+ f32 range = draw_control.wanted_range * BS + MAP_BLOCKSIZE/3*BS;
if(draw_control.range_all)
range = 100000*BS;
diff --git a/src/map.cpp b/src/map.cpp index 80210cead..9a976614f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1454,8 +1454,9 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks) u32 loopcount = 0; u32 initial_size = m_transforming_liquid.size(); - - //dstream<<"transformLiquids(): initial_size="<<initial_size<<std::endl; + + if(initial_size != 0) + dstream<<"transformLiquids(): initial_size="<<initial_size<<std::endl; while(m_transforming_liquid.size() != 0) { @@ -2321,9 +2322,13 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, Randomize some parameters */ - u32 stone_obstacle_amount = - myrand_range(0, myrand_range(20, 150)); - //myrand_range(0, myrand_range(20, myrand_range(80,150))); + u32 stone_obstacle_amount = 0; + if(myrand() % 2 == 0) + stone_obstacle_amount = myrand_range(0, myrand_range(20, 150)); + else + stone_obstacle_amount = myrand_range(0, myrand_range(20, 50)); + //u32 stone_obstacle_amount = + // myrand_range(0, myrand_range(20, myrand_range(80,150))); /* Loop this part, it will make stuff look older and newer nicely @@ -2375,7 +2380,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, ); // Minimum space left on top of the obstacle - s16 min_head_space = 10; + s16 min_head_space = 12; for(s16 x=-ob_size.X/2; x<ob_size.X/2; x++) for(s16 z=-ob_size.Z/2; z<ob_size.Z/2; z++) @@ -2449,7 +2454,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, } // Add mud count = 0; - for(; y<=y_nodes_max; y++) + for(; y<=y_nodes_max - min_head_space; y++) { MapNode &n = vmanip.m_data[i]; n.d = CONTENT_MUD; @@ -2587,11 +2592,11 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, s16 d1 = d0 + rs - 1; for(s16 z0=d0; z0<=d1; z0++) { - s16 si = rs - abs(z0); + s16 si = rs - MYMAX(0, abs(z0)-rs/4); for(s16 x0=-si; x0<=si-1; x0++) { - s16 maxabsxz = abs(x0)>abs(z0)?abs(x0):abs(z0); - s16 si2 = rs - maxabsxz; + s16 maxabsxz = MYMAX(abs(x0), abs(z0)); + s16 si2 = rs - MYMAX(0, maxabsxz-rs/4); //s16 si2 = rs - abs(x0); for(s16 y0=-si2+1; y0<=si2-1; y0++) { @@ -2638,7 +2643,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, /* Make ore veins */ - for(u32 jj=0; jj<relative_volume/524; jj++) + for(u32 jj=0; jj<relative_volume/2000; jj++) { s16 max_vein_diameter = 3; @@ -2768,6 +2773,8 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, Add mud to the central chunk */ + s16 mud_add_amount = myrand_range(1, 5); + for(s16 x=0; x<sectorpos_base_size*MAP_BLOCKSIZE; x++) for(s16 z=0; z<sectorpos_base_size*MAP_BLOCKSIZE; z++) { @@ -2802,7 +2809,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, MapNode &n = vmanip.m_data[i]; n.d = CONTENT_MUD; mudcount++; - if(mudcount >= 3) + if(mudcount >= mud_add_amount) break; vmanip.m_area.add_y(em, i, 1); @@ -2838,11 +2845,17 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, leaving out removing light from the borders for optimization and simplicity. */ - for(s16 x=0-max_spread_amount+2; + /*for(s16 x=0-max_spread_amount+2; x<sectorpos_base_size*MAP_BLOCKSIZE+max_spread_amount-2; x++) for(s16 z=0-max_spread_amount+2; z<sectorpos_base_size*MAP_BLOCKSIZE+max_spread_amount-2; + z++)*/ + for(s16 x=0-max_spread_amount+1; + x<sectorpos_base_size*MAP_BLOCKSIZE+max_spread_amount-1; + x++) + for(s16 z=0-max_spread_amount+1; + z<sectorpos_base_size*MAP_BLOCKSIZE+max_spread_amount-1; z++) { // Node position in 2d @@ -2850,74 +2863,92 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, v3s16 em = vmanip.m_area.getExtent(); u32 i = vmanip.m_area.index(v3s16(p2d.X, y_nodes_max, p2d.Y)); - s16 y; - // Go to ground level - for(y=y_nodes_max; y>=y_nodes_min; y--) + s16 y=y_nodes_max; + + for(;;) { - MapNode &n = vmanip.m_data[i]; - //if(n.d != CONTENT_AIR) - if(content_walkable(n.d)) + MapNode *n = NULL; + // Find mud + for(; y>=y_nodes_min; y--) + { + n = &vmanip.m_data[i]; + //if(content_walkable(n->d)) + // break; + if(n->d == CONTENT_MUD || n->d == CONTENT_GRASS) + break; + + vmanip.m_area.add_y(em, i, -1); + } + + // Stop if out of area + //if(vmanip.m_area.contains(i) == false) + if(y < y_nodes_min) break; - - vmanip.m_area.add_y(em, i, -1); - } - // If not mud, do nothing to it - MapNode *n = &vmanip.m_data[i]; - if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS) - continue; + /*// If not mud, do nothing to it + MapNode *n = &vmanip.m_data[i]; + if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS) + continue;*/ - // Make it exactly mud - n->d = CONTENT_MUD; + // Make it exactly mud + n->d = CONTENT_MUD; + + /*s16 recurse_count = 0; + mudflow_recurse:*/ - v3s16 dirs4[4] = { - v3s16(0,0,1), // back - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(-1,0,0), // left - }; + v3s16 dirs4[4] = { + v3s16(0,0,1), // back + v3s16(1,0,0), // right + v3s16(0,0,-1), // front + v3s16(-1,0,0), // left + }; - // Drop mud on side - - for(u32 di=0; di<4; di++) - { - v3s16 dirp = dirs4[di]; - u32 i2 = i; - // Check that side is air - vmanip.m_area.add_p(em, i2, dirp); - MapNode *n2 = &vmanip.m_data[i2]; - if(content_walkable(n2->d)) - continue; - // Check that under side is air - vmanip.m_area.add_y(em, i2, -1); - n2 = &vmanip.m_data[i2]; - if(content_walkable(n2->d)) - continue; - // Loop further down until not air - do{ + // Drop mud on side + + for(u32 di=0; di<4; di++) + { + v3s16 dirp = dirs4[di]; + u32 i2 = i; + // Move to side + vmanip.m_area.add_p(em, i2, dirp); + // Fail if out of area + if(vmanip.m_area.contains(i2) == false) + continue; + // Check that side is air + MapNode *n2 = &vmanip.m_data[i2]; + if(content_walkable(n2->d)) + continue; + // Check that under side is air vmanip.m_area.add_y(em, i2, -1); + // Fail if out of area + if(vmanip.m_area.contains(i2) == false) + continue; n2 = &vmanip.m_data[i2]; - }while(content_walkable(n2->d) == false); - // Loop one up so that we're in air - vmanip.m_area.add_y(em, i2, 1); - n2 = &vmanip.m_data[i2]; - - // Move mud to new place - *n2 = *n; - // Set old place to be air - *n = MapNode(CONTENT_AIR); - - #if 0 - // Switch mud and other and change mud source to air - //MapNode tempnode = *n2; - *n2 = *n; - //*n = tempnode; - // Force old mud position to be air - n->d = CONTENT_AIR; - #endif - - // Done - break; + if(content_walkable(n2->d)) + continue; + // Loop further down until not air + do{ + vmanip.m_area.add_y(em, i2, -1); + // Fail if out of area + if(vmanip.m_area.contains(i2) == false) + continue; + n2 = &vmanip.m_data[i2]; + }while(content_walkable(n2->d) == false); + // Loop one up so that we're in air + vmanip.m_area.add_y(em, i2, 1); + n2 = &vmanip.m_data[i2]; + + // Move mud to new place + *n2 = *n; + // Set old place to be air + *n = MapNode(CONTENT_AIR); + + // Done + break; + } + + // Continue from next y + y--; } } @@ -4683,6 +4714,12 @@ void ServerMap::save(bool only_changed) { saveBlock(block); block_count++; + + /*dstream<<"ServerMap: Written block (" + <<block->getPos().X<<"," + <<block->getPos().Y<<"," + <<block->getPos().Z<<")" + <<std::endl;*/ } } } diff --git a/src/utility.h b/src/utility.h index cc69099b4..e6e72efcf 100644 --- a/src/utility.h +++ b/src/utility.h @@ -1829,5 +1829,11 @@ inline bool string_allowed(const std::string &s, const std::string &allowed_char return true; } +/* + Some helper stuff +*/ +#define MYMIN(a,b) ((a)<(b)?(a):(b)) +#define MYMAX(a,b) ((a)>(b)?(a):(b)) + #endif diff --git a/src/voxel.h b/src/voxel.h index 89333159c..0cffb16b5 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -152,6 +152,10 @@ public: p.Z >= MinEdge.Z && p.Z <= MaxEdge.Z ); } + bool contains(s32 i) const + { + return (i >= 0 && i < getVolume()); + } bool operator==(const VoxelArea &other) const { return (MinEdge == other.MinEdge |