Guest User

Untitled

a guest
Mar 15th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.91 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3.  
  4. #include "ClientManager.h"
  5.  
  6. #include "Main.h"
  7. #include "QID.h"
  8. #include "ItemAwardManager.h"
  9. #include "HB.h"
  10. #include "Cache.h"
  11.  
  12. extern bool g_bHotBackup;
  13.  
  14. extern std::string g_stLocale;
  15. extern int g_test_server;
  16. extern int g_log;
  17.  
  18. //
  19. // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  20. // !!!!!!!!!!! IMPORTANT !!!!!!!!!!!!
  21. // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  22. //
  23. // Check all SELECT syntax on item table before change this function!!!
  24. //
  25. bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DWORD dwPID)
  26. {
  27. if (!res)
  28. {
  29. pVec->clear();
  30. return true;
  31. }
  32.  
  33. int rows;
  34.  
  35. if ((rows = mysql_num_rows(res)) <= 0) // µĄŔĚĹÍ ľřŔ˝
  36. {
  37. pVec->clear();
  38. return true;
  39. }
  40.  
  41. pVec->resize(rows);
  42.  
  43. for (int i = 0; i < rows; ++i)
  44. {
  45. MYSQL_ROW row = mysql_fetch_row(res);
  46. TPlayerItem & item = pVec->at(i);
  47.  
  48. int cur = 0;
  49.  
  50. // Check all SELECT syntax on item table before change this function!!!
  51. // Check all SELECT syntax on item table before change this function!!!
  52. // Check all SELECT syntax on item table before change this function!!!
  53. str_to_number(item.id, row[cur++]);
  54. str_to_number(item.window, row[cur++]);
  55. str_to_number(item.pos, row[cur++]);
  56. str_to_number(item.count, row[cur++]);
  57. str_to_number(item.vnum, row[cur++]);
  58. str_to_number(item.alSockets[0], row[cur++]);
  59. str_to_number(item.alSockets[1], row[cur++]);
  60. str_to_number(item.alSockets[2], row[cur++]);
  61.  
  62. for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)
  63. {
  64. str_to_number(item.aAttr[j].bType, row[cur++]);
  65. str_to_number(item.aAttr[j].sValue, row[cur++]);
  66. }
  67.  
  68. item.owner = dwPID;
  69. }
  70.  
  71. return true;
  72. }
  73.  
  74. size_t CreatePlayerSaveQuery(char * pszQuery, size_t querySize, TPlayerTable * pkTab)
  75. {
  76. size_t queryLen;
  77. queryLen = snprintf(pszQuery, querySize,
  78. "UPDATE player%s SET "
  79. "job = %d, "
  80. "voice = %d, "
  81. "dir = %d, "
  82. "x = %d, "
  83. "y = %d, "
  84. "z = %d, "
  85. "map_index = %d, "
  86. "exit_x = %ld, "
  87. "exit_y = %ld, "
  88. "exit_map_index = %ld, "
  89. "hp = %d, "
  90. "mp = %d, "
  91. "stamina = %d, "
  92. "random_hp = %d, "
  93. "random_sp = %d, "
  94. "playtime = %d, "
  95. "level = %d, "
  96. "level_step = %d, "
  97. "st = %d, "
  98. "ht = %d, "
  99. "dx = %d, "
  100. "iq = %d, "
  101. "gold = %lld, "
  102. "exp = %u, "
  103. "stat_point = %d, "
  104. "skill_point = %d, "
  105. "sub_skill_point = %d, "
  106. "stat_reset_count = %d, "
  107. "ip = '%s', "
  108. "part_main = %d, "
  109. "part_hair = %d, "
  110. "part_acce = %d, "
  111. "last_play = NOW(), "
  112. "skill_group = %d, "
  113. "alignment = %ld, "
  114. "horse_level = %d, "
  115. "horse_riding = %d, "
  116. "horse_hp = %d, "
  117. "horse_hp_droptime = %u, "
  118. "horse_stamina = %d, "
  119. "horse_skill_point = %d, "
  120. ,
  121. GetTablePostfix(),
  122. pkTab->job,
  123. pkTab->voice,
  124. pkTab->dir,
  125. pkTab->x,
  126. pkTab->y,
  127. pkTab->z,
  128. pkTab->lMapIndex,
  129. pkTab->lExitX,
  130. pkTab->lExitY,
  131. pkTab->lExitMapIndex,
  132. pkTab->hp,
  133. pkTab->sp,
  134. pkTab->stamina,
  135. pkTab->sRandomHP,
  136. pkTab->sRandomSP,
  137. pkTab->playtime,
  138. pkTab->level,
  139. pkTab->level_step,
  140. pkTab->st,
  141. pkTab->ht,
  142. pkTab->dx,
  143. pkTab->iq,
  144. pkTab->gold,
  145. pkTab->exp,
  146. pkTab->stat_point,
  147. pkTab->skill_point,
  148. pkTab->sub_skill_point,
  149. pkTab->stat_reset_count,
  150. pkTab->ip,
  151. pkTab->parts[PART_MAIN],
  152. pkTab->parts[PART_HAIR],
  153. pkTab->parts[PART_ACCE],
  154. pkTab->skill_group,
  155. pkTab->lAlignment,
  156. pkTab->horse.bLevel,
  157. pkTab->horse.bRiding,
  158. pkTab->horse.sHealth,
  159. pkTab->horse.dwHorseHealthDropTime,
  160. pkTab->horse.sStamina,
  161. pkTab->horse_skill_point);
  162.  
  163. // Binary ·Î ąŮ˛Ů±â Ŕ§ÇŃ Ŕӽà °ř°Ł
  164. static char text[8192 + 1];
  165. CDBManager::instance().EscapeString(text, pkTab->skills, sizeof(pkTab->skills));
  166. queryLen += snprintf(pszQuery + queryLen, querySize - queryLen, "skill_level = '%s', ", text);
  167.  
  168. CDBManager::instance().EscapeString(text, pkTab->quickslot, sizeof(pkTab->quickslot));
  169. queryLen += snprintf(pszQuery + queryLen, querySize - queryLen, "quickslot = '%s' ", text);
  170.  
  171. queryLen += snprintf(pszQuery + queryLen, querySize - queryLen, " WHERE id=%d", pkTab->id);
  172. return queryLen;
  173. }
  174.  
  175. CPlayerTableCache * CClientManager::GetPlayerCache(DWORD id)
  176. {
  177. TPlayerTableCacheMap::iterator it = m_map_playerCache.find(id);
  178.  
  179. if (it == m_map_playerCache.end())
  180. return NULL;
  181.  
  182. TPlayerTable* pTable = it->second->Get(false);
  183. pTable->logoff_interval = GetCurrentTime() - it->second->GetLastUpdateTime();
  184. return it->second;
  185. }
  186.  
  187. void CClientManager::PutPlayerCache(TPlayerTable * pNew)
  188. {
  189. CPlayerTableCache * c;
  190.  
  191. c = GetPlayerCache(pNew->id);
  192.  
  193. if (!c)
  194. {
  195. c = new CPlayerTableCache;
  196. m_map_playerCache.insert(TPlayerTableCacheMap::value_type(pNew->id, c));
  197. }
  198.  
  199. if (g_bHotBackup)
  200. PlayerHB::instance().Put(pNew->id);
  201.  
  202. c->Put(pNew);
  203. }
  204.  
  205. /*
  206. * PLAYER LOAD
  207. */
  208. void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoadPacket * packet)
  209. {
  210. CPlayerTableCache * c;
  211. TPlayerTable * pTab;
  212.  
  213. CLoginData * pLoginData = GetLoginDataByAID(packet->account_id);
  214. if (pLoginData)
  215. {
  216. for (int n = 0; n < PLAYER_PER_ACCOUNT; ++n)
  217. if (pLoginData->GetAccountRef().players[n].dwID != 0)
  218. DeleteLogoutPlayer(pLoginData->GetAccountRef().players[n].dwID);
  219. }
  220.  
  221. if ((c = GetPlayerCache(packet->player_id)))
  222. {
  223. CLoginData * pkLD = GetLoginDataByAID(packet->account_id);
  224. if (!pkLD || pkLD->IsPlay())
  225. {
  226. sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
  227. peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, dwHandle, 0);
  228. return;
  229. }
  230.  
  231. pTab = c->Get();
  232. pkLD->SetPlay(true);
  233. SendLoginToBilling(pkLD, true);
  234. thecore_memcpy(pTab->aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(pTab->aiPremiumTimes));
  235.  
  236. peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, dwHandle, sizeof(TPlayerTable));
  237. peer->Encode(pTab, sizeof(TPlayerTable));
  238.  
  239. if (packet->player_id != pkLD->GetLastPlayerID())
  240. {
  241. TPacketNeedLoginLogInfo logInfo;
  242. logInfo.dwPlayerID = packet->player_id;
  243.  
  244. pkLD->SetLastPlayerID( packet->player_id );
  245. peer->EncodeHeader( HEADER_DG_NEED_LOGIN_LOG, dwHandle, sizeof(TPacketNeedLoginLogInfo) );
  246. peer->Encode( &logInfo, sizeof(TPacketNeedLoginLogInfo) );
  247. }
  248.  
  249. char szQuery[1024] = { 0, };
  250. TItemCacheSet * pSet = GetItemCacheSet(pTab->id);
  251. sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold);
  252.  
  253. if (pSet)
  254. {
  255. static std::vector<TPlayerItem> s_items;
  256. s_items.resize(pSet->size());
  257.  
  258. DWORD dwCount = 0;
  259. TItemCacheSet::iterator it = pSet->begin();
  260. while (it != pSet->end())
  261. {
  262. CItemCache * c = *it++;
  263. TPlayerItem * p = c->Get();
  264.  
  265. if (p->vnum) // vnumŔĚ ľřŔ¸¸é »čÁ¦µČ ľĆŔĚĹŰŔĚ´Ů.
  266. thecore_memcpy(&s_items[dwCount++], p, sizeof(TPlayerItem));
  267. }
  268.  
  269. if (g_test_server)
  270. sys_log(0, "ITEM_CACHE: HIT! %s count: %u", pTab->name, dwCount);
  271.  
  272. peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
  273. peer->EncodeDWORD(dwCount);
  274.  
  275. if (dwCount)
  276. peer->Encode(&s_items[0], sizeof(TPlayerItem) * dwCount);
  277.  
  278. snprintf(szQuery, sizeof(szQuery),
  279. "SELECT dwPID,szName,szState,lValue FROM quest%s WHERE dwPID=%d AND lValue<>0",
  280. GetTablePostfix(), pTab->id);
  281.  
  282. CDBManager::instance().ReturnQuery(szQuery, QID_QUEST, peer->GetHandle(), new ClientHandleInfo(dwHandle,0,packet->account_id));
  283. snprintf(szQuery, sizeof(szQuery), "SELECT dwPID,bType,bApplyOn,lApplyValue,dwFlag,lDuration,lSPCost FROM affect%s WHERE dwPID=%d", GetTablePostfix(), pTab->id);
  284. CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle));
  285. }
  286. else
  287. {
  288. snprintf(szQuery, sizeof(szQuery),
  289. "SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 "
  290. "FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)",
  291. GetTablePostfix(), pTab->id, SAFEBOX, DRAGON_SOUL_INVENTORY);
  292.  
  293. CDBManager::instance().ReturnQuery(szQuery, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, pTab->id));
  294. snprintf(szQuery, sizeof(szQuery), "SELECT dwPID, szName, szState, lValue FROM quest%s WHERE dwPID=%d", GetTablePostfix(), pTab->id);
  295.  
  296. CDBManager::instance().ReturnQuery(szQuery, QID_QUEST, peer->GetHandle(), new ClientHandleInfo(dwHandle, pTab->id));
  297. snprintf(szQuery, sizeof(szQuery), "SELECT dwPID, bType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost FROM affect%s WHERE dwPID=%d", GetTablePostfix(), pTab->id);
  298.  
  299. CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle, pTab->id));
  300. }
  301. }
  302. else
  303. {
  304. sys_log(0, "[PLAYER_LOAD] Load from PlayerDB pid[%d]", packet->player_id);
  305. char queryStr[QUERY_MAX_LEN + QUERY_MAX_LEN]; // char queryStr[QUERY_MAX_LEN]; acce miatt, ez volt a régi!
  306. snprintf(queryStr, sizeof(queryStr),
  307. "SELECT "
  308. "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
  309. "gold,level,level_step,st,ht,dx,iq,exp,"
  310. "stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,part_acce,"
  311. "skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_hp_droptime,horse_stamina,"
  312. "UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(last_play),horse_skill_point FROM player%s WHERE id=%d",
  313. GetTablePostfix(), packet->player_id);
  314.  
  315. ClientHandleInfo * pkInfo = new ClientHandleInfo(dwHandle, packet->player_id);
  316. pkInfo->account_id = packet->account_id;
  317. CDBManager::instance().ReturnQuery(queryStr, QID_PLAYER, peer->GetHandle(), pkInfo);
  318.  
  319. snprintf(queryStr, sizeof(queryStr),
  320. "SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 "
  321. "FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)",
  322. GetTablePostfix(), packet->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY);
  323.  
  324. CDBManager::instance().ReturnQuery(queryStr, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id));
  325.  
  326. snprintf(queryStr, sizeof(queryStr),
  327. "SELECT dwPID,szName,szState,lValue FROM quest%s WHERE dwPID=%d",
  328. GetTablePostfix(), packet->player_id);
  329. CDBManager::instance().ReturnQuery(queryStr, QID_QUEST, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id,packet->account_id));
  330.  
  331. snprintf(queryStr, sizeof(queryStr),
  332. "SELECT dwPID,bType,bApplyOn,lApplyValue,dwFlag,lDuration,lSPCost FROM affect%s WHERE dwPID=%d",
  333. GetTablePostfix(), packet->player_id);
  334. CDBManager::instance().ReturnQuery(queryStr, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id));
  335. }
  336.  
  337.  
  338. }
  339. void CClientManager::ItemAward(CPeer * peer,char* login)
  340. {
  341. char login_t[LOGIN_MAX_LEN + 1] = "";
  342. strlcpy(login_t,login,LOGIN_MAX_LEN + 1);
  343. std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(login_t);
  344. if(pSet == NULL)
  345. return;
  346. typeof(pSet->begin()) it = pSet->begin(); //taken_timeŔĚ NULLŔΰ͵é ŔĐľîżČ
  347. while(it != pSet->end() )
  348. {
  349. TItemAward * pItemAward = *(it++);
  350. char* whyStr = pItemAward->szWhy; //why ÄÝ·ë Ŕбâ
  351. char cmdStr[100] = ""; //whyÄݷ뿡Ľ­ ŔĐŔş °ŞŔ» Ŕӽà ą®ŔÚż­żˇ şą»çÇصŇ
  352. strcpy(cmdStr,whyStr); //¸í·Éľî ľň´Â °úÁ¤żˇĽ­ ĹäĹ«ľ˛¸é żřş»µµ Ĺäūȭ µÇ±â ¶§ą®
  353. char command[20] = "";
  354. strcpy(command,GetCommand(cmdStr)); // command ľň±â
  355. if( !(strcmp(command,"GIFT") )) // command °ˇ GIFTŔ̸é
  356. {
  357. TPacketItemAwardInfromer giftData;
  358. strcpy(giftData.login, pItemAward->szLogin); //·Î±×ŔÎ ľĆŔ̵𠺹»ç
  359. strcpy(giftData.command, command); //¸í·Éľî şą»ç
  360. giftData.vnum = pItemAward->dwVnum; //ľĆŔĚĹŰ vnumµµ şą»ç
  361. ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
  362. }
  363. }
  364. }
  365. char* CClientManager::GetCommand(char* str)
  366. {
  367. char command[20] = "";
  368. char* tok;
  369.  
  370. if( str[0] == '[' )
  371. {
  372. tok = strtok(str,"]");
  373. strcat(command,&tok[1]);
  374. }
  375.  
  376. return command;
  377. }
  378.  
  379. bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
  380. {
  381. if (mysql_num_rows(res) == 0)
  382. return false;
  383.  
  384. memset(pkTab, 0, sizeof(TPlayerTable));
  385. MYSQL_ROW row = mysql_fetch_row(res);
  386. int col = 0;
  387.  
  388. str_to_number(pkTab->id, row[col++]);
  389. strlcpy(pkTab->name, row[col++], sizeof(pkTab->name));
  390. str_to_number(pkTab->job, row[col++]);
  391. str_to_number(pkTab->voice, row[col++]);
  392. str_to_number(pkTab->dir, row[col++]);
  393. str_to_number(pkTab->x, row[col++]);
  394. str_to_number(pkTab->y, row[col++]);
  395. str_to_number(pkTab->z, row[col++]);
  396. str_to_number(pkTab->lMapIndex, row[col++]);
  397. str_to_number(pkTab->lExitX, row[col++]);
  398. str_to_number(pkTab->lExitY, row[col++]);
  399. str_to_number(pkTab->lExitMapIndex, row[col++]);
  400. str_to_number(pkTab->hp, row[col++]);
  401. str_to_number(pkTab->sp, row[col++]);
  402. str_to_number(pkTab->stamina, row[col++]);
  403. str_to_number(pkTab->sRandomHP, row[col++]);
  404. str_to_number(pkTab->sRandomSP, row[col++]);
  405. str_to_number(pkTab->playtime, row[col++]);
  406. str_to_number(pkTab->gold, row[col++]);
  407. str_to_number(pkTab->level, row[col++]);
  408. str_to_number(pkTab->level_step, row[col++]);
  409. str_to_number(pkTab->st, row[col++]);
  410. str_to_number(pkTab->ht, row[col++]);
  411. str_to_number(pkTab->dx, row[col++]);
  412. str_to_number(pkTab->iq, row[col++]);
  413. str_to_number(pkTab->exp, row[col++]);
  414. str_to_number(pkTab->stat_point, row[col++]);
  415. str_to_number(pkTab->skill_point, row[col++]);
  416. str_to_number(pkTab->sub_skill_point, row[col++]);
  417. str_to_number(pkTab->stat_reset_count, row[col++]);
  418. str_to_number(pkTab->part_base, row[col++]);
  419. str_to_number(pkTab->parts[PART_HAIR], row[col++]);
  420. str_to_number(pkTab->parts[PART_ACCE], row[col++]);
  421. if (row[col])
  422. thecore_memcpy(pkTab->skills, row[col], sizeof(pkTab->skills));
  423. else
  424. memset(&pkTab->skills, 0, sizeof(pkTab->skills));
  425.  
  426. col++;
  427.  
  428. if (row[col])
  429. thecore_memcpy(pkTab->quickslot, row[col], sizeof(pkTab->quickslot));
  430. else
  431. memset(pkTab->quickslot, 0, sizeof(pkTab->quickslot));
  432.  
  433. col++;
  434.  
  435. str_to_number(pkTab->skill_group, row[col++]);
  436. str_to_number(pkTab->lAlignment, row[col++]);
  437. if (row[col])
  438. {
  439. strlcpy(pkTab->szMobile, row[col], sizeof(pkTab->szMobile));
  440. }
  441.  
  442. col++;
  443. str_to_number(pkTab->horse.bLevel, row[col++]);
  444. str_to_number(pkTab->horse.bRiding, row[col++]);
  445. str_to_number(pkTab->horse.sHealth, row[col++]);
  446. str_to_number(pkTab->horse.dwHorseHealthDropTime, row[col++]);
  447. str_to_number(pkTab->horse.sStamina, row[col++]);
  448. str_to_number(pkTab->logoff_interval, row[col++]);
  449. str_to_number(pkTab->horse_skill_point, row[col++]);
  450. {
  451. pkTab->skills[123].bLevel = 0;
  452. if (pkTab->level > 9)
  453. {
  454. int max_point = pkTab->level - 9;
  455. int skill_point = MIN(20, pkTab->skills[121].bLevel) + MIN(20, pkTab->skills[124].bLevel) + MIN(10, pkTab->skills[131].bLevel) + MIN(20, pkTab->skills[141].bLevel) + MIN(20, pkTab->skills[142].bLevel);
  456. pkTab->sub_skill_point = max_point - skill_point;
  457. }
  458. else
  459. pkTab->sub_skill_point = 0;
  460. }
  461.  
  462. return true;
  463. }
  464.  
  465. void CClientManager::RESULT_COMPOSITE_PLAYER(CPeer * peer, SQLMsg * pMsg, DWORD dwQID)
  466. {
  467. CQueryInfo * qi = (CQueryInfo *) pMsg->pvUserData;
  468. std::auto_ptr<ClientHandleInfo> info((ClientHandleInfo *) qi->pvData);
  469.  
  470. MYSQL_RES * pSQLResult = pMsg->Get()->pSQLResult;
  471. if (!pSQLResult)
  472. {
  473. sys_err("null MYSQL_RES QID %u", dwQID);
  474. return;
  475. }
  476.  
  477. switch (dwQID)
  478. {
  479. case QID_PLAYER:
  480. sys_log(0, "QID_PLAYER %u %u", info->dwHandle, info->player_id);
  481. RESULT_PLAYER_LOAD(peer, pSQLResult, info.get());
  482.  
  483. break;
  484.  
  485. case QID_ITEM:
  486. sys_log(0, "QID_ITEM %u", info->dwHandle);
  487. RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
  488. break;
  489.  
  490. case QID_QUEST:
  491. {
  492. sys_log(0, "QID_QUEST %u", info->dwHandle);
  493. RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
  494. //aidľň±â
  495. ClientHandleInfo* temp1 = info.get();
  496. if (temp1 == NULL)
  497. break;
  498.  
  499. CLoginData* pLoginData1 = GetLoginDataByAID(temp1->account_id); //
  500. //µ¶ŔĎ Ľ±ą° ±â´É
  501. if( pLoginData1->GetAccountRef().login == NULL)
  502. break;
  503. if( pLoginData1 == NULL )
  504. break;
  505. sys_log(0,"info of pLoginData1 before call ItemAwardfunction %d",pLoginData1);
  506. ItemAward(peer,pLoginData1->GetAccountRef().login);
  507. }
  508. break;
  509.  
  510. case QID_AFFECT:
  511. sys_log(0, "QID_AFFECT %u", info->dwHandle);
  512. RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
  513. break;
  514. /*
  515. case QID_PLAYER_ITEM_QUEST_AFFECT:
  516. sys_log(0, "QID_PLAYER_ITEM_QUEST_AFFECT %u", info->dwHandle);
  517. RESULT_PLAYER_LOAD(peer, pSQLResult, info->dwHandle);
  518.  
  519. if (!pMsg->Next())
  520. {
  521. sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: ITEM FAILED");
  522. return;
  523. }
  524.  
  525. case QID_ITEM_QUEST_AFFECT:
  526. sys_log(0, "QID_ITEM_QUEST_AFFECT %u", info->dwHandle);
  527. RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
  528.  
  529. if (!pMsg->Next())
  530. {
  531. sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: QUEST FAILED");
  532. return;
  533. }
  534.  
  535. case QID_QUEST_AFFECT:
  536. sys_log(0, "QID_QUEST_AFFECT %u", info->dwHandle);
  537. RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle);
  538.  
  539. if (!pMsg->Next())
  540. sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: AFFECT FAILED");
  541. else
  542. RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
  543.  
  544. break;
  545. */
  546. }
  547.  
  548. }
  549.  
  550. void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHandleInfo * pkInfo)
  551. {
  552. TPlayerTable tab;
  553.  
  554. if (!CreatePlayerTableFromRes(pRes, &tab))
  555. {
  556. peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, pkInfo->dwHandle, 0);
  557. return;
  558. }
  559.  
  560. CLoginData * pkLD = GetLoginDataByAID(pkInfo->account_id);
  561.  
  562. if (!pkLD || pkLD->IsPlay())
  563. {
  564. sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
  565. peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, pkInfo->dwHandle, 0);
  566. return;
  567. }
  568.  
  569. pkLD->SetPlay(true);
  570. SendLoginToBilling(pkLD, true);
  571. thecore_memcpy(tab.aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(tab.aiPremiumTimes));
  572.  
  573. peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, pkInfo->dwHandle, sizeof(TPlayerTable));
  574. peer->Encode(&tab, sizeof(TPlayerTable));
  575.  
  576. if (tab.id != pkLD->GetLastPlayerID())
  577. {
  578. TPacketNeedLoginLogInfo logInfo;
  579. logInfo.dwPlayerID = tab.id;
  580.  
  581. pkLD->SetLastPlayerID( tab.id );
  582.  
  583. peer->EncodeHeader( HEADER_DG_NEED_LOGIN_LOG, pkInfo->dwHandle, sizeof(TPacketNeedLoginLogInfo) );
  584. peer->Encode( &logInfo, sizeof(TPacketNeedLoginLogInfo) );
  585. }
  586. }
  587.  
  588. void CClientManager::RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID)
  589. {
  590. static std::vector<TPlayerItem> s_items;
  591. //DBżˇĽ­ ľĆŔĚĹŰ Á¤ş¸¸¦ ŔĐľîżÂ´Ů.
  592. CreateItemTableFromRes(pRes, &s_items, dwPID);
  593. DWORD dwCount = s_items.size();
  594.  
  595. peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
  596. peer->EncodeDWORD(dwCount);
  597.  
  598. //CacheSetŔ» ¸¸µç´Ů
  599. CreateItemCacheSet(dwPID);
  600.  
  601. // ITEM_LOAD_LOG_ATTACH_PID
  602. sys_log(0, "ITEM_LOAD: count %u pid %u", dwCount, dwPID);
  603. // END_OF_ITEM_LOAD_LOG_ATTACH_PID
  604.  
  605. if (dwCount)
  606. {
  607. peer->Encode(&s_items[0], sizeof(TPlayerItem) * dwCount);
  608.  
  609. for (DWORD i = 0; i < dwCount; ++i)
  610. PutItemCache(&s_items[i], true); // ·ÎµĺÇŃ °ÍŔş µű·Î ŔúŔĺÇŇ ÇĘżä ľřŔ¸ąÇ·Î, ŔÎŔÚ bSkipQueryżˇ true¸¦ łÖ´Â´Ů.
  611. }
  612. }
  613.  
  614. void CClientManager::RESULT_AFFECT_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle)
  615. {
  616. int iNumRows;
  617.  
  618. if ((iNumRows = mysql_num_rows(pRes)) == 0) // µĄŔĚĹÍ ľřŔ˝
  619. return;
  620.  
  621. static std::vector<TPacketAffectElement> s_elements;
  622. s_elements.resize(iNumRows);
  623.  
  624. DWORD dwPID = 0;
  625.  
  626. MYSQL_ROW row;
  627.  
  628. for (int i = 0; i < iNumRows; ++i)
  629. {
  630. TPacketAffectElement & r = s_elements[i];
  631. row = mysql_fetch_row(pRes);
  632.  
  633. if (dwPID == 0)
  634. str_to_number(dwPID, row[0]);
  635.  
  636. str_to_number(r.dwType, row[1]);
  637. str_to_number(r.bApplyOn, row[2]);
  638. str_to_number(r.lApplyValue, row[3]);
  639. str_to_number(r.dwFlag, row[4]);
  640. str_to_number(r.lDuration, row[5]);
  641. str_to_number(r.lSPCost, row[6]);
  642. }
  643.  
  644. sys_log(0, "AFFECT_LOAD: count %d PID %u", s_elements.size(), dwPID);
  645.  
  646. DWORD dwCount = s_elements.size();
  647.  
  648. peer->EncodeHeader(HEADER_DG_AFFECT_LOAD, dwHandle, sizeof(DWORD) + sizeof(DWORD) + sizeof(TPacketAffectElement) * dwCount);
  649. peer->Encode(&dwPID, sizeof(DWORD));
  650. peer->Encode(&dwCount, sizeof(DWORD));
  651. peer->Encode(&s_elements[0], sizeof(TPacketAffectElement) * dwCount);
  652. }
  653.  
  654. void CClientManager::RESULT_QUEST_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD pid)
  655. {
  656. int iNumRows;
  657.  
  658. if ((iNumRows = mysql_num_rows(pRes)) == 0)
  659. {
  660. DWORD dwCount = 0;
  661. peer->EncodeHeader(HEADER_DG_QUEST_LOAD, dwHandle, sizeof(DWORD));
  662. peer->Encode(&dwCount, sizeof(DWORD));
  663. return;
  664. }
  665.  
  666. static std::vector<TQuestTable> s_table;
  667. s_table.resize(iNumRows);
  668.  
  669. MYSQL_ROW row;
  670.  
  671. for (int i = 0; i < iNumRows; ++i)
  672. {
  673. TQuestTable & r = s_table[i];
  674.  
  675. row = mysql_fetch_row(pRes);
  676.  
  677. str_to_number(r.dwPID, row[0]);
  678. strlcpy(r.szName, row[1], sizeof(r.szName));
  679. strlcpy(r.szState, row[2], sizeof(r.szState));
  680. str_to_number(r.lValue, row[3]);
  681. }
  682.  
  683. sys_log(0, "QUEST_LOAD: count %d PID %u", s_table.size(), s_table[0].dwPID);
  684.  
  685. DWORD dwCount = s_table.size();
  686.  
  687. peer->EncodeHeader(HEADER_DG_QUEST_LOAD, dwHandle, sizeof(DWORD) + sizeof(TQuestTable) * dwCount);
  688. peer->Encode(&dwCount, sizeof(DWORD));
  689. peer->Encode(&s_table[0], sizeof(TQuestTable) * dwCount);
  690. }
  691.  
  692. /*
  693. * PLAYER SAVE
  694. */
  695. void CClientManager::QUERY_PLAYER_SAVE(CPeer * peer, DWORD dwHandle, TPlayerTable * pkTab)
  696. {
  697. if (g_test_server)
  698. sys_log(0, "PLAYER_SAVE: %s", pkTab->name);
  699.  
  700. PutPlayerCache(pkTab);
  701. }
  702.  
  703. typedef std::map<DWORD, time_t> time_by_id_map_t;
  704. static time_by_id_map_t s_createTimeByAccountID;
  705.  
  706. /*
  707. * PLAYER CREATE
  708. */
  709. void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerCreatePacket* packet)
  710. {
  711. char queryStr[QUERY_MAX_LEN];
  712. int queryLen;
  713. int player_id;
  714.  
  715. time_by_id_map_t::iterator it = s_createTimeByAccountID.find(packet->account_id);
  716. if (it != s_createTimeByAccountID.end())
  717. {
  718. time_t curtime = time(0);
  719. if (curtime - it->second < 30)
  720. {
  721. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  722. return;
  723. }
  724. }
  725.  
  726. queryLen = snprintf(queryStr, sizeof(queryStr), "SELECT pid%u FROM player_index%s WHERE id=%d", packet->account_index + 1, GetTablePostfix(), packet->account_id);
  727. std::auto_ptr<SQLMsg> pMsg0(CDBManager::instance().DirectQuery(queryStr));
  728. if (pMsg0->Get()->uiNumRows != 0)
  729. {
  730. if (!pMsg0->Get()->pSQLResult)
  731. {
  732. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  733. return;
  734. }
  735.  
  736. MYSQL_ROW row = mysql_fetch_row(pMsg0->Get()->pSQLResult);
  737. DWORD dwPID = 0; str_to_number(dwPID, row[0]);
  738. if (row[0] && dwPID > 0)
  739. {
  740. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
  741. sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID);
  742. return;
  743. }
  744. }
  745. else
  746. {
  747. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  748. return;
  749. }
  750.  
  751. if (g_stLocale == "sjis")
  752. snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s' collate sjis_japanese_ci", GetTablePostfix(), packet->player_table.name);
  753. else
  754. snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s'", GetTablePostfix(), packet->player_table.name);
  755.  
  756. std::auto_ptr<SQLMsg> pMsg1(CDBManager::instance().DirectQuery(queryStr));
  757. if (pMsg1->Get()->uiNumRows)
  758. {
  759. if (!pMsg1->Get()->pSQLResult)
  760. {
  761. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  762. return;
  763. }
  764.  
  765. MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult);
  766. if (*row[0] != '0')
  767. {
  768. sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr);
  769. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
  770. return;
  771. }
  772. }
  773. else
  774. {
  775. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  776. return;
  777. }
  778.  
  779. queryLen = snprintf(queryStr, sizeof(queryStr),
  780. "INSERT INTO player%s "
  781. "(id, account_id, name, level, st, ht, dx, iq, "
  782. "job, voice, dir, x, y, z, "
  783. "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, part_acce, gold, playtime, "
  784. "skill_level, quickslot) "
  785. "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, "
  786. "%d, %d, %d, %d, %d, %d, %d, "
  787. // "%d, %d, %d, %d, %d, %d, %d, %d, 0, %lld, 0, ", //Ezzel kellene jónak lennie hisz long long
  788. "%d, %d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", //De mégis ezzel jó... És ki tudja ami ezt okozta okozott-e más hibát is....
  789. GetTablePostfix(),
  790. packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq,
  791. packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z,
  792. packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold);
  793.  
  794. sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", //amúgy itt meg full jó, 0-nak logolja a syslogba
  795. packet->account_id,
  796. packet->player_table.name,
  797. packet->player_table.level,
  798. packet->player_table.gold,
  799. packet->player_table.st,
  800. packet->player_table.ht,
  801. packet->player_table.job);
  802.  
  803. static char text[4096 + 1];
  804.  
  805. CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills));
  806. queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text);
  807. if (g_test_server)
  808. sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
  809.  
  810. CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot));
  811. queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text);
  812.  
  813. std::auto_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr));
  814. if (g_test_server)
  815. sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
  816.  
  817. if (pMsg2->Get()->uiAffectedRows <= 0)
  818. {
  819. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
  820. sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows);
  821. return;
  822. }
  823.  
  824. player_id = pMsg2->Get()->uiInsertID;
  825.  
  826. snprintf(queryStr, sizeof(queryStr), "UPDATE player_index%s SET pid%d=%d WHERE id=%d", GetTablePostfix(), packet->account_index + 1, player_id, packet->account_id);
  827. std::auto_ptr<SQLMsg> pMsg3(CDBManager::instance().DirectQuery(queryStr));
  828. if (pMsg3->Get()->uiAffectedRows <= 0)
  829. {
  830. sys_err("QUERY_ERROR: %s", queryStr);
  831.  
  832. snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id);
  833. CDBManager::instance().DirectQuery(queryStr);
  834.  
  835. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  836. return;
  837. }
  838.  
  839. TPacketDGCreateSuccess pack;
  840. memset(&pack, 0, sizeof(pack));
  841.  
  842. pack.bAccountCharacterIndex = packet->account_index;
  843. pack.player.dwID = player_id;
  844. strlcpy(pack.player.szName, packet->player_table.name, sizeof(pack.player.szName));
  845. pack.player.byJob = packet->player_table.job;
  846. pack.player.byLevel = 1;
  847. pack.player.dwPlayMinutes = 0;
  848. pack.player.byST = packet->player_table.st;
  849. pack.player.byHT = packet->player_table.ht;
  850. pack.player.byDX = packet->player_table.dx;
  851. pack.player.byIQ = packet->player_table.iq;
  852. pack.player.wMainPart = packet->player_table.part_base;
  853. pack.player.x = packet->player_table.x;
  854. pack.player.y = packet->player_table.y;
  855.  
  856. peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess));
  857. peer->Encode(&pack, sizeof(TPacketDGCreateSuccess));
  858.  
  859. sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob);
  860. s_createTimeByAccountID[packet->account_id] = time(0);
  861. }
  862.  
  863. /*
  864. * PLAYER DELETE
  865. */
  866. void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerDeletePacket* packet)
  867. {
  868. if (!packet->login[0] || !packet->player_id || packet->account_index >= PLAYER_PER_ACCOUNT)
  869. return;
  870.  
  871. CLoginData * ld = GetLoginDataByLogin(packet->login);
  872.  
  873. if (!ld)
  874. {
  875. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
  876. peer->EncodeBYTE(packet->account_index);
  877. return;
  878. }
  879.  
  880. TAccountTable & r = ld->GetAccountRef();
  881.  
  882. // block for japan
  883. if (g_stLocale != "sjis")
  884. {
  885. if (!IsChinaEventServer())
  886. {
  887. if (strlen(r.social_id) < 7 || strncmp(packet->private_code, r.social_id + strlen(r.social_id) - 7, 7))
  888. {
  889. sys_log(0, "PLAYER_DELETE FAILED len(%d)", strlen(r.social_id));
  890. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
  891. peer->EncodeBYTE(packet->account_index);
  892. return;
  893. }
  894.  
  895. CPlayerTableCache * pkPlayerCache = GetPlayerCache(packet->player_id);
  896. if (pkPlayerCache)
  897. {
  898. TPlayerTable * pTab = pkPlayerCache->Get();
  899.  
  900. if (pTab->level >= m_iPlayerDeleteLevelLimit)
  901. {
  902. sys_log(0, "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimit);
  903. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
  904. peer->EncodeBYTE(packet->account_index);
  905. return;
  906. }
  907.  
  908. if (pTab->level < m_iPlayerDeleteLevelLimitLower)
  909. {
  910. sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimitLower);
  911. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
  912. peer->EncodeBYTE(packet->account_index);
  913. return;
  914. }
  915. }
  916. }
  917. }
  918.  
  919. char szQuery[128];
  920. snprintf(szQuery, sizeof(szQuery), "SELECT p.id, p.level, p.name FROM player_index%s AS i, player%s AS p WHERE pid%u=%u AND pid%u=p.id",
  921. GetTablePostfix(), GetTablePostfix(), packet->account_index + 1, packet->player_id, packet->account_index + 1);
  922.  
  923. ClientHandleInfo * pi = new ClientHandleInfo(dwHandle, packet->player_id);
  924. pi->account_index = packet->account_index;
  925.  
  926. sys_log(0, "PLAYER_DELETE TRY: %s %d pid%d", packet->login, packet->player_id, packet->account_index + 1);
  927. CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_DELETE, peer->GetHandle(), pi);
  928. }
  929.  
  930. //
  931. // @version 05/06/10 Bang2ni - ÇĂ·ąŔĚľî »čÁ¦˝Ă °ˇ°ÝÁ¤ş¸ ¸®˝şĆ® »čÁ¦ Ăß°ˇ.
  932. //
  933. void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
  934. {
  935. CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  936. ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData;
  937.  
  938. if (msg->Get() && msg->Get()->uiNumRows)
  939. {
  940. MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);
  941.  
  942. DWORD dwPID = 0;
  943. str_to_number(dwPID, row[0]);
  944.  
  945. int deletedLevelLimit = 0;
  946. str_to_number(deletedLevelLimit, row[1]);
  947.  
  948. char szName[64];
  949. strlcpy(szName, row[2], sizeof(szName));
  950.  
  951. if (deletedLevelLimit >= m_iPlayerDeleteLevelLimit && !IsChinaEventServer())
  952. {
  953. sys_log(0, "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimit);
  954. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
  955. peer->EncodeBYTE(pi->account_index);
  956. return;
  957. }
  958.  
  959. if (deletedLevelLimit < m_iPlayerDeleteLevelLimitLower)
  960. {
  961. sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimitLower);
  962. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
  963. peer->EncodeBYTE(pi->account_index);
  964. return;
  965. }
  966.  
  967. char queryStr[QUERY_MAX_LEN];
  968.  
  969. snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s_deleted SELECT * FROM player%s WHERE id=%d",
  970. GetTablePostfix(), GetTablePostfix(), pi->player_id);
  971. std::auto_ptr<SQLMsg> pIns(CDBManager::instance().DirectQuery(queryStr));
  972.  
  973. if (pIns->Get()->uiAffectedRows == 0 || pIns->Get()->uiAffectedRows == (uint32_t)-1)
  974. {
  975. sys_log(0, "PLAYER_DELETE FAILED %u CANNOT INSERT TO player%s_deleted", dwPID, GetTablePostfix());
  976.  
  977. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
  978. peer->EncodeBYTE(pi->account_index);
  979. return;
  980. }
  981.  
  982. // »čÁ¦ Ľş°ř
  983. sys_log(0, "PLAYER_DELETE SUCCESS %u", dwPID);
  984.  
  985. char account_index_string[16];
  986.  
  987. snprintf(account_index_string, sizeof(account_index_string), "player_id%d", m_iPlayerIDStart + pi->account_index);
  988.  
  989. // ÇĂ·ąŔĚľî Ĺ×ŔĚşíŔ» Äł˝¬żˇĽ­ »čÁ¦ÇŃ´Ů.
  990. CPlayerTableCache * pkPlayerCache = GetPlayerCache(pi->player_id);
  991.  
  992. if (pkPlayerCache)
  993. {
  994. m_map_playerCache.erase(pi->player_id);
  995. delete pkPlayerCache;
  996. }
  997.  
  998. // ľĆŔĚĹ۵éŔ» Äł˝¬żˇĽ­ »čÁ¦ÇŃ´Ů.
  999. TItemCacheSet * pSet = GetItemCacheSet(pi->player_id);
  1000.  
  1001. if (pSet)
  1002. {
  1003. TItemCacheSet::iterator it = pSet->begin();
  1004.  
  1005. while (it != pSet->end())
  1006. {
  1007. CItemCache * pkItemCache = *it++;
  1008. DeleteItemCache(pkItemCache->Get()->id);
  1009. }
  1010.  
  1011. pSet->clear();
  1012. delete pSet;
  1013.  
  1014. m_map_pkItemCacheSetPtr.erase(pi->player_id);
  1015. }
  1016.  
  1017. snprintf(queryStr, sizeof(queryStr), "UPDATE player_index%s SET pid%u=0 WHERE pid%u=%d",
  1018. GetTablePostfix(),
  1019. pi->account_index + 1,
  1020. pi->account_index + 1,
  1021. pi->player_id);
  1022.  
  1023. std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(queryStr));
  1024.  
  1025. if (pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1)
  1026. {
  1027. sys_log(0, "PLAYER_DELETE FAIL WHEN UPDATE account table");
  1028. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
  1029. peer->EncodeBYTE(pi->account_index);
  1030. return;
  1031. }
  1032.  
  1033. snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), pi->player_id);
  1034. delete CDBManager::instance().DirectQuery(queryStr);
  1035.  
  1036. snprintf(queryStr, sizeof(queryStr), "DELETE FROM item%s WHERE owner_id=%d AND (window < %d or window = %d)", GetTablePostfix(), pi->player_id, SAFEBOX, DRAGON_SOUL_INVENTORY);
  1037. delete CDBManager::instance().DirectQuery(queryStr);
  1038.  
  1039. snprintf(queryStr, sizeof(queryStr), "DELETE FROM quest%s WHERE dwPID=%d", GetTablePostfix(), pi->player_id);
  1040. CDBManager::instance().AsyncQuery(queryStr);
  1041.  
  1042. snprintf(queryStr, sizeof(queryStr), "DELETE FROM affect%s WHERE dwPID=%d", GetTablePostfix(), pi->player_id);
  1043. CDBManager::instance().AsyncQuery(queryStr);
  1044.  
  1045. snprintf(queryStr, sizeof(queryStr), "DELETE FROM guild_member%s WHERE pid=%d", GetTablePostfix(), pi->player_id);
  1046. CDBManager::instance().AsyncQuery(queryStr);
  1047.  
  1048. // MYSHOP_PRICE_LIST
  1049. snprintf(queryStr, sizeof(queryStr), "DELETE FROM myshop_pricelist%s WHERE owner_id=%d", GetTablePostfix(), pi->player_id);
  1050. CDBManager::instance().AsyncQuery(queryStr);
  1051. // END_OF_MYSHOP_PRICE_LIST
  1052.  
  1053. snprintf(queryStr, sizeof(queryStr), "DELETE FROM messenger_list%s WHERE account='%s' OR companion='%s'", GetTablePostfix(), szName, szName);
  1054. CDBManager::instance().AsyncQuery(queryStr);
  1055.  
  1056. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_SUCCESS, pi->dwHandle, 1);
  1057. peer->EncodeBYTE(pi->account_index);
  1058. }
  1059. else
  1060. {
  1061. // »čÁ¦ ˝ÇĆĐ
  1062. sys_log(0, "PLAYER_DELETE FAIL NO ROW");
  1063. peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
  1064. peer->EncodeBYTE(pi->account_index);
  1065. }
  1066. }
  1067.  
  1068. void CClientManager::QUERY_ADD_AFFECT(CPeer * peer, TPacketGDAddAffect * p)
  1069. {
  1070. char queryStr[QUERY_MAX_LEN];
  1071. /*
  1072. snprintf(queryStr, sizeof(queryStr),
  1073. "INSERT INTO affect%s (dwPID, bType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost) "
  1074. "VALUES(%u, %u, %u, %d, %u, %d, %d) "
  1075. "ON DUPLICATE KEY UPDATE lApplyValue=%d, dwFlag=%u, lDuration=%d, lSPCost=%d",
  1076. GetTablePostfix(),
  1077. p->dwPID,
  1078. p->elem.dwType,
  1079. p->elem.bApplyOn,
  1080. p->elem.lApplyValue,
  1081. p->elem.dwFlag,
  1082. p->elem.lDuration,
  1083. p->elem.lSPCost,
  1084. p->elem.lApplyValue,
  1085. p->elem.dwFlag,
  1086. p->elem.lDuration,
  1087. p->elem.lSPCost);
  1088. */
  1089. snprintf(queryStr, sizeof(queryStr),
  1090. "REPLACE INTO affect%s (dwPID, bType, bApplyOn, lApplyValue, dwFlag, lDuration, lSPCost) "
  1091. "VALUES(%u, %u, %u, %ld, %u, %ld, %ld)",
  1092. GetTablePostfix(),
  1093. p->dwPID,
  1094. p->elem.dwType,
  1095. p->elem.bApplyOn,
  1096. p->elem.lApplyValue,
  1097. p->elem.dwFlag,
  1098. p->elem.lDuration,
  1099. p->elem.lSPCost);
  1100.  
  1101. CDBManager::instance().AsyncQuery(queryStr);
  1102. }
  1103.  
  1104. void CClientManager::QUERY_REMOVE_AFFECT(CPeer * peer, TPacketGDRemoveAffect * p)
  1105. {
  1106. char queryStr[QUERY_MAX_LEN];
  1107.  
  1108. snprintf(queryStr, sizeof(queryStr),
  1109. "DELETE FROM affect%s WHERE dwPID=%u AND bType=%u AND bApplyOn=%u",
  1110. GetTablePostfix(), p->dwPID, p->dwType, p->bApplyOn);
  1111.  
  1112. CDBManager::instance().AsyncQuery(queryStr);
  1113. }
  1114.  
  1115.  
  1116. void CClientManager::QUERY_HIGHSCORE_REGISTER(CPeer* peer, TPacketGDHighscore * data)
  1117. {
  1118. char szQuery[128];
  1119. snprintf(szQuery, sizeof(szQuery), "SELECT value FROM highscore%s WHERE board='%s' AND pid = %u", GetTablePostfix(), data->szBoard, data->dwPID);
  1120.  
  1121. sys_log(0, "HEADER_GD_HIGHSCORE_REGISTER: PID %u", data->dwPID);
  1122.  
  1123. ClientHandleInfo * pi = new ClientHandleInfo(0);
  1124. strlcpy(pi->login, data->szBoard, sizeof(pi->login));
  1125. pi->account_id = (DWORD)data->lValue;
  1126. pi->player_id = data->dwPID;
  1127. pi->account_index = (data->cDir > 0);
  1128.  
  1129. CDBManager::instance().ReturnQuery(szQuery, QID_HIGHSCORE_REGISTER, peer->GetHandle(), pi);
  1130. }
  1131.  
  1132. void CClientManager::RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg)
  1133. {
  1134. CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  1135. ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData;
  1136. //DWORD dwHandle = pi->dwHandle;
  1137.  
  1138. char szBoard[21];
  1139. strlcpy(szBoard, pi->login, sizeof(szBoard));
  1140. int value = (int)pi->account_id;
  1141.  
  1142. SQLResult * res = msg->Get();
  1143.  
  1144. if (res->uiNumRows == 0)
  1145. {
  1146. // »ő·Îżî ÇĎŔĚ˝şÄھ »đŔÔ
  1147. char buf[256];
  1148. snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
  1149. CDBManager::instance().AsyncQuery(buf);
  1150. }
  1151. else
  1152. {
  1153. if (!res->pSQLResult)
  1154. {
  1155. delete pi;
  1156. return;
  1157. }
  1158.  
  1159. MYSQL_ROW row = mysql_fetch_row(res->pSQLResult);
  1160. if (row && row[0])
  1161. {
  1162. int current_value = 0; str_to_number(current_value, row[0]);
  1163. if (pi->account_index && current_value >= value || !pi->account_index && current_value <= value)
  1164. {
  1165. value = current_value;
  1166. }
  1167. else
  1168. {
  1169. char buf[256];
  1170. snprintf(buf, sizeof(buf), "REPLACE INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
  1171. CDBManager::instance().AsyncQuery(buf);
  1172. }
  1173. }
  1174. else
  1175. {
  1176. char buf[256];
  1177. snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
  1178. CDBManager::instance().AsyncQuery(buf);
  1179. }
  1180. }
  1181. // TODO: Ŕ̰÷żˇĽ­ ÇĎŔĚ˝şÄÚľî°ˇ ľ÷µĄŔĚĆ® µÇľú´ÂÁö ĂĽĹ©ÇĎż© °řÁö¸¦ »Ń·ÁľßÇŃ´Ů.
  1182. delete pi;
  1183. }
  1184.  
  1185. void CClientManager::InsertLogoutPlayer(DWORD pid)
  1186. {
  1187. TLogoutPlayerMap::iterator it = m_map_logout.find(pid);
  1188.  
  1189. // Á¸ŔçÇĎÁö ľĘŔ»°ćżě Ăß°ˇ
  1190. if (it != m_map_logout.end())
  1191. {
  1192. // Á¸ŔçÇҰćżě ˝Ă°Ł¸¸ °»˝Ĺ
  1193. if (g_log)
  1194. sys_log(0, "LOGOUT: Update player time pid(%d)", pid);
  1195.  
  1196. it->second->time = time(0);
  1197. return;
  1198. }
  1199.  
  1200. TLogoutPlayer * pLogout = new TLogoutPlayer;
  1201. pLogout->pid = pid;
  1202. pLogout->time = time(0);
  1203. m_map_logout.insert(std::make_pair(pid, pLogout));
  1204.  
  1205. if (g_log)
  1206. sys_log(0, "LOGOUT: Insert player pid(%d)", pid);
  1207. }
  1208.  
  1209. void CClientManager::DeleteLogoutPlayer(DWORD pid)
  1210. {
  1211. TLogoutPlayerMap::iterator it = m_map_logout.find(pid);
  1212.  
  1213. if (it != m_map_logout.end())
  1214. {
  1215. delete it->second;
  1216. m_map_logout.erase(it);
  1217. }
  1218. }
  1219.  
  1220. extern int g_iLogoutSeconds;
  1221.  
  1222. void CClientManager::UpdateLogoutPlayer()
  1223. {
  1224. time_t now = time(0);
  1225.  
  1226. TLogoutPlayerMap::iterator it = m_map_logout.begin();
  1227.  
  1228. while (it != m_map_logout.end())
  1229. {
  1230. TLogoutPlayer* pLogout = it->second;
  1231.  
  1232. if (now - g_iLogoutSeconds > pLogout->time)
  1233. {
  1234. FlushItemCacheSet(pLogout->pid);
  1235. FlushPlayerCacheSet(pLogout->pid);
  1236.  
  1237. delete pLogout;
  1238. m_map_logout.erase(it++);
  1239. }
  1240. else
  1241. ++it;
  1242. }
  1243. }
  1244.  
  1245. void CClientManager::FlushPlayerCacheSet(DWORD pid)
  1246. {
  1247. TPlayerTableCacheMap::iterator it = m_map_playerCache.find(pid);
  1248.  
  1249. if (it != m_map_playerCache.end())
  1250. {
  1251. CPlayerTableCache * c = it->second;
  1252. m_map_playerCache.erase(it);
  1253.  
  1254. c->Flush();
  1255. delete c;
  1256. }
  1257. }
Advertisement
Add Comment
Please, Sign In to add comment