1
0

Scoreboard improvements

This commit is contained in:
andrew 2014-01-19 16:02:37 +02:00
parent 2b94361059
commit f321b5d224
3 changed files with 83 additions and 120 deletions

View File

@ -798,7 +798,7 @@ void cPlayer::DoTakeDamage(TakeDamageInfo & a_TDI)
if ((m_Team != NULL) && (m_Team == Attacker->m_Team)) if ((m_Team != NULL) && (m_Team == Attacker->m_Team))
{ {
if (!m_Team->GetFriendlyFire()) if (!m_Team->AllowsFriendlyFire())
{ {
// Friendly fire is disabled // Friendly fire is disabled
return; return;
@ -868,7 +868,7 @@ void cPlayer::KilledBy(cEntity * a_Killer)
cScoreboard* Scoreboard = m_World->GetScoreBoard(); cScoreboard* Scoreboard = m_World->GetScoreBoard();
// Update scoreboard objectives // Update scoreboard objectives
Scoreboard->ForEachObjectiveWith(E_OBJECTIVE_DEATH_COUNT, IncrementCounter); Scoreboard->ForEachObjectiveWith(cObjective::E_TYPE_DEATH_COUNT, IncrementCounter);
} }
@ -953,14 +953,14 @@ void cPlayer::SetTeam(cTeam* a_Team)
{ {
if (m_Team) if (m_Team)
{ {
m_Team->RemovePlayer(this); m_Team->RemovePlayer(GetName());
} }
m_Team = a_Team; m_Team = a_Team;
if (m_Team) if (m_Team)
{ {
m_Team->AddPlayer(this); m_Team->AddPlayer(GetName());
} }
} }

View File

@ -11,14 +11,14 @@
cObjective::cObjective(eObjectiveType a_Type) : m_Type(a_Type) cObjective::cObjective(cObjective::eType a_Type) : m_Type(a_Type)
{} {}
void cObjective::SetDisplaySlot(eDisplaySlot a_Display) void cObjective::SetDisplaySlot(cObjective::eDisplaySlot a_Display)
{ {
m_Display = a_Display; m_Display = a_Display;
} }
@ -102,8 +102,8 @@ cObjective::Score cObjective::SubScore(const AString & a_Name, cObjective::Score
cTeam::cTeam(const AString & a_Name, const AString & a_DisplayName, cTeam::cTeam(const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix) const AString & a_Prefix, const AString & a_Suffix)
: m_FriendlyFire(true) : m_AllowsFriendlyFire(true)
, m_SeeFriendlyInvisible(false) , m_CanSeeFriendlyInvisible(false)
, m_Name(a_Name) , m_Name(a_Name)
, m_DisplayName(a_DisplayName) , m_DisplayName(a_DisplayName)
, m_Prefix(a_Prefix) , m_Prefix(a_Prefix)
@ -114,18 +114,18 @@ cTeam::cTeam(const AString & a_Name, const AString & a_DisplayName,
bool cTeam::AddPlayer(cPlayer * a_Player) bool cTeam::AddPlayer(const AString & a_Name)
{ {
return m_Players.insert(a_Player).second; return m_Players.insert(a_Name).second;
} }
bool cTeam::RemovePlayer(cPlayer * a_Player) bool cTeam::RemovePlayer(const AString & a_Name)
{ {
return m_Players.erase(a_Player) > 0; return m_Players.erase(a_Name) > 0;
} }
@ -149,38 +149,13 @@ unsigned int cTeam::GetNumPlayers(void) const
cScoreboard::~cScoreboard() cObjective* cScoreboard::RegisterObjective(const AString & a_Name, cObjective::eType a_Type)
{ {
for (ObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it) cObjective Objective(a_Type);
{
delete it->second;
}
for (TeamMap::iterator it = m_Teams.begin(); it != m_Teams.end(); ++it) std::pair<ObjectiveMap::iterator, bool> Status = m_Objectives.insert(NamedObjective(a_Name, Objective));
{
delete it->second;
}
}
return Status.second ? &Status.first->second : NULL;
cObjective* cScoreboard::RegisterObjective(const AString & a_Name, eObjectiveType a_Type)
{
cObjective* Objective = new cObjective(a_Type);
bool Status = m_Objectives.insert(NamedObjective(a_Name, Objective)).second;
if (Status)
{
return Objective;
}
else
{
delete Objective;
return NULL;
}
} }
@ -215,7 +190,7 @@ cObjective* cScoreboard::GetObjective(const AString & a_Name)
} }
else else
{ {
return it->second; return &it->second;
} }
} }
@ -223,22 +198,16 @@ cObjective* cScoreboard::GetObjective(const AString & a_Name)
cTeam* cScoreboard::RegisterTeam(const AString & a_Name, const AString & a_DisplayName, cTeam* cScoreboard::RegisterTeam(
const AString & a_Prefix, const AString & a_Suffix) const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix
)
{ {
cTeam* Team = new cTeam(a_Name, a_DisplayName, a_Prefix, a_Suffix); cTeam Team(a_Name, a_DisplayName, a_Prefix, a_Suffix);
bool Status = m_Teams.insert(NamedTeam(a_Name, Team)).second; std::pair<TeamMap::iterator, bool> Status = m_Teams.insert(NamedTeam(a_Name, Team));
if (Status) return Status.second ? &Status.first->second : NULL;
{
return Team;
}
else
{
delete Team;
return NULL;
}
} }
@ -273,7 +242,7 @@ cTeam* cScoreboard::GetTeam(const AString & a_Name)
} }
else else
{ {
return it->second; return &it->second;
} }
} }
@ -281,14 +250,14 @@ cTeam* cScoreboard::GetTeam(const AString & a_Name)
void cScoreboard::ForEachObjectiveWith(eObjectiveType a_Type, cObjectiveCallback& a_Callback) void cScoreboard::ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback& a_Callback)
{ {
for (ObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it) for (ObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)
{ {
if (it->second->GetType() == a_Type) if (it->second.GetType() == a_Type)
{ {
// Call callback // Call callback
if (a_Callback.Item(it->second)) if (a_Callback.Item(&it->second))
{ {
return; return;
} }

View File

@ -13,61 +13,51 @@
class cPlayer;
class cObjective; class cObjective;
typedef std::set< cPlayer * > cPlayerSet;
typedef cItemCallback<cObjective> cObjectiveCallback; typedef cItemCallback<cObjective> cObjectiveCallback;
enum eObjectiveType
{
E_OBJECTIVE_DUMMY,
E_OBJECTIVE_DEATH_COUNT,
E_OBJECTIVE_PLAYER_KILL_COUNT,
E_OBJECTIVE_TOTAL_KILL_COUNT,
E_OBJECTIVE_HEALTH,
E_OBJECTIVE_ACHIEVEMENT,
E_OBJECTIVE_STAT,
E_OBJECTIVE_STAT_ITEM_CRAFT,
E_OBJECTIVE_STAT_ITEM_USE,
E_OBJECTIVE_STAT_ITEM_BREAK,
E_OBJECTIVE_STAT_BLOCK_MINE,
E_OBJECTIVE_STAT_ENTITY_KILL,
E_OBJECTIVE_STAT_ENTITY_KILLED_BY
};
enum eDisplaySlot
{
E_DISPLAY_SLOT_LIST,
E_DISPLAY_SLOT_SIDEBAR,
E_DISPLAY_SLOT_NAME
};
class cObjective class cObjective
{ {
public: public:
typedef int Score; typedef int Score;
public: enum eType
cObjective(eObjectiveType a_Type); {
E_TYPE_DUMMY,
eObjectiveType GetType(void) const { return m_Type; } E_TYPE_DEATH_COUNT,
E_TYPE_PLAYER_KILL_COUNT,
E_TYPE_TOTAL_KILL_COUNT,
E_TYPE_HEALTH,
E_TYPE_ACHIEVEMENT,
E_TYPE_STAT,
E_TYPE_STAT_ITEM_CRAFT,
E_TYPE_STAT_ITEM_USE,
E_TYPE_STAT_ITEM_BREAK,
E_TYPE_STAT_BLOCK_MINE,
E_TYPE_STAT_ENTITY_KILL,
E_TYPE_STAT_ENTITY_KILLED_BY
};
enum eDisplaySlot
{
E_DISPLAY_SLOT_LIST,
E_DISPLAY_SLOT_SIDEBAR,
E_DISPLAY_SLOT_NAME
};
public:
cObjective(eType a_Type);
eType GetType(void) const { return m_Type; }
eDisplaySlot GetDisplaySlot(void) const { return m_Display; } eDisplaySlot GetDisplaySlot(void) const { return m_Display; }
@ -98,7 +88,7 @@ private:
ScoreMap m_Scores; ScoreMap m_Scores;
eObjectiveType m_Type; eType m_Type;
eDisplaySlot m_Display; eDisplaySlot m_Display;
}; };
@ -110,14 +100,17 @@ private:
class cTeam class cTeam
{ {
public: public:
cTeam(const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix); cTeam(
const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix
);
/// Adds a new player to the team /// Adds a new player to the team
bool AddPlayer(cPlayer * a_Player); bool AddPlayer(const AString & a_Name);
/// Removes a player from the team /// Removes a player from the team
bool RemovePlayer(cPlayer * a_Player); bool RemovePlayer(const AString & a_Name);
/// Removes all registered players /// Removes all registered players
void Reset(void); void Reset(void);
@ -125,10 +118,10 @@ public:
/// Returns the number of registered players /// Returns the number of registered players
unsigned int GetNumPlayers(void) const; unsigned int GetNumPlayers(void) const;
bool GetFriendlyFire(void) const { return m_FriendlyFire; } bool AllowsFriendlyFire(void) const { return m_AllowsFriendlyFire; }
bool GetCanSeeFriendlyInvisible(void) const { return m_SeeFriendlyInvisible; } bool CanSeeFriendlyInvisible(void) const { return m_CanSeeFriendlyInvisible; }
const AString & GetDisplayName(void) const { return m_Name; } const AString & GetDisplayName(void) const { return m_DisplayName; }
const AString & GetName(void) const { return m_DisplayName; } const AString & GetName(void) const { return m_DisplayName; }
const AString & GetPrefix(void) const { return m_Prefix; } const AString & GetPrefix(void) const { return m_Prefix; }
@ -144,8 +137,8 @@ public:
private: private:
bool m_FriendlyFire; bool m_AllowsFriendlyFire;
bool m_SeeFriendlyInvisible; bool m_CanSeeFriendlyInvisible;
AString m_DisplayName; AString m_DisplayName;
AString m_Name; AString m_Name;
@ -154,7 +147,9 @@ private:
AString m_Suffix; AString m_Suffix;
// TODO 2014-01-19 xdot: Potential optimization - vector/list // TODO 2014-01-19 xdot: Potential optimization - vector/list
cPlayerSet m_Players; typedef std::set<AString> PlayerNameSet;
PlayerNameSet m_Players;
}; };
@ -165,10 +160,9 @@ class cScoreboard
{ {
public: public:
cScoreboard() {} cScoreboard() {}
virtual ~cScoreboard();
/// Registers a new scoreboard objective, returns the cObjective instance /// Registers a new scoreboard objective, returns the cObjective instance, NULL on name collision
cObjective* RegisterObjective(const AString & a_Name, eObjectiveType a_Type); cObjective* RegisterObjective(const AString & a_Name, cObjective::eType a_Type);
/// Removes a registered objective, returns true if operation was successful /// Removes a registered objective, returns true if operation was successful
bool RemoveObjective(const AString & a_Name); bool RemoveObjective(const AString & a_Name);
@ -176,7 +170,7 @@ public:
/// Retrieves the objective with the specified name, NULL if not found /// Retrieves the objective with the specified name, NULL if not found
cObjective* GetObjective(const AString & a_Name); cObjective* GetObjective(const AString & a_Name);
/// Registers a new team, returns the cTeam instance /// Registers a new team, returns the cTeam instance, NULL on name collision
cTeam* RegisterTeam(const AString & a_Name, const AString & a_DisplayName, cTeam* RegisterTeam(const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix); const AString & a_Prefix, const AString & a_Suffix);
@ -187,14 +181,14 @@ public:
cTeam* GetTeam(const AString & a_Name); cTeam* GetTeam(const AString & a_Name);
/// Execute callback for each objective with the specified type /// Execute callback for each objective with the specified type
void ForEachObjectiveWith(eObjectiveType a_Type, cObjectiveCallback& a_Callback); void ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallback& a_Callback);
private: private:
typedef std::pair<AString, cObjective*> NamedObjective; typedef std::pair<AString, cObjective> NamedObjective;
typedef std::pair<AString, cTeam*> NamedTeam; typedef std::pair<AString, cTeam> NamedTeam;
typedef std::map<AString, cObjective*> ObjectiveMap; typedef std::map<AString, cObjective> ObjectiveMap;
typedef std::map<AString, cTeam*> TeamMap; typedef std::map<AString, cTeam> TeamMap;
// TODO 2014-01-19 xdot: Potential optimization - Sort objectives based on type // TODO 2014-01-19 xdot: Potential optimization - Sort objectives based on type
ObjectiveMap m_Objectives; ObjectiveMap m_Objectives;