diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-07-22 01:37:05 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-07-22 01:37:05 +0300 |
commit | fe855e004f424fec1f7f3f2e7e06be2f70f4952e (patch) | |
tree | 4bc022fca274f23a18f4f73d6d75e5ada9abc00a /src | |
parent | 74ef5b8a42aacaeef4bffeef59a7fddb3e14c17c (diff) | |
download | minetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.tar.gz minetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.tar.bz2 minetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.zip |
Fixed new map generator causing a crash when generating at map limit
Diffstat (limited to 'src')
-rw-r--r-- | src/map.cpp | 68 | ||||
-rw-r--r-- | src/mapgen.cpp | 2 |
2 files changed, 42 insertions, 28 deletions
diff --git a/src/map.cpp b/src/map.cpp index 9ff0fa6d3..2a3e9f760 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2012,7 +2012,15 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos) { /*dstream<<"initBlockMake(): ("<<blockpos.X<<","<<blockpos.Y<<"," <<blockpos.Z<<")"<<std::endl;*/ - + + // Do nothing if not inside limits (+-1 because of neighbors) + if(blockpos_over_limit(blockpos - v3s16(1,1,1)) || + blockpos_over_limit(blockpos + v3s16(1,1,1))) + { + data->no_op = true; + return; + } + data->no_op = false; data->seed = m_seed; data->blockpos = blockpos; @@ -2063,6 +2071,7 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos) neighboring blocks */ + // The area that contains this block and it's neighbors v3s16 bigarea_blocks_min = blockpos - v3s16(1,1,1); v3s16 bigarea_blocks_max = blockpos + v3s16(1,1,1); @@ -2087,7 +2096,7 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data, if(data->no_op) { - dstream<<"finishBlockMake(): no-op"<<std::endl; + //dstream<<"finishBlockMake(): no-op"<<std::endl; return NULL; } @@ -2339,49 +2348,54 @@ MapBlock * ServerMap::generateBlock( Get central block */ MapBlock *block = getBlockNoCreateNoEx(p); - assert(block); #if 0 /* Check result */ - bool erroneus_content = false; - for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) - for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) - for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) + if(block) { - v3s16 p(x0,y0,z0); - MapNode n = block->getNode(p); - if(n.d == CONTENT_IGNORE) + bool erroneus_content = false; + for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) + for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) + for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) + { + v3s16 p(x0,y0,z0); + MapNode n = block->getNode(p); + if(n.d == CONTENT_IGNORE) + { + dstream<<"CONTENT_IGNORE at " + <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" + <<std::endl; + erroneus_content = true; + assert(0); + } + } + if(erroneus_content) { - dstream<<"CONTENT_IGNORE at " - <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" - <<std::endl; - erroneus_content = true; assert(0); } } - if(erroneus_content) - { - assert(0); - } #endif #if 0 /* Generate a completely empty block */ - for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) - for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) + if(block) { - for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) + for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) + for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) { - MapNode n; - if(y0%2==0) - n.d = CONTENT_AIR; - else - n.d = CONTENT_STONE; - block->setNode(v3s16(x0,y0,z0), n); + for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) + { + MapNode n; + if(y0%2==0) + n.d = CONTENT_AIR; + else + n.d = CONTENT_STONE; + block->setNode(v3s16(x0,y0,z0), n); + } } } #endif diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 4a2a39aec..acff3b963 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1303,7 +1303,7 @@ void make_block(BlockMakeData *data) { if(data->no_op) { - dstream<<"makeBlock: no-op"<<std::endl; + //dstream<<"makeBlock: no-op"<<std::endl; return; } |