- Service.h veya CommonDefines.h
- Ekle:
- #define REBOOT_LATER_RELOAD_ITEMS_PLAYER // Kaybolan Eşyaların Geri Yüklenmesi
- ClinetManagerPlayer.cpp
- Arat:
- bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DWORD dwPID)
- {
- if (!res)
- {
- pVec->clear();
- return true;
- }
- int rows;
- if ((rows = mysql_num_rows(res)) <= 0) // µ¥ÀÌÅÍ ¾øÀ½
- {
- pVec->clear();
- return true;
- }
- pVec->resize(rows);
- Altına Ekle:
- #ifdef REBOOT_LATER_RELOAD_ITEMS_PLAYER
- std::vector<DWORD> m_recovery;
- std::vector<DWORD>::iterator it;
- char queryStr[256];
- bool bIsLoaded = false;
- sprintf(queryStr, "SELECT load_items FROM player WHERE id = %d", dwPID);
- std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(queryStr));
- SQLResult * pRes = pkMsg->Get();
- if (pRes->uiNumRows)
- {
- MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
- bIsLoaded = atoi(row[0]);
- if (!bIsLoaded)
- {
- sprintf(queryStr, "UPDATE player SET load_items = 1 WHERE id = %d", dwPID);
- CDBManager::instance().DirectQuery(queryStr);
- }
- }
- for (int i = 0; i < rows; ++i)
- {
- MYSQL_ROW row = mysql_fetch_row(res);
- DWORD dwCount = 0;
- DWORD dwReelPos = 0;
- if (!bIsLoaded)
- {
- it = find(m_recovery.begin(), m_recovery.end(), atoi(row[0]));
- if (it != m_recovery.end())
- continue;
- 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);
- std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(queryStr));
- pRes = pkMsg->Get();
- if (pRes->uiNumRows > 1)
- {
- MYSQL_ROW row2 = mysql_fetch_row(pRes->pSQLResult);
- while ((row2 = mysql_fetch_row(pRes->pSQLResult)) != NULL)
- {
- dwCount += atoi(row2[4]);
- sprintf(queryStr, "DELETE FROM item WHERE id = %d", atoi(row2[0]));
- CDBManager::instance().DirectQuery(queryStr);
- m_recovery.push_back(atoi(row2[0]));
- }
- }
- sprintf(queryStr, "SELECT id FROM item WHERE pos = %d and window = %d and owner_id = %d", atoi(row[2]), atoi(row[1]), dwPID);
- std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(queryStr));
- pRes = pkMsg2->Get();
- if (pRes->uiNumRows > 1)
- {
- DWORD dwPos = atoi(row[2]);
- for (int i = 0; i < 180; ++i)
- {
- dwPos++;
- sprintf(queryStr, "SELECT id FROM item WHERE window = %d and owner_id = %d and pos = %d", atoi(row[1]), dwPID, dwPos);
- std::unique_ptr<SQLMsg> pkMsg3(CDBManager::instance().DirectQuery(queryStr));
- SQLResult * pRes2 = pkMsg3->Get();
- if (!pRes2->uiNumRows)
- break;
- }
- sprintf(queryStr, "UPDATE item SET pos = %d WHERE id = %d", dwPos, atoi(row[0]));
- CDBManager::instance().DirectQuery(queryStr);
- dwReelPos = dwPos;
- }
- }
- TPlayerItem & item = pVec->at(i);
- int cur = 0;
- str_to_number(item.id, row[cur++]);
- str_to_number(item.window, row[cur++]);
- if (dwReelPos)
- {
- item.pos = dwReelPos;
- cur++;
- }
- else
- str_to_number(item.pos, row[cur++]);
- str_to_number(item.count, row[cur++]);
- item.count += dwCount;
- str_to_number(item.vnum, row[cur++]);
- str_to_number(item.is_basic, row[cur++]);
- #ifdef __ENABLE_CHANGELOOK_SYSTEM__
- str_to_number(item.transmutation, row[cur++]);
- #endif
- str_to_number(item.alSockets[0], row[cur++]);
- str_to_number(item.alSockets[1], row[cur++]);
- str_to_number(item.alSockets[2], row[cur++]);
- str_to_number(item.alSockets[3], row[cur++]);
- #ifdef ENABLE_PET_SYSTEM
- str_to_number(item.alSockets[4], row[cur++]);
- str_to_number(item.alSockets[5], row[cur++]);
- #endif
- for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)
- {
- str_to_number(item.aAttr[j].bType, row[cur++]);
- str_to_number(item.aAttr[j].sValue, row[cur++]);
- }
- #ifdef __ENABLE_SOULBIND_SYSTEM__
- str_to_number(item.sealbind, row[cur++]);
- #endif
- item.owner = dwPID;
- }
- #else
- for (int i = 0; i < rows; ++i)
- {
- MYSQL_ROW row = mysql_fetch_row(res);
- TPlayerItem & item = pVec->at(i);
- int cur = 0;
- // Check all SELECT syntax on item table before change this function!!!
- // Check all SELECT syntax on item table before change this function!!!
- // Check all SELECT syntax on item table before change this function!!!
- str_to_number(item.id, row[cur++]);
- str_to_number(item.window, row[cur++]);
- str_to_number(item.pos, row[cur++]);
- str_to_number(item.count, row[cur++]);
- str_to_number(item.vnum, row[cur++]);
- str_to_number(item.is_basic, row[cur++]);
- #ifdef __ENABLE_CHANGELOOK_SYSTEM__
- str_to_number(item.transmutation, row[cur++]);
- #endif
- str_to_number(item.alSockets[0], row[cur++]);
- str_to_number(item.alSockets[1], row[cur++]);
- str_to_number(item.alSockets[2], row[cur++]);
- str_to_number(item.alSockets[3], row[cur++]);
- #ifdef ENABLE_PET_SYSTEM
- str_to_number(item.alSockets[4], row[cur++]);
- str_to_number(item.alSockets[5], row[cur++]);
- #endif
- for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)
- {
- str_to_number(item.aAttr[j].bType, row[cur++]);
- str_to_number(item.aAttr[j].sValue, row[cur++]);
- }
- #ifdef __ENABLE_SOULBIND_SYSTEM__
- str_to_number(item.sealbind, row[cur++]);
- #endif
- #ifdef ENABLE_RENTITEM_SYSTEM
- str_to_number(item.dwRentTime, row[cur++]);
- str_to_number(item.dwRentOwner, row[cur++]);
- #endif
- item.owner = dwPID;
- }
- #endif
- return true;
- }