KPlayerChat.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:8k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 2002 by Kingsoft
  3. //
  4. // File: KPlayerChat.h
  5. // Date: 2002.10.05
  6. // Code: 边城浪子
  7. // Desc: PlayerChat Class
  8. //---------------------------------------------------------------------------
  9. #ifndef KPLAYERCHAT_H
  10. #define KPLAYERCHAT_H
  11. #include "GameDataDef.h"
  12. #ifndef _SERVER
  13. #include "KNode.h"
  14. #include "KList.h"
  15. #endif
  16. #ifdef _SERVER
  17. #define MAX_FRIEND_TEAM 1 // 最大好友分组数
  18. #define CHAT_SPEED 20 // 玩家多长时间能发一句话
  19. #else
  20. #define MAX_FRIEND_TEAM 10 // 最大好友分组数
  21. #endif
  22. #define CHAT_APPLY_ADD_FRIEND_LIST 10
  23. enum // 当前发送频道
  24. {
  25. CHAT_CUR_CHANNEL_NONE = 0, // 当前没有发送频道
  26. CHAT_CUR_CHANNEL_ALL, // 所有同一服务器
  27. CHAT_CUR_CHANNEL_SCREEN, // 当前九屏区域内
  28. CHAT_CUR_CHANNEL_SINGLE, // 单聊
  29. CHAT_CUR_CHANNEL_TEAM, // 所有对友
  30. CHAT_CUR_CHANNEL_FACTION, // 同门派
  31. CHAT_CUR_CHANNEL_TONG, // 同帮派
  32. CHAT_CUR_CHANNEL_SCREENSINGLE, // 九屏区域内单聊
  33. CHAT_CUR_CHANNEL_SYSTEM, // 系统频道,专用于系统给玩家发消息,必须订阅
  34. CHAT_CUR_CHANNEL_NUM, // 频道数量
  35. };
  36. extern DWORD g_dwChannelAnd[CHAT_CUR_CHANNEL_NUM];
  37. extern DWORD g_dwChannelOr[CHAT_CUR_CHANNEL_NUM];
  38. #ifndef _SERVER
  39. class KCHAT_RECORDER
  40. {
  41. private:
  42. char m_szDay[11];
  43. char m_szTime[9];
  44. private:
  45. void SetTime();
  46. public:
  47. void SaveSentenceSingle(char *lpszSelfName, char *lpszTarget, char *lpszTalkerName, char *lpszSentence);
  48. void SaveSentenceChannel(char *lpszSelfName, char *lpszTalkerName, char *lpszSentence);
  49. };
  50. #endif
  51. // 每个聊天好友的数据
  52. class CChatFriend : public KNode
  53. {
  54. public:
  55. DWORD m_dwID; // 好友ID
  56. int m_nPlayerIdx; // 好友在 player 数组中的位置
  57. char m_szName[32]; // 好友名字
  58. public:
  59. CChatFriend() {Release();};
  60. void Release() {m_dwID = 0; memset(m_szName, 0, 32);};
  61. };
  62. // 好友分组数据
  63. class CChatFriendTeam
  64. {
  65. public:
  66. int m_nFriendNo; // 好友数量
  67. char m_szTeamName[32]; // 组名
  68. KList m_cEveryOne; // 本组每一个好友的数据
  69. public:
  70. CChatFriendTeam();
  71. void Release();
  72. #ifdef _SERVER
  73. void DataBaseAddOne(int nSelfIdx, DWORD dwID, char *lpszName); // 玩家登陆的时候从数据库获得数据时专用
  74. #endif
  75. };
  76. #ifndef _SERVER
  77. class CChatApplyListNode : public KNode
  78. {
  79. public:
  80. int m_nPlayerIdx;
  81. int m_nAccessFlag;
  82. char m_szName[32];
  83. char m_szInfo[MAX_SENTENCE_LENGTH];
  84. public:
  85. CChatApplyListNode() { m_nPlayerIdx = 0; m_nAccessFlag = 0; m_szName[0] = 0; m_szInfo[0] = 0; };
  86. };
  87. #endif
  88. #ifdef _SERVER
  89. #include <list>
  90. #endif
  91. class KPlayerChat
  92. {
  93. public:
  94. #ifdef _SERVER
  95. int m_nAddFriendList[CHAT_APPLY_ADD_FRIEND_LIST]; // 当前申请添加的好友 npc id 列表
  96. int m_nListPos; // m_nAddFriendList 的当前位置
  97. int m_nSyncState; // 玩家登陆时候发送好友数据的过程
  98. CChatFriend *m_pStateSendPos; // 玩家登陆时候发送好友数据时位置指针
  99. int m_nTimer; // 控制聊天刷屏速度
  100. #endif
  101. #ifndef _SERVER
  102. KList m_cApplyAddList; // 客户端申请人列表(链表)
  103. int m_nCurChannel; // 当前聊天频道
  104. BOOL m_btIniLoadFlag; // m_cTeamInfo 是否载入
  105. KIniFile m_cTeamInfo; // 客户端好友分组文件
  106. int m_nLoginGetFirstOneFriendFlag; // 玩家登录时接收到第一个好友信息
  107. KCHAT_RECORDER m_cRecorder;
  108. #endif
  109. DWORD m_dwTakeChannel; // 当前订阅频道
  110. DWORD m_dwTargetID; // 当前聊天对象ID 在不同的频道下会有不同的含义
  111. int m_nTargetIdx; // 当前聊天对象在服务器端的index
  112. CChatFriendTeam m_cFriendTeam[MAX_FRIEND_TEAM]; // 好友分组列表
  113. public:
  114. void Release();
  115. BOOL CheckExist(DWORD dwID);
  116. BOOL CheckExist(char *lpszName);
  117. BOOL GetName(DWORD dwID, char *lpszName);
  118. CChatFriend* GetFriendNode(DWORD dwID);
  119. int GetTeamNo(DWORD dwID);
  120. void SetTakeChannel(DWORD dwChannel); // 订阅聊天频道
  121. BOOL CheckTalkChannel(int nChannel);
  122. #ifdef _SERVER
  123. void ServerSendChat(int nPlayerIdx, BYTE* pProtocol);// 服务器收到客户端发来的聊天信息
  124. void DataBaseAddOne(int nSelfIdx, DWORD dwID, char *lpszName);// 玩家登陆的时候从数据库获得数据时专用
  125. void AddFriendData(int nSelfIdx, int nDestIdx); // 添加好友数据
  126. void ResendOneFriendData(DWORD dwID, int nPlayerIdx);// 重新发送某个好友数据
  127. BOOL SyncFriendData(int nPlayerIdx, unsigned int &nParam);// 玩家登录时加载数据库玩家好友数据完成后自动依次发送好友数据给客户端
  128. void StartSendFriendData(); // 玩家登录时加载数据库玩家好友数据完成后调用次方法开始发送给客户端好友数据
  129. void DeleteFriend(DWORD dwID, DWORD dwSelfID); // 删除某个好友数据(会通知对方相应处理)
  130. void DeleteFriendData(DWORD dwID, int nSelfIndex); // 删除某个好友数据(会通知自己客户端)
  131. void RedeleteFriend(DWORD dwID, int nSelfIndex); // 再次删除某好友
  132. void OffLine(DWORD dwSelfID); // 本玩家下线
  133. void GetMsgOffLine(DWORD dwID, int nSelfIdx); // 得到通知有好友下线
  134. void TimerAdd(); // 聊天时间计数加一
  135. // 发送系统消息 nType = 0 给全体玩家发送 nType == 1 给某个特定玩家发送
  136. static void SendSystemInfo(int nType, int nTargetIdx, char *lpszSendName, char *lpszSentence, int nSentenceLength);
  137. static void SendGlobalSystemInfo(char *lpszSendName, char *lpszSentence, int nSentenceLength);
  138. typedef std::list<std::string> STRINGLIST;
  139. static void MakeBrother(const STRINGLIST& brothers);
  140. static void MakeEnemy(char* szPlayer, char* szEnemy);
  141. static void SendInfoToGM(char *lpszAccName, char *lpszRoleName, char *lpszSentence, int nSentenceLength);
  142. static void SendInfoToIP(DWORD nIP, DWORD nID, char *lpszAccName, char *lpszRoleName, char *lpszSentence, int nSentenceLength);
  143. #endif
  144. #ifndef _SERVER
  145. void SetCurChannel(int nChannelNo, DWORD dwID = 0, int nIdx = 0);// 设定当前发送频道
  146. void AddChannel(int nChannelNo); // 增加订阅频道
  147. void SubChannel(int nChannelNo); // 取消订阅频道
  148. void SendTakeChannel(); // 客户端发送订阅频道给服务器
  149. void SendSentence(KUiMsgParam *pMsg, char *lpszSentence);// 客户端发送聊天语句给服务器
  150. void QQSendSentence(DWORD dwID, int nIdx, KUiMsgParam *pMsg, char *lpszSentence);// 客户端发送聊天语句给服务器(QQ专用)
  151. void GetChat(PLAYER_SEND_CHAT_SYNC *pChat); // 客户端收到聊天语句
  152. void ApplyAddFriend(DWORD dwNpcID, char *lpszSentence = NULL);// 申请添加聊天好友
  153. void ApplyDeleteFriend(DWORD dwID, int nTeamNo, char *lpszSelfName);// 客户端申请删除某好友
  154. BOOL GetApplyOneInfo(int *lpnPlayerIdx, char *lpszName, char *lpszInfo);// 界面获取聊天好友添加申请人信息
  155. void SaveTeamInfo(char *lpszName); // 保存所有好友分组信息
  156. int CheckTeamNo(char *lpszName, char *lpszGetName); // 判断某个ID的好友在哪个组里
  157. void LoadTeamName(char *lpszPlayerName); // 载入组名(初始化的时候调用,其他时候不允许调用)
  158. void AddOne(DWORD dwID, int nPlayerIdx, char *lpszName, int nTeamNo);// 添加一个成员
  159. BOOL CheckIsFriend(int nPlayerIdx); // 判断某个playeridx是否好友
  160. int AddTeam(char *lpszPlayerName, char *lpszTeamName);// 添加组,返回第几组,if < 0 失败
  161. BOOL RenameTeam(int nTeamNo, char *lpszTeamName, char *lpszPlayerName);// 组改名
  162. BOOL DeleteTeam(int nTeamNo, char *lpszPlayerName); // 删除组,返回成功与否
  163. BOOL OneFriendChangeTeam(DWORD dwID, int nSrcTeam, int nDestTeam);// 把一个好友从一个组移动到另一个组
  164. void GetMsgOffLine(DWORD dwID); // 得到通知有好友下线
  165. BOOL CheckTakeChannel(int nChannelNo); // 判断是否订阅了某个频道
  166. void SaveTakeChannelInfo(char *lpszName); // 保存频道订阅信息
  167. void LoadTakeChannelInfo(char *lpszName); // 载入频道订阅信息
  168. // 用于界面
  169. int SendSelectChannelList(KUiChatChannel *pList, int nCount); // 发送可选择聊天频道列表给界面
  170. int SendTakeChannelList(KUiChatChannel *pList, int nCount); // 发送可订阅聊天频道列表给界面
  171. BOOL GetCurChannel(KUiChatChannel *pList); // 获得当前使用聊天频道信息
  172. int IGetTeamInfo(int nTeamNo, KUiChatGroupInfo *psTeamInfo); // 获得某个分组信息,返回下一个有效组编号(如果是最后一个有效组,返回-1)
  173. int IGetTeamFriendInfo(int nTeamNo, KUiPlayerItem *pList); // 获得某个分组的所有成员的信息
  174. #endif
  175. };
  176. #endif