UINT CLAskCharListHandler::Execute(CLAskCharList* pPacket, Player* pPlayer ) { __ENTER_FUNCTION TID CurrentThreadID = MyGetCurrentThreadID(); //检查线程执行资源是否正确 if(CurrentThreadID == g_pProcessPlayerManager->m_ThreadID) { LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); if( !StrSafeCheck( pPacket->GetAccount(), MAX_ACCOUNT ) ) { Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskCharListHandler Get IllegalString,acc = %s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_ERROR; } //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskCharListHandler Get Guid Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_ERROR; } UINT uTime = g_pTimeManager->CurrentTime(); if(uTime<pLoginPlayer->m_LastDBOpTime+DB_OPERATION_TIME) { LCRetCharList Msg; Msg.SetResult(ASKCHARLIST_OP_TIMES); pLoginPlayer->SendPacket(&Msg); return PACKET_EXE_CONTINUE; } if(pLoginPlayer->GetPlayerStatus()!=PS_LOGIN_NORMAL) { return PACKET_EXE_CONTINUE; } pPacket->SetPlayerID(pLoginPlayer->PlayerID()); //将玩家操作加入DB 队列 //并且设置最后操作时间 if(g_pDBThreadManager->SendPacket(pPacket,pLoginPlayer->PlayerID())) {//加入成功,将消息发送到DB处理 pLoginPlayer->m_LastDBOpTime = uTime; return PACKET_EXE_NOTREMOVE; } else {//DB 压力过大,让用户重新尝试 LCRetCharList Msg; Msg.SetResult(ASKCHARLIST_SERVER_BUSY); pLoginPlayer->SendPacket(&Msg); pLoginPlayer->m_LastDBOpTime = uTime; return PACKET_EXE_CONTINUE; } } else if(g_pDBThreadManager->IsPoolTID(CurrentThreadID)) { PlayerID_t PlayerID = pPacket->GetPlayerID(); LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); LCRetCharList* pMsg = (LCRetCharList*)g_pPacketFactoryManager->CreatePacket(PACKET_LC_RETCHARLIST) ; if(!pMsg) { //不能进行操作 AssertEx(FALSE,"创建 LCRetCharList 消息失败"); } if(pLoginPlayer->GetDBOperating() == TRUE||!g_pDBThreadManager->GetInterface(CurrentThreadID)->IsConnected()) { pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCHARLIST_SERVER_BUSY); pMsg->SetCharNumber(0); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog(LOGIN_LOGFILE, "CLAskCharListHandler::Execute()....数据库操作冲突 ,Acc = %s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_CONTINUE; } //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskCharListHandler DBOperation Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } pLoginPlayer->SetDBOperating(TRUE); ODBCInterface* pInterface = g_pDBThreadManager->GetInterface(CurrentThreadID); Assert(pInterface); DBCharList CharListObject(pInterface); CharListObject.SetAccount(pPacket->GetAccount()); BOOL bLoadRet = CharListObject.Load(); if(!bLoadRet) { Log::SaveLog(LOGIN_LOGFILE,"CharListObject.Load() ... Get Errors: %s", CharListObject.GetErrorMessage()); pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCHARLIST_OP_FAILS); pMsg->SetCharNumber(0); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskCharListHandler::Execute()....Fails!,code = ASKCHARLIST_OP_FAILS" ) ; pLoginPlayer->SetDBOperating(FALSE); return PACKET_EXE_CONTINUE; } //取结果 CharListObject.ParseResult(pMsg->GetCharBaseInfo()); //判断是否没有进入过场景 INT iCharNumber = CharListObject.GetCharNumber(); //把参数设置到pMsg pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCHARLIST_SUCCESS); pMsg->SetCharNumber(iCharNumber); pLoginPlayer->SetCharNumber(iCharNumber); for(INT i=0;i<pLoginPlayer->GetCharNumber();i++) { pLoginPlayer->SetCharGUID(pMsg->GetCharBaseInfo(i)->m_GUID,i); pLoginPlayer->SetPlayerCamp( pMsg->GetCharBaseInfo(i)->m_Camp ); } g_pProcessManager->SendPacket(pMsg,PlayerID); pLoginPlayer->SetDBOperating(FALSE); Log::SaveLog( LOGIN_LOGFILE, "CLAskCharListHandler::Execute()....OK! Acc=%s CharNum=%d", pPacket->GetAccount(), pLoginPlayer->GetCharNumber() ) ; } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT CLAskCreateCharHandler::Execute(CLAskCreateChar* pPacket, Player* pPlayer) { __ENTER_FUNCTION TID CurrentThreadID = MyGetCurrentThreadID(); if(CurrentThreadID == g_pProcessPlayerManager->m_ThreadID) { LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); if( !StrSafeCheck( pPacket->GetAccount(), MAX_ACCOUNT ) ) { Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskDeleteCharHandler Get IllegalString,acc = %s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_ERROR; } if( CheckIllegalString( pPacket->GetName(), MAX_CHARACTER_NAME, CHECK_STRING_CHARNAME ) ) { LCRetCreateChar Msg; Msg.SetAccount(pPacket->GetAccount()); Msg.SetResult(ASKCREATECHAR_INVALID_NAME); //发送DB操作频繁消息 pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler....Fails!, code = ASKCREATECHAR_INVALID_NAME") ; return PACKET_EXE_CONTINUE; } if(pLoginPlayer->GetPlayerStatus()!=PS_LOGIN_NORMAL) { //没有权限,什么也不做 return PACKET_EXE_CONTINUE; } UINT uTime = g_pTimeManager->CurrentTime(); if(uTime<pLoginPlayer->m_LastDBOpTime+DB_OPERATION_TIME) { LCRetCreateChar Msg; Msg.SetAccount(pPacket->GetAccount()); Msg.SetResult(ASKCREATECHAR_OP_TIMES); //发送DB操作频繁消息 pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler....Fails!, code = ASKCREATECHAR_OP_TIMES") ; return PACKET_EXE_CONTINUE; } pPacket->SetPlayerID(pLoginPlayer->PlayerID()); pPacket->SetAccount(pLoginPlayer->GetAccount()); //将玩家操作加入DB 队列 //并且设置最后操作时间 if(g_pDBThreadManager->SendPacket(pPacket,pLoginPlayer->PlayerID())) {//加入成功,将消息发送到DB处理 pLoginPlayer->m_LastDBOpTime = uTime; return PACKET_EXE_NOTREMOVE; } else {//DB 压力过大,让用户重新尝试 LCRetCreateChar Msg; Msg.SetAccount(pPacket->GetAccount()); Msg.SetResult(ASKCREATECHAR_SERVER_BUSY); pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler....Fails!, code = ASKCREATECHAR_SERVER_BUSY") ; return PACKET_EXE_CONTINUE; } } else if(g_pDBThreadManager->IsPoolTID(CurrentThreadID)) { PlayerID_t PlayerID = pPacket->GetPlayerID(); GUID_t PlayerCharGUID = 1; LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); ASKCREATECHAR_RESULT Result; LCRetCreateChar* pMsg = (LCRetCreateChar*)g_pPacketFactoryManager->CreatePacket(PACKET_LC_RETCREATECHAR); if(!pMsg) { AssertEx(FALSE,"创建 LCRetCreateChar 消息失败"); } if(pLoginPlayer->GetDBOperating() == TRUE) { pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_SERVER_BUSY); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog(LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute()....数据库操作冲突!,acc = %s", pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskCreateChar DBOperation Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } pLoginPlayer->SetDBOperating(TRUE); LCRetCharList* pRetListMsg = (LCRetCharList*)g_pPacketFactoryManager->CreatePacket(PACKET_LC_RETCHARLIST) ; if(!pRetListMsg) { AssertEx(FALSE,"创建 LCRetCharList 消息失败"); } INT CharNumber = pLoginPlayer->GetCharNumber(); if(CharNumber>=MAX_CREATE_PLAYER_NUM ) { pRetListMsg->SetAccount(pPacket->GetAccount()); Result = ASKCREATECHAR_FULL; //角色满了 } else if(CharNumber ==-1) { pRetListMsg->SetAccount(pPacket->GetAccount()); Result = ASKCREATECHAR_OP_ERROR; } else { CampID_t PlayerCampType ; if( CharNumber > 0 ) PlayerCampType = pLoginPlayer->GetPlayerCamp(); //如果建立过角色,强制用上一个角色的阵营ID else { PlayerCampType = pPacket->GetCharCamp(); pLoginPlayer->SetPlayerCamp( PlayerCampType ); } if( PlayerCampType != CAMP1_PLAYER && PlayerCampType != CAMP2_PLAYER ) { pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_OP_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute()....玩家阵营数据错误!") ; return PACKET_EXE_CONTINUE; } if( pPacket->GetMenPai() != MATTRIBUTE_SHAOLIN && pPacket->GetMenPai() != MATTRIBUTE_WUDANG && pPacket->GetMenPai() != MATTRIBUTE_EMEI ) { //目前就只有3个职业 pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_OP_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute()....玩家选择门派数据错误!") ; return PACKET_EXE_CONTINUE; } ODBCInterface* pInterface = g_pDBThreadManager->GetInterface(CurrentThreadID); Assert(pInterface); //插入纪录 DBCreateCharOp CreateCharOp(pInterface); CreateCharOp.SetAccount(pPacket->GetAccount()); CreateCharOp.SetCharName(pPacket->GetName()); CreateCharOp.SetCharGuid(pPacket->GetCharGuid()); CreateCharOp.SetSex(pPacket->GetSex()); CreateCharOp.SetHairColor(pPacket->GetHairColor()); CreateCharOp.SetHairModel(pPacket->GetHairModel()); CreateCharOp.SetFaceColor(pPacket->GetFaceColor()); CreateCharOp.SetFaceModel(pPacket->GetFaceModel()); CreateCharOp.SetHeadID(pPacket->GetHeadID()); CreateCharOp.SetCampID(PlayerCampType); CreateCharOp.SetMenPaiID(pPacket->GetMenPai()); BOOL bRetAddNew = CreateCharOp.AddNew(); if(!bRetAddNew) { Log::SaveLog(LOGIN_LOGFILE,"CreateCharOp.AddNew()...Get Errors: %s",CreateCharOp.GetErrorMessage()); //添加新角色失败 pMsg->SetAccount(pPacket->GetAccount()); INT ErrorCode = CreateCharOp.GetErrorCode(); switch(ErrorCode) { case ODBCBase::DB_SAME_PRI_KEY: //用户需要知道的错误 { pMsg->SetResult(ASKCREATECHAR_SAME_NAME); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute()....Fails! DBCreateCharOP ErrorCode = ASKCREATECHAR_SAME_NAME") ; } break; default: { pMsg->SetResult(ASKCREATECHAR_INTERNAL_ERROR); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute() ...Fails! DBCreateCharOP ErrorCode = %d",ErrorCode) ; break; } } g_pProcessManager->SendPacket(pMsg,PlayerID); pLoginPlayer->SetDBOperating(FALSE); return PACKET_EXE_NOTREMOVE; } CreateCharOp.ParseResult(&Result); PlayerCharGUID = CreateCharOp.GetCharGuid(); Assert(PlayerCharGUID!=INVALID_ID); //设置基本属性 FULLUSERDATA UserData; DBCharFullData CharFullDataObject(pInterface); CharFullDataObject.SetCharGuid(PlayerCharGUID); BOOL bRetLoad = CharFullDataObject.Load(); if(!bRetLoad) { //验证数据失败 pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_INTERNAL_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); pLoginPlayer->SetDBOperating(FALSE); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute() ...CharFullDataObject.Load()....Fails!") ; return PACKET_EXE_NOTREMOVE; } CharFullDataObject.ParseResult(&UserData); g_CharConfig.InitCharAttr(&UserData); BOOL bRetSave = CharFullDataObject.Save(&UserData); //保存出始化信息 if(!bRetSave) { //初始化数据设置失败 pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_INTERNAL_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute() ...CharFullDataObject.Save()....Fails!") ; pLoginPlayer->SetDBOperating(FALSE); return PACKET_EXE_NOTREMOVE; } bRetSave = CharFullDataObject.ParseResult(&UserData);//保存全部档案 if(!bRetSave) { //初始化数据设置失败 pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKCREATECHAR_INTERNAL_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute() ...CharFullDataObject.ParseResult....Fails!") ; pLoginPlayer->SetDBOperating(FALSE); return PACKET_EXE_NOTREMOVE; } //返回新的角色列表 DBCharList CharListObject(pInterface); CharListObject.SetAccount(pPacket->GetAccount()); bRetLoad = CharListObject.Load(); if(bRetLoad) { CharListObject.ParseResult(pRetListMsg->GetCharBaseInfo()); pRetListMsg->SetAccount(pPacket->GetAccount()); pRetListMsg->SetResult(ASKCHARLIST_SUCCESS); pRetListMsg->SetCharNumber(CharListObject.GetCharNumber()); if(CharListObject.GetCharNumber()> (UINT)CharNumber) { Result = ASKCREATECHAR_SUCCESS; } else { Result = ASKCREATECHAR_INTERNAL_ERROR; } pLoginPlayer->SetCharNumber(CharListObject.GetCharNumber()); for(INT i=0;i<pLoginPlayer->GetCharNumber();i++) { pLoginPlayer->SetCharGUID(pRetListMsg->GetCharBaseInfo(i)->m_GUID,i); } } else //操作失败,可能是断开连接了 { pRetListMsg->SetAccount(pPacket->GetAccount()); pRetListMsg->SetResult(ASKCHARLIST_OP_FAILS); pRetListMsg->SetCharNumber(CharListObject.GetCharNumber()); } } pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(Result); g_pProcessManager->SendPacket(pMsg,PlayerID); g_pProcessManager->SendPacket(pRetListMsg,PlayerID); pLoginPlayer->SetDBOperating(FALSE); Log::SaveLog( LOGIN_LOGFILE, "CLAskCreateCharHandler::Execute()....OK! \ Account = %s CharGuid = %X CharName = %s",\ pPacket->GetAccount(),PlayerCharGUID,pPacket->GetName()) ; return PACKET_EXE_NOTREMOVE; }
UINT CLAskCharLoginHandler::Execute(CLAskCharLogin* pPacket, Player* pPlayer ) { __ENTER_FUNCTION TID CurrentThreadID = MyGetCurrentThreadID(); if(CurrentThreadID== g_pProcessPlayerManager->m_ThreadID) { LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); if(pLoginPlayer->GetPlayerStatus()!=PS_LOGIN_NORMAL) { return PACKET_EXE_CONTINUE; } UINT uTime = g_pTimeManager->CurrentTime(); if(uTime<pLoginPlayer->m_LastDBOpTime+DB_OPERATION_TIME) { //用户操作过于频繁 LCRetCharLogin Msg; Msg.SetResult(ASKCHARLOGIN_OP_TIMES); pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....Fails!,code = ASKCHARLOGIN_OP_TIMES") ; return PACKET_EXE_CONTINUE; } GUID_t TryLoginGuid = pPacket->GetCharGuid(); if(!pLoginPlayer->IsGUIDOwner(TryLoginGuid)) { //用户操作非法,用户不是请求角色的所有者 LCRetCharLogin Msg; Msg.SetResult(ASKCHARLOGIN_NOT_OWNER); pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....Fails!,code = ASKCHARLOGIN_NOT_OWNER") ; return PACKET_EXE_CONTINUE; } //检查是否是合法SID //if(g_DBSceneTable.isValidSceneID(pPacket->GetSceneID(),CT_NORMAL)) //{ // pLoginPlayer->SetChooseSceneID(pPacket->GetSceneID()); //} //else //{ // LCRetCharLogin Msg; // Msg.SetResult(ASKCHARLOGIN_NOT_OWNER); // pLoginPlayer->SendPacket(&Msg); // DiskLog(LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....Choose Scene error,acc=%s,guid=%X", // pLoginPlayer->GetAccount(),pPacket->GetCharGuid()) ; // return PACKET_EXE_CONTINUE; //} pLoginPlayer->SetUserKey(rand()); pPacket->SetPlayerID(pLoginPlayer->PlayerID()); if(g_pDBThreadManager->SendPacket(pPacket,pLoginPlayer->PlayerID())) { //加入成功,将消息发送到DB处理 //将修改数据库操作时间的步骤移动到实际数据库操作进行的部分 return PACKET_EXE_NOTREMOVE; } else {//DB 压力过大,让用户重新尝试 LCRetCharLogin Msg; Msg.SetResult(ASKCHARLOGIN_SERVER_BUSY); pLoginPlayer->SendPacket(&Msg); pLoginPlayer->m_LastDBOpTime = uTime; Log::SaveLog( LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....Fails!, code = ASKCHARLOGIN_SERVER_BUSY") ; return PACKET_EXE_CONTINUE; } } else if(g_pDBThreadManager->IsPoolTID(CurrentThreadID)) {//将玩家加入到World 队列中 PlayerID_t PlayerID = pPacket->GetPlayerID(); GUID_t PlayerCharGUID = pPacket->GetCharGuid(); //SceneID_t PlayerSceneID = pPacket->GetSceneID(); UINT QueuePos; LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); GUID_t TryLoginGuid = pPacket->GetCharGuid(); if(!pLoginPlayer->IsGUIDOwner(TryLoginGuid)) { //一次错误的数据操作 Log::SaveLog(LOGIN_LOGFILE, "CLAskCharLoginHandler Wrong operation,acc=%s,guid=%X", pLoginPlayer->GetAccount(),pPacket->GetCharGuid()) ; return PACKET_EXE_CONTINUE; } if(g_pWorldPlayerQueue->AddInPlayer(PlayerID, pLoginPlayer->GetAccount(), pPacket->GetCharGuid(), pLoginPlayer->GetPlayerAge(), QueuePos)) { //加入成功 Log::SaveLog( LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....OK!, PlayerCharGUID = %X ",PlayerCharGUID ) ; return PACKET_EXE_CONTINUE; } else //加入失败 { //queue 都满了,World爆满 ,但是不应该出现,因为World状态已经通知过Login //并且不是所有玩家都在排队 Log::SaveLog( LOGIN_LOGFILE, "CLAskCharLoginHandler::Execute()....Fail,World is Full,PlayerCharGUID = %X ",PlayerCharGUID ) ; } } else { Log::SaveLog( LOGIN_LOGFILE, "ERROR::CLAskCharLoginHandler::Execute() ... Fail, Invalid Thread Handler") ; Assert(FALSE); return PACKET_EXE_CONTINUE; } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT BLRetAuthHandler::Execute(BLRetAuth* pPacket, Player* pPlayer ) { __ENTER_FUNCTION PlayerID_t PlayerID ; LoginPlayer* pLoginPlayer = NULL ; Assert( pPlayer ) ; if( pPlayer->IsServerPlayer() ) { PlayerID = pPacket->GetPlayerID(); pLoginPlayer = g_pPlayerPool->GetPlayer(PlayerID) ; if( pLoginPlayer==NULL ) { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } } else if( pPlayer->IsLoginPlayer() ) { PlayerID = pPlayer->PlayerID() ; pLoginPlayer = (LoginPlayer*)pPlayer ; if( pLoginPlayer==NULL ) { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } } else { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } TID CurrentThreadID = MyGetCurrentThreadID(); if(CurrentThreadID == g_pServerManager->m_ThreadID) { if(pLoginPlayer->GetPlayerStatus() == PS_LOGIN_WAIT_AUTH) { //ServerManager 中执行 g_pLoginPlayerManager->SendPacket(pPacket,PlayerID); return PACKET_EXE_NOTREMOVE; } return PACKET_EXE_CONTINUE; } else if ( CurrentThreadID == g_pLoginPlayerManager->m_ThreadID) { //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 Log::SaveLog(LOGIN_LOGFILE, "ERROR: BLRetAuthHandler::Execute Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } if (pLoginPlayer->GetPlayerStatus() == PS_LOGIN_WAIT_AUTH) { if(pPacket->GetResult() == LOGINR_SUCCESS) { pLoginPlayer->SetAccount(pPacket->GetAccount()); pLoginPlayer->SetPlayerStatus(PS_LOGIN_AUTHED); pLoginPlayer->SetPlayerAge( (BYTE)pPacket->GetAge() ); //把客户端从当前LoginPlayerManager 中释放 g_pLoginPlayerManager->DelPlayer(pLoginPlayer->PlayerID()); //并且向ProcessManager 发送消息 g_pProcessManager->SendPacket(pPacket,pLoginPlayer->PlayerID()); //修改客户端状态为 PS_LOGIN_WAIT_PROCESS_TURN pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_PROCESS_TURN); return PACKET_EXE_NOTREMOVE ; } else { pLoginPlayer->SetAccount(pPacket->GetAccount()); pLoginPlayer->SetWrongPWCount(pLoginPlayer->GetWrongPWCount()+1); LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_AUTH_FAIL); pLoginPlayer->SendPacket(&Msg); if(pLoginPlayer->GetWrongPWCount()>=MAX_WRONGPW_TIMES) { Log::SaveLog(LOGIN_LOGFILE, "ERROR: BLRetAuthHandler Reach Max Password Wrong Times acc=%s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_ERROR; } else return PACKET_EXE_CONTINUE; } } } else if (CurrentThreadID == g_pProcessPlayerManager->m_ThreadID ) { //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 Log::SaveLog(LOGIN_LOGFILE, "ERROR: BLRetAuthHandler::Execute Process Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } //加入到g_pProcessPlayerManager 中,能够处理对应的HeartBeat g_pProcessPlayerManager->AddPlayer(pLoginPlayer); //先处理login 结果 LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_SUCCESS); pLoginPlayer->SendPacket(&Msg); UINT QueuePos; //加入到g_pProcessPlayerQueue 中,能够对客户端排队 if(g_pProcessPlayerQueue->AddInPlayer(pLoginPlayer->PlayerID(), pLoginPlayer->GetAccount(),QueuePos)) { pLoginPlayer->SetQueuePos(QueuePos); //设置当前玩家状态 pLoginPlayer->SetPlayerStatus(PS_LOGIN_PROCESS_TURN); pLoginPlayer->SetLastSendTurnTime(g_pTimeManager->CurrentTime()); //发送开始排队消息(HeartBeat 中执行) } else { //排队玩家都超过MAX_TURN_PLAYER个 //所以只能断开此玩家的网络连接 BOOL boo = pLoginPlayer->FreeOwn() ; Log::SaveLog( LOGIN_LOGFILE, "ERROR: BLRetAuthHandler::FreeOwn " ) ; Assert( boo ) ; return PACKET_EXE_ERROR ; } } Log::SaveLog( LOGIN_LOGFILE, "BLRetAuthHandler::Execute()....OK! " ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT BLRetAuthHandler::Execute(BLRetAuth* pPacket, Player* pPlayer ) { __ENTER_FUNCTION PlayerID_t PlayerID ; LoginPlayer* pLoginPlayer = NULL ; Assert( pPlayer ) ; if( pPlayer->IsServerPlayer() ) { PlayerID = pPacket->GetPlayerID(); pLoginPlayer = g_pPlayerPool->GetPlayer(PlayerID) ; if( pLoginPlayer==NULL ) { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } } else if( pPlayer->IsLoginPlayer() ) { PlayerID = pPlayer->PlayerID() ; pLoginPlayer = (LoginPlayer*)pPlayer ; if( pLoginPlayer==NULL ) { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } } else { Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } TID CurrentThreadID = MyGetCurrentThreadID(); if(CurrentThreadID == g_pServerManager->m_ThreadID) { if(pLoginPlayer->GetPlayerStatus() == PS_LOGIN_WAIT_AUTH) { //ServerManager 中执行 g_pLoginPlayerManager->SendPacket(pPacket,PlayerID); return PACKET_EXE_NOTREMOVE; } return PACKET_EXE_CONTINUE; } else if ( CurrentThreadID == g_pLoginPlayerManager->m_ThreadID) { //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 g_pLog->FastSaveLog(LOG_FILE_0, "ERROR: BLRetAuthHandler::Execute Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } if (pLoginPlayer->GetPlayerStatus() == PS_LOGIN_WAIT_AUTH) { if( pPacket->GetResult() == LOGINR_SUCCESS || pPacket->GetResult() == LOGINR_REG_SUCCESS) { //设置帐号的防沉迷标识[7/10/2007] pLoginPlayer->SetAccFatigueSign(pPacket->GetFatigueSign()); pLoginPlayer->SetAccOnlineTime(pPacket->GetTotalOnlineTime()); pLoginPlayer->SetPhoneBind(pPacket->GetPhoneBind()); pLoginPlayer->SetIPBind(pPacket->GetIPBind()); pLoginPlayer->SetMiBaoBind(pPacket->GetMiBaoBind()); pLoginPlayer->SetMacBind(pPacket->GetMacBind()); pLoginPlayer->SetRealNameBind(pPacket->GetRealNameBind()); pLoginPlayer->SetInputNameBind(pPacket->GetInputNameBind()); INT nSafeSign = g_Config.m_LoginInfo.NotifySafeSign; if(nSafeSign<=0) { //pLoginPlayer->SetAccount(pPacket->GetAccount()); // no need to set[11/24/2006] pLoginPlayer->SetPlayerStatus(PS_LOGIN_AUTHED); //把客户端从当前LoginPlayerManager 中释放 g_pLoginPlayerManager->DelPlayer(pLoginPlayer->PlayerID()); //并且向ProcessManager 发送消息 g_pProcessManager->SendPacket(pPacket,pLoginPlayer->PlayerID()); //修改客户端状态为 PS_LOGIN_WAIT_PROCESS_TURN pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_PROCESS_TURN); return PACKET_EXE_NOTREMOVE; } else { LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_NOTIFY_SAFESIGN); //Msg.SetSafeSign(pLoginPlayer->m_AccountSafeSign); pLoginPlayer->SendPacket(&Msg); //修改客户端状态为等待确认安全标识 pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_SAFESIGN_CLIENT); g_pLog->FastSaveLog(LOG_FILE_0, "BLRetAuthHandler Wait Client NotifySafeSign acc=%s", pLoginPlayer->GetAccount()); return PACKET_EXE_CONTINUE; } return PACKET_EXE_CONTINUE; } else if(pPacket->GetResult() == LOGINR_ONLY_SUCCESS) { INT nSafeSign = g_Config.m_LoginInfo.NotifySafeSign; if(nSafeSign<=0) { pPacket->SetResult(LOGINR_SUCCESS); //pLoginPlayer->SetAccount(pPacket->GetAccount()); // no need to set[11/24/2006] pLoginPlayer->SetPlayerStatus(PS_LOGIN_AUTHED); //把客户端从当前LoginPlayerManager 中释放 g_pLoginPlayerManager->DelPlayer(pLoginPlayer->PlayerID()); //并且向ProcessManager 发送消息 g_pProcessManager->SendPacket(pPacket,pLoginPlayer->PlayerID()); //修改客户端状态为 PS_LOGIN_WAIT_PROCESS_TURN pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_PROCESS_TURN); return PACKET_EXE_NOTREMOVE; } else { LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_NOTIFY_SAFESIGN); Msg.SetSafeSign(pLoginPlayer->m_AccountSafeSign); pLoginPlayer->SendPacket(&Msg); //修改客户端状态为等待确认安全标识 pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_SAFESIGN_CLIENT); g_pLog->FastSaveLog(LOG_FILE_0, "BLRetAuthHandler Wait Client NotifySafeSign acc=%s", pLoginPlayer->GetAccount()); return PACKET_EXE_CONTINUE; } return PACKET_EXE_CONTINUE; } else if(pPacket->GetResult() == LOGINR_SAFESIGN_SUCCESS) { pPacket->SetResult(LOGINR_SUCCESS); //pLoginPlayer->SetAccount(pPacket->GetAccount()); // no need to set[11/24/2006] pLoginPlayer->SetPlayerStatus(PS_LOGIN_AUTHED); //把客户端从当前LoginPlayerManager 中释放 g_pLoginPlayerManager->DelPlayer(pLoginPlayer->PlayerID()); //并且向ProcessManager 发送消息 g_pProcessManager->SendPacket(pPacket,pLoginPlayer->PlayerID()); //修改客户端状态为 PS_LOGIN_WAIT_PROCESS_TURN pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_PROCESS_TURN); return PACKET_EXE_NOTREMOVE; } else if(pPacket->GetResult() == LOGINR_NEED_REG) { LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_NEED_REG); pLoginPlayer->SendPacket(&Msg); //修改客户端状态为等待注册PassPort pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_REG_PASSPORT); g_pLog->FastSaveLog(LOG_FILE_0, "REG: BLRetAuthHandler Wait Client Send PassPort Reg Info acc=%s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_CONTINUE; } else if(pPacket->GetResult() == LOGINR_NO_NEW_LICENSE) { LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(LOGINR_NO_NEW_LICENSE); pLoginPlayer->SendPacket(&Msg); //修改客户端状态为等待确认新注册协议 pLoginPlayer->SetPlayerStatus(PS_LOGIN_WAIT_LICENSE_CLIENT); //设置帐号的防沉迷标识[7/10/2007] pLoginPlayer->SetAccFatigueSign(pPacket->GetFatigueSign()); pLoginPlayer->SetAccOnlineTime(pPacket->GetTotalOnlineTime()); pLoginPlayer->SetPhoneBind(pPacket->GetPhoneBind()); pLoginPlayer->SetIPBind(pPacket->GetIPBind()); pLoginPlayer->SetMiBaoBind(pPacket->GetMiBaoBind()); pLoginPlayer->SetMacBind(pPacket->GetMacBind()); pLoginPlayer->SetRealNameBind(pPacket->GetRealNameBind()); pLoginPlayer->SetInputNameBind(pPacket->GetInputNameBind()); g_pLog->FastSaveLog(LOG_FILE_0, "BLRetAuthHandler Wait Client Send New License Info acc=%s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_CONTINUE; } else if(pPacket->GetResult() == LOGINR_AUTH_FAIL || pPacket->GetResult() == LOGINR_MIBAO_ERROR || pPacket->GetResult() == LOGINR_MAC_ERROR) { //pLoginPlayer->SetAccount(pPacket->GetAccount()); // no need to set[11/24/2006] pLoginPlayer->SetWrongPWCount(pLoginPlayer->GetWrongPWCount()+1); LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(pPacket->GetResult()); pLoginPlayer->SendPacket(&Msg); if(pLoginPlayer->GetWrongPWCount()>=MAX_WRONGPW_TIMES) { g_pLog->FastSaveLog(LOG_FILE_0, "ERROR: BLRetAuthHandler Reach Max Password Wrong Times acc=%s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_ERROR; } else return PACKET_EXE_CONTINUE; } else { //pLoginPlayer->SetAccount(pPacket->GetAccount()); // no need to set[11/24/2006] LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(pPacket->GetResult()); Msg.SetServerIP(pPacket->GetServerIP()); pLoginPlayer->SendPacket(&Msg); return PACKET_EXE_CONTINUE; } } } else if (CurrentThreadID == g_pProcessPlayerManager->m_ThreadID ) { //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 g_pLog->FastSaveLog(LOG_FILE_0, "ERROR: BLRetAuthHandler::Execute Process Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } //加入到g_pProcessPlayerManager 中,能够处理对应的HeartBeat if(FALSE == g_pProcessPlayerManager->AddPlayer(pLoginPlayer)) { g_pLog->FastSaveLog(LOG_FILE_0, "ERROR: BLRetAuthHandler::Execute Process Errors,acc = %s,Packet acc = %s maybe online", pLoginPlayer->GetAccount(),pPacket->GetAccount()); //已有的这个玩家的状态置成等待被踢的状态 LoginPlayer* pAlreadyInPlayer = (LoginPlayer*)(g_pProcessPlayerManager->FindAccName(pLoginPlayer->GetAccount())); if(pAlreadyInPlayer) { if(pAlreadyInPlayer->GetPlayerStatus() != PS_LOGIN_WAIT_WORLD_KICK) { //请求World踢掉此已有玩家 LWNotifyUser* ptMsg = (LWNotifyUser*)g_pPacketFactoryManager->CreatePacket(PACKET_LW_NOTIFYUSER); ptMsg->SetAccount(pAlreadyInPlayer->GetAccount()); ptMsg->SetNotifyStatus(LNOTIFY_KICK_REQUEST); ptMsg->SetUserKey(pAlreadyInPlayer->GetUserKey()); g_pServerManager->SendPacket(ptMsg, WORLD_PLAYER_ID); } //设为等待被踢状态 pAlreadyInPlayer->SetPlayerStatus(PS_LOGIN_WAIT_WORLD_KICK); } //主动断开当前的玩家 return PACKET_EXE_ERROR; } pLoginPlayer->SetUserKey(rand()); g_pLog->FastSaveLog(LOG_FILE_0, "BLRetAuthHandler Acc=%s, SetAccFatigueSign=%s, SetAccOnlineTime=%us,PhoneBind=%s,IPBind=%s,MiBaoBind=%s,MacBind=%s,ReadNameBind=%s,InputNameBind=%s", pLoginPlayer->GetAccount(), pLoginPlayer->GetAccFatigueSign()?"Y":"N", pLoginPlayer->GetAccOnlineTime(), pLoginPlayer->GetPhoneBind()?"Y":"N", pLoginPlayer->GetIPBind()?"Y":"N", pLoginPlayer->GetMiBaoBind()?"Y":"N", pLoginPlayer->GetMacBind()?"Y":"N", pLoginPlayer->GetRealNameBind()?"Y":"N", pLoginPlayer->GetInputNameBind()?"Y":"N"); //先处理login 结果 LCRetLogin Msg; Msg.SetAccount(pLoginPlayer->GetAccount()); Msg.SetResult(pPacket->GetResult()); pLoginPlayer->SendPacket(&Msg); UINT QueuePos; //加入到g_pProcessPlayerQueue 中,能够对客户端排队 if(g_pProcessPlayerQueue->AddInPlayer(pLoginPlayer->PlayerID(), pLoginPlayer->GetAccount(),QueuePos)) { //pLoginPlayer->SetQueuePos(0); //设置当前玩家状态 pLoginPlayer->SetPlayerStatus(PS_LOGIN_PROCESS_TURN); pLoginPlayer->SetLastSendTurnTime(g_pTimeManager->CurrentTime()); //发送开始排队消息(HeartBeat 中执行) } else { //排队玩家都超过MAX_TURN_PLAYER个 //所以只能断开此玩家的网络连接 g_pLog->FastSaveLog(LOG_FILE_0, "ERROR: BLRetAuthHandler Reach MAX_TURN_PLAYER Acc = %s", pLoginPlayer->GetAccount()) ; //由管理器来清除此玩家 //return PACKET_EXE_ERROR ; /** doing 29929,2007-12-25,alan * 达到排队人数上限,通知客户端,并让该用户进入退出倒计时。 */ pLoginPlayer->SetPlayerStatus(PS_LOGIN_PROCESS_OVER_TURN); LCStatus errMsg; errMsg.SetClientStatus(CTS_OVER); pLoginPlayer->SendPacket(&errMsg); pLoginPlayer->TrigerDisconnectCountDown(3000);//3秒后断开连接 return PACKET_EXE_CONTINUE; } } g_pLog->FastSaveLog(LOG_FILE_0, "BLRetAuthHandler::Execute()....OK! acc = %s ",pLoginPlayer->GetAccount()) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT CLAskDeleteCharHandler::Execute(CLAskDeleteChar* pPacket, Player* pPlayer ) { __ENTER_FUNCTION TID CurrentThreadID = MyGetCurrentThreadID(); if(CurrentThreadID == g_pProcessPlayerManager->m_ThreadID) { LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); if( !StrSafeCheck( pPacket->GetAccount(), MAX_ACCOUNT ) ) { Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskDeleteCharHandler Get IllegalString,acc = %s", pLoginPlayer->GetAccount()) ; return PACKET_EXE_ERROR; } if(pLoginPlayer->GetPlayerStatus()!=PS_LOGIN_NORMAL) { //没有权限,什么也不做 return PACKET_EXE_CONTINUE; } GUID_t TryLoginGuid = pPacket->GetCharGuid(); if(!pLoginPlayer->IsGUIDOwner(TryLoginGuid)) { //用户操作非法,用户不是请求角色的所有者 LCRetDeleteChar Msg; Msg.SetResult(ASKDELETECHAR_NOT_OWNER); pLoginPlayer->SendPacket(&Msg); Log::SaveLog( LOGIN_LOGFILE, "CLAskDeleteCharHandler::Execute()....Fails!,code = ASKDELETECHAR_NOT_OWNER") ; return PACKET_EXE_CONTINUE; } UINT uTime = g_pTimeManager->CurrentTime(); if(uTime<pLoginPlayer->m_LastDBOpTime+DB_OPERATION_TIME) { LCRetDeleteChar Msg; Msg.SetResult(ASKDELETECHAR_OP_TIMES); //发送DB操作频繁消息 pLoginPlayer->SendPacket(&Msg); Log::SaveLog(LOGIN_LOGFILE, "CLAskDeleteCharHandler::Execute()....database busy,acc=%s,tryguid=%X", pLoginPlayer->GetAccount(),TryLoginGuid) ; return PACKET_EXE_CONTINUE; } //________________________________________ //pPacket->SetPlayerID(pLoginPlayer->PlayerID()); //pPacket->SetAccount(pLoginPlayer->GetAccount()); ////将玩家操作加入DB 队列 ////并且设置最后操作时间 //if(g_pDBThreadManager->SendPacket(pPacket,pLoginPlayer->PlayerID())) //{//加入成功,将消息发送到DB处理 // pLoginPlayer->m_LastDBOpTime = uTime; // return PACKET_EXE_NOTREMOVE; //} //else //{//DB 压力过大,让用户重新尝试 // LCRetDeleteChar Msg; // Msg.SetResult(ASKDELETECHAR_SERVER_BUSY); // pLoginPlayer->SendPacket(&Msg); // return PACKET_EXE_CONTINUE; //} //________________________________________ LWAskDeleteChar MsgDeleteChar; MsgDeleteChar.SetAccount( pLoginPlayer->GetAccount() ); MsgDeleteChar.SetPlayerID( pLoginPlayer->PlayerID() ); MsgDeleteChar.SetPlayerGUID( pPacket->GetCharGuid() ); g_pServerManager->GetServerPlayer(WORLD_PLAYER_ID)->SendPacket(&MsgDeleteChar); return PACKET_EXE_CONTINUE; } else if(g_pDBThreadManager->IsPoolTID(CurrentThreadID)) { PlayerID_t PlayerID = pPacket->GetPlayerID(); LoginPlayer* pLoginPlayer = static_cast<LoginPlayer*>(pPlayer); Assert(pLoginPlayer); ASKDELETECHAR_RESULT Result; LCRetDeleteChar* pMsg = (LCRetDeleteChar*)g_pPacketFactoryManager->CreatePacket(PACKET_LC_RETDELETECHAR); if(!pMsg) { AssertEx(FALSE,"创建 LCRetDeleteChar 消息失败"); } if(pLoginPlayer->GetDBOperating() == TRUE) { pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKDELETECHAR_SERVER_BUSY); g_pProcessManager->SendPacket(pMsg,PlayerID); Log::SaveLog( LOGIN_LOGFILE, "CLAskDeleteCharHandler::Execute()....数据库操作冲突!") ; return PACKET_EXE_NOTREMOVE; } //检查GUID 是否正确 if(strcmp(pLoginPlayer->GetAccount(),pPacket->GetAccount())!= 0) { //应该是一次错误操作 Log::SaveLog(LOGIN_LOGFILE, "ERROR: CLAskDeleteChar DBOperation Errors,acc = %s,Packet acc = %s", pLoginPlayer->GetAccount(),pPacket->GetAccount()) ; return PACKET_EXE_CONTINUE; } pLoginPlayer->SetDBOperating(TRUE); LCRetCharList* pRetListMsg = (LCRetCharList*)g_pPacketFactoryManager->CreatePacket(PACKET_LC_RETCHARLIST) ; if(!pRetListMsg) { AssertEx(FALSE,"创建 LCRetCharList 消息失败"); } INT CharNumber = pLoginPlayer->GetCharNumber(); if(CharNumber==0) { pRetListMsg->SetAccount(pPacket->GetAccount()); Result = ASKDELETECHARR_EMPTY; //角色空了 } else if(CharNumber ==-1) { pRetListMsg->SetAccount(pPacket->GetAccount()); Result = ASKDELETECHAR_OP_ERROR; } else { ODBCInterface* pInterface = g_pDBThreadManager->GetInterface(CurrentThreadID); Assert(pInterface); //删除纪录 DBDeleteCharOp DeleteCharOp(pInterface); DeleteCharOp.SetAccount(pPacket->GetAccount()); DeleteCharOp.SetCharGuid(pPacket->GetCharGuid()); BOOL bRetDelete = DeleteCharOp.Delete(); if(!bRetDelete) { Log::SaveLog(LOGIN_LOGFILE,"DeleteCharOp.Delete()....Get Errors: %s ",DeleteCharOp.GetErrorMessage()); INT ErrorCode = DeleteCharOp.GetErrorCode(); pMsg->SetAccount(pPacket->GetAccount()); pMsg->SetResult(ASKDELETECHAR_INTERNAL_ERROR); g_pProcessManager->SendPacket(pMsg,PlayerID); pLoginPlayer->SetDBOperating(FALSE); Log::SaveLog( LOGIN_LOGFILE, "CLAskDeleteCharHandler::Execute()....Fails! code = ASKDELETECHAR_INTERNAL_ERROR \ CharGUID = %d,Account = %s",pPacket->GetCharGuid(),pPacket->GetAccount()) ; return PACKET_EXE_NOTREMOVE; } DeleteCharOp.ParseResult(&Result); //返回新的角色列表 DBCharList CharListObject(pInterface); CharListObject.SetAccount(pPacket->GetAccount()); BOOL bRetLoad = CharListObject.Load(); if(bRetLoad) { CharListObject.ParseResult(pRetListMsg->GetCharBaseInfo()); pRetListMsg->SetAccount(pPacket->GetAccount()); pRetListMsg->SetResult(ASKCHARLIST_SUCCESS); pRetListMsg->SetCharNumber(CharListObject.GetCharNumber()); if(CharListObject.GetCharNumber()<(UINT)CharNumber) { Result = ASKDELETECHAR_SUCCESS; } else { Result = ASKDELETECHAR_INTERNAL_ERROR; } pLoginPlayer->SetCharNumber(CharListObject.GetCharNumber()); for(INT i=0;i<pLoginPlayer->GetCharNumber();i++) { pLoginPlayer->SetCharGUID(pRetListMsg->GetCharBaseInfo(i)->m_GUID,i); } } else //操作失败,可能是断开连接了 { Log::SaveLog(LOGIN_LOGFILE,"CharListObject.Load()....Get Errors: %s ", CharListObject.GetErrorMessage()); pRetListMsg->SetAccount(pPacket->GetAccount()); pRetListMsg->SetResult(ASKCHARLIST_OP_FAILS); pRetListMsg->SetCharNumber(CharListObject.GetCharNumber()); } }