summaryrefslogtreecommitdiff
path: root/src/map.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-02-15 01:02:31 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-02-15 01:02:31 +0200
commit2684e620b5fe5d8c3e22c01b3d2f55b260f65501 (patch)
treef5a8032ac7a308e87700ad7d870a01f127a6ebff /src/map.cpp
parent9a58749347f9eb0e2c8d38058c10deb0cae57a45 (diff)
downloadminetest-2684e620b5fe5d8c3e22c01b3d2f55b260f65501.tar.gz
minetest-2684e620b5fe5d8c3e22c01b3d2f55b260f65501.tar.bz2
minetest-2684e620b5fe5d8c3e22c01b3d2f55b260f65501.zip
server now won't crash when it is tries to generate blocks that are not inside MAP_GENERATION_LIMIT
Diffstat (limited to 'src/map.cpp')
-rw-r--r--src/map.cpp53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/map.cpp b/src/map.cpp
index 184d89b9c..f4f1668c7 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -4412,6 +4412,17 @@ MapBlock * ServerMap::createBlock(v3s16 p)
DSTACK("%s: p=(%d,%d,%d)",
__FUNCTION_NAME, p.X, p.Y, p.Z);
+ /*
+ Do not create over-limit
+ */
+ if(p.X < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.X > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Y < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Y > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Z < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Z > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE)
+ throw InvalidPositionException("createBlock(): pos. over limit");
+
v2s16 p2d(p.X, p.Z);
s16 block_y = p.Y;
/*
@@ -4426,17 +4437,22 @@ MapBlock * ServerMap::createBlock(v3s16 p)
sector = (ServerMapSector*)createSector(p2d);
assert(sector->getId() == MAPSECTOR_SERVER);
}
- /*catch(InvalidPositionException &e)
+ catch(InvalidPositionException &e)
{
dstream<<"createBlock: createSector() failed"<<std::endl;
throw e;
- }*/
- catch(std::exception &e)
+ }
+ /*
+ NOTE: This should not be done, or at least the exception
+ should not be passed on as std::exception, because it
+ won't be catched at all.
+ */
+ /*catch(std::exception &e)
{
dstream<<"createBlock: createSector() failed: "
<<e.what()<<std::endl;
throw e;
- }
+ }*/
/*
Try to get a block from the sector
@@ -4461,6 +4477,17 @@ MapBlock * ServerMap::emergeBlock(
__FUNCTION_NAME,
p.X, p.Y, p.Z, only_from_disk);
+ /*
+ Do not generate over-limit
+ */
+ if(p.X < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.X > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Y < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Y > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Z < -MAP_GENERATION_LIMIT / MAP_BLOCKSIZE
+ || p.Z > MAP_GENERATION_LIMIT / MAP_BLOCKSIZE)
+ throw InvalidPositionException("generateBlock(): pos. over limit");
+
v2s16 p2d(p.X, p.Z);
s16 block_y = p.Y;
/*
@@ -4472,7 +4499,7 @@ MapBlock * ServerMap::emergeBlock(
sector = (ServerMapSector*)emergeSector(p2d, changed_blocks);
assert(sector->getId() == MAPSECTOR_SERVER);
}
- catch(std::exception &e)
+ catch(InvalidPositionException &e)
{
dstream<<"emergeBlock: emergeSector() failed: "
<<e.what()<<std::endl;
@@ -4481,6 +4508,20 @@ MapBlock * ServerMap::emergeBlock(
<<"You could try to delete it."<<std::endl;
throw e;
}
+ /*
+ NOTE: This should not be done, or at least the exception
+ should not be passed on as std::exception, because it
+ won't be catched at all.
+ */
+ /*catch(std::exception &e)
+ {
+ dstream<<"emergeBlock: emergeSector() failed: "
+ <<e.what()<<std::endl;
+ dstream<<"Path to failed sector: "<<getSectorDir(p2d)
+ <<std::endl
+ <<"You could try to delete it."<<std::endl;
+ throw e;
+ }*/
/*
Try to get a block from the sector
@@ -5263,7 +5304,7 @@ MapSector * ClientMap::emergeSector(v2s16 p2d)
{
}
- // Create a sector with no heightmaps
+ // Create a sector
ClientMapSector *sector = new ClientMapSector(this, p2d);
{