diff options
author | kwolekr <kwolekr@minetest.net> | 2013-06-25 11:49:08 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2013-06-27 22:35:35 -0400 |
commit | 2c0b51795e6fa6747d881f1871c89830abb6e6e8 (patch) | |
tree | f14014ac3aeaeca01b941e9acd6e45bfc7527e98 | |
parent | d6ac3d8d9a6484f2d348d1caea203de0069b6bd6 (diff) | |
download | minetest-2c0b51795e6fa6747d881f1871c89830abb6e6e8.tar.gz minetest-2c0b51795e6fa6747d881f1871c89830abb6e6e8.tar.bz2 minetest-2c0b51795e6fa6747d881f1871c89830abb6e6e8.zip |
Fix issue of VManip occasionally not blitting back blocks, and pitch black lighting bug
-rw-r--r-- | src/map.cpp | 38 | ||||
-rw-r--r-- | src/map.h | 3 |
2 files changed, 26 insertions, 15 deletions
diff --git a/src/map.cpp b/src/map.cpp index 001ae1609..cf7dd6f9f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2596,7 +2596,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) // Add the area { //TimeTaker timer("initBlockMake() initialEmerge"); - data->vmanip->initialEmerge(bigarea_blocks_min, bigarea_blocks_max); + data->vmanip->initialEmerge(bigarea_blocks_min, bigarea_blocks_max, false); } // Ensure none of the blocks to be generated were marked as containing CONTENT_IGNORE @@ -4202,8 +4202,8 @@ void ManualMapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) VoxelManipulator::emerge(a, caller_id); } -void ManualMapVoxelManipulator::initialEmerge( - v3s16 blockpos_min, v3s16 blockpos_max) +void ManualMapVoxelManipulator::initialEmerge(v3s16 blockpos_min, + v3s16 blockpos_max, bool load_if_inexistent) { TimeTaker timer1("initialEmerge", &emerge_time); @@ -4255,18 +4255,28 @@ void ManualMapVoxelManipulator::initialEmerge( if(block_data_inexistent) { - flags |= VMANIP_BLOCK_DATA_INEXIST; - /* - Mark area inexistent - */ - VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); - // Fill with VOXELFLAG_INEXISTENT - for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) - for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) - { - s32 i = m_area.index(a.MinEdge.X,y,z); - memset(&m_flags[i], VOXELFLAG_INEXISTENT, MAP_BLOCKSIZE); + if (load_if_inexistent) { + ServerMap *svrmap = (ServerMap *)m_map; + block = svrmap->emergeBlock(p, false); + if (block == NULL) + block = svrmap->createBlock(p); + else + block->copyTo(*this); + } else { + flags |= VMANIP_BLOCK_DATA_INEXIST; + + /* + Mark area inexistent + */ + VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); + // Fill with VOXELFLAG_INEXISTENT + for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) + for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) + { + s32 i = m_area.index(a.MinEdge.X,y,z); + memset(&m_flags[i], VOXELFLAG_INEXISTENT, MAP_BLOCKSIZE); + } } } /*else if (block->getNode(0, 0, 0).getContent() == CONTENT_IGNORE) @@ -555,7 +555,8 @@ public: virtual void emerge(VoxelArea a, s32 caller_id=-1); - void initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max); + void initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, + bool load_if_inexistent = true); // This is much faster with big chunks of generated data void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks); |