From fe855e004f424fec1f7f3f2e7e06be2f70f4952e Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Fri, 22 Jul 2011 01:37:05 +0300
Subject: [PATCH] Fixed new map generator causing a crash when generating at
 map limit

---
 src/map.cpp    | 68 ++++++++++++++++++++++++++++++--------------------
 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;
 	}
 
-- 
GitLab