summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-07-22 01:37:05 +0300
committerPerttu Ahola <celeron55@gmail.com>2011-07-22 01:37:05 +0300
commitfe855e004f424fec1f7f3f2e7e06be2f70f4952e (patch)
tree4bc022fca274f23a18f4f73d6d75e5ada9abc00a
parent74ef5b8a42aacaeef4bffeef59a7fddb3e14c17c (diff)
downloadminetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.tar.gz
minetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.tar.bz2
minetest-fe855e004f424fec1f7f3f2e7e06be2f70f4952e.zip
Fixed new map generator causing a crash when generating at map limit
-rw-r--r--src/map.cpp68
-rw-r--r--src/mapgen.cpp2
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;
}