Fix client disconnect assert (#4579)
This commit is contained in:
parent
1e4cf9ce48
commit
6116f899de
@ -163,8 +163,8 @@ void cClientHandle::Destroy(void)
|
|||||||
|
|
||||||
LOGD("%s: destroying client %p, \"%s\" @ %s", __FUNCTION__, static_cast<void *>(this), m_Username.c_str(), m_IPString.c_str());
|
LOGD("%s: destroying client %p, \"%s\" @ %s", __FUNCTION__, static_cast<void *>(this), m_Username.c_str(), m_IPString.c_str());
|
||||||
auto player = m_Player;
|
auto player = m_Player;
|
||||||
m_Self.reset();
|
auto Self = std::move(m_Self); // Keep ourself alive for at least as long as this function
|
||||||
SetState(csDestroyed); // Tick thread is allowed to call destructor async at any time after this
|
SetState(csDestroyed);
|
||||||
|
|
||||||
if (player == nullptr)
|
if (player == nullptr)
|
||||||
{
|
{
|
||||||
@ -3350,7 +3350,7 @@ void cClientHandle::SetSelf(cClientHandlePtr a_Self)
|
|||||||
bool cClientHandle::SetState(eState a_NewState)
|
bool cClientHandle::SetState(eState a_NewState)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSState);
|
cCSLock Lock(m_CSState);
|
||||||
if (a_NewState < m_State)
|
if (a_NewState <= m_State)
|
||||||
{
|
{
|
||||||
return false; // Can only advance the state machine
|
return false; // Can only advance the state machine
|
||||||
}
|
}
|
||||||
|
@ -2543,9 +2543,13 @@ std::unique_ptr<cPlayer> cWorld::RemovePlayer(cPlayer & a_Player)
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
bool cWorld::IsPlayerReferencedInWorldOrChunk(cPlayer & a_Player)
|
bool cWorld::IsPlayerReferencedInWorldOrChunk(cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
if (m_ChunkMap->RemoveEntity(a_Player) != nullptr)
|
|
||||||
{
|
{
|
||||||
return true;
|
cLock lock(*this);
|
||||||
|
auto * Chunk = a_Player.GetParentChunk();
|
||||||
|
if (Chunk && Chunk->HasEntity(a_Player.GetUniqueID()))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user