summaryrefslogtreecommitdiff
path: root/src/client.cpp
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2014-10-09 14:02:02 +0200
committersfan5 <sfan5@live.de>2014-11-19 15:11:23 +0100
commit9d69436052c32bc218352fc991be157a4f135b9d (patch)
tree8c6ebf508615dde855b6331a7f8c0d7afd786a60 /src/client.cpp
parent0ee5a2197d228122412598f6b87000df10006911 (diff)
downloadminetest-9d69436052c32bc218352fc991be157a4f135b9d.tar.gz
minetest-9d69436052c32bc218352fc991be157a4f135b9d.tar.bz2
minetest-9d69436052c32bc218352fc991be157a4f135b9d.zip
Add (optional) client-side saving of server map to disk
Diffstat (limited to 'src/client.cpp')
-rw-r--r--src/client.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/client.cpp b/src/client.cpp
index 89bb053ae..c1806df99 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -52,6 +52,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "config.h"
#include "version.h"
#include "drawscene.h"
+#include "subgame.h"
+#include "server.h"
+#include "database.h"
+#include "database-sqlite3.h"
extern gui::IGUIEnvironment* guienv;
@@ -275,12 +279,43 @@ Client::Client(
m_env.addPlayer(player);
}
+
+ if (g_settings->getBool("enable_local_map_saving")) {
+ const std::string world_path = porting::path_user + DIR_DELIM + "worlds"
+ + DIR_DELIM + "server_" + g_settings->get("address")
+ + "_" + g_settings->get("remote_port");
+
+ SubgameSpec gamespec;
+ if (!getWorldExists(world_path)) {
+ gamespec = findSubgame(g_settings->get("default_game"));
+ if (!gamespec.isValid())
+ gamespec = findSubgame("minimal");
+ } else {
+ std::string world_gameid = getWorldGameId(world_path, false);
+ gamespec = findWorldSubgame(world_path);
+ }
+ if (!gamespec.isValid()) {
+ errorstream << "Couldn't find subgame for local map saving." << std::endl;
+ return;
+ }
+
+ localserver = new Server(world_path, gamespec, false, false);
+ localdb = new Database_SQLite3(&(ServerMap&)localserver->getMap(), world_path);
+ localdb->beginSave();
+ actionstream << "Local map saving started, map will be saved at '" << world_path << "'" << std::endl;
+ } else {
+ localdb = NULL;
+ }
}
void Client::Stop()
{
//request all client managed threads to stop
m_mesh_update_thread.Stop();
+ if (localdb != NULL) {
+ actionstream << "Local map saving ended" << std::endl;
+ localdb->endSave();
+ }
}
bool Client::isShutdown()
@@ -1156,6 +1191,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
sector->insertBlock(block);
}
+ if (localdb != NULL) {
+ ((ServerMap&) localserver->getMap()).saveBlock(block, localdb);
+ }
+
/*
Add it to mesh update queue and set it to be acknowledged after update.
*/