world.mt
---------
World metadata.
-Example content (added indentation):
- gameid = mesetint
+Example content (added indentation and - explanations):
+ gameid = mesetint - name of the game
+ enable_damage = true - whether damage is enabled or not
+ creative_mode = false - whether creative mode is enabled or not
+ backend = sqlite3 - which DB backend to use for blocks (sqlite3, dummy, leveldb, redis, postgresql)
+ player_backend = sqlite3 - which DB backend to use for player data
+ readonly_backend = sqlite3 - optionally readonly seed DB (DB file _must_ be located in "readonly" subfolder)
+ server_announce = false - whether the server is publicly announced or not
+ load_mod_<mod> = false - whether <mod> is to be loaded in this world
Player File Format
===================
}
std::string backend = conf.get("backend");
dbase = createDatabase(backend, savedir, conf);
-
+ if (conf.exists("readonly_backend")) {
+ std::string readonly_dir = savedir + DIR_DELIM + "readonly";
+ dbase_ro = createDatabase(conf.get("readonly_backend"), readonly_dir, conf);
+ }
if (!conf.updateConfigFile(conf_path.c_str()))
errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" << std::endl;
Close database if it was opened
*/
delete dbase;
+ if (dbase_ro)
+ delete dbase_ro;
#if 0
/*
<< "all blocks that are stored in flat files." << std::endl;
}
dbase->listAllLoadableBlocks(dst);
+ if (dbase_ro)
+ dbase_ro->listAllLoadableBlocks(dst);
}
void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
dbase->loadBlock(blockpos, &ret);
if (!ret.empty()) {
loadBlock(&ret, blockpos, createSector(p2d), false);
+ } else if (dbase_ro) {
+ dbase_ro->loadBlock(blockpos, &ret);
+ if (!ret.empty()) {
+ loadBlock(&ret, blockpos, createSector(p2d), false);
+ }
} else {
// Not found in database, try the files