Files
mir_server/server/robot/RobotClient.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

196 lines
5.1 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.

/*模拟登陆的客户端连接
* 模拟客户端的连接,发起多个连接到服务器去
*每个客户端都需要维护一个当前的状态机
*/
#pragma once
//class CLogicAgent;
class CRobotClient:
public CCustomWorkSocket
{
public:
typedef CCustomWorkSocket Inherited;
//客户端连接到的服务器
enum enServer
{
eServerNone, //初始化的状
eServerSession, //连接到了session网关
eServerDbsever, //连接到了db服务器
eServerLogic, //连接到逻辑服务器
};
//当前的通信状态,于网关的通信的状态
enum enConmStatus
{
eStatusIdle , //空闲状态
eStatusEncryReq , //请求服务器的密钥状态这个时候Socket
eStatusCommunication, //正常的通信阶段
eStatusEncryReqDisConnect, //请求连接状态断开
eStatusCommuDisConnect, //连接状态断开
eStatusMax, //最大的状态数目
};
CRobotClient()
{
m_nCurrentServer = eServerNone;
m_nCurrentStatus = eStatusIdle;
//每个代理的初始化
m_logicAgent.Init(this);
m_dwReconnectTick =0;
m_nAccountId =0;
m_sActorName[0]=0;
}
/**** 以下函数集为子类可能需要覆盖的函数 ****/
//处理接受到的服务器数据包
virtual VOID ProcessRecvBuffers(PDATABUFFER pDataBuffer);
//进行内部消息的处理分派
virtual VOID DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4);
//每次逻辑循环的例行逻辑处理函数
virtual VOID OnRun();
//例行执行函数
virtual VOID SingleRun();
//提供向最外层逻辑通知连接建立的事件
virtual VOID OnConnected();
//断开连接的时候
virtual VOID OnDisconnected();
//出現錯誤
virtual VOID OnError(INT errorCode);
//申请一个带数据头的数据包
CDataPacket& AllocProtoPacket();
//发送数据包
VOID FlushProtoPacket(CDataPacket& packet);
//获取登陆的账户
inline LOGINACCOUNT & GetAccount() {return m_account;}
/*
* Comments:
* Param char address:
* Param int nPort:
* @Return void:
*/
inline void SetServerAddress(char* address, int nPort)
{
struct hostent * iterName= gethostbyname(address);
if(iterName)
{
char add[100] ;
sprintf(add,"%d.%d.%d.%d",
(iterName->h_addr_list[0][0]&0x00ff),
(iterName->h_addr_list[0][1]&0x00ff),
(iterName->h_addr_list[0][2]&0x00ff),
(iterName->h_addr_list[0][3]&0x00ff));
strcpy(m_serverIp,add);
}
else
{
strcpy(m_serverIp,address);
}
m_nServerPort = nPort;
}
//获取玩家的账户的ID
inline int GetAccountId(){return m_nAccountId;}
//设置玩家账户的ID
inline void SetAccountId(int nAccountId){m_nAccountId =nAccountId; }
/*
* Comments:速传到场景id指定点
* Param int nSceneId:
* Param int nX:
* Param int nY:
* @Return bool:
*/
bool MoveBySceneId(int nSceneId, int nX, int nY);
/*
* Comments:速传到场景名指定点
* Param LPCTSTR sSceneName:
* Param int nX:
* Param int nY:
* @Return bool:
*/
bool MoveBySceneName(LPCTSTR sSceneName, int nX, int nY);
//连接到服务器
BOOL ConnectToServer();
//处理数据
void ProcData();
//设置玩家的角色的ID
inline void SetActorId(unsigned int nActorID){m_nActorID =nActorID;}
//获取玩家的角色的ID
inline unsigned int GetActorId(){return m_nActorID;}
//设置角色的名字
inline void SetActorName(char * name) { strncpy(m_sActorName, name,sizeof(m_sActorName));}
//获取角色的名字
inline char * GetActorName(){return m_sActorName;}
void ConnectNextServer(); //连接下一个服务器
//获取逻辑代理
inline CLogicAgent &GetLogicAgent(){return m_logicAgent;}
//获取当前所连接的服务器
int GetCurrentServerType() {return m_nCurrentServer;}
//获取当前的通信状态
int GetCurrentStatus(){return m_nCurrentStatus;}
// 获取玩家数据
inline CClientActor& GetActorData(){ return m_ActorData;}
inline void SetCnName(LPCTSTR sName)
{
CUtility::CopyCharArrayS(m_szCnName, sName);
}
inline char * GetCnName()
{
return m_szCnName;
}
TICKCOUNT GetCurTick()
{
return m_CurTick;
}
private:
CAgent * GetCurrentAgent() ;//当前那个代理负责处理处理数据
public:
LOGINACCOUNT m_account; //玩家的角色
int m_nCurrentServer; //玩家当前连接到的服务器
int m_nCurrentStatus; //当前的通信状态
Encrypt m_encryptHander; //加密器
CLogicAgent m_logicAgent; //逻辑数据代理
char m_serverIp[32]; //当前服务器的地址
int m_nServerPort; //当前服务器的端口
int m_nAccountId; //玩家的账户的ID
unsigned int m_nActorID; //玩家的角色的ID
char m_sActorName[32]; //玩家的角色的名字
char m_szCnName[32]; // 解码后的汉字
uint16_t m_nKey;
TICKCOUNT m_CurTick;
CClientActor m_ActorData; // 玩家数据
private:
TICKCOUNT m_dwReconnectTick; //连接到服务器的tick
};