1
0

cWorld now saves/loads the scoreboard

This commit is contained in:
andrew 2014-01-22 15:49:21 +02:00
parent 9bd8f74b59
commit dd04f5a73c
4 changed files with 44 additions and 15 deletions

View File

@ -238,6 +238,8 @@ bool cTeam::HasPlayer(const AString & a_Name) const
void cTeam::Reset(void) void cTeam::Reset(void)
{ {
// TODO 2014-01-22 xdot: Inform online players
m_Players.clear(); m_Players.clear();
} }
@ -505,3 +507,4 @@ unsigned int cScoreboard::GetNumTeams(void) const

View File

@ -27,8 +27,6 @@ class cObjective
{ {
public: public:
// tolua_end
typedef int Score; typedef int Score;
enum eType enum eType
@ -52,6 +50,8 @@ public:
E_TYPE_STAT_ENTITY_KILLED_BY E_TYPE_STAT_ENTITY_KILLED_BY
}; };
// tolua_end
static AString TypeToString(eType a_Type); static AString TypeToString(eType a_Type);
static eType StringToType(const AString & a_Name); static eType StringToType(const AString & a_Name);
@ -60,6 +60,8 @@ public:
cObjective(const AString & a_Name, const AString & a_DisplayName, eType a_Type, cWorld * a_World); cObjective(const AString & a_Name, const AString & a_DisplayName, eType a_Type, cWorld * a_World);
// tolua_begin
eType GetType(void) const { return m_Type; } eType GetType(void) const { return m_Type; }
const AString & GetName(void) const { return m_Name; } const AString & GetName(void) const { return m_Name; }
@ -85,6 +87,8 @@ public:
void SetDisplayName(const AString & a_Name); void SetDisplayName(const AString & a_Name);
// tolua_end
/// Send this objective to the specified client /// Send this objective to the specified client
void SendTo(cClientHandle & a_Client); void SendTo(cClientHandle & a_Client);
@ -135,6 +139,8 @@ public:
/// Removes all registered players /// Removes all registered players
void Reset(void); void Reset(void);
// tolua_begin
/// Returns the number of registered players /// Returns the number of registered players
unsigned int GetNumPlayers(void) const; unsigned int GetNumPlayers(void) const;
@ -147,13 +153,15 @@ public:
const AString & GetPrefix(void) const { return m_Prefix; } const AString & GetPrefix(void) const { return m_Prefix; }
const AString & GetSuffix(void) const { return m_Suffix; } const AString & GetSuffix(void) const { return m_Suffix; }
void SetFriendlyFire(bool a_Flag) { m_AllowsFriendlyFire = a_Flag; } void SetFriendlyFire(bool a_Flag) { m_AllowsFriendlyFire = a_Flag; }
void SetCanSeeFriendlyInvisible(bool a_Flag) { m_CanSeeFriendlyInvisible = a_Flag; } void SetCanSeeFriendlyInvisible(bool a_Flag) { m_CanSeeFriendlyInvisible = a_Flag; }
void SetDisplayName(const AString & a_Name); void SetDisplayName(const AString & a_Name);
void SetPrefix(const AString & a_Prefix); void SetPrefix(const AString & a_Prefix) { m_Prefix = a_Prefix; }
void SetSuffix(const AString & a_Suffix); void SetSuffix(const AString & a_Suffix) { m_Suffix = a_Suffix; }
// tolua_end
private: private:
@ -183,8 +191,6 @@ class cScoreboard
{ {
public: public:
// tolua_end
enum eDisplaySlot enum eDisplaySlot
{ {
E_DISPLAY_SLOT_LIST = 0, E_DISPLAY_SLOT_LIST = 0,
@ -194,11 +200,15 @@ public:
E_DISPLAY_SLOT_COUNT E_DISPLAY_SLOT_COUNT
}; };
// tolua_end
public: public:
cScoreboard(cWorld * a_World); cScoreboard(cWorld * a_World);
// tolua_begin
/// Registers a new scoreboard objective, returns the cObjective instance, NULL on name collision /// Registers a new scoreboard objective, returns the cObjective instance, NULL on name collision
cObjective * RegisterObjective(const AString & a_Name, const AString & a_DisplayName, cObjective::eType a_Type); cObjective * RegisterObjective(const AString & a_Name, const AString & a_DisplayName, cObjective::eType a_Type);
@ -228,13 +238,15 @@ public:
/// Execute callback for each objective with the specified type /// Execute callback for each objective with the specified type
void ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback& a_Callback); void ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback& a_Callback);
/// Send this scoreboard to the specified client
void SendTo(cClientHandle & a_Client);
unsigned int GetNumObjectives(void) const; unsigned int GetNumObjectives(void) const;
unsigned int GetNumTeams(void) const; unsigned int GetNumTeams(void) const;
// tolua_end
/// Send this scoreboard to the specified client
void SendTo(cClientHandle & a_Client);
private: private:

