/** @file Player.h @brief 封装玩家信息
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:
*	作    者:张少东
*	完成日期:2008-01-23
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #ifndef PLAYER_H #define PLAYER_H #include "CliProtocol_T.h" #include "..\include\IRCIntf.h" #include "SkillManager.h" #include "ItemManager.h" #include "ClientManager.h" #include "TaskManager.h" #include "CliNet.h" #include "PacketBuild.h" #include "../ChatRecorder/ChatRecordMng.h" #include "MemoryModule.h" #define DealPlayerPkgPre( OUTTYPE, outPtr, inputPkg, inputLen, ProtolTool ) \ OUTTYPE tmpStruct;\ OUTTYPE* outPtr = &tmpStruct;\ memset( outPtr, 0, sizeof(OUTTYPE) );\ size_t outBufLen = sizeof(tmpStruct);\ int nDecodeLen = (int)ProtolTool.DeCode( OUTTYPE::wCmd, &tmpStruct, outBufLen, (char*)inputPkg, inputLen );\ if ( nDecodeLen < 0 )\ {\ return false;\ } #define MAX_MSG_SIZE 512 using namespace MUX_PROTO; inline bool operator < ( const PlayerID& first,const PlayerID& otherPlayerID ) { if ( first.wGID < otherPlayerID.wGID ) return true; else if ( first.wGID > otherPlayerID.wGID ) return false; else return first.dwPID < otherPlayerID.dwPID? true: false; } inline bool operator == ( const PlayerID& firstPlayerID,const PlayerID &secPlayerID ) { return ( ( firstPlayerID.wGID == secPlayerID.wGID ) && ( firstPlayerID.dwPID == secPlayerID.dwPID ) ); } inline bool operator != ( const PlayerID& firstPlayerID,const PlayerID & otherPlayerID ) { return ( ( firstPlayerID.wGID != otherPlayerID.wGID ) || ( firstPlayerID.dwPID != otherPlayerID.dwPID ) ); } //提供PlayerID的比较Function struct PlayerIDComp { bool operator()(const PlayerID& Src, const PlayerID& Dest) const { return Src.wGID > Dest.wGID || (Src.wGID == Dest.wGID && Src.dwPID > Dest.dwPID); } }; //角色定义 typedef struct _tagRole { PlayerInfoLogin playerInfo; } ROLE, *PROLE; class CPlayer; #pragma pack(push, 1) typedef struct tag_msgHeader { unsigned short m_DataLen; unsigned char m_DataType; unsigned short m_Cmd; } MSGHEADER, *PMSGHEADER; //连接成功消息 struct CONNMSG { unsigned char ConnType; }; struct REQCONNMSG { unsigned char ConnType; char IpAddr[32]; unsigned short Port; }; // #define LOCAL_TYPE 0xFF //发起连接 #define REQ_CONN 0xFFFF //连接成功 #define CONN_ID 0xFFFE //关闭连接 #define REQ_CONN_CLOSE 0xFFFD //连接关闭 #define CONN_CLOSE 0xFFFC //私聊记录 #define PRI_MSG 0xFFFB //世界频道记录 #define WORLD_MSG 0xFFFA //清空记录命令 #define CLEAR_LOG 0xFFF9 //工会频道记录 #define GUILD_MSG 0xFFF8 #pragma pack(pop) class CMemNode; ///玩家当前所处的状态(阶段) enum PLAYER_STAT { PS_INVALID = 0, //初始(无效状态) PS_QUERYASSIGNSVR, //查询AssignServer状态 PS_QUERYGATESVR, //查询GateServer端口 PS_OPENCONN, PS_LOGINING, //登录中 PS_LOGINED, //已登录 PS_ROLESELING, //选角色中 PS_ROLESELED, //角色已选 PS_LOGINGGAME, //登录游戏中 PS_LOGGAME//已登录游戏 }; //玩家的接收消息队列,存贮利用IOCP机制从网络上收到的消息 typedef list IN_BOX; class CClientSession; //消息处理结构 struct MSGHANDLER { MSGHANDLER(): m_Status(PS_INVALID), handler(NULL){} MSGHANDLER(int status, int (CPlayer::*_handler)(void*, unsigned short)): m_Status(status), handler(_handler){} int m_Status; int (CPlayer::*handler)(void*, unsigned short); }; typedef map FRIENDGROUPMAP; typedef map FRIENDINFOMAP; typedef map FOEINFOMAP; typedef map BLACKITEMMAP; typedef map HANDLERMAP; typedef struct _tagReqRespInfo { _tagReqRespInfo(): m_ReqID(0), m_RespID(0), m_ReqTime(0){} _tagReqRespInfo(unsigned short usReq, unsigned short usResp, DWORD dwTime): m_ReqID(usReq), m_RespID(usResp), m_ReqTime(dwTime){} unsigned short m_ReqID; unsigned short m_RespID; int m_TimeOut; DWORD m_ReqTime; }REQRESPINFO, *PREQRESPINFO; class CPlayer: public CIRCIntf, MUX_CLIMOD::IMuxCliNetSinker, IChatRecEvent { public: CPlayer(); public: virtual ~CPlayer(void); public: int virtual OnChatRecord(CChatRecordMng::ChatLog* pChatLog); public: //接口实现 //设置服务器信息 virtual int SetServerInfo(const char* szAssignSvrIp, unsigned short usPort, const char* szGateSvrIp, unsigned short usGateSvrPort); //设置玩家信息 virtual int SetPlayerInfo(const char* szAccount, const char* szPwd, const char* szRoleName); //读取技能信息 virtual int ReadSkillInfo(const char* szSkillFileName); //读取任务信息 virtual int ReadTaskInfo(const char* szTaskFileName); //读取道具信息 virtual int ReadItemInfo(const char* szItemFileName); virtual int ReadSuitInfo(const char* szSuitFileName); virtual int ReadAdditionAttr(const char* szFileName); virtual int ReadItemLevelUpInfo(const char* szFileName); virtual void ReqUserInfo(const char* szRoleName); virtual void ClearLog(int nType); virtual void SetFilter(unsigned short usFilter); virtual void ChangeChatLogDir(const char* szDir); virtual void GetSkillInfo(unsigned long ulSkillID, vector& vectSkillProp); virtual int GetItemInfo(unsigned long ulItemID, vector& vectItemInfo); virtual int GetSuitInfo(unsigned long ulSuitID, int& nSuitCount, vector& vectSuitName, vector& vectSuitAttr); virtual int GetItemAdditionInfo(unsigned long ulItemAddID, vector& vectItemAdditionAttr); virtual int GetItemLevelUpInfo(unsigned long ulLevelUpID, vector& vectLevelUpInfo); virtual int GetTaskInfo(unsigned long ulTaskID, vector& vectTaskInfo); virtual string GetClassByClassID(unsigned long ulClassID); virtual string GetRaceByRaceID(unsigned long ulRaceID); virtual string GetGender(unsigned long ulGenderID); virtual unsigned short GetCurRoleNo(); virtual int QryUnionMember(); //启动 virtual int StartUp(CIRCEventSink& ircEvent, char* pDllData); //停止 virtual int CleanUp(); virtual int Open(); virtual int Close(); virtual int EnterWorld(unsigned int uiRoleID); virtual int SendPrivateMsg(const char* szDest, const char* szChat); virtual int SendMsgToWorld(const char* szChat); virtual int SendMsgToGuild(const char* szChat); virtual int ReadPrivateMsg(); virtual int ReadWorldMsg(); virtual int ReadGuildMsg(); virtual int ReadCommonMsg(); virtual int ReadSystermMsg(); virtual int ReadChatGroupMsg(); virtual int ReadGroupMsg(); public: virtual int OnLoginRes( int errNo ); virtual int OnTestAccountsRes( int errNo ); virtual int OnCreateAccountsRes( int errNo ); virtual int OnPkgRcved( unsigned short wCmd, const char* pPkg, const DWORD dwLen ); virtual int OnError( const int& errNo, const DWORD dwPkgID ); public: //网络数据到来 int OnConnectionOpen(); int OnConnectionClose(); int OnDataRecv(CMemNode* pMemNode); int LeaveWorld(); //处理网络消息 int HandleNetMsg(); //增加网络消息到缓冲队列 int AddNetMsg(CMemNode* pMemNode); public: int QueryAssignSrvState(); int QueryGateSrvAddr(); private: int RegisterHandler(); public: //打开连接 int OpenConnection(); //心跳 int HeartBeat(unsigned long ulPkgID = 0); //获取加密Key int ReqClientKey(); //验证密码 int ReqCheckPwd(); //登录 int Login(); //选择角色 int SelectRole(unsigned int uiRoleNO); //登录游戏 int StartGame(); // int ChatWith(CHAT_TYPE ChatType, const char* szDest, const char* strChat); public: //处理接收的数据信息 int ProcRecvData(CMemNode* pMemNode); //获得帐号、密码 void GetAccountAndPwd(string& strAccount, string& strPwd); const char* GetAccount(); void SetCliSession(CClientSession* pClientSession); private: int SaveChat(CHAT_TYPE ct, ChatLog::CHATDIRECT cd, const char* szChatObj, const char* szChat); int LoadChat(char* pData, unsigned short usDataLen, ChatLog& cl); bool IsBlackItem(const char* szRoleName); void CheckTimeOut(); void SetTimeOut(USHORT usReqID, USHORT usRespID, DWORD dwTimeOut); void CalcTimeOut(unsigned short usCmdID); BOOL GetCreateCliNetModFun(char* pDllData); private: int NetBias(void* pRawData, unsigned short usDataLen); int ProcNotifySvrState(void* pRawData, unsigned short usDataLen); int ProcNotifyGateSrvAddr(void* pRawData, unsigned short usDataLen); int ProcRandomKey(void* pRawData, unsigned short usDataLen); //登录的回应 int LoginResp(void* pRawData, unsigned short usDataLen); //玩家标示信息 int UpdatePlayerInfo(void* pRawData, unsigned short usDataLen); //更新玩家角色信息 int UpdateRoleInfo(void* pRawData, unsigned short usDataLen); //更新玩家所选角色 int UpdateSelRole(void* pRawData, unsigned short usDataLen); //玩家登录游戏世界 int LoginGame(void* pRawData, unsigned short usDataLen); //处理聊天消息 int PlayerChat(void* pRawData, unsigned short usDataLen); //处理私聊时业务错误消息 int ProcPrivateChatErro(void* pRawData, unsigned short usDataLen); //心跳协议 int PlayerHeartBeat(void* pRawData, unsigned short usDataLen); //对时消息 int NetDetect(void* pRawData, unsigned short usDataLen); //处理连接成功消息 int ProcConn(void* pRawData, unsigned short usDataLen); //处理连接请求 int ProcConnReq(void* pRawData, unsigned short usDataLen); //处理关闭连接请求 int ProcConnCloseReq(void* pRawData, unsigned short usDataLen); //处理连接关闭消息 int ProcConnClose(void* pRawData, unsigned short usDataLen); //处理服务器端错误 int ProcServerError(void * pRawData, USHORT usDataLen); //处理玩家好友分组信息 int ProcFriendGroups(void* pRawData, unsigned short usDataLen); //处理好友信息 int ProcFriends(void* pRawData, unsigned short usDataLen); //处理好友信息更新 int ProcFriendInfoUpdate(void* pRawData, unsigned short usDataLen); //处理仇人列表 int ProcFoeList(void* pRawData, unsigned short usDataLen); //处理仇人 int ProcNewFoe(void* pRawData, unsigned short usDataLen); //处理仇人信息更新 int ProFoeInfoUpdate(void* pRawData, unsigned short usDataLen); //黑名单列表 int ProcBlackList(void* pRawData, unsigned short usDataLen); /* int ProcPrivateMsgRec(void* pRawData, unsigned short usDataLen); int ProcWorldMsgRec(void* pRawData, unsigned short usDataLen); int ProcGuildMsgRec(void* pRawData, unsigned short usDataLen); */ int ProcClearLog(void* pRawData, unsigned short usDataLen); int ProcIrcQryUserInfo(void* pRawData, unsigned short usDataLen); int ProcUnionInfo(void* pRawData, unsigned short usDataLen); int ProcDelUnionMember(void*, unsigned short); int ProcUnionDestroy(void*, unsigned short); int ProcForbidUnionSpeek(void*, unsigned short); int ProcUnionMembers(void*, unsigned short); int ProcAddUnionMember(void*, unsigned short); int ProcUnionMemOnOffline(void*, unsigned short); int ProcUnionMemTitleNty(void*, unsigned short); int ProcUnionPosUdpNty(void*, unsigned short); int ProcUnionMemAdvPos(void*, unsigned short); int ProcUnionMemRedPos(void*, unsigned short); private: string m_AssignSrvIp; int m_AssignSrvPort; string m_GateSrvIp; int m_GatePort; int m_TrySendTimes; DWORD m_dwLastCheckTime; DWORD m_dwLastCheckID; unsigned short m_Filter; typedef map REQRESPINFOMAP; REQRESPINFOMAP m_ReqRespInfos; CChatRecordMng m_RecordMng; private: HANDLE m_hEvent; HANDLE m_hFrameUpdate; static unsigned __stdcall FrameUpdate(void* pThreadParams); private: CIRCEventSink* m_IRCEvent; string m_Account; //帐号 string m_Pwd; //密码 string m_CliKey; PlayerID m_UserID; //玩家唯一标示 PLAYER_STAT m_UserStage; //玩家阶段 CClientManager m_CliManager; map m_RoleInfo; //玩家可用角色 string m_RoleName; unsigned short m_RoleNO; //玩家当前角色序号 FRIENDGROUPMAP m_FriendGroupMap; //好友分组信息 FRIENDINFOMAP m_FriendInfoMap; //好友信息 FOEINFOMAP m_FoeInfoMap; BLACKITEMMAP m_BlackItemMap; private: unsigned long m_NetBias; vector m_vecDetectPkgRcvTime; bool m_IsNetBiasAquired; CClientSession* m_CliSession; private: IN_BOX m_ProNodes; IN_BOX m_NetNodes; IN_BOX* m_ReadPtr; IN_BOX* m_WritePtr; CRITICAL_SECTION m_CriticalSection; HANDLERMAP m_Handler; private: CliProtocol m_ProtolTool; CSkillManager m_SkillManager; CItemManager m_ItemManager; CTaskManager m_TaskManager; private: ///取模块函数指针; MUX_CLIMOD::PFN_GetMuxCliNetMod m_pfnGetMuxCliNetMod; ///网络模块; MUX_CLIMOD::IMuxCliNetMod* m_pNetMod; ///通信库句柄; HMEMORYMODULE m_hMemoryModule; private: CPlayer(const CPlayer&); CPlayer& operator=(const CPlayer&); }; #endif