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 "../../common/auction_table.h"
  9. #include "../../common/service.h"
  10. #include "Peer.h"
  11. #include "DBManager.h"
  12. #include "LoginData.h"
  13. class CPlayerTableCache;
  14. class CItemCache;
  15. class CItemPriceListTableCache;
  16. class CPacketInfo
  17. {
  18. public:
  19. void Add(int header);
  20. void Reset();
  21. std::map<int, int> m_map_info;
  22. };
  23. size_t CreatePlayerSaveQuery(char * pszQuery, size_t querySize, TPlayerTable * pkTab);
  24. class CClientManager : public CNetBase, public singleton<CClientManager>
  25. {
  26. public:
  27. typedef std::list<CPeer *> TPeerList;
  28. typedef boost::unordered_map<DWORD, CPlayerTableCache *> TPlayerTableCacheMap;
  29. typedef boost::unordered_map<DWORD, CItemCache *> TItemCacheMap;
  30. typedef boost::unordered_set<CItemCache *, boost::hash<CItemCache*> > TItemCacheSet;
  31. typedef boost::unordered_map<DWORD, TItemCacheSet *> TItemCacheSetPtrMap;
  32. typedef boost::unordered_map<DWORD, CItemPriceListTableCache*> TItemPriceListCacheMap;
  33. typedef boost::unordered_map<short, BYTE> TChannelStatusMap;
  34. // MYSHOP_PRICE_LIST
  35. /// 아이템 가격정보 리스트 요청 정보
  36. /**
  37. * first: Peer handle
  38. * second: 요청한 플레이어의 ID
  39. */
  40. typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo;
  41. // END_OF_MYSHOP_PRICE_LIST
  42. class ClientHandleInfo
  43. {
  44. public:
  45. DWORD dwHandle;
  46. DWORD account_id;
  47. DWORD player_id;
  48. BYTE account_index;
  49. char login[LOGIN_MAX_LEN + 1];
  50. char safebox_password[SAFEBOX_PASSWORD_MAX_LEN + 1];
  51. char ip[MAX_HOST_LENGTH + 1];
  52. TAccountTable * pAccountTable;
  53. TSafeboxTable * pSafebox;
  54. ClientHandleInfo(DWORD argHandle, DWORD dwPID = 0)
  55. {
  56. dwHandle = argHandle;
  57. pSafebox = NULL;
  58. pAccountTable = NULL;
  59. player_id = dwPID;
  60. };
  61. //독일선물기능용 생성자
  62. ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId)
  63. {
  64. dwHandle = argHandle;
  65. pSafebox = NULL;
  66. pAccountTable = NULL;
  67. player_id = dwPID;
  68. account_id = accountId;
  69. };
  70. ~ClientHandleInfo()
  71. {
  72. if (pSafebox)
  73. {
  74. delete pSafebox;
  75. pSafebox = NULL;
  76. }
  77. }
  78. };
  79. public:
  80. CClientManager();
  81. ~CClientManager();
  82. bool Initialize();
  83. time_t GetCurrentTime();
  84. void MainLoop();
  85. void Quit();
  86. void SetTablePostfix(const char* c_pszTablePostfix);
  87. void SetPlayerIDStart(int iIDStart);
  88. int GetPlayerIDStart() { return m_iPlayerIDStart; }
  89. int GetPlayerDeleteLevelLimit() { return m_iPlayerDeleteLevelLimit; }
  90. void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; }
  91. bool IsChinaEventServer() { return m_bChinaEventServer; }
  92. DWORD GetUserCount(); // 접속된 사용자 수를 리턴 한다.
  93. void SendAllGuildSkillRechargePacket();
  94. void SendTime();
  95. CPlayerTableCache * GetPlayerCache(DWORD id);
  96. void PutPlayerCache(TPlayerTable * pNew);
  97. void CreateItemCacheSet(DWORD dwID);
  98. TItemCacheSet * GetItemCacheSet(DWORD dwID);
  99. void FlushItemCacheSet(DWORD dwID);
  100. CItemCache * GetItemCache(DWORD id);
  101. void PutItemCache(TPlayerItem * pNew, bool bSkipQuery = false);
  102. bool DeleteItemCache(DWORD id);
  103. void UpdatePlayerCache();
  104. void UpdateItemCache();
  105. // MYSHOP_PRICE_LIST
  106. /// 가격정보 리스트 캐시를 가져온다.
  107. /**
  108. * @param [in] dwID 가격정보 리스트의 소유자.(플레이어 ID)
  109. * @return 가격정보 리스트 캐시의 포인터
  110. */
  111. CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID);
  112. /// 가격정보 리스트 캐시를 넣는다.
  113. /**
  114. * @param [in] pItemPriceList 캐시에 넣을 아이템 가격정보 리스트
  115. *
  116. * 캐시가 이미 있으면 Update 가 아닌 replace 한다.
  117. */
  118. void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList);
  119. /// Flush 시간이 만료된 아이템 가격정보 리스트 캐시를 Flush 해주고 캐시에서 삭제한다.
  120. void UpdateItemPriceListCache(void);
  121. // END_OF_MYSHOP_PRICE_LIST
  122. void SendGuildSkillUsable(DWORD guild_id, DWORD dwSkillVnum, bool bUsable);
  123. void SetCacheFlushCountLimit(int iLimit);
  124. template <class Func>
  125. Func for_each_peer(Func f);
  126. CPeer * GetAnyPeer();
  127. void ForwardPacket(BYTE header, const void* data, int size, BYTE bChannel = 0, CPeer * except = NULL);
  128. void SendNotice(const char * c_pszFormat, ...);
  129. char* GetCommand(char* str); //독일선물기능에서 명령어 얻는 함수
  130. void ItemAward(CPeer * peer, char* login); //독일 선물 기능
  131. protected:
  132. void Destroy();
  133. private:
  134. bool InitializeTables();
  135. bool InitializeShopTable();
  136. bool InitializeMobTable();
  137. bool InitializeItemTable();
  138. bool InitializeQuestItemTable();
  139. bool InitializeSkillTable();
  140. bool InitializeRefineTable();
  141. bool InitializeBanwordTable();
  142. bool InitializeItemAttrTable();
  143. bool InitializeItemRareTable();
  144. bool InitializeLandTable();
  145. bool InitializeObjectProto();
  146. bool InitializeObjectTable();
  147. bool InitializeMonarch();
  148. // mob_proto.txt, item_proto.txt에서 읽은 mob_proto, item_proto를 real db에 반영.
  149. // item_proto, mob_proto를 db에 반영하지 않아도, 게임 돌아가는데는 문제가 없지만,
  150. // 운영툴 등에서 db의 item_proto, mob_proto를 읽어 쓰기 때문에 문제가 발생한다.
  151. bool MirrorMobTableIntoDB();
  152. bool MirrorItemTableIntoDB();
  153. void AddPeer(socket_t fd);
  154. void RemovePeer(CPeer * pPeer);
  155. CPeer * GetPeer(IDENT ident);
  156. int AnalyzeQueryResult(SQLMsg * msg);
  157. int AnalyzeErrorMsg(CPeer * peer, SQLMsg * msg);
  158. int Process();
  159. void ProcessPackets(CPeer * peer);
  160. CLoginData * GetLoginData(DWORD dwKey);
  161. CLoginData * GetLoginDataByLogin(const char * c_pszLogin);
  162. CLoginData * GetLoginDataByAID(DWORD dwAID);
  163. void InsertLoginData(CLoginData * pkLD);
  164. void DeleteLoginData(CLoginData * pkLD);
  165. bool InsertLogonAccount(const char * c_pszLogin, DWORD dwHandle, const char * c_pszIP);
  166. bool DeleteLogonAccount(const char * c_pszLogin, DWORD dwHandle);
  167. bool FindLogonAccount(const char * c_pszLogin);
  168. void GuildCreate(CPeer * peer, DWORD dwGuildID);
  169. void GuildSkillUpdate(CPeer * peer, TPacketGuildSkillUpdate* p);
  170. void GuildExpUpdate(CPeer * peer, TPacketGuildExpUpdate* p);
  171. void GuildAddMember(CPeer * peer, TPacketGDGuildAddMember* p);
  172. void GuildChangeGrade(CPeer * peer, TPacketGuild* p);
  173. void GuildRemoveMember(CPeer * peer, TPacketGuild* p);
  174. void GuildChangeMemberData(CPeer * peer, TPacketGuildChangeMemberData* p);
  175. void GuildDisband(CPeer * peer, TPacketGuild * p);
  176. void GuildWar(CPeer * peer, TPacketGuildWar * p);
  177. void GuildWarScore(CPeer * peer, TPacketGuildWarScore * p);
  178. void GuildChangeLadderPoint(TPacketGuildLadderPoint* p);
  179. void GuildUseSkill(TPacketGuildUseSkill* p);
  180. void GuildDepositMoney(TPacketGDGuildMoney* p);
  181. void GuildWithdrawMoney(CPeer* peer, TPacketGDGuildMoney* p);
  182. void GuildWithdrawMoneyGiveReply(TPacketGDGuildMoneyWithdrawGiveReply* p);
  183. void GuildWarBet(TPacketGDGuildWarBet * p);
  184. void GuildChangeMaster(TPacketChangeGuildMaster* p);
  185. void SetGuildWarEndTime(DWORD guild_id1, DWORD guild_id2, time_t tEndTime);
  186. void QUERY_BOOT(CPeer * peer, TPacketGDBoot * p);
  187. void QUERY_LOGIN(CPeer * peer, DWORD dwHandle, SLoginPacket* data);
  188. void QUERY_LOGOUT(CPeer * peer, DWORD dwHandle, const char *);
  189. void RESULT_LOGIN(CPeer * peer, SQLMsg *msg);
  190. void QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoadPacket*);
  191. void RESULT_COMPOSITE_PLAYER(CPeer * peer, SQLMsg * pMsg, DWORD dwQID);
  192. void RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHandleInfo * pkInfo);
  193. void RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID);
  194. void RESULT_QUEST_LOAD(CPeer * pkPeer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID);
  195. void RESULT_AFFECT_LOAD(CPeer * pkPeer, MYSQL_RES * pRes, DWORD dwHandle);
  196. // PLAYER_INDEX_CREATE_BUG_FIX
  197. void RESULT_PLAYER_INDEX_CREATE(CPeer *pkPeer, SQLMsg *msg);
  198. // END_PLAYER_INDEX_CREATE_BUG_FIX
  199. // MYSHOP_PRICE_LIST
  200. /// 가격정보 로드 쿼리에 대한 Result 처리
  201. /**
  202. * @param peer 가격정보를 요청한 Game server 의 peer 객체 포인터
  203. * @param pMsg 쿼리의 Result 로 받은 객체의 포인터
  204. *
  205. * 로드된 가격정보 리스트를 캐시에 저장하고 peer 에게 리스트를 보내준다.
  206. */
  207. void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg);
  208. /// 가격정보 업데이트를 위한 로드 쿼리에 대한 Result 처리
  209. /**
  210. * @param pMsg 쿼리의 Result 로 받은 객체의 포인터
  211. *
  212. * 로드된 정보로 가격정보 리스트 캐시를 만들고 업데이트 받은 가격정보로 업데이트 한다.
  213. */
  214. void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg);
  215. // END_OF_MYSHOP_PRICE_LIST
  216. void QUERY_PLAYER_SAVE(CPeer * peer, DWORD dwHandle, TPlayerTable*);
  217. void __QUERY_PLAYER_CREATE(CPeer * peer, DWORD dwHandle, TPlayerCreatePacket *);
  218. void __QUERY_PLAYER_DELETE(CPeer * peer, DWORD dwHandle, TPlayerDeletePacket *);
  219. void __RESULT_PLAYER_DELETE(CPeer * peer, SQLMsg* msg);
  220. void QUERY_PLAYER_COUNT(CPeer * pkPeer, TPlayerCountPacket *);
  221. void QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData);
  222. void QUERY_ITEM_DESTROY(CPeer * pkPeer, const char * c_pData);
  223. void QUERY_ITEM_FLUSH(CPeer * pkPeer, const char * c_pData);
  224. void QUERY_QUEST_SAVE(CPeer * pkPeer, TQuestTable *, DWORD dwLen);
  225. void QUERY_ADD_AFFECT(CPeer * pkPeer, TPacketGDAddAffect * p);
  226. void QUERY_REMOVE_AFFECT(CPeer * pkPeer, TPacketGDRemoveAffect * p);
  227. void QUERY_SAFEBOX_LOAD(CPeer * pkPeer, DWORD dwHandle, TSafeboxLoadPacket *, bool bMall);
  228. void QUERY_SAFEBOX_SAVE(CPeer * pkPeer, TSafeboxTable * pTable);
  229. void QUERY_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangeSizePacket * p);
  230. void QUERY_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangePasswordPacket * p);
  231. void RESULT_SAFEBOX_LOAD(CPeer * pkPeer, SQLMsg * msg);
  232. void RESULT_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, SQLMsg * msg);
  233. void RESULT_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, SQLMsg * msg);
  234. void RESULT_SAFEBOX_CHANGE_PASSWORD_SECOND(CPeer * pkPeer, SQLMsg * msg);
  235. void QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p);
  236. void QUERY_SETUP(CPeer * pkPeer, DWORD dwHandle, const char * c_pData);
  237. void SendPartyOnSetup(CPeer * peer);
  238. void QUERY_HIGHSCORE_REGISTER(CPeer * peer, TPacketGDHighscore* data);
  239. void RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg);
  240. void QUERY_FLUSH_CACHE(CPeer * pkPeer, const char * c_pData);
  241. void QUERY_PARTY_CREATE(CPeer * peer, TPacketPartyCreate* p);
  242. void QUERY_PARTY_DELETE(CPeer * peer, TPacketPartyDelete* p);
  243. void QUERY_PARTY_ADD(CPeer * peer, TPacketPartyAdd* p);
  244. void QUERY_PARTY_REMOVE(CPeer * peer, TPacketPartyRemove* p);
  245. void QUERY_PARTY_STATE_CHANGE(CPeer * peer, TPacketPartyStateChange* p);
  246. void QUERY_PARTY_SET_MEMBER_LEVEL(CPeer * peer, TPacketPartySetMemberLevel* p);
  247. void QUERY_RELOAD_PROTO();
  248. void QUERY_CHANGE_NAME(CPeer * peer, DWORD dwHandle, TPacketGDChangeName * p);
  249. void GetPlayerFromRes(TPlayerTable * player_table, MYSQL_RES* res);
  250. void QUERY_SMS(CPeer * pkPeer, TPacketGDSMS * p);
  251. void QUERY_LOGIN_KEY(CPeer * pkPeer, TPacketGDLoginKey * p);
  252. void AddGuildPriv(TPacketGiveGuildPriv* p);
  253. void AddEmpirePriv(TPacketGiveEmpirePriv* p);
  254. void AddCharacterPriv(TPacketGiveCharacterPriv* p);
  255. void MoneyLog(TPacketMoneyLog* p);
  256. void QUERY_AUTH_LOGIN(CPeer * pkPeer, DWORD dwHandle, TPacketGDAuthLogin * p);
  257. void QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketGDLoginByKey * p);
  258. void RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg);
  259. void ChargeCash(const TRequestChargeCash * p);
  260. void LoadEventFlag();
  261. void SetEventFlag(TPacketSetEventFlag* p);
  262. void SendEventFlagsOnSetup(CPeer* peer);
  263. void BillingExpire(TPacketBillingExpire * p);
  264. void BillingCheck(const char * data);
  265. void SendAllLoginToBilling();
  266. void SendLoginToBilling(CLoginData * pkLD, bool bLogin);
  267. #ifdef __SWITCH_CHANNEL_SYSTEM__
  268. void FindChannel(CPeer * pkPeer, DWORD dwHandle, TPacketChangeChannel * p);
  269. #endif
  270. // 결혼
  271. void MarriageAdd(TPacketMarriageAdd * p);
  272. void MarriageUpdate(TPacketMarriageUpdate * p);
  273. void MarriageRemove(TPacketMarriageRemove * p);
  274. void WeddingRequest(TPacketWeddingRequest * p);
  275. void WeddingReady(TPacketWeddingReady * p);
  276. void WeddingEnd(TPacketWeddingEnd * p);
  277. // MYSHOP_PRICE_LIST
  278. // 개인상점 가격정보
  279. /// 아이템 가격정보 리스트 업데이트 패킷(HEADER_GD_MYSHOP_PRICELIST_UPDATE) 처리함수
  280. /**
  281. * @param [in] pPacket 패킷 데이터의 포인터
  282. */
  283. void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket);
  284. /// 아이템 가격정보 리스트 요청 패킷(HEADER_GD_MYSHOP_PRICELIST_REQ) 처리함수
  285. /**
  286. * @param peer 패킷을 보낸 Game server 의 peer 객체의 포인터
  287. * @param [in] dwHandle 가격정보를 요청한 peer 의 핸들
  288. * @param [in] dwPlayerID 가격정보 리스트를 요청한 플레이어의 ID
  289. */
  290. void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID);
  291. // END_OF_MYSHOP_PRICE_LIST
  292. // Building
  293. void CreateObject(TPacketGDCreateObject * p);
  294. void DeleteObject(DWORD dwID);
  295. void UpdateLand(DWORD * pdw);
  296. // VCard
  297. void VCard(TPacketGDVCard * p);
  298. void VCardProcess();
  299. // BLOCK_CHAT
  300. void BlockChat(TPacketBlockChat * p);
  301. // END_OF_BLOCK_CHAT
  302. private:
  303. int m_looping;
  304. socket_t m_fdAccept; // 접속 받는 소켓
  305. TPeerList m_peerList;
  306. CPeer * m_pkAuthPeer;
  307. // LoginKey, LoginData pair
  308. typedef boost::unordered_map<DWORD, CLoginData *> TLoginDataByLoginKey;
  309. TLoginDataByLoginKey m_map_pkLoginData;
  310. // Login LoginData pair
  311. typedef boost::unordered_map<std::string, CLoginData *> TLoginDataByLogin;
  312. TLoginDataByLogin m_map_pkLoginDataByLogin;
  313. // AccountID LoginData pair
  314. typedef boost::unordered_map<DWORD, CLoginData *> TLoginDataByAID;
  315. TLoginDataByAID m_map_pkLoginDataByAID;
  316. // Login LoginData pair (실제 로그인 되어있는 계정)
  317. typedef boost::unordered_map<std::string, CLoginData *> TLogonAccountMap;
  318. TLogonAccountMap m_map_kLogonAccount;
  319. int m_iPlayerIDStart;
  320. int m_iPlayerDeleteLevelLimit;
  321. int m_iPlayerDeleteLevelLimitLower;
  322. bool m_bChinaEventServer;
  323. std::vector<TMobTable> m_vec_mobTable;
  324. std::vector<TItemTable> m_vec_itemTable;
  325. std::map<DWORD, TItemTable *> m_map_itemTableByVnum;
  326. int m_iShopTableSize;
  327. TShopTable * m_pShopTable;
  328. int m_iRefineTableSize;
  329. TRefineTable* m_pRefineTable;
  330. std::vector<TSkillTable> m_vec_skillTable;
  331. std::vector<TBanwordTable> m_vec_banwordTable;
  332. std::vector<TItemAttrTable> m_vec_itemAttrTable;
  333. std::vector<TItemAttrTable> m_vec_itemRareTable;
  334. std::vector<building::TLand> m_vec_kLandTable;
  335. std::vector<building::TObjectProto> m_vec_kObjectProto;
  336. std::map<DWORD, building::TObject *> m_map_pkObjectTable;
  337. std::queue<TPacketGDVCard> m_queue_vcard;
  338. bool m_bShutdowned;
  339. TPlayerTableCacheMap m_map_playerCache; // 플레이어 id가 key
  340. TItemCacheMap m_map_itemCache; // 아이템 id가 key
  341. TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // 플레이어 id가 key, 이 플레이어가 어떤 아이템 캐쉬를 가지고 있나?
  342. // MYSHOP_PRICE_LIST
  343. /// 플레이어별 아이템 가격정보 리스트 map. key: 플레이어 ID, value: 가격정보 리스트 캐시
  344. TItemPriceListCacheMap m_mapItemPriceListCache; ///< 플레이어별 아이템 가격정보 리스트
  345. // END_OF_MYSHOP_PRICE_LIST
  346. TChannelStatusMap m_mChannelStatus;
  347. struct TPartyInfo
  348. {
  349. BYTE bRole;
  350. BYTE bLevel;
  351. TPartyInfo() :bRole(0), bLevel(0)
  352. {
  353. }
  354. };
  355. typedef std::map<DWORD, TPartyInfo> TPartyMember;
  356. typedef std::map<DWORD, TPartyMember> TPartyMap;
  357. typedef std::map<BYTE, TPartyMap> TPartyChannelMap;
  358. TPartyChannelMap m_map_pkChannelParty;
  359. typedef std::map<std::string, long> TEventFlagMap;
  360. TEventFlagMap m_map_lEventFlag;
  361. BYTE m_bLastHeader;
  362. int m_iCacheFlushCount;
  363. int m_iCacheFlushCountLimit;
  364. private :
  365. TItemIDRangeTable m_itemRange;
  366. public :
  367. bool InitializeNowItemID();
  368. DWORD GetItemID();
  369. DWORD GainItemID();
  370. TItemIDRangeTable GetItemRange() { return m_itemRange; }
  371. //BOOT_LOCALIZATION
  372. public:
  373. /* 로컬 정보 초기화
  374. **/
  375. bool InitializeLocalization();
  376. private:
  377. std::vector<tLocale> m_vec_Locale;
  378. //END_BOOT_LOCALIZATION
  379. //ADMIN_MANAGER
  380. bool __GetAdminInfo(const char *szIP, std::vector<tAdminInfo> & rAdminVec);
  381. bool __GetHostInfo(std::vector<std::string> & rIPVec);
  382. //END_ADMIN_MANAGER
  383. //RELOAD_ADMIN
  384. void ReloadAdmin(CPeer * peer, TPacketReloadAdmin * p);
  385. //END_RELOAD_ADMIN
  386. void BreakMarriage(CPeer * peer, const char * data);
  387. struct TLogoutPlayer
  388. {
  389. DWORD pid;
  390. time_t time;
  391. bool operator < (const TLogoutPlayer & r)
  392. {
  393. return (pid < r.pid);
  394. }
  395. };
  396. typedef boost::unordered_map<DWORD, TLogoutPlayer*> TLogoutPlayerMap;
  397. TLogoutPlayerMap m_map_logout;
  398. void InsertLogoutPlayer(DWORD pid);
  399. void DeleteLogoutPlayer(DWORD pid);
  400. void UpdateLogoutPlayer();
  401. void UpdateItemCacheSet(DWORD pid);
  402. void FlushPlayerCacheSet(DWORD pid);
  403. //MONARCH
  404. void Election(CPeer * peer, DWORD dwHandle, const char * p);
  405. void Candidacy(CPeer * peer, DWORD dwHandle, const char * p);
  406. void AddMonarchMoney(CPeer * peer, DWORD dwHandle, const char * p);
  407. void TakeMonarchMoney(CPeer * peer, DWORD dwHandle, const char * p);
  408. void ComeToVote(CPeer * peer, DWORD dwHandle, const char * p);
  409. void RMCandidacy(CPeer * peer, DWORD dwHandle, const char * p);
  410. void SetMonarch(CPeer * peer, DWORD dwHandle, const char * p);
  411. void RMMonarch(CPeer * peer, DWORD dwHandle, const char * p);
  412. void DecMonarchMoney(CPeer * peer, DWORD dwHandle, const char * p);
  413. //END_MONARCH
  414. void ChangeMonarchLord(CPeer* peer, DWORD dwHandle, TPacketChangeMonarchLord* info);
  415. void BlockException(TPacketBlockException *data);
  416. void SendSpareItemIDRange(CPeer* peer);
  417. void UpdateHorseName(TPacketUpdateHorseName* data, CPeer* peer);
  418. void AckHorseName(DWORD dwPID, CPeer* peer);
  419. void DeleteLoginKey(TPacketDC *data);
  420. void ResetLastPlayerID(const TPacketNeedLoginLogInfo* data);
  421. //delete gift notify icon
  422. void DeleteAwardId(TPacketDeleteAwardID* data);
  423. void UpdateChannelStatus(TChannelStatus* pData);
  424. void RequestChannelStatus(CPeer* peer, DWORD dwHandle);
  425. #ifdef __AUCTION__
  426. void EnrollInAuction (CPeer * peer, DWORD owner_id, AuctionEnrollProductInfo* data);
  427. void EnrollInSale (CPeer * peer, DWORD owner_id, AuctionEnrollSaleInfo* data);
  428. void EnrollInWish (CPeer * peer, DWORD wisher_id, AuctionEnrollWishInfo* data);
  429. void AuctionBid (CPeer * peer, DWORD bidder_id, AuctionBidInfo* data);
  430. void AuctionImpur (CPeer * peer, DWORD purchaser_id, AuctionImpurInfo* data);
  431. void AuctionGetAuctionedItem (CPeer * peer, DWORD actor_id, DWORD item_id);
  432. void AuctionBuySoldItem (CPeer * peer, DWORD actor_id, DWORD item_id);
  433. void AuctionCancelAuction (CPeer * peer, DWORD actor_id, DWORD item_id);
  434. void AuctionCancelWish (CPeer * peer, DWORD actor_id, DWORD item_num);
  435. void AuctionCancelSale (CPeer * peer, DWORD actor_id, DWORD item_id);
  436. void AuctionDeleteAuctionItem (CPeer * peer, DWORD actor_id, DWORD item_id);
  437. void AuctionDeleteSaleItem (CPeer * peer, DWORD actor_id, DWORD item_id);
  438. void AuctionReBid (CPeer * peer, DWORD bidder_id, AuctionBidInfo* data);
  439. void AuctionBidCancel (CPeer * peer, DWORD bidder_id, DWORD item_id);
  440. #endif
  441. };
  442. template<class Func>
  443. Func CClientManager::for_each_peer(Func f)
  444. {
  445. TPeerList::iterator it;
  446. for (it = m_peerList.begin(); it!=m_peerList.end();++it)
  447. {
  448. f(*it);
  449. }
  450. return f;
  451. }
  452. #endif

ClientManager.h