1. Service.h veya CommonDefines.h
  2. Ekle:
  3. #define REBOOT_LATER_RELOAD_ITEMS_PLAYER // Kaybolan Eşyaların Geri Yüklenmesi
  4. ClinetManagerPlayer.cpp
  5. Arat:
  6. bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DWORD dwPID)
  7. {
  8. if (!res)
  9. {
  10. pVec->clear();
  11. return true;
  12. }
  13. int rows;
  14. if ((rows = mysql_num_rows(res)) <= 0) // µ¥ÀÌÅÍ ¾øÀ½
  15. {
  16. pVec->clear();
  17. return true;
  18. }
  19. pVec->resize(rows);
  20. Altına Ekle:
  21. #ifdef REBOOT_LATER_RELOAD_ITEMS_PLAYER
  22. std::vector<DWORD> m_recovery;
  23. std::vector<DWORD>::iterator it;
  24. char queryStr[256];
  25. bool bIsLoaded = false;
  26. sprintf(queryStr, "SELECT load_items FROM player WHERE id = %d", dwPID);
  27. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(queryStr));
  28. SQLResult * pRes = pkMsg->Get();
  29. if (pRes->uiNumRows)
  30. {
  31. MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
  32. bIsLoaded = atoi(row[0]);
  33. if (!bIsLoaded)
  34. {
  35. sprintf(queryStr, "UPDATE player SET load_items = 1 WHERE id = %d", dwPID);
  36. CDBManager::instance().DirectQuery(queryStr);
  37. }
  38. }
  39. for (int i = 0; i < rows; ++i)
  40. {
  41. MYSQL_ROW row = mysql_fetch_row(res);
  42. DWORD dwCount = 0;
  43. DWORD dwReelPos = 0;
  44. if (!bIsLoaded)
  45. {
  46. it = find(m_recovery.begin(), m_recovery.end(), atoi(row[0]));
  47. if (it != m_recovery.end())
  48. continue;
  49. sprintf(queryStr, "SELECT * FROM item WHERE pos = %d and vnum = %d and window = %d and owner_id = %d", atoi(row[2]), atoi(row[4]), atoi(row[1]), dwPID);
  50. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(queryStr));
  51. pRes = pkMsg->Get();
  52. if (pRes->uiNumRows > 1)
  53. {
  54. MYSQL_ROW row2 = mysql_fetch_row(pRes->pSQLResult);
  55. while ((row2 = mysql_fetch_row(pRes->pSQLResult)) != NULL)
  56. {
  57. dwCount += atoi(row2[4]);
  58. sprintf(queryStr, "DELETE FROM item WHERE id = %d", atoi(row2[0]));
  59. CDBManager::instance().DirectQuery(queryStr);
  60. m_recovery.push_back(atoi(row2[0]));
  61. }
  62. }
  63. sprintf(queryStr, "SELECT id FROM item WHERE pos = %d and window = %d and owner_id = %d", atoi(row[2]), atoi(row[1]), dwPID);
  64. std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(queryStr));
  65. pRes = pkMsg2->Get();
  66. if (pRes->uiNumRows > 1)
  67. {
  68. DWORD dwPos = atoi(row[2]);
  69. for (int i = 0; i < 180; ++i)
  70. {
  71. dwPos++;
  72. sprintf(queryStr, "SELECT id FROM item WHERE window = %d and owner_id = %d and pos = %d", atoi(row[1]), dwPID, dwPos);
  73. std::unique_ptr<SQLMsg> pkMsg3(CDBManager::instance().DirectQuery(queryStr));
  74. SQLResult * pRes2 = pkMsg3->Get();
  75. if (!pRes2->uiNumRows)
  76. break;
  77. }
  78. sprintf(queryStr, "UPDATE item SET pos = %d WHERE id = %d", dwPos, atoi(row[0]));
  79. CDBManager::instance().DirectQuery(queryStr);
  80. dwReelPos = dwPos;
  81. }
  82. }
  83. TPlayerItem & item = pVec->at(i);
  84. int cur = 0;
  85. str_to_number(item.id, row[cur++]);
  86. str_to_number(item.window, row[cur++]);
  87. if (dwReelPos)
  88. {
  89. item.pos = dwReelPos;
  90. cur++;
  91. }
  92. else
  93. str_to_number(item.pos, row[cur++]);
  94. str_to_number(item.count, row[cur++]);
  95. item.count += dwCount;
  96. str_to_number(item.vnum, row[cur++]);
  97. str_to_number(item.is_basic, row[cur++]);
  98. #ifdef __ENABLE_CHANGELOOK_SYSTEM__
  99. str_to_number(item.transmutation, row[cur++]);
  100. #endif
  101. str_to_number(item.alSockets[0], row[cur++]);
  102. str_to_number(item.alSockets[1], row[cur++]);
  103. str_to_number(item.alSockets[2], row[cur++]);
  104. str_to_number(item.alSockets[3], row[cur++]);
  105. #ifdef ENABLE_PET_SYSTEM
  106. str_to_number(item.alSockets[4], row[cur++]);
  107. str_to_number(item.alSockets[5], row[cur++]);
  108. #endif
  109. for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)
  110. {
  111. str_to_number(item.aAttr[j].bType, row[cur++]);
  112. str_to_number(item.aAttr[j].sValue, row[cur++]);
  113. }
  114. #ifdef __ENABLE_SOULBIND_SYSTEM__
  115. str_to_number(item.sealbind, row[cur++]);
  116. #endif
  117. item.owner = dwPID;
  118. }
  119. #else
  120. for (int i = 0; i < rows; ++i)
  121. {
  122. MYSQL_ROW row = mysql_fetch_row(res);
  123. TPlayerItem & item = pVec->at(i);
  124. int cur = 0;
  125. // Check all SELECT syntax on item table before change this function!!!
  126. // Check all SELECT syntax on item table before change this function!!!
  127. // Check all SELECT syntax on item table before change this function!!!
  128. str_to_number(item.id, row[cur++]);
  129. str_to_number(item.window, row[cur++]);
  130. str_to_number(item.pos, row[cur++]);
  131. str_to_number(item.count, row[cur++]);
  132. str_to_number(item.vnum, row[cur++]);
  133. str_to_number(item.is_basic, row[cur++]);
  134. #ifdef __ENABLE_CHANGELOOK_SYSTEM__
  135. str_to_number(item.transmutation, row[cur++]);
  136. #endif
  137. str_to_number(item.alSockets[0], row[cur++]);
  138. str_to_number(item.alSockets[1], row[cur++]);
  139. str_to_number(item.alSockets[2], row[cur++]);
  140. str_to_number(item.alSockets[3], row[cur++]);
  141. #ifdef ENABLE_PET_SYSTEM
  142. str_to_number(item.alSockets[4], row[cur++]);
  143. str_to_number(item.alSockets[5], row[cur++]);
  144. #endif
  145. for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)
  146. {
  147. str_to_number(item.aAttr[j].bType, row[cur++]);
  148. str_to_number(item.aAttr[j].sValue, row[cur++]);
  149. }
  150. #ifdef __ENABLE_SOULBIND_SYSTEM__
  151. str_to_number(item.sealbind, row[cur++]);
  152. #endif
  153. #ifdef ENABLE_RENTITEM_SYSTEM
  154. str_to_number(item.dwRentTime, row[cur++]);
  155. str_to_number(item.dwRentOwner, row[cur++]);
  156. #endif
  157. item.owner = dwPID;
  158. }
  159. #endif
  160. return true;
  161. }