Files
mir_server/server/DBServer/DBGate.h

126 lines
4.7 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _GATE_H_
#define _GATE_H_
using namespace wylib::time::tick64;
using namespace wylib::container;
class CDBGateManager;
class CDBServer;
/*******************************************************
********************************************************/
class CDBGate
: public CCustomServerGate
{
friend class CDBGateManager;
public:
CDBGate();
virtual ~CDBGate();
/*
* Comments:
* Param const unsigned int nSessionID: sessionID
* Param const unsigned int nActorId: actorID
* @Return void:
*/
void OnLogicRsponseSessionData(const unsigned int nSessionID,const unsigned int nActorId);
static bool m_bGableIsClose; //盗梦空间是否关闭
virtual void OnRountine()
{
CCustomServerGate::OnRountine();
}
protected:
/*** 覆盖父类的逻辑处理函数集 ***/
CCustomServerGateUser* CreateGateUser();
VOID DestroyGateUser(CCustomServerGateUser* pUser);
VOID OnOpenUser(CCustomServerGateUser *pGateUser);
VOID OnCloseUser(CCustomServerGateUser *pGateUser);
VOID OnGateClosed();
VOID OnDispatchUserMsg(CCustomServerGateUser *pUser, char* pBuffer, SIZE_T nBufferSize);
VOID OnRun();
virtual VOID DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4);
private:
//处理用户列表
VOID ProcessUsers();
VOID AddAllGateUsersToFreeList();
//通过全局会话ID查找网关用户如果找到用户且lpIndex非空则会想*lpIndex填充网关用户的索引
CDBGateUser* GetGateUserPtrBySessionId(const int nSessionId, PINT_PTR lpIndex = NULL);
//处理用户选择角色进入游戏的消息
int UserSelCharEntryGame(CDBGateUser *pGateUser, int nCharId,
char* sGateHost,SIZE_T nHostLen,PINT_PTR nGatePort);
//处理名称服务器返回申请角色名称的结果
BOOL NameServerAllocCharIdResult(const int nSessionId, const INT_PTR nError, const int nCharId);
//处理各个数据包
private:
//根据帐户ID查询出相关的角色列表,结果会添加到pPacket中
CDataPacket* QueryActorList(CDBGateUser *pGateUser, char* lpData, SIZE_T nSize);
//处理创建角色包
CDataPacket* CreateActor(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
CDataPacket* DeleteActor(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
CDataPacket* EntryGameReq(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
//随机生成名字
CDataPacket* RandNameReq(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
//查询最少人选择的职业
CDataPacket* QueryLessJobReq(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
BYTE QueryLessJobReq( BYTE &bJob, int serverindex );
CDataPacket* QueryZYReq(CDBGateUser *pGateUser, char* lpData,SIZE_T nSize);
BYTE QueryZYReq( BYTE& bZY ,int serverindex);
INT_PTR QueryActorCount(INT_PTR nAccountId, INT_PTR nServerIndex);
WORD QueryZyList(INT_PTR nServerIndex);
// 当名字服务器返回创建角色结果时,执行本函数
// 1.数据库中插入新的角色信息 2.返回客户端结果
VOID ProcessNameSrvResult(CDBGateUser* pGateUser,int nCharId, INT_PTR nError);
void SendClientLogin(const unsigned int nSessionID,const unsigned int nActorId);
// 设置网关管理器
void SetGateManager(CDBGateManager* mgr){ m_pGateMgr = mgr; }
//inline void InitDBReqHandler() { m_reqHandler.Init(m_pSQLConnection, m_pGateMgr); }
//// 封装DB请求处理
///*
//* Comments: 获取指定账号ID的所有角色列表信息
//* Param const int nActorId: 玩家账号ID
//* Param const int nServerId: 角色所在的逻辑服务器ID
//* Param CDataPacket &: 输出数据包
//* @Return void:
//* @Remark: 输出内容包括错误码1Byte) + 角色数目1Byte + 角色信息列表。如果查询失败,只有错误码。
//*/
//void GetActorList(const int nActorId, const int nServerId, CDataPacket &packet);
//有可能玩家连接了2个连接或者连接没有关闭导致逻辑服发过来的时候发给了另外一个连接
//所以玩家登陆的时候根据账户id把以前的连接需要关闭避免发错连接也避免僵尸连接
VOID DeleteOldActor(CDBGateUser *pGateUser);
public:
typedef CCustomServerGate Inherited;
static const INT_PTR MAX_GATE_USER = 8192; //最大网关用户数
static const INT_PTR SSM_LOGIC_RESPONSE_SESSION_DATA =40001;
private:
CDBGateManager* m_pGateMgr; // 网关管理器
CDBGateUser m_GateUsers[MAX_GATE_USER]; //网关用户数组
CSQLConenction* m_pSQLConnection; //数据库连接对象
CDBServer* m_pDBServer; //所属数据引擎
CBaseList<CCustomServerGateUser*> m_FreeUserList; //空闲网关用户列表
PERFORMANCEINFO m_MaxTimeUserMsgPerformance;//处理用户单个消息最高的时间
CGateDBReqestHandler m_reqHandler; // GateDBReqHandler
};
#endif