X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fremoteplayer.cpp;h=f8f31d928f6f49fb49c8332ee1e2988f9cf7951f;hb=644d0ab2bb44df8a3aefb387736930150b7d0aed;hp=c8e5b91326ba06dd02d7c8763176e434f0e0a226;hpb=072bbba69aa2528c309b76aaec288bdba52e119c;p=oweals%2Fminetest.git diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index c8e5b9132..f8f31d928 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" // strlcpy #include "server.h" #include "settings.h" +#include "convert_json.h" /* RemotePlayer @@ -36,15 +37,7 @@ float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f; u16 RemotePlayer::m_setting_chat_message_limit_trigger_kick = 0; RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): - Player(name, idef), - protocol_version(0), - m_sao(NULL), - m_dirty(false), - m_last_chat_message_sent(time(NULL)), - m_chat_message_allowance(5.0f), - m_message_rate_overhead(0), - hud_hotbar_image(""), - hud_hotbar_selected_image("") + Player(name, idef) { if (!RemotePlayer::m_setting_cache_loaded) { RemotePlayer::m_setting_chat_message_limit_per_10sec = @@ -65,54 +58,14 @@ RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS; movement_liquid_sink = g_settings->getFloat("movement_liquid_sink") * BS; movement_gravity = g_settings->getFloat("movement_gravity") * BS; -} -void RemotePlayer::save(std::string savedir, IGameDef *gamedef) -{ - /* - * 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. - */ - - // A player to deserialize files into to check their names - RemotePlayer testplayer("", gamedef->idef()); - - savedir += DIR_DELIM; - std::string path = savedir + m_name; - for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; 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; - } - setModified(false); - return; - } - // Open file and deserialize - std::ifstream is(path.c_str(), std::ios_base::binary); - if (!is.good()) { - infostream << "Failed to open " << path << std::endl; - return; - } - testplayer.deSerialize(is, path, NULL); - is.close(); - 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; - } - setModified(false); - return; - } - path = savedir + m_name + itos(i); - } - - infostream << "Didn't find free file for player " << m_name << std::endl; + // copy defaults + m_cloud_params.density = 0.4f; + m_cloud_params.color_bright = video::SColor(229, 240, 240, 255); + m_cloud_params.color_ambient = video::SColor(255, 0, 0, 0); + m_cloud_params.height = 120.0f; + m_cloud_params.thickness = 16.0f; + m_cloud_params.speed = v2f(0.0f, -2.0f); } void RemotePlayer::serializeExtraAttributes(std::string &output) @@ -120,12 +73,12 @@ void RemotePlayer::serializeExtraAttributes(std::string &output) assert(m_sao); Json::Value json_root; const PlayerAttributes &attrs = m_sao->getExtendedAttributes(); - for (PlayerAttributes::const_iterator it = attrs.begin(); it != attrs.end(); ++it) { - json_root[(*it).first] = (*it).second; + for (const auto &attr : attrs) { + json_root[attr.first] = attr.second; } - Json::FastWriter writer; - output = writer.write(json_root); + output = fastWriteJson(json_root); + m_sao->setExtendedAttributeModified(false); } @@ -148,7 +101,7 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, try { sao->setHPRaw(args.getS32("hp")); } catch(SettingNotFoundException &e) { - sao->setHPRaw(PLAYER_MAX_HP); + sao->setHPRaw(PLAYER_MAX_HP_DEFAULT); } try { @@ -168,15 +121,18 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, try { const std::string &extended_attributes = args.get("extended_attributes"); - Json::Reader reader; + std::istringstream iss(extended_attributes); + Json::CharReaderBuilder builder; + builder.settings_["collectComments"] = false; + std::string errs; + Json::Value attr_root; - reader.parse(extended_attributes, attr_root); + Json::parseFromStream(builder, iss, &attr_root, &errs); const Json::Value::Members attr_list = attr_root.getMemberNames(); - for (Json::Value::Members::const_iterator it = attr_list.begin(); - it != attr_list.end(); ++it) { - Json::Value attr_value = attr_root[*it]; - sao->setExtendedAttribute(*it, attr_value.asString()); + for (const auto &it : attr_list) { + Json::Value attr_value = attr_root[it]; + sao->setExtendedAttribute(it, attr_value.asString()); } } catch (SettingNotFoundException &e) {} } @@ -213,7 +169,7 @@ void RemotePlayer::serialize(std::ostream &os) args.setFloat("yaw", m_sao->getYaw()); args.setS32("breath", m_sao->getBreath()); - std::string extended_attrs = ""; + std::string extended_attrs; serializeExtraAttributes(extended_attrs); args.set("extended_attributes", extended_attrs);