mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 03:23:45 +01:00
Add (optional) client-side saving of server map to disk
This commit is contained in:
parent
0ee5a2197d
commit
9d69436052
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user