Fixed cClientHandle::Tick() being called from two threads.
When the player was initialized, the Tick() function continued to stream chunk, while the cWorld called Tick() from its tick thread. Final fix for #187.
This commit is contained in:
@@ -1476,12 +1476,6 @@ void cClientHandle::Tick(float a_Dt)
|
||||
}
|
||||
m_Protocol->DataReceived(IncomingData.data(), IncomingData.size());
|
||||
|
||||
if (m_State == csAuthenticated)
|
||||
{
|
||||
StreamChunks();
|
||||
m_State = csDownloadingWorld;
|
||||
}
|
||||
|
||||
m_TimeSinceLastPacket += a_Dt;
|
||||
if (m_TimeSinceLastPacket > 30000.f) // 30 seconds time-out
|
||||
{
|
||||
@@ -1536,6 +1530,49 @@ void cClientHandle::Tick(float a_Dt)
|
||||
|
||||
|
||||
|
||||
void cClientHandle::ServerTick(float a_Dt)
|
||||
{
|
||||
// Handle clients that are waiting for final close while destroyed:
|
||||
if (m_State == csDestroyedWaiting)
|
||||
{
|
||||
// Do not wait while the client is not in the world, simply cut them off.
|
||||
m_State = csDestroyed;
|
||||
return;
|
||||
}
|
||||
|
||||
// Process received network data:
|
||||
AString IncomingData;
|
||||
{
|
||||
cCSLock Lock(m_CSIncomingData);
|
||||
std::swap(IncomingData, m_IncomingData);
|
||||
}
|
||||
m_Protocol->DataReceived(IncomingData.data(), IncomingData.size());
|
||||
|
||||
if (m_State == csAuthenticated)
|
||||
{
|
||||
StreamChunks();
|
||||
|
||||
// Remove the client handle from the server, it will be ticked from its cPlayer object from now on
|
||||
cRoot::Get()->GetServer()->ClientMovedToWorld(this);
|
||||
|
||||
// Add the player to the world (start ticking from there):
|
||||
m_State = csDownloadingWorld;
|
||||
m_Player->GetWorld()->AddPlayer(m_Player);
|
||||
return;
|
||||
}
|
||||
|
||||
m_TimeSinceLastPacket += a_Dt;
|
||||
if (m_TimeSinceLastPacket > 30000.f) // 30 seconds time-out
|
||||
{
|
||||
SendDisconnect("Nooooo!! You timed out! D: Come back!");
|
||||
Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle)
|
||||
{
|
||||
m_Protocol->SendAttachEntity(a_Entity, a_Vehicle);
|
||||
|
||||
Reference in New Issue
Block a user