Added the player list to the 1.8 protocol.

master
Howaner 2014-09-09 03:02:25 +02:00
parent 6fb0a76b1e
commit f94df06b66
16 changed files with 109 additions and 32 deletions

@ -1 +1 @@
Subproject commit 203c2fb68bbf871eaf4ca98756a113d74d620dea Subproject commit 27b9d111818af3b05bcf4153bb6e380fe1dd6816

View File

@ -127,7 +127,7 @@ cClientHandle::~cClientHandle()
if (!m_Username.empty() && (World != NULL)) if (!m_Username.empty() && (World != NULL))
{ {
// Send the Offline PlayerList packet: // Send the Offline PlayerList packet:
World->BroadcastPlayerListItem(*m_Player, false, this); World->BroadcastPlayerListItem(*m_Player, 4, this);
} }
if (World != NULL) if (World != NULL)
{ {
@ -366,6 +366,10 @@ void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID,
m_Player->Initialize(*World); m_Player->Initialize(*World);
m_State = csAuthenticated; m_State = csAuthenticated;
// Send player list items
SendPlayerListItem(*m_Player, 0);
World->SendPlayerList(m_Player);
// Query player team // Query player team
m_Player->UpdateTeam(); m_Player->UpdateTeam();
@ -2378,9 +2382,9 @@ void cClientHandle::SendPlayerAbilities()
void cClientHandle::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cClientHandle::SendPlayerListItem(const cPlayer & a_Player, char a_Action)
{ {
m_Protocol->SendPlayerListItem(a_Player, a_IsOnline); m_Protocol->SendPlayerListItem(a_Player, a_Action);
} }

View File

@ -156,7 +156,7 @@ public:
void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); // tolua_export void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); // tolua_export
void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount); void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount);
void SendPlayerAbilities (void); void SendPlayerAbilities (void);
void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline); void SendPlayerListItem (const cPlayer & a_Player, char a_Action);
void SendPlayerMaxSpeed (void); ///< Informs the client of the maximum player speed (1.6.1+) void SendPlayerMaxSpeed (void); ///< Informs the client of the maximum player speed (1.6.1+)
void SendPlayerMoveLook (void); void SendPlayerMoveLook (void);
void SendPlayerPosition (void); void SendPlayerPosition (void);

View File

@ -135,7 +135,7 @@ const char * cEntity::GetParentClass(void) const
bool cEntity::Initialize(cWorld & a_World) bool cEntity::Initialize(cWorld & a_World)
{ {
if (cPluginManager::Get()->CallHookSpawningEntity(a_World, *this)) if (cPluginManager::Get()->CallHookSpawningEntity(a_World, *this) && !IsPlayer())
{ {
return false; return false;
} }

View File

@ -266,7 +266,7 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
cTimer t1; cTimer t1;
if (m_LastPlayerListTime + PLAYER_LIST_TIME_MS <= t1.GetNowTime()) if (m_LastPlayerListTime + PLAYER_LIST_TIME_MS <= t1.GetNowTime())
{ {
m_World->SendPlayerList(this); m_World->BroadcastPlayerListItem(*this, 2);
m_LastPlayerListTime = t1.GetNowTime(); m_LastPlayerListTime = t1.GetNowTime();
} }
@ -1172,6 +1172,8 @@ void cPlayer::SetGameMode(eGameMode a_GameMode)
SetFlying(false); SetFlying(false);
SetCanFly(false); SetCanFly(false);
} }
m_World->BroadcastPlayerListItem(*this, 1);
} }

View File

@ -94,7 +94,7 @@ public:
virtual void SendPlayerAbilities (void) = 0; virtual void SendPlayerAbilities (void) = 0;
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) = 0; virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) = 0;
virtual void SendParticleEffect (const AString & a_SoundName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) = 0; virtual void SendParticleEffect (const AString & a_SoundName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) = 0;
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) = 0; virtual void SendPlayerListItem (const cPlayer & a_Player, char a_Action) = 0;
virtual void SendPlayerMaxSpeed (void) = 0; ///< Informs the client of the maximum player speed (1.6.1+) virtual void SendPlayerMaxSpeed (void) = 0; ///< Informs the client of the maximum player speed (1.6.1+)
virtual void SendPlayerMoveLook (void) = 0; virtual void SendPlayerMoveLook (void) = 0;
virtual void SendPlayerPosition (void) = 0; virtual void SendPlayerPosition (void) = 0;

View File

