1. // vim:ts=8 sw=4
  2. #ifndef __INC_CLIENTMANAGER_H__
  3. #define __INC_CLIENTMANAGER_H__
  4. #include <boost/unordered_map.hpp>
  5. #include <boost/unordered_set.hpp>
  6. #include "../../common/stl.h"
  7. #include "../../common/building.h"
  8. #include "Peer.h"
  9. #include "DBManager.h"
  10. #include "LoginData.h"
  11. class CPlayerTableCache;
  12. class CItemCache;
  13. class CItemPriceListTableCache;
  14. class CPacketInfo
  15. {
  16. public:
  17. void Add(int header);
  18. void Reset();
  19. std::map<int, int> m_map_info;
  20. };
  21. size_t CreatePlayerSaveQuery(char * pszQuery, size_t querySize, TPlayerTable * pkTab);
  22. class CClientManager : public CNetBase, public singleton<CClientManager>
  23. {
  24. public:
  25. typedef std::list<CPeer *> TPeerList;
  26. typedef boost::unordered_map<DWORD, CPlayerTableCache *> TPlayerTableCacheMap;
  27. typedef boost::unordered_map<DWORD, CItemCache *> TItemCacheMap;
  28. typedef boost::unordered_set<CItemCache *, boost::hash<CItemCache*> > TItemCacheSet;
  29. typedef boost::unordered_map<DWORD, TItemCacheSet *> TItemCacheSetPtrMap;
  30. typedef boost::unordered_map<DWORD, CItemPriceListTableCache*> TItemPriceListCacheMap;
  31. typedef boost::unordered_map<short, BYTE> TChannelStatusMap;
  32. // MYSHOP_PRICE_LIST
  33. /// ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ® ¿äû Á¤º¸
  34. /**
  35. * first: Peer handle
  36. * second: ¿äûÇÑ Ç÷¹À̾îÀÇ ID
  37. */
  38. typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo;
  39. // END_OF_MYSHOP_PRICE_LIST
  40. class ClientHandleInfo
  41. {
  42. public:
  43. DWORD dwHandle;
  44. DWORD account_id;
  45. DWORD player_id;
  46. BYTE account_index;
  47. char login[LOGIN_MAX_LEN + 1];
  48. char safebox_password[SAFEBOX_PASSWORD_MAX_LEN + 1];
  49. char ip[MAX_HOST_LENGTH + 1];
  50. TAccountTable * pAccountTable;
  51. TSafeboxTable * pSafebox;
  52. ClientHandleInfo(DWORD argHandle, DWORD dwPID = 0)
  53. {
  54. dwHandle = argHandle;
  55. pSafebox = NULL;
  56. pAccountTable = NULL;
  57. player_id = dwPID;
  58. };
  59. //µ¶Àϼ±¹°±â´É¿ë »ı¼ºÀÚ
  60. ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId)
  61. {
  62. dwHandle = argHandle;
  63. pSafebox = NULL;
  64. pAccountTable = NULL;
  65. player_id = dwPID;
  66. account_id = accountId;
  67. };
  68. ~ClientHandleInfo()
  69. {
  70. if (pSafebox)
  71. {
  72. delete pSafebox;
  73. pSafebox = NULL;
  74. }
  75. }
  76. };
  77. public:
  78. CClientManager();
  79. ~CClientManager();
  80. bool Initialize();
  81. time_t GetCurrentTime();
  82. #ifdef OFFLINE_SHOP
  83. void ShopName(CPeer * peer, TPacketShopName * p);
  84. void ShopClose(CPeer * peer, TPacketShopClose *p);
  85. void ShopUpdateItem(CPeer * peer, TPacketShopUpdateItem *p);
  86. #endif
  87. void MainLoop();
  88. void Quit();
  89. void SetTablePostfix(const char* c_pszTablePostfix);
  90. void SetPlayerIDStart(int iIDStart);
  91. int GetPlayerIDStart() { return m_iPlayerIDStart; }
  92. int GetPlayerDeleteLevelLimit() { return m_iPlayerDeleteLevelLimit; }
  93. void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; }
  94. bool IsChinaEventServer() { return m_bChinaEventServer; }
  95. DWORD GetUserCount(); // Á¢¼ÓµÈ »ç¿ëÀÚ ¼ö¸¦ ¸®ÅÏ ÇÑ´Ù.
  96. void SendAllGuildSkillRechargePacket();
  97. void SendTime();
  98. CPlayerTableCache * GetPlayerCache(DWORD id);
  99. void PutPlayerCache(TPlayerTable * pNew);
  100. void CreateItemCacheSet(DWORD dwID);
  101. TItemCacheSet * GetItemCacheSet(DWORD dwID);
  102. void FlushItemCacheSet(DWORD dwID);
  103. CItemCache * GetItemCache(DWORD id);
  104. void PutItemCache(TPlayerItem * pNew, bool bSkipQuery = false);
  105. bool DeleteItemCache(DWORD id);
  106. void UpdatePlayerCache();
  107. void UpdateItemCache();
  108. // MYSHOP_PRICE_LIST
  109. /// °¡°İÁ¤º¸ ¸®½ºÆ® ij½Ã¸¦ °¡Á®¿Â´Ù.
  110. /**
  111. * @param [in] dwID °¡°İÁ¤º¸ ¸®½ºÆ®ÀÇ ¼ÒÀ¯ÀÚ.(Ç÷¹À̾î ID)
  112. * @return °¡°İÁ¤º¸ ¸®½ºÆ® ij½ÃÀÇ Æ÷ÀÎÅÍ
  113. */
  114. CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID);
  115. /// °¡°İÁ¤º¸ ¸®½ºÆ® ij½Ã¸¦ ³Ö´Â´Ù.
  116. /**
  117. * @param [in] pItemPriceList ij½Ã¿¡ ³ÖÀ» ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ®
  118. *
  119. * ij½Ã°¡ ÀÌ¹Ì ÀÖÀ¸¸é Update °¡ ¾Æ´Ñ replace ÇÑ´Ù.
  120. */
  121. void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList);
  122. /// Flush ½Ã°£ÀÌ ¸¸·áµÈ ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ® ij½Ã¸¦ Flush ÇØÁÖ°í ij½Ã¿¡¼­ »èÁ¦ÇÑ´Ù.
  123. void UpdateItemPriceListCache(void);
  124. // END_OF_MYSHOP_PRICE_LIST
  125. void SendGuildSkillUsable(DWORD guild_id, DWORD dwSkillVnum, bool bUsable);
  126. void SetCacheFlushCountLimit(int iLimit);
  127. template <class Func>
  128. Func for_each_peer(Func f);
  129. CPeer * GetAnyPeer();
  130. void ForwardPacket(BYTE header, const void* data, int size, BYTE bChannel = 0, CPeer * except = NULL);
  131. void SendNotice(const char * c_pszFormat, ...);
  132. char* GetCommand(char* str); //µ¶Àϼ±¹°±â´É¿¡¼­ ¸í·É¾î ¾ò´Â ÇÔ¼ö
  133. void ItemAward(CPeer * peer, char* login); //µ¶ÀÏ ¼±¹° ±â´É
  134. protected:
  135. void Destroy();
  136. private:
  137. bool InitializeTables();
  138. bool InitializeShopTable();
  139. bool InitializeMobTable();
  140. bool InitializeItemTable();
  141. bool InitializeQuestItemTable();
  142. bool InitializeSkillTable();
  143. bool InitializeRefineTable();
  144. bool InitializeBanwordTable();
  145. bool InitializeItemAttrTable();
  146. bool InitializeItemRareTable();
  147. bool InitializeLandTable();
  148. bool InitializeObjectProto();
  149. bool InitializeObjectTable();
  150. bool MirrorMobTableIntoDB();
  151. bool MirrorItemTableIntoDB();
  152. void AddPeer(socket_t fd);
  153. void RemovePeer(CPeer * pPeer);
  154. CPeer * GetPeer(IDENT ident);
  155. int AnalyzeQueryResult(SQLMsg * msg);
  156. int AnalyzeErrorMsg(CPeer * peer, SQLMsg * msg);
  157. int Process();
  158. void ProcessPackets(CPeer * peer);
  159. CLoginData * GetLoginData(DWORD dwKey);
  160. CLoginData * GetLoginDataByLogin(const char * c_pszLogin);
  161. CLoginData * GetLoginDataByAID(DWORD dwAID);
  162. void InsertLoginData(CLoginData * pkLD);
  163. void DeleteLoginData(CLoginData * pkLD);
  164. bool InsertLogonAccount(const char * c_pszLogin, DWORD dwHandle, const char * c_pszIP);
  165. bool DeleteLogonAccount(const char * c_pszLogin, DWORD dwHandle);
  166. bool FindLogonAccount(const char * c_pszLogin);
  167. void GuildCreate(CPeer * peer, DWORD dwGuildID);
  168. void GuildSkillUpdate(CPeer * peer, TPacketGuildSkillUpdate* p);
  169. void GuildExpUpdate(CPeer * peer, TPacketGuildExpUpdate* p);
  170. void GuildAddMember(CPeer * peer, TPacketGDGuildAddMember* p);
  171. void GuildChangeGrade(CPeer * peer, TPacketGuild* p);
  172. void GuildRemoveMember(CPeer * peer, TPacketGuild* p);
  173. void GuildChangeMemberData(CPeer * peer, TPacketGuildChangeMemberData* p);
  174. void GuildDisband(CPeer * peer, TPacketGuild * p);
  175. void GuildWar(CPeer * peer, TPacketGuildWar * p);
  176. void GuildWarScore(CPeer * peer, TPacketGuildWarScore * p);
  177. void GuildChangeLadderPoint(TPacketGuildLadderPoint* p);
  178. void GuildUseSkill(TPacketGuildUseSkill* p);
  179. void GuildDepositMoney(TPacketGDGuildMoney* p);
  180. void GuildWithdrawMoney(CPeer* peer, TPacketGDGuildMoney* p);
  181. void GuildWithdrawMoneyGiveReply(TPacketGDGuildMoneyWithdrawGiveReply* p);
  182. void GuildWarBet(TPacketGDGuildWarBet * p);
  183. void GuildChangeMaster(TPacketChangeGuildMaster* p);
  184. void SetGuildWarEndTime(DWORD guild_id1, DWORD guild_id2, time_t tEndTime);
  185. void QUERY_BOOT(CPeer * peer, TPacketGDBoot * p);
  186. void QUERY_LOGIN(CPeer * peer, DWORD dwHandle, SLoginPacket* data);
  187. void QUERY_LOGOUT(CPeer * peer, DWORD dwHandle, const char *);
  188. void RESULT_LOGIN(CPeer * peer, SQLMsg *msg);
  189. void QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoadPacket*);
  190. void RESULT_COMPOSITE_PLAYER(CPeer * peer, SQLMsg * pMsg, DWORD dwQID);
  191. void RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHandleInfo * pkInfo);
  192. void RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID);
  193. void RESULT_QUEST_LOAD(CPeer * pkPeer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID);
  194. void RESULT_AFFECT_LOAD(CPeer * pkPeer, MYSQL_RES * pRes, DWORD dwHandle);
  195. // PLAYER_INDEX_CREATE_BUG_FIX
  196. void RESULT_PLAYER_INDEX_CREATE(CPeer *pkPeer, SQLMsg *msg);
  197. // END_PLAYER_INDEX_CREATE_BUG_FIX
  198. // MYSHOP_PRICE_LIST
  199. /// °¡°İÁ¤º¸ ·Îµå Äõ¸®¿¡ ´ëÇÑ Result ó¸®
  200. /**
  201. * @param peer °¡°İÁ¤º¸¸¦ ¿äûÇÑ Game server ÀÇ peer °´Ã¼ Æ÷ÀÎÅÍ
  202. * @param pMsg Äõ¸®ÀÇ Result ·Î ¹ŞÀº °´Ã¼ÀÇ Æ÷ÀÎÅÍ
  203. *
  204. * ·ÎµåµÈ °¡°İÁ¤º¸ ¸®½ºÆ®¸¦ ij½Ã¿¡ ÀúÀåÇϰí peer ¿¡°Ô ¸®½ºÆ®¸¦ º¸³»ÁØ´Ù.
  205. */
  206. void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg);
  207. /// °¡°İÁ¤º¸ ¾÷µ¥ÀÌÆ®¸¦ À§ÇÑ ·Îµå Äõ¸®¿¡ ´ëÇÑ Result ó¸®
  208. /**
  209. * @param pMsg Äõ¸®ÀÇ Result ·Î ¹ŞÀº °´Ã¼ÀÇ Æ÷ÀÎÅÍ
  210. *
  211. * ·ÎµåµÈ Á¤º¸·Î °¡°İÁ¤º¸ ¸®½ºÆ® ij½Ã¸¦ ¸¸µé°í ¾÷µ¥ÀÌÆ® ¹ŞÀº °¡°İÁ¤º¸·Î ¾÷µ¥ÀÌÆ® ÇÑ´Ù.
  212. */
  213. void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg);
  214. // END_OF_MYSHOP_PRICE_LIST
  215. void QUERY_PLAYER_SAVE(CPeer * peer, DWORD dwHandle, TPlayerTable*);
  216. void __QUERY_PLAYER_CREATE(CPeer * peer, DWORD dwHandle, TPlayerCreatePacket *);
  217. void __QUERY_PLAYER_DELETE(CPeer * peer, DWORD dwHandle, TPlayerDeletePacket *);
  218. void __RESULT_PLAYER_DELETE(CPeer * peer, SQLMsg* msg);
  219. void QUERY_PLAYER_COUNT(CPeer * pkPeer, TPlayerCountPacket *);
  220. void QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData);
  221. void QUERY_ITEM_DESTROY(CPeer * pkPeer, const char * c_pData);
  222. void QUERY_ITEM_FLUSH(CPeer * pkPeer, const char * c_pData);
  223. void QUERY_QUEST_SAVE(CPeer * pkPeer, TQuestTable *, DWORD dwLen);
  224. void QUERY_ADD_AFFECT(CPeer * pkPeer, TPacketGDAddAffect * p);
  225. void QUERY_REMOVE_AFFECT(CPeer * pkPeer, TPacketGDRemoveAffect * p);
  226. void QUERY_SAFEBOX_LOAD(CPeer * pkPeer, DWORD dwHandle, TSafeboxLoadPacket *, bool bMall);
  227. void QUERY_SAFEBOX_SAVE(CPeer * pkPeer, TSafeboxTable * pTable);
  228. void QUERY_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangeSizePacket * p);
  229. void QUERY_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangePasswordPacket * p);
  230. void RESULT_SAFEBOX_LOAD(CPeer * pkPeer, SQLMsg * msg);
  231. void RESULT_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, SQLMsg * msg);
  232. void RESULT_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, SQLMsg * msg);
  233. void RESULT_SAFEBOX_CHANGE_PASSWORD_SECOND(CPeer * pkPeer, SQLMsg * msg);
  234. void QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p);
  235. void QUERY_SETUP(CPeer * pkPeer, DWORD dwHandle, const char * c_pData);
  236. void SendPartyOnSetup(CPeer * peer);
  237. void QUERY_HIGHSCORE_REGISTER(CPeer * peer, TPacketGDHighscore* data);
  238. void RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg);
  239. void QUERY_FLUSH_CACHE(CPeer * pkPeer, const char * c_pData);
  240. void QUERY_PARTY_CREATE(CPeer * peer, TPacketPartyCreate* p);
  241. void QUERY_PARTY_DELETE(CPeer * peer, TPacketPartyDelete* p);
  242. void QUERY_PARTY_ADD(CPeer * peer, TPacketPartyAdd* p);
  243. void QUERY_PARTY_REMOVE(CPeer * peer, TPacketPartyRemove* p);
  244. void QUERY_PARTY_STATE_CHANGE(CPeer * peer, TPacketPartyStateChange* p);
  245. void QUERY_PARTY_SET_MEMBER_LEVEL(CPeer * peer, TPacketPartySetMemberLevel* p);
  246. void QUERY_RELOAD_PROTO();
  247. void QUERY_CHANGE_NAME(CPeer * peer, DWORD dwHandle, TPacketGDChangeName * p);
  248. void GetPlayerFromRes(TPlayerTable * player_table, MYSQL_RES* res);
  249. void QUERY_SMS(CPeer * pkPeer, TPacketGDSMS * p);
  250. void QUERY_LOGIN_KEY(CPeer * pkPeer, TPacketGDLoginKey * p);
  251. void AddGuildPriv(TPacketGiveGuildPriv* p);
  252. void AddEmpirePriv(TPacketGiveEmpirePriv* p);
  253. void AddCharacterPriv(TPacketGiveCharacterPriv* p);
  254. void MoneyLog(TPacketMoneyLog* p);
  255. void QUERY_AUTH_LOGIN(CPeer * pkPeer, DWORD dwHandle, TPacketGDAuthLogin * p);
  256. void QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketGDLoginByKey * p);
  257. void RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg);
  258. void ChargeCash(const TRequestChargeCash * p);
  259. void LoadEventFlag();
  260. void SetEventFlag(TPacketSetEventFlag* p);
  261. void SendEventFlagsOnSetup(CPeer* peer);
  262. // °áÈ¥
  263. void MarriageAdd(TPacketMarriageAdd * p);
  264. void MarriageUpdate(TPacketMarriageUpdate * p);
  265. void MarriageRemove(TPacketMarriageRemove * p);
  266. void WeddingRequest(TPacketWeddingRequest * p);
  267. void WeddingReady(TPacketWeddingReady * p);
  268. void WeddingEnd(TPacketWeddingEnd * p);
  269. // MYSHOP_PRICE_LIST
  270. // °³ÀλóÁ¡ °¡°İÁ¤º¸
  271. /// ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ® ¾÷µ¥ÀÌÆ® ÆĞŶ(HEADER_GD_MYSHOP_PRICELIST_UPDATE) ó¸®ÇÔ¼ö
  272. /**
  273. * @param [in] pPacket ÆĞŶ µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ
  274. */
  275. void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket);
  276. /// ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ® ¿äû ÆĞŶ(HEADER_GD_MYSHOP_PRICELIST_REQ) ó¸®ÇÔ¼ö
  277. /**
  278. * @param peer ÆĞŶÀ» º¸³½ Game server ÀÇ peer °´Ã¼ÀÇ Æ÷ÀÎÅÍ
  279. * @param [in] dwHandle °¡°İÁ¤º¸¸¦ ¿äûÇÑ peer ÀÇ ÇÚµé
  280. * @param [in] dwPlayerID °¡°İÁ¤º¸ ¸®½ºÆ®¸¦ ¿äûÇÑ Ç÷¹À̾îÀÇ ID
  281. */
  282. void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID);
  283. // END_OF_MYSHOP_PRICE_LIST
  284. // Building
  285. void CreateObject(TPacketGDCreateObject * p);
  286. void DeleteObject(DWORD dwID);
  287. void UpdateLand(DWORD * pdw);
  288. // BLOCK_CHAT
  289. void BlockChat(TPacketBlockChat * p);
  290. // END_OF_BLOCK_CHAT
  291. private:
  292. int m_looping;
  293. socket_t m_fdAccept; // Á¢¼Ó ¹Ş´Â ¼ÒÄÏ
  294. TPeerList m_peerList;
  295. CPeer * m_pkAuthPeer;
  296. // LoginKey, LoginData pair
  297. typedef boost::unordered_map<DWORD, CLoginData *> TLoginDataByLoginKey;
  298. TLoginDataByLoginKey m_map_pkLoginData;
  299. // Login LoginData pair
  300. typedef boost::unordered_map<std::string, CLoginData *> TLoginDataByLogin;
  301. TLoginDataByLogin m_map_pkLoginDataByLogin;
  302. // AccountID LoginData pair
  303. typedef boost::unordered_map<DWORD, CLoginData *> TLoginDataByAID;
  304. TLoginDataByAID m_map_pkLoginDataByAID;
  305. // Login LoginData pair (½ÇÁ¦ ·Î±×ÀÎ µÇ¾îÀÖ´Â °èÁ¤)
  306. typedef boost::unordered_map<std::string, CLoginData *> TLogonAccountMap;
  307. TLogonAccountMap m_map_kLogonAccount;
  308. int m_iPlayerIDStart;
  309. int m_iPlayerDeleteLevelLimit;
  310. int m_iPlayerDeleteLevelLimitLower;
  311. bool m_bChinaEventServer;
  312. std::vector<TMobTable> m_vec_mobTable;
  313. std::vector<TItemTable> m_vec_itemTable;
  314. std::map<DWORD, TItemTable *> m_map_itemTableByVnum;
  315. int m_iShopTableSize;
  316. TShopTable * m_pShopTable;
  317. int m_iRefineTableSize;
  318. TRefineTable* m_pRefineTable;
  319. std::vector<TSkillTable> m_vec_skillTable;
  320. std::vector<TBanwordTable> m_vec_banwordTable;
  321. std::vector<TItemAttrTable> m_vec_itemAttrTable;
  322. std::vector<TItemAttrTable> m_vec_itemRareTable;
  323. std::vector<building::TLand> m_vec_kLandTable;
  324. std::vector<building::TObjectProto> m_vec_kObjectProto;
  325. std::map<DWORD, building::TObject *> m_map_pkObjectTable;
  326. bool m_bShutdowned;
  327. TPlayerTableCacheMap m_map_playerCache; // Ç÷¹À̾î id°¡ key
  328. TItemCacheMap m_map_itemCache; // ¾ÆÀÌÅÛ id°¡ key
  329. TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // Ç÷¹À̾î id°¡ key, ÀÌ Ç÷¹À̾ ¾î¶² ¾ÆÀÌÅÛ Ä³½¬¸¦ °¡Áö°í ÀÖ³ª?
  330. // MYSHOP_PRICE_LIST
  331. /// Ç÷¹À̾ ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ® map. key: Ç÷¹À̾î ID, value: °¡°İÁ¤º¸ ¸®½ºÆ® ij½Ã
  332. TItemPriceListCacheMap m_mapItemPriceListCache; ///< Ç÷¹À̾ ¾ÆÀÌÅÛ °¡°İÁ¤º¸ ¸®½ºÆ®
  333. // END_OF_MYSHOP_PRICE_LIST
  334. TChannelStatusMap m_mChannelStatus;
  335. struct TPartyInfo
  336. {
  337. BYTE bRole;
  338. BYTE bLevel;
  339. TPartyInfo() :bRole(0), bLevel(0)
  340. {
  341. }
  342. };
  343. typedef std::map<DWORD, TPartyInfo> TPartyMember;
  344. typedef std::map<DWORD, TPartyMember> TPartyMap;
  345. typedef std::map<BYTE, TPartyMap> TPartyChannelMap;
  346. TPartyChannelMap m_map_pkChannelParty;
  347. typedef std::map<std::string, long> TEventFlagMap;
  348. TEventFlagMap m_map_lEventFlag;
  349. BYTE m_bLastHeader;
  350. int m_iCacheFlushCount;
  351. int m_iCacheFlushCountLimit;
  352. private :
  353. TItemIDRangeTable m_itemRange;
  354. public :
  355. bool InitializeNowItemID();
  356. DWORD GetItemID();
  357. DWORD GainItemID();
  358. TItemIDRangeTable GetItemRange() { return m_itemRange; }
  359. //BOOT_LOCALIZATION
  360. public:
  361. /* ·ÎÄà Á¤º¸ ÃʱâÈ­
  362. **/
  363. bool InitializeLocalization();
  364. private:
  365. std::vector<tLocale> m_vec_Locale;
  366. //END_BOOT_LOCALIZATION
  367. //ADMIN_MANAGER
  368. bool __GetAdminInfo(const char *szIP, std::vector<tAdminInfo> & rAdminVec);
  369. bool __GetHostInfo(std::vector<std::string> & rIPVec);
  370. //END_ADMIN_MANAGER
  371. //RELOAD_ADMIN
  372. void ReloadAdmin(CPeer * peer, TPacketReloadAdmin * p);
  373. //END_RELOAD_ADMIN
  374. void BreakMarriage(CPeer * peer, const char * data);
  375. struct TLogoutPlayer
  376. {
  377. DWORD pid;
  378. time_t time;
  379. bool operator < (const TLogoutPlayer & r)
  380. {
  381. return (pid < r.pid);
  382. }
  383. };
  384. typedef boost::unordered_map<DWORD, TLogoutPlayer*> TLogoutPlayerMap;
  385. TLogoutPlayerMap m_map_logout;
  386. void InsertLogoutPlayer(DWORD pid);
  387. void DeleteLogoutPlayer(DWORD pid);
  388. void UpdateLogoutPlayer();
  389. void UpdateItemCacheSet(DWORD pid);
  390. void FlushPlayerCacheSet(DWORD pid);
  391. void SendSpareItemIDRange(CPeer* peer);
  392. void UpdateHorseName(TPacketUpdateHorseName* data, CPeer* peer);
  393. void AckHorseName(DWORD dwPID, CPeer* peer);
  394. void DeleteLoginKey(TPacketDC *data);
  395. void ResetLastPlayerID(const TPacketNeedLoginLogInfo* data);
  396. void DeleteAwardId(TPacketDeleteAwardID* data);
  397. void UpdateChannelStatus(TChannelStatus* pData);
  398. void RequestChannelStatus(CPeer* peer, DWORD dwHandle);
  399. };
  400. template<class Func>
  401. Func CClientManager::for_each_peer(Func f)
  402. {
  403. TPeerList::iterator it;
  404. for (it = m_peerList.begin(); it!=m_peerList.end();++it)
  405. {
  406. f(*it);
  407. }
  408. return f;
  409. }
  410. #endif