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

271 lines
8.4 KiB
C++
Raw Permalink 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"
using namespace TRANSMIT;
#include "../base/Container.hpp"
bool CTransmitMgr::ReqTransmitTo(CActor *pActor, const char *pSceneName, const int nPosX, const int nPosY)
{
if (!pActor)
return false;
// 0、判断此玩家是否在等待传送阶段发送了传送请求还没收到应答如果是返回false否则继续下面处理
// 1、找到目标逻辑服务器如果没连接上返回false否则继续下面处理
// 2、调用对应的连接对象分配数据包DataPacket并且先写入本服务器的ServerIndex以及是否是公共服务器标记1Byte
// 3、将要传送到的目标场景和位置写入到DataPacket以便目标服务器检测是否可传入
// 4、将数据包发送给目标服务器
// 5、将此玩家加入到等待传送列表记录当前时间用于超时。
// 当前角色所在的逻辑服务器ServerIndex
int nServerIdx = GetLogicServer()->GetServerIndex();
unsigned int nActorId = pActor->GetId();
// 角色原始服务器的ServerIndex
int nRawServerIdx = GetActorRawServerIndex(pActor);
char szData[256];
CDataPacket packet(szData, sizeof(szData));
packet.setLength(0);
packet << (WORD)L2L_ReqTransmit << nServerIdx << nActorId;
SendMessage(packet.getMemoryPtr(), packet.getPosition(), nRawServerIdx);
return true;
}
void CTransmitMgr::OnRecvReqTransmitTo(CDataPacketReader &reader)
{
unsigned int nSrcServerIdx = 0, nActorId = 0;
reader >> nSrcServerIdx >> nActorId; // TODO 场景名称、坐标XY
char szData[256];
CDataPacket packet(szData, sizeof(szData));
packet.setLength(0);
packet << (WORD)L2L_ReqTransmitAck << (bool)true << nSrcServerIdx << nActorId;
SendMessage(packet.getMemoryPtr(), packet.getPosition(), nSrcServerIdx);
}
void CTransmitMgr::OnRecvReqTransmitToAck(CDataPacketReader &reader)
{
unsigned int nServerIdx = 0, nActorId = 0;
reader >> nServerIdx >> nActorId;
// TODO 对于公共服务器应该根据角色ID和ServerID一起来唯一确定一个CActor对象
CActor *pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId);
StartTransmitTo(pActor);
}
void CTransmitMgr::StartTransmitTo(CActor *pActor)
{
int nServerIdx = GetLogicServer()->GetServerIndex();
unsigned int nActorId = 0;
char szData[128];
CDataPacket packet(szData, sizeof(szData));
packet << (WORD)L2L_StartTransmit << nServerIdx << nActorId;
SendMessage(packet.getMemoryPtr(), packet.getPosition(), GetActorRawServerIndex(pActor));
// TODO.调用Actor的TransmitTo函数开始传送
EndTransmitTo(pActor);
}
void CTransmitMgr::OnRecvStartTransmitTo(CDataPacketReader &reader)
{
unsigned int nServerIdx = 0, nActorId = 0;
reader >> nServerIdx >> nActorId; // 场景名称、坐标XY
if (nServerIdx < 0 || nServerIdx >= SERVER_INDEX_MAX)
{
OutputMsg(rmError, _T("%s error occur: invalid serverindex=%d"), __FUNCTION__, nServerIdx);
return;
}
if (nServerIdx == GetLogicServer()->GetServerIndex())
{
OutputMsg(rmError, _T("%s error occur: transmit from same server!!!"), __FUNCTION__);
return;
}
// TODO.设置角色的会话状态、创建角色缓存数据对象
CServerActorInfo &serverActorInfo = m_ServerActorInfo[nServerIdx];
serverActorInfo.AddActorCache(nActorId); // 到目前为止,还没有缓存任何角色传送数据!
}
bool CTransmitMgr::ExistActorTransSessionData(int nServerIdx, unsigned int nActorId)
{
if (nServerIdx < 0 || nServerIdx > SERVER_INDEX_MAX)
{
OutputMsg(rmError, _T("%s invalid serverindex:%d"), __FUNCTION__, nServerIdx);
return false;
}
TRANSMIT::CServerActorInfo &serverActorInfo = m_ServerActorInfo[nServerIdx];
return serverActorInfo.GetActorCache(nActorId) != NULL ? true : false;
}
bool CTransmitMgr::ExistAccountTransSessionData(int nServerIdx, unsigned int nAccount)
{
if (nServerIdx < 0 || nServerIdx > SERVER_INDEX_MAX)
{
OutputMsg(rmError, _T("%s invalid serverindex:%d"), __FUNCTION__, nServerIdx);
return false;
}
TRANSMIT::CServerActorInfo &serverActorInfo = m_ServerActorInfo[nServerIdx];
return serverActorInfo.GetActorCacheByAccountId(nAccount) != NULL ? true : false;
}
void CTransmitMgr::OnLogicServerDisconnected(int nServerIdx)
{
CLogicServer *pLogicServer = GetLogicServer();
if (pLogicServer->IsCommonServer())
{
((CCSTransmitMgr *)this)->KillActorByServerIdx(nServerIdx);
}
else
{
// 将那些传送到公共服务器的玩家会话关闭。
((CNSTransmitMgr *)this)->CloseTransedActorSession();
}
}
void CTransmitMgr::EndTransmitTo(CActor *pActor)
{
int nServerIdx = GetLogicServer()->GetServerIndex();
unsigned int nActorId = 0;
char szData[128];
CDataPacket packet(szData, sizeof(szData));
packet << (WORD)L2L_EndTransmit << nServerIdx << nActorId;
SendMessage(packet.getMemoryPtr(), packet.getPosition(), GetActorRawServerIndex(pActor));
}
void CTransmitMgr::OnRecvEndTransmitTo(CDataPacketReader &reader)
{
unsigned int nServerIdx = 0, nActorId = 0;
reader >> nServerIdx >> nActorId;
if (nServerIdx < 0 || nServerIdx >= SERVER_INDEX_MAX)
return;
CServerActorInfo &serverActorInfo = m_ServerActorInfo[nServerIdx];
CActorTransmitCache *pCache = serverActorInfo.GetActorCache(nActorId);
if (pCache)
{
pCache->SetAllDataReady(true);
}
}
void CTransmitMgr::SendMessage(void *pData, SIZE_T size, int nServerIdx)
{
CLogicServer *pLogicServer = GetLogicServer();
if (pLogicServer->IsCommonServer())
{
//CCommonServer *pServer = pLogicServer->GetCommonServer();
//pServer->SendData(nServerIdx, pData, size);
}
else
{
CCommonClient *pClient = pLogicServer->GetCommonClient();
// 这里消息号是站位用pData里头已经有消息号
CDataPacket &packet = pClient->allocProtoPacket(0);
packet.adjustOffset(0-sizeof(jxSrvDef::INTERSRVCMD)); // 将Offset回退到消息ID的位置
packet.writeBuf(pData, size);
pClient->flushProtoPacket(packet);
}
}
void CTransmitMgr::TransmitFrom(INT_PTR nCmd, CDataPacketReader &reader)
{
// 处理传送打包的角色数据
}
int CTransmitMgr::GetActorRawServerIndex(CActor *pActor)
{
CLogicServer *pLogicServer = GetLogicServer();
int nServerIdx = pLogicServer->GetServerIndex();
if (GetLogicServer()->IsCommonServer())
nServerIdx = pActor->GetRawServerIndex();
return nServerIdx;
}
void CTransmitMgr::OnRecvMessage(int nDir, int nMsgId, CDataPacketReader &reader)
{
switch (nMsgId)
{
case L2L_ReqTransmit:
OnRecvReqTransmitTo(reader);
break;
case L2L_ReqTransmitAck:
OnRecvReqTransmitToAck(reader);
break;
case L2L_StartTransmit:
OnRecvStartTransmitTo(reader);
break;
case L2L_EndTransmit:
OnRecvEndTransmitTo(reader);
break;
default:
OutputMsg(rmError, _T("%s Recv unknown message:%d"), __FUNCTION__, nMsgId);
break;
}
}
void CCSTransmitMgr::KillActorByServerIdx(int nServerIdx)
{
if (nServerIdx < 0 || nServerIdx >= SERVER_INDEX_MAX)
{
OutputMsg(rmError, _T("%s invalid serveridx:%d"), __FUNCTION__, nServerIdx);
return;
}
TRANSMIT::CServerActorInfo &serverActorInfo = m_ServerActorInfo[nServerIdx];
serverActorInfo.CloseAllActor();
}
void CNSTransmitMgr::CloseTransedActorSession()
{
INT_PTR count = m_transedActorList.count();
if (count > 0)
{
CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient();
CMiniDateTime nCurrentTime;
nCurrentTime.tv = GetGlobalLogicEngine()->getMiniDateTime();
for (INT_PTR i = 0; i < count; i++)
{
TRANSMIT::CTransedActorRecord &record = m_transedActorList[i];
pSSClient->PostCloseSession(record.m_nAccountId, 0);
}
}
}
void CTransmitMgr::RunOne(TICKCOUNT nCurrTick)
{
for (INT_PTR i = 0; i < SERVER_INDEX_MAX; i++)
{
TRANSMIT::CServerActorInfo &ServerActorInfo = this->m_ServerActorInfo[i];
ServerActorInfo.RunOne(nCurrTick);
}
}
namespace TRANSMIT
{
void CServerActorInfo::CloseAllActor()
{
if (m_actorDBData.size() > 0)
{
CEntityManager *pEntityMgr = GetGlobalLogicEngine()->GetEntityMgr();
std::map<int, CActorTransmitCache*>::iterator iter = m_actorDBData.begin();
std::map<int, CActorTransmitCache*>::iterator iter_end = m_actorDBData.end();
for (; iter != iter_end; ++iter)
{
unsigned int nActorId = iter->first;
CActor *pActor = pEntityMgr->GetEntityPtrByActorID(nActorId);
if (pActor)
pActor->CloseActor(lwiCloseTransmitAllUser, false);
}
}
}
void CServerActorInfo::RunOne(TICKCOUNT nCurrTick)
{
std::map<int, CActorTransmitCache*>::iterator iter = m_actorDBData.begin();
std::map<int, CActorTransmitCache*>::iterator iter_end = m_actorDBData.end();
for (; iter != iter_end; ++iter)
{
CActorTransmitCache *pCache = iter->second;
}
}
}