From e2acb45d191a401c2b2f93cbb6484be631bed14d Mon Sep 17 00:00:00 2001 From: "mtilden@gmail.com" Date: Mon, 26 Dec 2011 04:06:29 +0000 Subject: [PATCH] - Added timer to cPlayer PlayerListItem because sending the packets like minecraft does (every tick per player) is 20 pps per client to each client and was causing Kicks for having too high of a packet queue git-svn-id: http://mc-server.googlecode.com/svn/trunk@120 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cPlayer.cpp | 21 ++++++++++++++------- source/cPlayer.h | 3 +++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/source/cPlayer.cpp b/source/cPlayer.cpp index d0dfa8795..41bb24945 100644 --- a/source/cPlayer.cpp +++ b/source/cPlayer.cpp @@ -16,6 +16,7 @@ #include "cTracer.h" #include "cRoot.h" #include "cMakeDir.h" +#include "cTimer.h" #include "packets/cPacket_NamedEntitySpawn.h" #include "packets/cPacket_EntityLook.h" @@ -82,6 +83,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const char* a_PlayerName) { m_EntityType = E_PLAYER; m_Inventory = new cInventory( this ); + cTimer t1; + m_LastPlayerListTime = t1.GetNowTime(); m_TimeLastTeleportPacket = cWorld::GetTime(); m_TimeLastPickupCheck = cWorld::GetTime(); @@ -234,14 +237,18 @@ void cPlayer::Tick(float a_Dt) InStateBurning(a_Dt); } - // Send Player List - cWorld::PlayerList PlayerList = cRoot::Get()->GetWorld()->GetAllPlayers(); - for( cWorld::PlayerList::iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr ) - { - if ((*itr) && (*itr)->GetClientHandle() && !((*itr)->GetClientHandle()->IsDestroyed())) { - cPacket_PlayerListItem PlayerList(GetColor() + GetName(), true, (*itr)->GetClientHandle()->GetPing()); - (*itr)->GetClientHandle()->Send( PlayerList ); + cTimer t1; + // Send Player List (Once per m_LastPlayerListTime/1000 second(s)) + if (m_LastPlayerListTime + cPlayer::E_PLAYER_LIST_TIME <= t1.GetNowTime()) { + cWorld::PlayerList PlayerList = cRoot::Get()->GetWorld()->GetAllPlayers(); + for( cWorld::PlayerList::iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr ) + { + if ((*itr) && (*itr)->GetClientHandle() && !((*itr)->GetClientHandle()->IsDestroyed())) { + cPacket_PlayerListItem PlayerList(GetColor() + GetName(), true, (*itr)->GetClientHandle()->GetPing()); + (*itr)->GetClientHandle()->Send( PlayerList ); + } } + m_LastPlayerListTime = t1.GetNowTime(); } } diff --git a/source/cPlayer.h b/source/cPlayer.h index e25fb1b07..6f52b3f1f 100644 --- a/source/cPlayer.h +++ b/source/cPlayer.h @@ -112,5 +112,8 @@ protected: int m_GameMode; std::string m_IP; + long long m_LastPlayerListTime; + static const unsigned short E_PLAYER_LIST_TIME = 1000; // 1000 = once per second + cClientHandle* m_ClientHandle; }; //tolua_export