Preparation for player UUID-based storage: LoadFromFile()
This commit is contained in:
parent
729cc7f6ff
commit
2bd486660a
@ -75,11 +75,6 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
|
|||||||
, m_TicksUntilNextSave(PLAYER_INVENTORY_SAVE_INTERVAL)
|
, m_TicksUntilNextSave(PLAYER_INVENTORY_SAVE_INTERVAL)
|
||||||
, m_bIsTeleporting(false)
|
, m_bIsTeleporting(false)
|
||||||
{
|
{
|
||||||
LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d",
|
|
||||||
a_PlayerName.c_str(), a_Client->GetIPString().c_str(),
|
|
||||||
this, GetUniqueID()
|
|
||||||
);
|
|
||||||
|
|
||||||
m_InventoryWindow = new cInventoryWindow(*this);
|
m_InventoryWindow = new cInventoryWindow(*this);
|
||||||
m_CurrentWindow = m_InventoryWindow;
|
m_CurrentWindow = m_InventoryWindow;
|
||||||
m_InventoryWindow->OpenedByPlayer(*this);
|
m_InventoryWindow->OpenedByPlayer(*this);
|
||||||
@ -1690,53 +1685,70 @@ void cPlayer::LoadPermissionsFromDisk()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPlayer::LoadFromDisk()
|
|
||||||
|
bool cPlayer::LoadFromDisk(void)
|
||||||
{
|
{
|
||||||
LoadPermissionsFromDisk();
|
LoadPermissionsFromDisk();
|
||||||
|
|
||||||
AString SourceFile;
|
AString SourceFile;
|
||||||
Printf(SourceFile, "players/%s.json", GetName().c_str() );
|
Printf(SourceFile, "players/%s.json", GetName().c_str());
|
||||||
|
|
||||||
|
bool res = LoadFromFile(SourceFile);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPlayer::LoadFromFile(const AString & a_FileName)
|
||||||
|
{
|
||||||
|
// Load the data from the file:
|
||||||
cFile f;
|
cFile f;
|
||||||
if (!f.Open(SourceFile, cFile::fmRead))
|
if (!f.Open(a_FileName, cFile::fmRead))
|
||||||
{
|
{
|
||||||
// This is a new player whom we haven't seen yet, bail out, let them have the defaults
|
// This is a new player whom we haven't seen yet, bail out, let them have the defaults
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AString buffer;
|
AString buffer;
|
||||||
if (f.ReadRestOfFile(buffer) != f.GetSize())
|
if (f.ReadRestOfFile(buffer) != f.GetSize())
|
||||||
{
|
{
|
||||||
LOGWARNING("Cannot read player data from file \"%s\"", SourceFile.c_str());
|
LOGWARNING("Cannot read player data from file \"%s\"", a_FileName.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
f.Close(); //cool kids play nice
|
f.Close();
|
||||||
|
|
||||||
|
// Parse the JSON format:
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
Json::Reader reader;
|
Json::Reader reader;
|
||||||
if (!reader.parse(buffer, root, false))
|
if (!reader.parse(buffer, root, false))
|
||||||
{
|
{
|
||||||
LOGWARNING("Cannot parse player data in file \"%s\", player will be reset", SourceFile.c_str());
|
LOGWARNING("Cannot parse player data in file \"%s\"", a_FileName.c_str());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load the player data:
|
||||||
Json::Value & JSON_PlayerPosition = root["position"];
|
Json::Value & JSON_PlayerPosition = root["position"];
|
||||||
if (JSON_PlayerPosition.size() == 3)
|
if (JSON_PlayerPosition.size() == 3)
|
||||||
{
|
{
|
||||||
SetPosX(JSON_PlayerPosition[(unsigned int)0].asDouble());
|
SetPosX(JSON_PlayerPosition[(unsigned)0].asDouble());
|
||||||
SetPosY(JSON_PlayerPosition[(unsigned int)1].asDouble());
|
SetPosY(JSON_PlayerPosition[(unsigned)1].asDouble());
|
||||||
SetPosZ(JSON_PlayerPosition[(unsigned int)2].asDouble());
|
SetPosZ(JSON_PlayerPosition[(unsigned)2].asDouble());
|
||||||
m_LastPos = GetPosition();
|
m_LastPos = GetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
Json::Value & JSON_PlayerRotation = root["rotation"];
|
Json::Value & JSON_PlayerRotation = root["rotation"];
|
||||||
if (JSON_PlayerRotation.size() == 3)
|
if (JSON_PlayerRotation.size() == 3)
|
||||||
{
|
{
|
||||||
SetYaw ((float)JSON_PlayerRotation[(unsigned int)0].asDouble());
|
SetYaw ((float)JSON_PlayerRotation[(unsigned)0].asDouble());
|
||||||
SetPitch ((float)JSON_PlayerRotation[(unsigned int)1].asDouble());
|
SetPitch ((float)JSON_PlayerRotation[(unsigned)1].asDouble());
|
||||||
SetRoll ((float)JSON_PlayerRotation[(unsigned int)2].asDouble());
|
SetRoll ((float)JSON_PlayerRotation[(unsigned)2].asDouble());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Health = root.get("health", 0).asInt();
|
m_Health = root.get("health", 0).asInt();
|
||||||
m_AirLevel = root.get("air", MAX_AIR_LEVEL).asInt();
|
m_AirLevel = root.get("air", MAX_AIR_LEVEL).asInt();
|
||||||
m_FoodLevel = root.get("food", MAX_FOOD_LEVEL).asInt();
|
m_FoodLevel = root.get("food", MAX_FOOD_LEVEL).asInt();
|
||||||
m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble();
|
m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble();
|
||||||
@ -1763,8 +1775,8 @@ bool cPlayer::LoadFromDisk()
|
|||||||
cStatSerializer StatSerializer(cRoot::Get()->GetDefaultWorld()->GetName(), GetName(), &m_Stats);
|
cStatSerializer StatSerializer(cRoot::Get()->GetDefaultWorld()->GetName(), GetName(), &m_Stats);
|
||||||
StatSerializer.Load();
|
StatSerializer.Load();
|
||||||
|
|
||||||
LOGD("Player \"%s\" was read from file, spawning at {%.2f, %.2f, %.2f} in world \"%s\"",
|
LOGD("Player \"%s\" was read from file \"%s\", spawning at {%.2f, %.2f, %.2f} in world \"%s\"",
|
||||||
GetName().c_str(), GetPosX(), GetPosY(), GetPosZ(), m_LoadedWorldName.c_str()
|
GetName().c_str(), a_FileName.c_str(), GetPosX(), GetPosY(), GetPosZ(), m_LoadedWorldName.c_str()
|
||||||
);
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -41,6 +41,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
cPlayer(cClientHandle * a_Client, const AString & a_PlayerName);
|
cPlayer(cClientHandle * a_Client, const AString & a_PlayerName);
|
||||||
|
|
||||||
virtual ~cPlayer();
|
virtual ~cPlayer();
|
||||||
|
|
||||||
virtual void SpawnOn(cClientHandle & a_Client) override;
|
virtual void SpawnOn(cClientHandle & a_Client) override;
|
||||||
@ -337,7 +338,15 @@ public:
|
|||||||
bool MoveToWorld(const char * a_WorldName); // tolua_export
|
bool MoveToWorld(const char * a_WorldName); // tolua_export
|
||||||
|
|
||||||
bool SaveToDisk(void);
|
bool SaveToDisk(void);
|
||||||
|
|
||||||
|
/** Loads the player data from the disk file.
|
||||||
|
Returns true on success, false on failure. */
|
||||||
bool LoadFromDisk(void);
|
bool LoadFromDisk(void);
|
||||||
|
|
||||||
|
/** Loads the player data from the specified file.
|
||||||
|
Returns true on success, false on failure. */
|
||||||
|
bool LoadFromFile(const AString & a_FileName);
|
||||||
|
|
||||||
void LoadPermissionsFromDisk(void); // tolua_export
|
void LoadPermissionsFromDisk(void); // tolua_export
|
||||||
|
|
||||||
const AString & GetLoadedWorldName() { return m_LoadedWorldName; }
|
const AString & GetLoadedWorldName() { return m_LoadedWorldName; }
|
||||||
|
Loading…
Reference in New Issue
Block a user