aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2014-06-01 13:11:37 -0400
committerShadowNinja <shadowninja@minetest.net>2014-06-23 15:45:59 -0400
commite491f8cd485f5602c056b8b6c5e0c8c395e4a633 (patch)
tree003321151f1c1654bb6d6681a13fbd3c0c4affaa
parent7e6db1b80344a519e53a9967a159c8d3585a9b9d (diff)
downloadminetest-e491f8cd485f5602c056b8b6c5e0c8c395e4a633.tar.gz
minetest-e491f8cd485f5602c056b8b6c5e0c8c395e4a633.tar.bz2
minetest-e491f8cd485f5602c056b8b6c5e0c8c395e4a633.zip
Only try to load from possible player files
-rw-r--r--src/environment.cpp41
-rw-r--r--src/player.cpp61
-rw-r--r--src/player.h2
3 files changed, 37 insertions, 67 deletions
diff --git a/src/environment.cpp b/src/environment.cpp
index 91f5ea2b6..d068aa788 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -443,46 +443,35 @@ void ServerEnvironment::savePlayer(const std::string &playername)
Player *ServerEnvironment::loadPlayer(const std::string &playername)
{
- std::string players_path = m_path_world + DIR_DELIM "players";
+ std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM;
RemotePlayer *player = static_cast<RemotePlayer*>(getPlayer(playername.c_str()));
bool newplayer = false;
- bool foundplayer = false;
+ bool found = false;
if (!player) {
player = new RemotePlayer(m_gamedef);
newplayer = true;
}
- std::vector<fs::DirListNode> player_files = fs::GetDirListing(players_path);
- for (u32 i = 0; i < player_files.size(); i++) {
- if (player_files[i].dir)
- continue;
-
- // Full path to this file
- std::string path = players_path + "/" + player_files[i].name;
-
- // Load player to see what is its name
+ RemotePlayer testplayer(m_gamedef);
+ std::string path = players_path + playername;
+ for (u32 i = 0; i < 1000; i++) {
+ // Open file and deserialize
std::ifstream is(path.c_str(), std::ios_base::binary);
if (!is.good()) {
- infostream << "Failed to read " << path << std::endl;
- continue;
+ return NULL;
}
- player->deSerialize(is, player_files[i].name);
-
- if (!string_allowed(player->getName(), PLAYERNAME_ALLOWED_CHARS)) {
- infostream << "Not loading player with invalid name: "
- << player->getName() << std::endl;
- continue;
- }
-
- if (player->getName() == playername) {
- // We found our player
- foundplayer = true;
+ testplayer.deSerialize(is, path);
+ if (testplayer.getName() == playername) {
+ *player = testplayer;
+ found = true;
break;
}
-
+ path = players_path + playername + itos(i);
}
- if (!foundplayer) {
+ if (!found) {
+ infostream << "Player file for player " << playername
+ << " not found" << std::endl;
return NULL;
}
if (newplayer) {
diff --git a/src/player.cpp b/src/player.cpp
index 78ba17e89..a52385f20 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -284,11 +284,10 @@ void Player::clearHud()
}
-void RemotePlayer::save(const std::string &savedir)
+void RemotePlayer::save(std::string savedir)
{
- bool newplayer = true;
-
- /* We have to iterate through all files in the players directory
+ /*
+ * We have to open all possible player files in the players directory
* and check their player names because some file systems are not
* case-sensitive and player names are case-sensitive.
*/
@@ -296,23 +295,25 @@ void RemotePlayer::save(const std::string &savedir)
// A player to deserialize files into to check their names
RemotePlayer testplayer(m_gamedef);
- std::vector<fs::DirListNode> player_files = fs::GetDirListing(savedir);
- for(u32 i = 0; i < player_files.size(); i++) {
- if (player_files[i].dir || player_files[i].name[0] == '.') {
- continue;
+ savedir += DIR_DELIM;
+ std::string path = savedir + m_name;
+ for (u32 i = 0; i < 1000; i++) {
+ if (!fs::PathExists(path)) {
+ // Open file and serialize
+ std::ostringstream ss(std::ios_base::binary);
+ serialize(ss);
+ if (!fs::safeWriteToFile(path, ss.str())) {
+ infostream << "Failed to write " << path << std::endl;
+ }
+ return;
}
-
- // Full path to this file
- std::string path = savedir + "/" + player_files[i].name;
-
// Open file and deserialize
std::ifstream is(path.c_str(), std::ios_base::binary);
if (!is.good()) {
- infostream << "Failed to read " << path << std::endl;
- continue;
+ infostream << "Failed to open " << path << std::endl;
+ return;
}
- testplayer.deSerialize(is, player_files[i].name);
-
+ testplayer.deSerialize(is, path);
if (strcmp(testplayer.getName(), m_name) == 0) {
// Open file and serialize
std::ostringstream ss(std::ios_base::binary);
@@ -320,33 +321,13 @@ void RemotePlayer::save(const std::string &savedir)
if (!fs::safeWriteToFile(path, ss.str())) {
infostream << "Failed to write " << path << std::endl;
}
- newplayer = false;
- break;
- }
- }
-
- if (newplayer) {
- bool found = false;
- std::string path = savedir + "/" + m_name;
- for (u32 i = 0; i < 1000; i++) {
- if (!fs::PathExists(path)) {
- found = true;
- break;
- }
- path = savedir + "/" + m_name + itos(i);
- }
- if (!found) {
- infostream << "Didn't find free file for player " << m_name << std::endl;
return;
}
-
- // Open file and serialize
- std::ostringstream ss(std::ios_base::binary);
- serialize(ss);
- if (!fs::safeWriteToFile(path, ss.str())) {
- infostream << "Failed to write " << path << std::endl;
- }
+ path = savedir + m_name + itos(i);
}
+
+ infostream << "Didn't find free file for player " << m_name << std::endl;
+ return;
}
/*
diff --git a/src/player.h b/src/player.h
index 098a4d153..93197d374 100644
--- a/src/player.h
+++ b/src/player.h
@@ -335,7 +335,7 @@ public:
RemotePlayer(IGameDef *gamedef): Player(gamedef), m_sao(0) {}
virtual ~RemotePlayer() {}
- void save(const std::string &savedir);
+ void save(std::string savedir);
PlayerSAO *getPlayerSAO()
{ return m_sao; }