#include "StdAfx.h" #include "NetWorkMsgHandle.h" //#include "mjEdcode.h" #include "mjProto.h" using namespace jxInterSrvComm::DbServerProto; CNetWorkMsgHandle::CNetWorkMsgHandle() { for (int i = 0; i < CCustomGateManager::MaxGateCount; i++) { m_GateUserDataList[i].setLock(&m_GateDataLock[i]); } for (int i = 0; i < CCustomGateManager::MaxGateCount; i++) { m_GateServerPushdownDataList[i].setLock(&m_GateServerPushdownLock[i]); } m_ItnMsgList.setLock(&m_ItnMsgListLock); } CNetWorkMsgHandle::~CNetWorkMsgHandle() { //清理消息list for (INT_PTR nGateIdx=0; nGateIdx &DataList = m_GateUserDataList[nGateIdx]; if ( DataList.appendCount() > 0 ) DataList.flush(); if ( DataList.count() > 0 ) { CLogicGate* logicgate = (CLogicGate*)GetLogicServer()->GetGateManager()->getGate(nGateIdx); logicgate->freeBackUserDataList(DataList); } } if (m_ItnMsgList.appendCount() > 0) { m_ItnMsgList.flush(); } INT_PTR nCount = m_ItnMsgList.count(); for (int i = 0; i < nCount; ++i ) { PLOGICINTERNALMSG pAppMsg = m_ItnMsgList[i]; if (pAppMsg->uMsg == SSM_DB_RET_DATA) { CDataPacket* pDataPacket = (CDataPacket*)(pAppMsg->uParam2); GetLogicServer()->GetDbClient()->FreeBackUserDataPacket(pDataPacket); } m_Allocator.FreeBuffer(pAppMsg); } m_ItnMsgList.clear(); } // VOID CNetWorkMsgHandle::PostUserDataList(const INT_PTR nGateIdx, CBaseList& vList) { if ((nGateIdx < 0) || (nGateIdx >= CCustomGateManager::MaxGateCount)) return; CQueueList &DataList = m_GateUserDataList[nGateIdx]; DataList.appendList(vList); vList.trunc(0); } // void CNetWorkMsgHandle::DumpBuffAlloc(wylib::stream::CBaseStream& stream) { CBuffAllocStatHelper::Dump(stream, &m_Allocator, _T("NetWorkMsgHandler::DataAllocator"), false); TCHAR szBuff[MAX_PATH]; // Dump All logicGate for (INT_PTR nGateIdx = 0; nGateIdx < CCustomGateManager::MaxGateCount; ++nGateIdx) { CLogicGate* logicgate = (CLogicGate*)GetLogicServer()->GetGateManager()->getGate(nGateIdx); if (logicgate && logicgate->connected()) { logicgate->DumpBuffAlloc(stream); _stprintf(szBuff, _T("网关堆积数据包数量:%d\r\n"), logicgate->getPacketCount()); CBuffAllocStatHelper::WriteStrToStream(stream, szBuff); // 本周期发送的数据包大小 Uint64 nSendPacketSize = logicgate->GetSendPacketSize(); _stprintf(szBuff, _T("累积发送网关数据包大小:%lld, 数量:%d\r\n"), (unsigned long long)(nSendPacketSize / 1024), logicgate->GetSendPacketCount()); CBuffAllocStatHelper::WriteStrToStream(stream, szBuff); logicgate->ResetSendPacketSize(); } } } void CNetWorkMsgHandle::SendGateUserInfoToDB() { CDataClient* pDataClient = GetLogicServer()->GetDbClient(); CDataPacket& packet = pDataClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcUpdateGateUserInfo); WORD nCount = 0; packet << GetLogicServer()->GetServerIndex(); size_t nPos = packet.getPosition(); packet << nCount; GATEUSERINFO gi; for (INT_PTR i = 0; i < CCustomGateManager::MaxGateCount; i++) { CLogicGate* gate = (CLogicGate*)GetLogicServer()->GetGateManager()->getGate(i); if (gate && gate->connected()) { gi = gate->getGateUserInfo(); packet.writeBuf(&gi, sizeof(gi)); nCount++; } } char *pMem = packet.getPositionPtr(nPos); *((WORD *)pMem) = nCount; pDataClient->flushProtoPacket(packet); } VOID CNetWorkMsgHandle::RunOne() { SF_TIME_CHECK(); //检测性能 DECLARE_TIME_PROF("CNetWorkMsgHandle::RunOne"); TICKCOUNT nStartTick = _getTickCount(); /* if (m_SyncGateUserTimer.CheckAndSet(nStartTick)) { SendGateUserInfoToDB(); } */ for (INT_PTR nGateIdx=0; nGateIdxGetGateManager()->getGate(nGateIdx); if(logicgate ==NULL /*|| !logicgate->connected()*/) continue; CBaseList & freeList = logicgate->GetLogicProcecdDataList(); if(freeList.count() >0) { logicgate->freeBackUserDataList(freeList); //将空闲列表添加进去 } CQueueList &DataList = m_GateUserDataList[nGateIdx]; if ( DataList.appendCount() > 0 ) //如果后面有追加的列的话 DataList.flush(); //把追加的列刷到列表里去 if ( DataList.count() > 0 ) { for (INT_PTR i=0; igetPosition(); packet->setPosition(0); (*packet) >> GateUser ; //将网关的时间弄过来 EntityHandle hHandle; hHandle.init(enActor ,GateUser.nHandleIndex); CActor * pActor =(CActor *) GetEntityFromHandle(hHandle); if(pActor ==NULL) { OutputMsg(rmWaning, _T("recv data fail,Handle=%u entity has destroyed "), GateUser.nHandleIndex); continue; } //(this->*Handlers[nCmdId])(pActor,*packet); pActor->PostNetMsg(packet,nSize- packet->getPosition()); //搞一个网络数据包过去 } DataList.trunc(0); //logicgate->freeBackUserDataList(DataList); } //这里发送给网关的数据 logicgate->SendToGate(); } SetLoopTickCount(_getTickCount() - nStartTick); //记录这个花了多少时间 } //这个是逻辑线程处理的 VOID CNetWorkMsgHandle::DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4,UINT64 uParam5,UINT64 uParam6,UINT64 uParam7,int uParam8 ) { //created entity,要转给实体管理器 if (SSM_DB_RET_DATA == uMsg) //数据服务器返回的 { //uParam1 CMD //uParam2 pData数据指针 //OutputMsg(rmTip, _T("db return data :%d"), uParam1); CDataPacket* pDataPacket = (CDataPacket*)uParam2; if ( pDataPacket ) { if(uParam1 == dcLoadOfflineUserBasic ||uParam1 == dcLoadOfflineUserOther || dcSaveOfflineInfo == uParam1 || uParam1 == dcLoadOfflineUserHeroBasic || uParam1 == dcLoadOfflineUserHeroEquips) { GetGlobalLogicEngine()->GetOfflineUserMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 == dcLoadCustomInfoUnForbid || uParam1 == dcSaveCustomInfoUnForbid || uParam1 == dcLoadCustomInfoCustomTitleId || uParam1 == dcSaveCustomInfoCustomTitleId ) { GetGlobalLogicEngine()->GetMiscMgr().OnDbReturnData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getPosition()); //GetGlobalLogicEngine()->GetGuildMgr().OnDbReturnData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getPosition()); } else if (uParam1 >= dcLoadGuildList && uParam1 <= dcLoadGuildDepotItem) { GetGlobalLogicEngine()->GetGuildMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 == dcAddMsg) { CMsgSystem::OnAddOfflineMsgDbReturn(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 == dcAddMsgByActorName) { CMsgSystem::OnAddOfflineMsgByNameDbReturn(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 >= dcLoadBaseRank && uParam1 <= dcSaveBaseRankCS ) { GetGlobalLogicEngine()->GetRankingMgr().OnDbReturnData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getPosition()); } else if (uParam1 == dcLoadCircleCount ) { GetGlobalLogicEngine()->GetGlobalVarMgr().DelDbRetData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getPosition()); } else if(dcLoadCombatRankInfo == uParam1 || dcUpdateCombatBaseInfo == uParam1) { //GetGlobalLogicEngine()->GetCombatRankMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if( uParam1 >= dcLoadTopLevelActor &&uParam1 <= dcLoadSwingLevelData) { } else if ( uParam1 >= dcLoadTopLevelActorData && uParam1 <= dcLoadTopLevelActorData) { GetGlobalLogicEngine()->GetWorldLevelMgr().OnDbReturnData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getMemorySize()); } else if( uParam1 >= dcAddFilterWordsMsg && uParam1 <= dcBackRemoveMoney) { GetGlobalLogicEngine()->GetChatMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if ( uParam1 >= dcSaveConsignmentItem && uParam1 <= dcLoadConsignmentIncome) { GetGlobalLogicEngine()->GetConsignmentMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 >= dcLoadNewServerMail && uParam1 <= dcLoadNewServerMail) { GetGlobalLogicEngine()->GetMailMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 >= dcLoadActivityList && uParam1 <= dcSaveActivityList) { GetGlobalLogicEngine()->GetActivityMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } else if (uParam1 == dcNoticeFee) { GetGlobalLogicEngine()->GetEntityMgr()->OnDbNoticeFee(pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } // else if (uParam1 >= dcLoadBossInfo && uParam1 <= dcSaveBossInfo) // { // GetGlobalLogicEngine()->GetBossMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); // } else { GetGlobalLogicEngine()->GetEntityMgr()->OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } //处理完数据指针要还回 GetLogicServer()->GetDbClient()->FreeBackUserDataPacket(pDataPacket); } return; } else if(SSM_GATE_CREATE_ACTOR == uMsg) { //uParam1 nSocket //uParam2 nActorID //uParam3 nGateID //uParam4 nGateSessionIndex //uParam5 nServerSessionIndex //uParam6 nAccountID OutputMsg(rmTip,"%s,account=%d,actorid=%d ",__FUNCTION__,(unsigned int)uParam6,(unsigned int)(uParam2)); CLogicGate * pGate = (CLogicGate *)GetLogicServer()->GetGateManager()->getGate(uParam3); if(pGate==NULL) { OutputMsg(rmWaning,"%s gate id=[%d] is NULL",__FUNCTION__,uParam3); return; } CEntityManager *pMgr = GetGlobalLogicEngine()->GetEntityMgr(); CSimulatorMgr *pSimuMgr = GetGlobalLogicEngine()->GetSimulatorMgr(); if(!GetLogicServer()->IsCrossServer()) { CActor * pActor = pMgr->GetEntityPtrByAccountID((unsigned int)uParam6); //判断这个玩家是否登陆了 if(pActor != NULL) //该账户已经有一个角色登陆了,就需要提示玩家登陆失败 { //GetLogicServer()->GetGateManager()->KickUser((ACCOUNTDATATYPE)uParam6,pActor->GetGateKey() ); while (1) { if (pActor->OnGetIsTestSimulator() || pActor->OnGetIsSimulator() ) { pActor->CloseActor(lwiSimulatorSameActorLogin, false); break; } if(pActor->GetGateKey() != uParam7) { CActorPacket ap; CDataPacket &outPack = pActor->AllocPacket(ap); outPack << (BYTE) enLoginSystemId << (BYTE)sOtherLoginGame; ap.flush(); pActor->CloseActor(lwiGateCreateKeyError, false); break; } break; } //return; }pActor = pMgr->GetEntityPtrByAccountID((unsigned int)uParam6); //判断这个玩家是否登陆了 if(pActor != NULL) //该账户已经有一个角色登陆了,就需要提示玩家登陆失败 { //GetLogicServer()->GetGateManager()->KickUser((ACCOUNTDATATYPE)uParam6,pActor->GetGateKey() ); while (1) { if (pActor->OnGetIsTestSimulator() || pActor->OnGetIsSimulator() ) { pActor->CloseActor(lwiSimulatorSameActorLogin, false); break; } if(pActor->GetGateKey() != uParam7) { CActorPacket ap; CDataPacket &outPack = pActor->AllocPacket(ap); outPack << (BYTE) enLoginSystemId << (BYTE)sOtherLoginGame; ap.flush(); pActor->CloseActor(lwiGateCreateKeyError, false); break; } break; } //return; }pActor = pMgr->GetEntityPtrByAccountID((unsigned int)uParam6); //判断这个玩家是否登陆了 if(pActor != NULL) //该账户已经有一个角色登陆了,就需要提示玩家登陆失败 { //GetLogicServer()->GetGateManager()->KickUser((ACCOUNTDATATYPE)uParam6,pActor->GetGateKey() ); while (1) { if (pActor->OnGetIsTestSimulator() || pActor->OnGetIsSimulator() ) { pActor->CloseActor(lwiSimulatorSameActorLogin, false); break; } if(pActor->GetGateKey() != uParam7) { CActorPacket ap; CDataPacket &outPack = pActor->AllocPacket(ap); outPack << (BYTE) enLoginSystemId << (BYTE)sOtherLoginGame; ap.flush(); pActor->CloseActor(lwiGateCreateKeyError, false); break; } break; } //return; }pActor = pMgr->GetEntityPtrByAccountID((unsigned int)uParam6); //判断这个玩家是否登陆了 if(pActor != NULL) //该账户已经有一个角色登陆了,就需要提示玩家登陆失败 { //GetLogicServer()->GetGateManager()->KickUser((ACCOUNTDATATYPE)uParam6,pActor->GetGateKey() ); while (1) { if (pActor->OnGetIsTestSimulator() || pActor->OnGetIsSimulator() ) { pActor->CloseActor(lwiSimulatorSameActorLogin, false); break; } if(pActor->GetGateKey() != uParam7) { CActorPacket ap; CDataPacket &outPack = pActor->AllocPacket(ap); outPack << (BYTE) enLoginSystemId << (BYTE)sOtherLoginGame; ap.flush(); pActor->CloseActor(lwiGateCreateKeyError, false); break; } break; } //return; } //2017-1-11 //登录客户端发来的nAccountID ,nActorID,没有校验角色是否属于对应账号的 //导致封包修改角色id可以登录其他账号角色,在线的角色先判断,避免2个角色同时登录 //CActor::Init 读取数据之后做了账号和id的校验 pActor = pMgr->GetEntityPtrByActorID((unsigned int)uParam2); if (pActor != NULL) { if (pActor->GetAccountID() != (unsigned int)uParam6) { pGate->PostKickUser((ACCOUNTDATATYPE)uParam6, uParam7); return; } else { pActor->CloseActor(lwiSameActorLogin, false); } } jxSrvDef::GLOBALSESSIONOPENDATA sessionData; CLogicSSClient* pSSClient = GetLogicServer()->GetSessionClient(); bool bRet = pSSClient->GetSessionData((int)uParam6, uParam7, &sessionData); if(bRet == false) { OutputMsg(rmWaning,"CNetWorkMsgHandle 创建角色的时候,找不到sessionID =%d,lkey=%lld的会话查找",(int)uParam6,uParam7); pGate->PostKickUser((ACCOUNTDATATYPE)uParam6, uParam7); return; } EntityHandle hHandle; pActor = (CActor*) pMgr->CreateEntity(enActor, hHandle); //创建一个实体,如果实体创建不成功的话 if(pActor ==NULL) //实体创建失败的话,要通知这个 { OutputMsg(rmError, _T("create actor entity failed")); pGate->PostSetActorHandleIndex((int)uParam5, 0, (unsigned int)uParam6); } else { pActor->SetSimulator(false);//标记不是模拟用户 pActor->SetGateKey(uParam7); pActor->SetCreateIndex(uParam8); int nFcmTime = 0; nFcmTime = sessionData.dwFCMOnlineSec; pSSClient->PostSetSessionPlayer(sessionData.nSessionId, pActor, uParam7); pActor->Onlogin(uParam1, uParam2, uParam3, uParam4, uParam5, (unsigned int)uParam6, nFcmTime, sessionData.nGmLevel, sessionData.nRawServerId, sessionData.nClientIPAddr); pGate->PostSetActorHandleIndex((int)uParam5, hHandle.GetIndex(), (unsigned int)uParam6); //跨服标记 pSimuMgr->OnRemoveRuningCsActor(uParam2); } } else { //跨服同id 需要做处理 CActor * pActor = pMgr->GetEntityPtrByActorID((unsigned int)uParam2); if (pActor != NULL) { CActorPacket ap; CDataPacket &outPack = pActor->AllocPacket(ap); outPack << (BYTE) enLoginSystemId << (BYTE)sOtherLoginGame; ap.flush(); pActor->CloseActor(lwiSameActorLogin, false); } /* 跨服同平台同账号同区处理--可能会存在效率问题 */ int nCSSrvId = GetGlobalLogicEngine()->GetCrossMgr().GetLoginActorCSSrvId((unsigned int)uParam2); OutputMsg(rmTip, "[CrossLogin 12 ]this is corssserver,account=%d,actorid=%d ", (unsigned int)uParam6, (unsigned int)(uParam2)); EntityHandle hHandle; pActor = (CActor*) pMgr->CreateEntity(enActor, hHandle); //创建一个实体,如果实体创建不成功的话 if(pActor ==NULL) //实体创建失败的话,要通知这个 { OutputMsg(rmError, _T("create actor entity failed")); pGate->PostSetActorHandleIndex((int)uParam5, 0, (unsigned int)uParam6); } else { pActor->SetSimulator(false);//标记不是模拟用户 // int nCSSrvId = GetGlobalLogicEngine()->GetCrossMgr().GetLoginActorCSSrvId((unsigned int)uParam2); pActor->SetGateKey(uParam7); pActor->SetCreateIndex(uParam8); int nFcmTime = 0; pActor->Crosslogin(uParam1, uParam2, uParam3, uParam4, uParam5, (unsigned int)uParam6, nCSSrvId); pGate->PostSetActorHandleIndex((int)uParam5, hHandle.GetIndex(), (unsigned int)uParam6); //跨服标记 pSimuMgr->OnRemoveRuningCsActor(uParam2); } } return; } else if (SSM_SS_RET_DATA == uMsg)//会话服务器返回的数据 { CDataPacket* pDataPacket = (CDataPacket*)uParam2; if ( pDataPacket ) { GetGlobalLogicEngine()->GetEntityMgr()->OnSsReturnData(uParam1, pDataPacket->getMemoryPtr(), pDataPacket->getPosition()); //处理完数据指针要还回 GetLogicServer()->GetSessionClient()->FreeBackUserDataPacket(pDataPacket); } return; } else if(SSM_LOGIN_FAIL == uMsg) //玩家登陆失败 { //uParam1 nSocket //uParam2 nErrorcode //uParam3 nGateID //uParam4 nGateSessionIndex //uParam5 nServerSessionIndex //uParam6 nAccountID //告诉客户端登陆失败了 OutputMsg(rmWaning,"CNetWorkMsgHandle SSM_LOGIN_FAIL account=[%d] is NULL,socket=%d",(int)uParam6,(int)uParam1); CActorPacket pack; CActor::InitActorPacket(pack, (int)uParam3, (int)uParam4, (int)uParam5, (int)uParam1, __FILE__, __LINE__); pack << (BYTE)enDefaultEntitySystemID << (BYTE)sUserLogin << BYTE(uParam2); pack.flush(); CLogicGate * pGate = (CLogicGate *)GetLogicServer()->GetGateManager()->getGate(uParam3); if(pGate) { pGate->PostCloseUser((int)uParam1,(int)uParam5); } else { OutputMsg(rmWaning,"%s gate id=[%d] is NULL", __FUNCTION__, uParam3); } } else if(SSM_GATE_USER_LOGOUT == uMsg) { //网关发过来消息,让玩家下线,这个时候直接把玩家踢下去 //网关发过来的,让玩家下线的 unsigned int nSessionId = (unsigned int)(uParam1); CActor * pActor = GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByAccountID((unsigned int)nSessionId); //判断这个玩家是否登陆了 if(pActor ) { if(pActor->GetGateKey() == uParam2) { pActor->CloseActor(lwiGateUserLogout, true); } } else { unsigned long long lKey = (unsigned long long)(uParam2); GetLogicServer()->GetSessionClient()->PostCloseSession(nSessionId, lKey); //session close //OutputMsg(rmError,_T("account=%d玩家登出的时候,account的玩家指针为空"),nSessionId); } return; } else if(SSM_SESSION_KICK_USER ==uMsg) { unsigned int nSessionId = (unsigned int)(uParam1); CActor * pActor = GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByAccountID((unsigned int)nSessionId); //判断这个玩家是否登陆了 if(pActor) { if(pActor->IsInTransmitStatus() ) { OutputMsg(rmTip,_T("account=%d玩家正在跨服状态,不踢下线"),nSessionId); } else { OutputMsg(rmTip,_T("account=%d玩家在其他服务器登陆,踢下线"),nSessionId); pActor->CloseActor(lwiSessionKickActor, false); } } else { OutputMsg(rmError,_T("SSM_SESSION_KICK_USER account=%d玩家登出的时候,account的玩家指针为空"),nSessionId); } } /* else if (SSM_FRIEND_INFO_UPDATE_SVR_ADDR == uMsg) { unsigned int nActorID =(unsigned int)uParam1; //玩家的actorID CActor *pActor =GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorID); if (pActor) { pActor->SyncFriendSvrAddr(); } else { OutputMsg(rmWaning,_T("初始化好友服务器的地址的时候玩家已经下线,actorid=%d"),nActorID); } } */ //else if (SSM_FRIEND_LIST == uMsg) //{ // unsigned int nActorID = (unsigned int )uParam1; //玩家的actorID // CActor *pActor =GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorID); // char * pAddr = (char *)uParam2; // if(pAddr ==NULL) return; // if (pActor && pActor->IsInited()) // { // // CDataPacketReader packet(pAddr,(UINT_PTR)uParam3 ); //这段数据是好友服务器传进来的 // LPCSTR sTag = strchr(packet.getOffsetPtr(), '/'); // if (sTag) // { // if (sTag > packet.getOffsetPtr()) // { // char TempBuffer[128] ; // INT_PTR nLen = DecodeBuffer(packet.getOffsetPtr(), TempBuffer, // sTag - packet.getOffsetPtr(), sizeof(TempBuffer)-1); // TempBuffer[nLen] = 0; // pActor->SetPersonalitySign(TempBuffer); // } // packet.setPosition(sTag - packet.getMemoryPtr() + 1); // if (packet.getAvaliableLength() > 0) // { // CFriendClient::LOGICFRIENDDATA frdData[MAX_USER_FRIEND_COUNT] = {0}; // CVector friendList; // INT_PTR nLen = DecodeBuffer(packet.getOffsetPtr(), frdData, packet.getAvaliableLength(), sizeof(frdData)); // for (int i = 0; i < MAX_USER_FRIEND_COUNT && frdData[i].nCharId != 0; i++) // { // friendList.push(frdData[i].nCharId); // } // pActor->InitFriendList(friendList); // } // pActor->SyncFriendSvrAddr(); // } // } // // SafeDelete(pAddr); // return; //} //else if (SSM_FRIEND_CHANGED == uMsg) //{ // CActor *pActor = GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID((unsigned int)uParam1); // if (pActor) // { // if (uParam2 == 0)//添加好友 // { // pActor->OnFriendChanged(true, (int)uParam3); // } // else //删除好友 // { // pActor->OnFriendChanged(false, (int)uParam3); // } // } // return; //} else if ( SSM_MS_RET_DATA == uMsg) { return; } else if (SSM_LOGIC_2_COMMONLOGIC_DATA == uMsg) { // 逻辑服务器之间的数据交互 CDataPacket* packet = (CDataPacket*)uParam2; GetGlobalLogicEngine()->GetTransmitMgr().OnRecvMessage(0, (int)uParam1, *packet); CCommonServerClient *pClient = (CCommonServerClient *)(uParam3); if (pClient) pClient->FreeBackUserDataPacket(packet); } else if (SSM_COMMONLOGIC_2_LOGIC_DATA == uMsg) { CDataPacket* packet = (CDataPacket*)uParam2; GetGlobalLogicEngine()->GetTransmitMgr().OnRecvMessage(1, (int)uParam1, *packet); GetLogicServer()->GetCommonClient()->FreeBackUserDataPacket(packet); } else if (SSM_LOGIC_2_CROSS_DATA == uMsg) { CDataPacket* packet = (CDataPacket*)uParam2; if(packet) { CDataPacketReader reader(packet->getMemoryPtr(),packet->getPosition()); GetGlobalLogicEngine()->GetCrossMgr().OnRecvLogicMessage((int)uParam1, reader); } return; } else if (SSM_CROSS_2_LOGIC_DATA == uMsg) { CDataPacket* packet = (CDataPacket*)uParam2; if(packet) { CDataPacketReader reader(packet->getMemoryPtr(),packet->getPosition()); GetGlobalLogicEngine()->GetCrossMgr().OnRecvCrossMessage((int)uParam1, reader); GetLogicServer()->GetCrossClient()->FreeBackUserDataPacket(packet); } return; } if (SSM_CROSS_SERVER_DB_DATA == uMsg) //数据服务器返回的 { CDataPacket* pDataPacket = (CDataPacket*)uParam2; if ( pDataPacket ) { if(uParam1 == dcGetCSActorId || uParam1 == dcCreateCSActorId) { GetGlobalLogicEngine()->GetCrossMgr().OnDbReturnData(uParam1,pDataPacket->getMemoryPtr(),pDataPacket->getPosition()); } //处理完数据指针要还回 GetLogicServer()->GetDbClient()->FreeBackUserDataPacket(pDataPacket); } return; } else if(SSM_CROSS_CEHCK_ACTORDATA == uMsg) //跨服玩家账号登录 { GetGlobalLogicEngine()->GetCrossMgr().OnAddWaitInitList(uParam1, uParam2, uParam3, uParam4); } else if (SSM_NEWBACKMGR_DATA == uMsg ) //后台CMD { GetLogicServer()->GetBackClient()->HandleCommand(uParam1, uParam2, uParam3, uParam4); } else if (SSM_ASYNC_WORK_THREAD == uMsg) //异步工作线程 { AsyncWorker::CBData* pCallBackData = (AsyncWorker::CBData*)uParam1; if (pCallBackData) { AsyncWorker::AsyncWorkerAlloc& alloc = pCallBackData->worker_->GetAlloc(); if (pCallBackData->after_func_) pCallBackData->after_func_(pCallBackData); if (pCallBackData->params_ && pCallBackData->free_func_) pCallBackData->free_func_(pCallBackData); alloc.FreeBuffer(pCallBackData); } } } //发送内部消息 VOID CNetWorkMsgHandle::PostInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4,UINT64 uParam5,UINT64 uParam6,UINT64 uParam7,int uParam8) { PLOGICINTERNALMSG pAppMsg = (PLOGICINTERNALMSG)m_Allocator.AllocBuffer(sizeof(*pAppMsg)); pAppMsg->uMsg = uMsg; pAppMsg->uParam1 = uParam1; pAppMsg->uParam2 = uParam2; pAppMsg->uParam3 = uParam3; pAppMsg->uParam4 = uParam4; pAppMsg->uParam5 = uParam5; pAppMsg->uParam6 = uParam6; pAppMsg->uParam7 = uParam7; pAppMsg->uParam8 = uParam8; m_ItnMsgList.append(pAppMsg); //OutputMsg(rmTip,_T("CNetWorkMsgHandle::PostInternalMessage(): addr=%d"),(int)pAppMsg); } VOID CNetWorkMsgHandle::ProcessInternalMessages() { //SF_TIME_CHECK(); //检测性能 INT_PTR i =0,nCount=0; PLOGICINTERNALMSG pAppMsg; DECLARE_TIME_PROF("CNetWorkMsgHandle::ProcessInternalMessages"); #ifdef _USE_TRY_CATCH #ifdef WIN32 __try #endif #endif { m_ItnMsgList.flush(); nCount = m_ItnMsgList.count(); for ( i = 0; i < nCount; i ++ ) // i =12 修改了数据 { pAppMsg = m_ItnMsgList[i]; DispatchInternalMessage(pAppMsg->uMsg, pAppMsg->uParam1, pAppMsg->uParam2, pAppMsg->uParam3,pAppMsg->uParam4,pAppMsg->uParam5,pAppMsg->uParam6,pAppMsg->uParam7,pAppMsg->uParam8); m_Allocator.FreeBuffer(pAppMsg); //OutputMsg(rmTip,_T("CNetWorkMsgHandle ProcessInternalMessages():i=%d,addr=%d"),i,(int)pAppMsg); } m_ItnMsgList.clear(); } #ifdef _USE_TRY_CATCH #ifdef WIN32 __except(CustomExceptHandler(GetExceptionInformation())) { if( i < nCount) { pAppMsg = m_ItnMsgList[i]; //如果这个消息出问题了,那么就删除这个消息 m_Allocator.FreeBuffer(pAppMsg); m_ItnMsgList.remove(0,i+1); } } #endif #endif }