Add (optional) client-side saving of server map to disk

This commit is contained in:
sfan5 2014-10-09 14:02:02 +02:00
parent 0ee5a2197d
commit 9d69436052
4 changed files with 48 additions and 0 deletions

@ -164,6 +164,8 @@
#selectionbox_width = 2 #selectionbox_width = 2
# maximum percentage of current window to be used for hotbar # maximum percentage of current window to be used for hotbar
#hud_hotbar_max_width = 1.0 #hud_hotbar_max_width = 1.0
# Save the map received by the client on disk
#enable_local_map_saving = false
# Enable highlighting for nodes (disables selectionboxes) # Enable highlighting for nodes (disables selectionboxes)
#enable_node_highlighting = false #enable_node_highlighting = false
# Texture filtering settings # Texture filtering settings

@ -52,6 +52,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "config.h" #include "config.h"
#include "version.h" #include "version.h"
#include "drawscene.h" #include "drawscene.h"
#include "subgame.h"
#include "server.h"
#include "database.h"
#include "database-sqlite3.h"
extern gui::IGUIEnvironment* guienv; extern gui::IGUIEnvironment* guienv;
@ -275,12 +279,43 @@ Client::Client(
m_env.addPlayer(player); 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() void Client::Stop()
{ {
//request all client managed threads to stop //request all client managed threads to stop
m_mesh_update_thread.Stop(); m_mesh_update_thread.Stop();
if (localdb != NULL) {
actionstream << "Local map saving ended" << std::endl;
localdb->endSave();
}
} }
bool Client::isShutdown() bool Client::isShutdown()
@ -1156,6 +1191,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
sector->insertBlock(block); 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. Add it to mesh update queue and set it to be acknowledged after update.
*/ */

@ -46,6 +46,8 @@ class ClientMediaDownloader;
struct MapDrawControl; struct MapDrawControl;
class MtEventManager; class MtEventManager;
struct PointedThing; struct PointedThing;
class Database;
class Server;
struct QueuedMeshUpdate struct QueuedMeshUpdate
{ {
@ -555,6 +557,10 @@ private:
// own state // own state
LocalClientState m_state; LocalClientState m_state;
// Used for saving server map to disk client-side
Database *localdb;
Server *localserver;
}; };
#endif // !CLIENT_HEADER #endif // !CLIENT_HEADER

@ -131,6 +131,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("desynchronize_mapblock_texture_animation", "true"); settings->setDefault("desynchronize_mapblock_texture_animation", "true");
settings->setDefault("selectionbox_width","2"); settings->setDefault("selectionbox_width","2");
settings->setDefault("hud_hotbar_max_width","1.0"); settings->setDefault("hud_hotbar_max_width","1.0");
settings->setDefault("enable_local_map_saving", "false");
settings->setDefault("mip_map", "false"); settings->setDefault("mip_map", "false");
settings->setDefault("anisotropic_filter", "false"); settings->setDefault("anisotropic_filter", "false");