summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ClientHandle.cpp8
-rw-r--r--src/Entities/Player.cpp31
-rw-r--r--src/Statistics.cpp2
-rw-r--r--src/WorldStorage/StatSerializer.cpp27
4 files changed, 44 insertions, 24 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 03b1b0dc2..c4f4e496a 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -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;
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index a42fe89cf..1df473eb2 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -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;
diff --git a/src/Statistics.cpp b/src/Statistics.cpp
index 94076f828..65addb0dd 100644
--- a/src/Statistics.cpp
+++ b/src/Statistics.cpp
@@ -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;
}
diff --git a/src/WorldStorage/StatSerializer.cpp b/src/WorldStorage/StatSerializer.cpp
index 5c6724c60..66e5e1e9e 100644
--- a/src/WorldStorage/StatSerializer.cpp
+++ b/src/WorldStorage/StatSerializer.cpp
@@ -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;