@ -720,9 +720,15 @@ void cProtocol125::SendPaintingSpawn(const cPainting & a_Painting)
void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, char a_Action)
{ {
cCSLock Lock(m_CSPacket); cCSLock Lock(m_CSPacket);
if (a_Action == 1)
{
// Ignore gamemode update
return;
}
AString PlayerName(a_Player.GetColor()); AString PlayerName(a_Player.GetColor());
PlayerName.append(a_Player.GetName()); PlayerName.append(a_Player.GetName());
if (PlayerName.length() > 14) if (PlayerName.length() > 14)
@ -733,8 +739,8 @@ void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
WriteByte ((unsigned char)PACKET_PLAYER_LIST_ITEM); WriteByte ((unsigned char)PACKET_PLAYER_LIST_ITEM);
WriteString(PlayerName); WriteString(PlayerName);
WriteBool (a_IsOnline); WriteBool (a_Action != 4);
WriteShort (a_IsOnline ? a_Player.GetClientHandle()->GetPing() : 0); WriteShort ((a_Action == 4) ? 0 : a_Player.GetClientHandle()->GetPing());
Flush(); Flush();
} }

View File

@ -65,7 +65,7 @@ public:
virtual void SendPickupSpawn (const cPickup & a_Pickup) override; virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override; virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override; virtual void SendPlayerListItem (const cPlayer & a_Player, char a_Action) override;
virtual void SendPlayerMaxSpeed (void) override; virtual void SendPlayerMaxSpeed (void) override;
virtual void SendPlayerMoveLook (void) override; virtual void SendPlayerMoveLook (void) override;
virtual void SendPlayerPosition (void) override; virtual void SendPlayerPosition (void) override;

View File

@ -867,14 +867,19 @@ void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_Sr
void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, char a_Action)
{ {
ASSERT(m_State == 3); // In game mode? ASSERT(m_State == 3); // In game mode?
if (a_Action == 1)
{
// Ignore gamemode update
return;
}
cPacketizer Pkt(*this, 0x38); // Playerlist Item packet cPacketizer Pkt(*this, 0x38); // Playerlist Item packet
Pkt.WriteString(a_Player.GetName()); Pkt.WriteString(a_Player.GetName());
Pkt.WriteBool(a_IsOnline); Pkt.WriteBool(a_Action != 4);
Pkt.WriteShort(a_IsOnline ? a_Player.GetClientHandle()->GetPing() : 0); Pkt.WriteShort((a_Action == 4) ? 0 : a_Player.GetClientHandle()->GetPing());
} }

View File

@ -101,7 +101,7 @@ public:
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override; virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
virtual void SendPickupSpawn (const cPickup & a_Pickup) override; virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
virtual void SendPlayerAbilities (void) override; virtual void SendPlayerAbilities (void) override;
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override; virtual void SendPlayerListItem (const cPlayer & a_Player, char a_Action) override;
virtual void SendPlayerMaxSpeed (void) override; virtual void SendPlayerMaxSpeed (void) override;
virtual void SendPlayerMoveLook (void) override; virtual void SendPlayerMoveLook (void) override;
virtual void SendPlayerPosition (void) override; virtual void SendPlayerPosition (void) override;

View File

@ -659,7 +659,7 @@ void cProtocol180::SendLogin(const cPlayer & a_Player, const cWorld & a_World)
Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (Server->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4 Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (Server->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4
Pkt.WriteChar((char)a_World.GetDimension()); Pkt.WriteChar((char)a_World.GetDimension());
Pkt.WriteByte(2); // TODO: Difficulty (set to Normal) Pkt.WriteByte(2); // TODO: Difficulty (set to Normal)
Pkt.WriteByte(std::min(Server->GetMaxPlayers(), 60)); Pkt.WriteByte(Server->GetMaxPlayers());
Pkt.WriteString("default"); // Level type - wtf? Pkt.WriteString("default"); // Level type - wtf?
Pkt.WriteBool(false); // Reduced Debug Info - wtf? Pkt.WriteBool(false); // Reduced Debug Info - wtf?
} }
@ -868,14 +868,74 @@ void cProtocol180::SendParticleEffect(const AString & a_ParticleName, float a_Sr
void cProtocol180::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocol180::SendPlayerListItem(const cPlayer & a_Player, char a_Action)
{ {
ASSERT(m_State == 3); // In game mode? ASSERT(m_State == 3); // In game mode?
/*cPacketizer Pkt(*this, 0x38); // Playerlist Item packet cPacketizer Pkt(*this, 0x38); // Playerlist Item packet
Pkt.WriteVarInt(a_Action);
Pkt.WriteVarInt(1);
Pkt.WriteUUID(a_Player.GetUUID());
switch (a_Action)
{
case 0:
{
// Add Player
Pkt.WriteString(a_Player.GetName()); Pkt.WriteString(a_Player.GetName());
Pkt.WriteBool(a_IsOnline);
Pkt.WriteShort(a_IsOnline ? a_Player.GetClientHandle()->GetPing() : 0);*/ const Json::Value & Properties = a_Player.GetClientHandle()->GetProperties();
Pkt.WriteVarInt(Properties.size());
for (Json::Value::iterator itr = Properties.begin(), end = Properties.end(); itr != end; ++itr)
{
Pkt.WriteString(((Json::Value)*itr).get("name", "").asString());
Pkt.WriteString(((Json::Value)*itr).get("value", "").asString());
AString Signature = ((Json::Value)*itr).get("signature", "").asString();
if (Signature.empty())
{
Pkt.WriteBool(false);
}
else
{
Pkt.WriteBool(true);
Pkt.WriteString(Signature);
}
}
Pkt.WriteVarInt((UInt32)a_Player.GetGameMode());
Pkt.WriteVarInt((UInt32)a_Player.GetClientHandle()->GetPing());
Pkt.WriteBool(false);
break;
}
case 1:
{
// Update GameMode
Pkt.WriteVarInt((UInt32)a_Player.GetGameMode());
break;
}
case 2:
{
// Update Ping
Pkt.WriteVarInt((UInt32)a_Player.GetClientHandle()->GetPing());
break;
}
case 3:
{
// Update DisplayName
Pkt.WriteBool(false);
break;
}
case 4:
{
// Remove player
break;
}
default:
{
ASSERT(!"Unhandled player list item action!");
return;
}
}
} }

