From e491f8cd485f5602c056b8b6c5e0c8c395e4a633 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 1 Jun 2014 13:11:37 -0400 Subject: [PATCH] Only try to load from possible player files --- src/environment.cpp | 41 +++++++++++------------------- src/player.cpp | 61 ++++++++++++++++----------------------------- src/player.h | 2 +- 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(getPlayer(playername.c_str())); bool newplayer = false; - bool foundplayer = false; + bool found = false; if (!player) { player = new RemotePlayer(m_gamedef); newplayer = true; } - std::vector 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 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; }