View File

@ -12,6 +12,7 @@
#include "ChunkMap.h" #include "ChunkMap.h"
#include "Generating/ChunkDesc.h" #include "Generating/ChunkDesc.h"
#include "OSSupport/Timer.h" #include "OSSupport/Timer.h"
#include "WorldStorage/ScoreboardSerializer.h"
// Entities (except mobs): // Entities (except mobs):
#include "Entities/ExpOrb.h" #include "Entities/ExpOrb.h"
@ -248,6 +249,10 @@ cWorld::cWorld(const AString & a_WorldName) :
LOGD("cWorld::cWorld(\"%s\")", a_WorldName.c_str()); LOGD("cWorld::cWorld(\"%s\")", a_WorldName.c_str());
cFile::CreateFolder(FILE_IO_PREFIX + m_WorldName); cFile::CreateFolder(FILE_IO_PREFIX + m_WorldName);
// Load the scoreboard
cScoreboardSerializer Serializer(m_WorldName, &m_Scoreboard);
Serializer.Load();
} }
@ -267,6 +272,10 @@ cWorld::~cWorld()
m_Storage.WaitForFinish(); m_Storage.WaitForFinish();
// Unload the scoreboard
cScoreboardSerializer Serializer(m_WorldName, &m_Scoreboard);
Serializer.Save();
delete m_ChunkMap; delete m_ChunkMap;
} }

View File

@ -22,7 +22,12 @@
cScoreboardSerializer::cScoreboardSerializer(const AString & a_WorldName, cScoreboard* a_ScoreBoard) cScoreboardSerializer::cScoreboardSerializer(const AString & a_WorldName, cScoreboard* a_ScoreBoard)
: m_ScoreBoard(a_ScoreBoard) : m_ScoreBoard(a_ScoreBoard)
{ {
Printf(m_Path, "%s/data/scoreboard.dat", a_WorldName.c_str()); AString DataPath;
Printf(DataPath, "%s/data", a_WorldName.c_str());
m_Path = DataPath + "/scoreboard.dat";
cFile::CreateFolder(FILE_IO_PREFIX + DataPath);
} }
@ -33,7 +38,7 @@ bool cScoreboardSerializer::Load(void)
{ {
cFile File; cFile File;
if (!File.Open(m_Path, cFile::fmReadWrite)) if (!File.Open(FILE_IO_PREFIX + m_Path, cFile::fmReadWrite))
{ {
return false; return false;
} }
@ -60,7 +65,7 @@ bool cScoreboardSerializer::Load(void)
{ {
return false; return false;
} }
// Parse the NBT data: // Parse the NBT data:
cParsedNBT NBT(Uncompressed, strm.total_out); cParsedNBT NBT(Uncompressed, strm.total_out);
if (!NBT.IsValid()) if (!NBT.IsValid())
@ -81,7 +86,7 @@ bool cScoreboardSerializer::Save(void)
cFastNBTWriter Writer; cFastNBTWriter Writer;
Writer.BeginCompound(""); Writer.BeginCompound("");
m_ScoreBoard->RegisterObjective("test","test",cObjective::E_TYPE_DUMMY)->AddScore("dot", 2);
SaveScoreboardToNBT(Writer); SaveScoreboardToNBT(Writer);
Writer.EndCompound(); Writer.EndCompound();
@ -91,7 +96,7 @@ bool cScoreboardSerializer::Save(void)
cParsedNBT TestParse(Writer.GetResult().data(), Writer.GetResult().size()); cParsedNBT TestParse(Writer.GetResult().data(), Writer.GetResult().size());
ASSERT(TestParse.IsValid()); ASSERT(TestParse.IsValid());
#endif // _DEBUG #endif // _DEBUG
gzFile gz = gzopen((FILE_IO_PREFIX + m_Path).c_str(), "wb"); gzFile gz = gzopen((FILE_IO_PREFIX + m_Path).c_str(), "wb");
if (gz != NULL) if (gz != NULL)
{ {