summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ClientHandle.cpp3
-rw-r--r--src/Protocol/Protocol17x.cpp6
-rw-r--r--src/Scoreboard.cpp54
-rw-r--r--src/Scoreboard.h17
4 files changed, 74 insertions, 6 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 30d1bdaa4..b06dbc84a 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -270,6 +270,9 @@ void cClientHandle::Authenticate(void)
// Query player team
m_Player->UpdateTeam();
+ // Send scoreboard data
+ World->GetScoreBoard().SendTo(*this);
+
cRoot::Get()->GetPluginManager()->CallHookPlayerSpawned(*m_Player);
}
diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp
index d5ed1a0aa..926be6027 100644
--- a/src/Protocol/Protocol17x.cpp
+++ b/src/Protocol/Protocol17x.cpp
@@ -707,7 +707,7 @@ void cProtocol172::SendExperienceOrb(const cExpOrb & a_ExpOrb)
void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode)
{
- cPacketizer Pkt(*this, 0x3b);
+ cPacketizer Pkt(*this, 0x3B);
Pkt.WriteString(a_Name);
Pkt.WriteString(a_DisplayName);
Pkt.WriteByte(a_Mode);
@@ -719,7 +719,7 @@ void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString
void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode)
{
- cPacketizer Pkt(*this, 0x3c);
+ cPacketizer Pkt(*this, 0x3C);
Pkt.WriteString(a_Player);
Pkt.WriteByte(a_Mode);
@@ -736,7 +736,7 @@ void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString &
void cProtocol172::SendDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display)
{
- cPacketizer Pkt(*this, 0x3d);
+ cPacketizer Pkt(*this, 0x3D);
Pkt.WriteByte((int) a_Display);
Pkt.WriteString(a_Objective);
}
diff --git a/src/Scoreboard.cpp b/src/Scoreboard.cpp
index 7fa1eab99..e6812d3d7 100644
--- a/src/Scoreboard.cpp
+++ b/src/Scoreboard.cpp
@@ -7,6 +7,7 @@
#include "Scoreboard.h"
#include "World.h"
+#include "ClientHandle.h"
@@ -178,6 +179,20 @@ void cObjective::SetDisplayName(const AString & a_Name)
+void cObjective::SendTo(cClientHandle & a_Client)
+{
+ a_Client.SendScoreboardObjective(m_Name, m_DisplayName, 0);
+
+ for (cScoreMap::const_iterator it = m_Scores.begin(); it != m_Scores.end(); ++it)
+ {
+ a_Client.SendScoreUpdate(m_Name, it->first, it->second, 0);
+ }
+}
+
+
+
+
+
cTeam::cTeam(const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix)
: m_AllowsFriendlyFire(true)
@@ -397,11 +412,19 @@ void cScoreboard::SetDisplay(const AString & a_Objective, eDisplaySlot a_Slot)
cObjective * Objective = GetObjective(a_Objective);
- m_Display[a_Slot] = Objective;
+ SetDisplay(Objective, a_Slot);
+}
+
+
+
+
+
+void cScoreboard::SetDisplay(cObjective * a_Objective, eDisplaySlot a_Slot)
+{
+ m_Display[a_Slot] = a_Objective;
ASSERT(m_World != NULL);
- m_World->BroadcastDisplayObjective(Objective ? a_Objective : "", a_Slot);
-
+ m_World->BroadcastDisplayObjective(a_Objective ? a_Objective->GetName() : "", a_Slot);
}
@@ -440,6 +463,31 @@ void cScoreboard::ForEachObjectiveWith(cObjective::eType a_Type, cObjectiveCallb
+void cScoreboard::SendTo(cClientHandle & a_Client)
+{
+ cCSLock Lock(m_CSObjectives);
+
+ for (cObjectiveMap::iterator it = m_Objectives.begin(); it != m_Objectives.end(); ++it)
+ {
+ it->second.SendTo(a_Client);
+ }
+
+ for (int i = 0; i < (int) E_DISPLAY_SLOT_COUNT; ++i)
+ {
+ // Avoid race conditions
+ cObjective * Objective = m_Display[i];
+
+ if (Objective)
+ {
+ a_Client.SendDisplayObjective(Objective->GetName(), (eDisplaySlot) i);
+ }
+ }
+}
+
+
+
+
+
unsigned int cScoreboard::GetNumObjectives(void) const
{
return m_Objectives.size();
diff --git a/src/Scoreboard.h b/src/Scoreboard.h
index b92642a9a..11b456739 100644
--- a/src/Scoreboard.h
+++ b/src/Scoreboard.h
@@ -22,10 +22,13 @@ typedef cItemCallback<cObjective> cObjectiveCallback;
+// tolua_begin
class cObjective
{
public:
+ // tolua_end
+
typedef int Score;
enum eType
@@ -82,6 +85,9 @@ public:
void SetDisplayName(const AString & a_Name);
+ /// Send this objective to the specified client
+ void SendTo(cClientHandle & a_Client);
+
private:
typedef std::pair<AString, Score> cTrackedPlayer;
@@ -105,10 +111,13 @@ private:
+// tolua_begin
class cTeam
{
public:
+ // tolua_end
+
cTeam(
const AString & a_Name, const AString & a_DisplayName,
const AString & a_Prefix, const AString & a_Suffix
@@ -169,10 +178,13 @@ private:
+// tolua_begin
class cScoreboard
{
public:
+ // tolua_end
+
enum eDisplaySlot
{
E_DISPLAY_SLOT_LIST = 0,
@@ -209,11 +221,16 @@ public:
void SetDisplay(const AString & a_Objective, eDisplaySlot a_Slot);
+ void SetDisplay(cObjective * a_Objective, eDisplaySlot a_Slot);
+
cObjective * GetObjectiveIn(eDisplaySlot a_Slot);
/// Execute callback for each objective with the specified type
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 GetNumTeams(void) const;