View File

@ -97,7 +97,7 @@ public:
virtual void SendPlayerAbilities (void) override; virtual void SendPlayerAbilities (void) override;
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override; virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override; virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override; virtual void SendPlayerListItem (const cPlayer & a_Player, char a_Action) override;
virtual void SendPlayerMaxSpeed (void) override; virtual void SendPlayerMaxSpeed (void) override;
virtual void SendPlayerMoveLook (void) override; virtual void SendPlayerMoveLook (void) override;
virtual void SendPlayerPosition (void) override; virtual void SendPlayerPosition (void) override;

View File

@ -489,10 +489,10 @@ void cProtocolRecognizer::SendEntityAnimation(const cEntity & a_Entity, char a_A
void cProtocolRecognizer::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocolRecognizer::SendPlayerListItem(const cPlayer & a_Player, char a_Action)
{ {
ASSERT(m_Protocol != NULL); ASSERT(m_Protocol != NULL);
m_Protocol->SendPlayerListItem(a_Player, a_IsOnline); m_Protocol->SendPlayerListItem(a_Player, a_Action);
} }

View File

@ -101,7 +101,7 @@ public:
virtual void SendPickupSpawn (const cPickup & a_Pickup) override; virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
virtual void SendPlayerAbilities (void) override; virtual void SendPlayerAbilities (void) override;
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override; virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override; virtual void SendPlayerListItem (const cPlayer & a_Player, char a_Action) override;
virtual void SendPlayerMaxSpeed (void) override; virtual void SendPlayerMaxSpeed (void) override;
virtual void SendPlayerMoveLook (void) override; virtual void SendPlayerMoveLook (void) override;
virtual void SendPlayerPosition (void) override; virtual void SendPlayerPosition (void) override;

View File

@ -2147,7 +2147,7 @@ void cWorld::BroadcastParticleEffect(const AString & a_ParticleName, float a_Src
void cWorld::BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline, const cClientHandle * a_Exclude) void cWorld::BroadcastPlayerListItem(const cPlayer & a_Player, char a_Action, const cClientHandle * a_Exclude)
{ {
cCSLock Lock(m_CSPlayers); cCSLock Lock(m_CSPlayers);
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
@ -2157,7 +2157,7 @@ void cWorld::BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline,
{ {
continue; continue;
} }
ch->SendPlayerListItem(a_Player, a_IsOnline); ch->SendPlayerListItem(a_Player, a_Action);
} }
} }
@ -2680,7 +2680,7 @@ void cWorld::SendPlayerList(cPlayer * a_DestPlayer)
cClientHandle * ch = (*itr)->GetClientHandle(); cClientHandle * ch = (*itr)->GetClientHandle();
if ((ch != NULL) && !ch->IsDestroyed()) if ((ch != NULL) && !ch->IsDestroyed())
{ {
a_DestPlayer->GetClientHandle()->SendPlayerListItem(*(*itr), true); a_DestPlayer->GetClientHandle()->SendPlayerListItem(*(*itr), 0);
} }
} }
} }

View File

@ -237,7 +237,7 @@ public:
void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL); void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
virtual void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL) override; // tolua_export virtual void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL) override; // tolua_export
void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude = NULL); // tolua_export void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude = NULL); // tolua_export
void BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline, const cClientHandle * a_Exclude = NULL); void BroadcastPlayerListItem (const cPlayer & a_Player, char a_Action, const cClientHandle * a_Exclude = NULL);
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL); void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
void BroadcastScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode); void BroadcastScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);
void BroadcastScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode); void BroadcastScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);