Added a delay between the kick packet and socket close.
This should have helped #31, but the client disagrees.
This commit is contained in:
parent
61e17d23f7
commit
69dc9b4c9a
@ -51,6 +51,9 @@ static const int MAX_EXPLOSIONS_PER_TICK = 100;
|
||||
/// How many explosions in the recent history are allowed
|
||||
static const int MAX_RUNNING_SUM_EXPLOSIONS = cClientHandle::NUM_CHECK_EXPLOSIONS_TICKS * MAX_EXPLOSIONS_PER_TICK / 8;
|
||||
|
||||
/// How many ticks before the socket is closed after the client is destroyed (#31)
|
||||
static const int TICKS_BEFORE_CLOSE = 20;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -84,6 +87,7 @@ cClientHandle::cClientHandle(const cSocket * a_Socket, int a_ViewDistance)
|
||||
, m_bKeepThreadGoing(true)
|
||||
, m_Ping(1000)
|
||||
, m_PingID(1)
|
||||
, m_TicksSinceDestruction(0)
|
||||
, m_State(csConnected)
|
||||
, m_LastStreamedChunkX(0x7fffffff) // bogus chunk coords to force streaming upon login
|
||||
, m_LastStreamedChunkZ(0x7fffffff)
|
||||
@ -111,7 +115,7 @@ cClientHandle::cClientHandle(const cSocket * a_Socket, int a_ViewDistance)
|
||||
|
||||
cClientHandle::~cClientHandle()
|
||||
{
|
||||
ASSERT(m_State == csDestroyed); // Has Destroy() been called?
|
||||
ASSERT(m_State >= csDestroyedWaiting); // Has Destroy() been called?
|
||||
|
||||
LOGD("Deleting client \"%s\" at %p", GetUsername().c_str(), this);
|
||||
|
||||
@ -189,7 +193,7 @@ void cClientHandle::Destroy(void)
|
||||
RemoveFromAllChunks();
|
||||
m_Player->GetWorld()->RemoveClientFromChunkSender(this);
|
||||
}
|
||||
m_State = csDestroyed;
|
||||
m_State = csDestroyedWaiting;
|
||||
}
|
||||
|
||||
|
||||
@ -1397,6 +1401,17 @@ bool cClientHandle::CheckBlockInteractionsRate(void)
|
||||
|
||||
void cClientHandle::Tick(float a_Dt)
|
||||
{
|
||||
// Handle clients that are waiting for final close while destroyed:
|
||||
if (m_State == csDestroyedWaiting)
|
||||
{
|
||||
m_TicksSinceDestruction += 1; // This field is misused for the timeout counting
|
||||
if (m_TicksSinceDestruction > TICKS_BEFORE_CLOSE)
|
||||
{
|
||||
m_State = csDestroyed;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Process received network data:
|
||||
AString IncomingData;
|
||||
{
|
||||
|
@ -255,6 +255,9 @@ private:
|
||||
int m_LastDigBlockY;
|
||||
int m_LastDigBlockZ;
|
||||
|
||||
/// Used while csDestroyedWaiting for counting the ticks until the connection is closed
|
||||
int m_TicksSinceDestruction;
|
||||
|
||||
enum eState
|
||||
{
|
||||
csConnected, ///< The client has just connected, waiting for their handshake / login
|
||||
@ -264,6 +267,7 @@ private:
|
||||
csConfirmingPos, ///< The client has been sent the position packet, waiting for them to repeat the position back
|
||||
csPlaying, ///< Normal gameplay
|
||||
csDestroying, ///< The client is being destroyed, don't queue any more packets / don't add to chunks
|
||||
csDestroyedWaiting, ///< The client has been destroyed, but is still kept so that the Kick packet is delivered (#31)
|
||||
csDestroyed, ///< The client has been destroyed, the destructor is to be called from the owner thread
|
||||
|
||||
// TODO: Add Kicking here as well
|
||||
|
Loading…
Reference in New Issue
Block a user