KPlayer* KSO3World::NewPlayer(DWORD dwPlayerID) { KPlayer* pResult = NULL; BOOL bRetCode = false; KPlayer* pPlayer = NULL; BOOL bRegisterFlag = false; BOOL bInitFlag = false; assert(dwPlayerID != ERROR_ID); pPlayer = KMemory::New<KPlayer>(); KGLOG_PROCESS_ERROR(pPlayer); bRetCode = g_pSO3World->m_PlayerSet.Register(pPlayer, dwPlayerID); KGLOG_PROCESS_ERROR(bRetCode); bRegisterFlag = true; bRetCode = pPlayer->Init(); KGLOG_PROCESS_ERROR(bRetCode); bInitFlag = true; pResult = pPlayer; Exit0: if (pResult == NULL) { if (bInitFlag) { pPlayer->UnInit(); bInitFlag = false; } if (bRegisterFlag) { g_pSO3World->m_PlayerSet.Unregister(pPlayer); bRegisterFlag = false; } if (pPlayer != NULL) { KMemory::Delete(pPlayer); pPlayer = NULL; } } return pResult; }