diff options
Diffstat (limited to 'src/player.cpp')
-rw-r--r-- | src/player.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/player.cpp b/src/player.cpp index 4dadf26d0..78ba17e89 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -283,6 +283,72 @@ void Player::clearHud() } } + +void RemotePlayer::save(const std::string &savedir) +{ + bool newplayer = true; + + /* We have to iterate through all files in the players directory + * and check their player names because some file systems are not + * case-sensitive and player names are case-sensitive. + */ + + // 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; + } + + // 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; + } + testplayer.deSerialize(is, player_files[i].name); + + if (strcmp(testplayer.getName(), m_name) == 0) { + // 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; + } + 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; + } + } +} + /* RemotePlayer */ @@ -292,3 +358,4 @@ void RemotePlayer::setPosition(const v3f &position) if(m_sao) m_sao->setBasePosition(position); } + |