diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index 3a0eb1edd..40107153b 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -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());
 	auto player = m_Player;
-	m_Self.reset();
-	SetState(csDestroyed);  // Tick thread is allowed to call destructor async at any time after this
+	auto Self = std::move(m_Self);  // Keep ourself alive for at least as long as this function
+	SetState(csDestroyed);
 
 	if (player == nullptr)
 	{
@@ -3350,7 +3350,7 @@ void cClientHandle::SetSelf(cClientHandlePtr a_Self)
 bool cClientHandle::SetState(eState a_NewState)
 {
 	cCSLock Lock(m_CSState);
-	if (a_NewState < m_State)
+	if (a_NewState <= m_State)
 	{
 		return false;  // Can only advance the state machine
 	}
diff --git a/src/World.cpp b/src/World.cpp
index 2d0dfca9f..a08c269d8 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -2543,9 +2543,13 @@ std::unique_ptr<cPlayer> cWorld::RemovePlayer(cPlayer & a_Player)
 #ifdef _DEBUG
 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;
+		}
 	}
 
 	{