1
0
Fork 0

Fixed stat serialization

This commit is contained in:
andrew 2014-05-11 20:30:54 +03:00
parent c7c3724a3e
commit e3c6c8f3dd
4 changed files with 44 additions and 24 deletions

View File

@ -31,8 +31,6 @@
#include "CompositeChat.h"
#include "Items/ItemSword.h"
#include "WorldStorage/StatSerializer.h"
#include "md5/md5.h"
@ -339,12 +337,6 @@ void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID)
// Send scoreboard data
World->GetScoreBoard().SendTo(*this);
#if 0
// Load stats
cStatSerializer StatSerializer(World->GetName(), m_Player->GetName(), &m_Player->GetStatManager());
StatSerializer.Load();
#endif
// Delay the first ping until the client "settles down"
// This should fix #889, "BadCast exception, cannot convert bit to fm" error in client
cTimer t1;

View File

@ -133,15 +133,6 @@ cPlayer::~cPlayer(void)
SaveToDisk();
#if 0
/* Save statistics. */
cStatSerializer StatSerializer(m_World->GetName(), m_PlayerName, &m_Stats);
if (!StatSerializer.Save())
{
LOGERROR("Could not save stats for player %s", m_PlayerName.c_str());
}
#endif
m_World->RemovePlayer( this );
m_ClientHandle = NULL;
@ -1638,6 +1629,12 @@ bool cPlayer::LoadFromDisk()
m_Inventory.LoadFromJson(root["inventory"]);
m_LoadedWorldName = root.get("world", "world").asString();
/* Load the player stats.
* We use the default world name (like bukkit) because stats are shared between dimensions/worlds.
*/
cStatSerializer StatSerializer(cRoot::Get()->GetDefaultWorld()->GetName(), GetName(), &m_Stats);
StatSerializer.Load();
LOGD("Player \"%s\" was read from file, spawning at {%.2f, %.2f, %.2f} in world \"%s\"",
m_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ(), m_LoadedWorldName.c_str()
@ -1709,6 +1706,17 @@ bool cPlayer::SaveToDisk()
LOGERROR("ERROR WRITING PLAYER JSON TO FILE \"%s\"", SourceFile.c_str());
return false;
}
/* Save the player stats.
* We use the default world name (like bukkit) because stats are shared between dimensions/worlds.
*/
cStatSerializer StatSerializer(cRoot::Get()->GetDefaultWorld()->GetName(), m_PlayerName, &m_Stats);
if (!StatSerializer.Save())
{
LOGERROR("Could not save stats for player %s", m_PlayerName.c_str());
return false;
}
return true;
}
@ -1723,7 +1731,10 @@ cPlayer::StringList cPlayer::GetResolvedPermissions()
const PermissionMap& ResolvedPermissions = m_ResolvedPermissions;
for( PermissionMap::const_iterator itr = ResolvedPermissions.begin(); itr != ResolvedPermissions.end(); ++itr )
{
if( itr->second ) Permissions.push_back( itr->first );
if (itr->second)
{
Permissions.push_back( itr->first );
}
}
return Permissions;

View File

@ -114,7 +114,7 @@ eStatistic cStatInfo::GetType(const AString & a_Name)
{
for (unsigned int i = 0; i < ARRAYCOUNT(ms_Info); ++i)
{
if (NoCaseCompare(ms_Info[i].m_Name, a_Name))
if (NoCaseCompare(ms_Info[i].m_Name, a_Name) == 0)
{
return ms_Info[i].m_Type;
}

View File

@ -7,8 +7,6 @@
#include "../Statistics.h"
#include <fstream>
@ -19,7 +17,7 @@ cStatSerializer::cStatSerializer(const AString& a_WorldName, const AString& a_Pl
AString StatsPath;
Printf(StatsPath, "%s/stats", a_WorldName.c_str());
m_Path = StatsPath + "/" + a_PlayerName + ".dat";
m_Path = StatsPath + "/" + a_PlayerName + ".json";
/* Ensure that the directory exists. */
cFile::CreateFolder(FILE_IO_PREFIX + StatsPath);
@ -88,6 +86,8 @@ void cStatSerializer::SaveStatToJSON(Json::Value & a_Out)
a_Out[StatName] = Value;
}
// TODO 2014-05-11 xdot: Save "progress"
}
}
@ -107,11 +107,28 @@ bool cStatSerializer::LoadStatFromJSON(const Json::Value & a_In)
if (StatType == statInvalid)
{
LOGWARNING("Invalid statistic type %s", StatName.c_str());
LOGWARNING("Invalid statistic type \"%s\"", StatName.c_str());
continue;
}
m_Manager->SetValue(StatType, (*it).asInt());
Json::Value & Node = *it;
if (Node.isInt())
{
m_Manager->SetValue(StatType, Node.asInt());
}
else if (Node.isObject())
{
StatValue Value = Node.get("value", 0).asInt();
// TODO 2014-05-11 xdot: Load "progress"
m_Manager->SetValue(StatType, Value);
}
else
{
LOGWARNING("Invalid statistic value for type \"%s\"", StatName.c_str());
}
}
return true;