X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmap.cpp;h=fda4d461dbe43480e674970849ba555b86ef39dc;hb=6929206bc29960b0fab8c0a0a65a48992cfff398;hp=29bbbc0d9388960f3e2ff0f4a4ad133567774b2f;hpb=a2e1b0fc7fa9a470f645e130115ce14a89aa2e02;p=oweals%2Fminetest.git diff --git a/src/map.cpp b/src/map.cpp index 29bbbc0d9..fda4d461d 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3265,7 +3265,38 @@ void ServerMap::endSave() bool ServerMap::saveBlock(MapBlock *block) { - return dbase->saveBlock(block); + return saveBlock(block, dbase); +} + +bool ServerMap::saveBlock(MapBlock *block, Database *db) +{ + v3s16 p3d = block->getPos(); + + // Dummy blocks are not written + if (block->isDummy()) { + errorstream << "WARNING: saveBlock: Not writing dummy block " + << PP(p3d) << std::endl; + return true; + } + + // Format used for writing + u8 version = SER_FMT_VER_HIGHEST_WRITE; + + /* + [0] u8 serialization version + [1] data + */ + std::ostringstream o(std::ios_base::binary); + o.write((char*) &version, 1); + block->serialize(o, version, true); + + std::string data = o.str(); + bool ret = db->saveBlock(p3d, data); + if(ret) { + // We just wrote it to the disk so clear modified flag + block->resetModified(); + } + return ret; } void ServerMap::loadBlock(std::string sectordir, std::string blockfile, @@ -3274,7 +3305,7 @@ void ServerMap::loadBlock(std::string sectordir, std::string blockfile, DSTACK(__FUNCTION_NAME); std::string fullpath = sectordir+DIR_DELIM+blockfile; - try{ + try { std::ifstream is(fullpath.c_str(), std::ios_base::binary); if(is.good() == false) @@ -3420,10 +3451,13 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos) v2s16 p2d(blockpos.X, blockpos.Z); - MapBlock *ret; + std::string ret; ret = dbase->loadBlock(blockpos); - if (ret) return (ret); + if (ret != "") { + loadBlock(&ret, blockpos, createSector(p2d), false); + return getBlockNoCreateNoEx(blockpos); + } // Not found in database, try the files // The directory layout we're going to load from.