Files
mir_server/server/LogicServer/transmit/TransmitMgr.h

405 lines
11 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef TRANSMIT_MGR_H_
#define TRANSMIT_MGR_H_
/*
Id
Id
*/
// 角色传送缓存数据。传送目的方接收到数据先缓存起来
namespace TRANSMIT
{
class CActorTransmitCacheData
{
public:
CActorTransmitCacheData() : m_nDataType(-1), m_packet(0){}
CActorTransmitCacheData(int nType, CDataPacket *packet){
m_nDataType = nType;
m_packet = packet;
}
int GetDataType() const { return m_nDataType; }
private:
int m_nDataType; // 角色数据类型
CDataPacket *m_packet; // 数据包
};
class CActorTransmitCache
{
public:
enum
{
TRANSMIT_TIMEOUT = 2 * 60 * 1000, // 传送超时
};
CActorTransmitCache()
{
m_nAccountId = 0;
m_bAllDataReady = false;
}
unsigned int GetAccountId() const
{
return m_nAccountId;
}
void SetAccountId(unsigned int nAccountId)
{
m_nAccountId = nAccountId;
}
unsigned int GetStartTransTime() const
{
return m_nStartTransTime;
}
void SetStartTransTime(unsigned int nTime)
{
m_nStartTransTime = nTime;
}
/*
* Comments:
* Param int nType:
* Param CDataPacket * packet:
* @Return void:
* @Remark:
*/
void CacheData(int nType, CDataPacket *packet)
{
CActorTransmitCacheData *pCacheData = GetCacheData(nType);
if (pCacheData)
{
// TODO 覆盖
}
else
{
// 添加一个新的
CActorTransmitCacheData cacheData(nType, packet);
m_cache.add(cacheData);
}
}
/*
* Comments:
* Param const int nType:
* @Return CActorTransmitCacheData*:
* @Remark:
*/
CActorTransmitCacheData* GetCacheData(const int nType)
{
for (INT_PTR i = 0; i < m_cache.count(); i++)
{
if (nType == m_cache[i].GetDataType())
return &m_cache[i];
}
return NULL;
}
/*
* Comments:
* Param bool flag:
* @Return void:
* @Remark:
*/
void SetAllDataReady(bool flag)
{
m_bAllDataReady = flag;
}
private:
unsigned int m_nAccountId; // 该角色的登录账号ID
unsigned int m_nStartTransTime; // 开始传送时间
bool m_bAllDataReady; // 所有的传送数据都缓存OK
CVector<CActorTransmitCacheData> m_cache;
};
// 同一个服务器内的所有角色数据
class CServerActorInfo
{
public:
/*
* Comments: ID的Cache数据对象
* Param int nActorId:
* @Return CActorTransmitCache*:
* @Remark:
*/
CActorTransmitCache* GetActorCache(unsigned int nActorId)
{
std::map<int, CActorTransmitCache*>::iterator iter = m_actorDBData.find(nActorId);
if (iter != m_actorDBData.end())
return iter->second;
return NULL;
}
CActorTransmitCache* GetActorCacheByAccountId(unsigned int nAccountId)
{
std::map<int, CActorTransmitCache*>::iterator iter = m_actorDBData.begin();
std::map<int, CActorTransmitCache*>::iterator iter_end = m_actorDBData.end();
for (; iter != iter_end; ++iter)
{
if (iter->second->GetAccountId() == nAccountId)
return iter->second;
}
return NULL;
}
/*
* Comments: Cache数据
* Param int nActorId:
* @Return CActorTransmitCache*: CaChe对象指针
* @Remark:
*/
CActorTransmitCache* AddActorCache(unsigned int nActorId)
{
CActorTransmitCache *pCache = GetActorCache(nActorId);
if (pCache != NULL)
return pCache;
pCache = new CActorTransmitCache();
m_actorDBData[nActorId] = pCache;
return pCache;
}
/*
* Comments: Cache数据
* Param int nActorId:
* @Return void:
* @Remark:
*/
void RemoveActorCache(unsigned int nActorId)
{
std::map<int, CActorTransmitCache*>::iterator iter = m_actorDBData.find(nActorId);
if (iter != m_actorDBData.end())
{
delete iter->second;
m_actorDBData.erase(iter);
}
}
/*
* Comments:
* @Return void:
* @Remark:
*/
void CloseAllActor();
/*
* Comments:
* Param TICKCOUNT nCurrTick:
* @Return void:
* @Remark:
*/
void RunOne(TICKCOUNT nCurrTick);
private:
std::map<int, CActorTransmitCache*> m_actorDBData; // 角色Id --> 传送缓存数据
};
// 记录角色传送到公共服务器的一些信息
struct CTransedActorRecord
{
unsigned int m_nAccountId; // 账号ID
unsigned int m_nActorId; // 角色ID
unsigned int m_nLoginTime; // 角色登录普通逻辑服务器的时间
};
}
class CTransmitMgr
{
public:
enum
{
SERVER_INDEX_MAX = 1024, // 最大的ServerIndex
};
CTransmitMgr(){}
~CTransmitMgr(){}
/*
* Comments:
* Param CActor * pActor:
* Param const char * pSceneName:
* Param const int nPosX: X
* Param const int nPosY: Y
* @Return bool:
* @Remark:
*/
bool ReqTransmitTo(CActor *pActor, const char *pSceneName, const int nPosX, const int nPosY);
/*
* Comments:
* Param INT_PTR nCmd: ID
* Param CDataPacketReader & reader:
* @Return void:
* @Remark: DB中加载数据处理
*/
void TransmitFrom(INT_PTR nCmd, CDataPacketReader &reader);
/*
* Comments:
* Param int nServerIdx: ServerIndex
* Param int nActorId: ID
* @Return bool: truefalse
* @Remark:
DB和Session会话状态
*/
bool ExistActorTransSessionData(int nServerIdx, unsigned int nActorId);
/*
* Comments:
* Param int nServerIdx: ServerIndex
* Param int nAccount:
* @Return bool:
* @Remark:
*/
bool ExistAccountTransSessionData(int nServerIdx, unsigned int nAccount);
/*
* Comments:
* Param int nServerIdx:
* @Return void:
* @Remark:
SessionServer断开此玩家的会话
线
*/
void OnLogicServerDisconnected(int nServerIdx);
/*
* Comments:
* Param int nDir: 01
* Param int nMsgId: Id
* Param CDataPacketReader & reader:
* @Return void:
* @Remark:
*/
void OnRecvMessage(int nDir, int nMsgId, CDataPacketReader &reader);
/*
* Comments:
* Param TICKCOUNT nCurrTick:
* @Return void:
* @Remark:
*/
void RunOne(TICKCOUNT nCurrTick);
protected:
/*
* Comments:
* Param CActor * pActor:
* @Return void:
* @Remark: IdServerIndex等信息
*/
void StartTransmitTo(CActor *pActor);
/*
* Comments:
* Param CActor * pActor:
* @Return void:
* @Remark:
*/
void EndTransmitTo(CActor *pActor);
/*
* Comments:
* Param CDataPacketReader & reader:
* @Return void:
* @Remark:
*/
void OnRecvReqTransmitTo(CDataPacketReader &reader);
/*
* Comments: ACK
* Param CDataPacketReader & reader:
* @Return void:
* @Remark:
*/
void OnRecvReqTransmitToAck(CDataPacketReader &reader);
/*
* Comments:
* Param CDataPacketReader & reader:
* @Return void:
* @Remark: session状态等等
*/
void OnRecvStartTransmitTo(CDataPacketReader &reader);
/*
* Comments:
* Param CDataPacketReader & reader:
* @Return void:
* @Remark:
*/
void OnRecvEndTransmitTo(CDataPacketReader &reader);
/*
* Comments:
* Param void * pData:
* Param SIZE_T size:
* Param int nServerIdx: ServerIndex
* @Return void:
* @Remark:
*/
void SendMessage(void *pData, SIZE_T size, int nServerIdx);
/*
* Comments: ServerIndex
* Param CActor * pActor:
* @Return int:
* @Remark:
*/
int GetActorRawServerIndex(CActor *pActor);
protected:
// 最多支持1024个服务器。用于缓存传送到本服务器的玩家的打包数据
TRANSMIT::CServerActorInfo m_ServerActorInfo[SERVER_INDEX_MAX];
// 对于普通逻辑服务器还需要记录传送到公共服务器的玩家的信息包括账号ID、角色ID、玩家上线时间用于
// 定时数据存盘的检测以及与公共服务器断开连接时关闭此部分玩家会话用
};
// 普通逻辑服务器传送管理器
class CNSTransmitMgr : public CTransmitMgr
{
public:
/*
* Comments:
* @Return void:
* @Remark:
*/
void CloseTransedActorSession();
private:
CVector<TRANSMIT::CTransedActorRecord> m_transedActorList; // 已经传送到公共服务器的玩家列表
};
// 公共服务器的传送管理器
class CCSTransmitMgr : public CTransmitMgr
{
public:
/*
* Comments: 线
* Param int nServerIdx:
* @Return void:
* @Remark:
*/
void KillActorByServerIdx(int nServerIdx);
};
#endif