uint CGConnectHandler::Execute( CGConnect* pPacket, Player* pPlayer ) { __ENTER_FUNCTION //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==g_pIncomingPlayerManager->m_ThreadID ) ; GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; //检查IP地址是否合法 if( !IsActiveIP(pGamePlayer->GetSocket()->m_Host ) ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::Not active ip address! " ) ; return PACKET_EXE_ERROR ; } //验证用户接入的合法性(可以即时完成) if( !pGamePlayer->CheckKey(pPacket->GetKey()) ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::GamePlayer->CheckKey " ) ; return PACKET_EXE_ERROR ; } if( pPacket->GetCheckVer()!=CURRENT_VERSION ) { //检查不合格 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::Versions FALSE " ) ; return PACKET_EXE_ERROR ; } if( pPacket->GetCountry() >= MAX_COUNTRY_NUM) { //检查不合格 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::Country FALSE " ) ; return PACKET_EXE_ERROR ; } if( pPacket->GetProfession() > MAX_MENPAI_NUM) { //检查不合格 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::profession FALSE " ) ; return PACKET_EXE_ERROR ; } //取得用户角色数据,并初始化用户角色信息 // 如果数据在别的服务器上(或者在数据库上), // 则需要等待别的服务器端将数据发送过来 ID_t ServerID = pPacket->GetServerID() ; GWAskUserData* AskMsg = (GWAskUserData*)(g_pPacketFactoryManager->CreatePacket(PACKET_GW_ASKUSERDATA)) ; AskMsg->SetPlayerID( pGamePlayer->PlayerID() ) ; AskMsg->SetGUID( pPacket->GetGUID() ) ; AskMsg->SetKey( pPacket->GetKey() ) ; AskMsg->SetAccount( pPacket->GetAccount() ) ; AskMsg->SetGender( pPacket->GetGender() ) ;//性别 AskMsg->SetCountry( pPacket->GetCountry() ); AskMsg->SetProfession( pPacket->GetProfession() ); AskMsg->SetFaceModel( pPacket->GetFaceModel() ); g_pServerManager->SendPacket( AskMsg, ServerID ) ; pGamePlayer->m_HumanGUID = pPacket->GetGUID() ; //将Player状态设置为“等待服务器取得资料” pGamePlayer->SetPlayerStatus( PS_SERVER_WAITING_FOR_SERVER_DATA ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGConnect::Execute(GUID=%X SOCKET=%d IP=%s) ...OK ", pPacket->GetGUID(), pGamePlayer->GetSocket()->getSOCKET(), pGamePlayer->GetSocket()->m_Host ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGConnectHandler::Execute( CGConnect* pPacket, Player* pPlayer ) { __ENTER_FUNCTION //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==g_pIncomingPlayerManager->m_ThreadID ) ; GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; //检查GamePlayer状态是否正常 if( pGamePlayer->GetPlayerStatus() != PS_SERVER_CONNECT ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::GetPlayerStatus! GUID=%X, Status=%d", pPacket->GetGUID(), pGamePlayer->GetPlayerStatus() ) ; return PACKET_EXE_ERROR ; } //检查IP地址是否合法 if( !IsActiveIP(pGamePlayer->GetSocket()->m_Host ) ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::Not active ip address! " ) ; return PACKET_EXE_ERROR ; } //验证用户接入的合法性(可以即时完成) if( !pGamePlayer->CheckKey(pPacket->GetKey()) ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::GamePlayer->CheckKey " ) ; return PACKET_EXE_ERROR ; } //检查不合格 if( pPacket->GetCheckVer()!=CURRENT_VERSION ) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::Versions FALSE " ) ; return PACKET_EXE_ERROR ; } //判断当前需要登陆的GUID的玩家是否正在保存档案 Obj_Human* pOldHuman = (Obj_Human*)(g_pGUIDManager->Get(pPacket->GetGUID())) ; if( pOldHuman ) { GamePlayer* pOldPlayer = (GamePlayer*)(pOldHuman->GetPlayer()) ; if( pOldPlayer && pOldPlayer->GetPlayerStatus()==PS_SERVER_ENTER_RECYCLE ) { GCConnect *pMsg = (GCConnect*)(g_pPacketFactoryManager->CreatePacket(PACKET_GC_CONNECT)) ; pMsg->SetServerID(-1); pMsg->SetSceneID(-1); pMsg->SetEstate(1);//1表示服务器正在存盘当前玩家,请玩家等待 pPlayer->SendPacket(pMsg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGConnect::PS_SERVER_ENTER_RECYCLE GUID=%X", pPacket->GetGUID() ) ; return PACKET_EXE_CONTINUE ; } } //取得用户角色数据,并初始化用户角色信息 // 如果数据在别的服务器上(或者在数据库上), // 则需要等待别的服务器端将数据发送过来 ID_t ServerID = pPacket->GetServerID() ; if( !StrSafeCheck( pPacket->GetAccount(), MAX_ACCOUNT ) ) { Assert(FALSE); } GWAskUserData* AskMsg = (GWAskUserData*)(g_pPacketFactoryManager->CreatePacket(PACKET_GW_ASKUSERDATA)) ; AskMsg->SetPlayerID( pGamePlayer->PlayerID() ) ; AskMsg->SetGUID( pPacket->GetGUID() ) ; AskMsg->SetKey( pPacket->GetKey() ) ; AskMsg->SetAccount( pPacket->GetAccount() ) ; AskMsg->SetGender( pPacket->GetGender() ) ;//性别 g_pServerManager->SendPacket( AskMsg, ServerID ) ; pGamePlayer->m_HumanGUID = pPacket->GetGUID() ; if (pPacket->GetGUID() == INVALID_ID) { Assert(FALSE); } //将Player状态设置为“等待服务器取得资料” pGamePlayer->SetPlayerStatus( PS_SERVER_WAITING_FOR_SERVER_DATA ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGConnect::Execute(GUID=%X SOCKET=%d IP=%s) ...OK ", pPacket->GetGUID(), pGamePlayer->GetSocket()->getSOCKET(), pGamePlayer->GetSocket()->m_Host ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }