BOOL KPlayerServer::Detach(int nConnIndex) { BOOL bResult = false; KPlayer* pPlayer = NULL; assert(nConnIndex >= 0 && nConnIndex < m_nMaxConnection); pPlayer = m_ConnectionDataList[nConnIndex].pPlayer; KG_PROCESS_ERROR(pPlayer); // 暂时这么处理,以后应该执行托管 pPlayer->Logout(); m_ConnectionDataList[nConnIndex].pPlayer = NULL; pPlayer->m_nConnIndex = -1; switch (pPlayer->m_eGameStatus) { case gsPlaying: pPlayer->RemoveHero(); g_RelayClient.SaveRoleData(pPlayer); g_pSO3World->DelPlayer(pPlayer); break; case gsInHall: case gsSearchMap: case gsWaitForNewMapLoading: g_RelayClient.SaveRoleData(pPlayer); g_pSO3World->DelPlayer(pPlayer); break; //case gsWaitForConnect: 此状态下网关还未解锁,在连接超时处删除玩家 case gsWaitForPermit: case gsWaitForRoleData: case gsWaitForTransmissionSave: case gsWaitForTransmissionGuid: g_pSO3World->DelPlayer(pPlayer); break; default: KGLogPrintf( KGLOG_ERR, "Unexpected GameStatus %d for player %s when connection close !", pPlayer->m_eGameStatus, pPlayer->m_szName ); break; } bResult = true; Exit0: return bResult; }