Files
mir_server/server/LogicServer/networkdata/NetWorkMsgHandle.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

778 lines
26 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<CCustomGateManager::MaxGateCount; ++nGateIdx)
{
CQueueList<CDataPacket*> &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<CDataPacket*>& vList)
{
if ((nGateIdx < 0) || (nGateIdx >= CCustomGateManager::MaxGateCount)) return;
CQueueList<CDataPacket*> &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; nGateIdx<CCustomGateManager::MaxGateCount; ++nGateIdx)
{
CLogicGate* logicgate = (CLogicGate*)GetLogicServer()->GetGateManager()->getGate(nGateIdx);
if(logicgate ==NULL /*|| !logicgate->connected()*/) continue;
CBaseList<CDataPacket *> & freeList = logicgate->GetLogicProcecdDataList();
if(freeList.count() >0)
{
logicgate->freeBackUserDataList(freeList); //将空闲列表添加进去
}
CQueueList<CDataPacket*> &DataList = m_GateUserDataList[nGateIdx];
if ( DataList.appendCount() > 0 ) //如果后面有追加的列的话
DataList.flush(); //把追加的列刷到列表里去
if ( DataList.count() > 0 )
{
for (INT_PTR i=0; i<DataList.count(); ++i)
{
CDataPacket* packet = (DataList[i]);
//TRACE("datalist[%d]:%d\n",i,(int)packet);
//处理数据
LOGICUSERDATA GateUser;
//jxSrvDef::INTERSRVCMD nCmdId;
INT_PTR nSize = packet->getPosition();
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<int> 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
}