m2Farm2025

ClientManagerBoot.cpp

Sep 23rd, 2025
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 51.32 KB | None | 0 0
  1. // vim:ts=4 sw=4
  2. #include <map>
  3. #include <algorithm>
  4. #include "stdafx.h"
  5. #include "ClientManager.h"
  6. #include "Main.h"
  7. #include "Monarch.h"
  8. #include "CsvReader.h"
  9. #include "ProtoReader.h"
  10.  
  11. using namespace std;
  12.  
  13. extern int g_test_server;
  14. extern std::string g_stLocaleNameColumn;
  15.  
  16. bool CClientManager::InitializeTables()
  17. {
  18. if (!InitializeMobTable())
  19. {
  20. sys_err("InitializeMobTable FAILED");
  21. return false;
  22. }
  23. if (!MirrorMobTableIntoDB())
  24. {
  25. sys_err("MirrorMobTableIntoDB FAILED");
  26. return false;
  27. }
  28.  
  29. if (!InitializeItemTable())
  30. {
  31. sys_err("InitializeItemTable FAILED");
  32. return false;
  33. }
  34.  
  35. if (!MirrorItemTableIntoDB())
  36. {
  37. sys_err("MirrorItemTableIntoDB FAILED");
  38. return false;
  39. }
  40.  
  41. if (!InitializeShopTable())
  42. {
  43. sys_err("InitializeShopTable FAILED");
  44. return false;
  45. }
  46.  
  47. #ifdef ENABLE_GEM_SYSTEM
  48. if (!InitializeGemShopTable())
  49. {
  50. sys_err("InitializeGemShopTable FAILED");
  51. return false;
  52. }
  53. #endif
  54.  
  55. if (!InitializeSkillTable())
  56. {
  57. sys_err("InitializeSkillTable FAILED");
  58. return false;
  59. }
  60.  
  61. if (!InitializeRefineTable())
  62. {
  63. sys_err("InitializeRefineTable FAILED");
  64. return false;
  65. }
  66.  
  67. if (!InitializeItemAttrTable())
  68. {
  69. sys_err("InitializeItemAttrTable FAILED");
  70. return false;
  71. }
  72.  
  73. if (!InitializeItemRareTable())
  74. {
  75. sys_err("InitializeItemRareTable FAILED");
  76. return false;
  77. }
  78.  
  79. if (!InitializeBanwordTable())
  80. {
  81. sys_err("InitializeBanwordTable FAILED");
  82. return false;
  83. }
  84.  
  85. if (!InitializeLandTable())
  86. {
  87. sys_err("InitializeLandTable FAILED");
  88. return false;
  89. }
  90.  
  91. if (!InitializeObjectProto())
  92. {
  93. sys_err("InitializeObjectProto FAILED");
  94. return false;
  95. }
  96.  
  97. if (!InitializeObjectTable())
  98. {
  99. sys_err("InitializeObjectTable FAILED");
  100. return false;
  101. }
  102.  
  103. if (!InitializeMonarch())
  104. {
  105. sys_err("InitializeMonarch FAILED");
  106. return false;
  107. }
  108.  
  109.  
  110. return true;
  111. }
  112.  
  113. bool CClientManager::InitializeRefineTable()
  114. {
  115. char query[2048];
  116.  
  117. snprintf(query, sizeof(query),
  118. "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 FROM refine_proto%s",
  119. GetTablePostfix());
  120.  
  121. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  122. SQLResult * pRes = pkMsg->Get();
  123.  
  124. if (!pRes->uiNumRows)
  125. return true;
  126.  
  127. if (m_pRefineTable)
  128. {
  129. sys_log(0, "RELOAD: refine_proto");
  130. delete [] m_pRefineTable;
  131. m_pRefineTable = NULL;
  132. }
  133.  
  134. m_iRefineTableSize = pRes->uiNumRows;
  135.  
  136. m_pRefineTable = new TRefineTable[m_iRefineTableSize];
  137. memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
  138.  
  139. TRefineTable* prt = m_pRefineTable;
  140. MYSQL_ROW data;
  141.  
  142. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  143. {
  144. //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
  145. //"vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 "
  146.  
  147. int col = 0;
  148. //prt->src_vnum = atoi(data[col++]);
  149. //prt->result_vnum = atoi(data[col++]);
  150. str_to_number(prt->id, data[col++]);
  151. str_to_number(prt->cost, data[col++]);
  152. str_to_number(prt->prob, data[col++]);
  153.  
  154. for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
  155. {
  156. str_to_number(prt->materials[i].vnum, data[col++]);
  157. str_to_number(prt->materials[i].count, data[col++]);
  158. if (prt->materials[i].vnum == 0)
  159. {
  160. prt->material_count = i;
  161. break;
  162. }
  163. }
  164.  
  165. sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
  166.  
  167. prt++;
  168. }
  169. return true;
  170. }
  171.  
  172. class FCompareVnum
  173. {
  174. public:
  175. bool operator () (const TEntityTable & a, const TEntityTable & b) const
  176. {
  177. return (a.dwVnum < b.dwVnum);
  178. }
  179. };
  180.  
  181. bool CClientManager::InitializeMobTable()
  182. {
  183. //================== 함수 설명 ==================//
  184. //1. 요약 : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' 파일을 읽고,
  185. // (!)[mob_table] 테이블 오브젝트를 생성한다. (타입 : TMobTable)
  186. //2. 순서
  187. // 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
  188. // 2) 'mob_proto_test.txt'파일과 (a)[localMap] 맵으로
  189. // (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
  190. // 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
  191. // (!)[mob_table] 테이블을 만든다.
  192. // <참고>
  193. // 각 row 들 중,
  194. // (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row는
  195. // (b)[test_map_mobTableByVnum]의 것을 사용한다.
  196. // 4) (b)[test_map_mobTableByVnum]의 row중, (!)[mob_table]에 없는 것을 추가한다.
  197. //3. 테스트
  198. // 1)'mob_proto.txt' 정보가 mob_table에 잘 들어갔는지. -> 완료
  199. // 2)'mob_names.txt' 정보가 mob_table에 잘 들어갔는지.
  200. // 3)'mob_proto_test.txt' 에서 [겹치는] 정보가 mob_table 에 잘 들어갔는지.
  201. // 4)'mob_proto_test.txt' 에서 [새로운] 정보가 mob_table 에 잘 들어갔는지.
  202. // 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
  203. //_______________________________________________//
  204.  
  205.  
  206. //===============================================//
  207. // 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap] 맵을 만든다.
  208. //<(a)localMap 맵 생성>
  209. map<int,const char*> localMap;
  210. bool isNameFile = true;
  211. //<파일 읽기>
  212. cCsvTable nameData;
  213. if(!nameData.Load("mob_names.txt",'\t'))
  214. {
  215. fprintf(stderr, "mob_names.txt 파일을 읽어오지 못했습니다\n");
  216. isNameFile = false;
  217. } else {
  218. nameData.Next(); //설명row 생략.
  219. while(nameData.Next()) {
  220. localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  221. }
  222. }
  223. //________________________________________________//
  224.  
  225.  
  226. //===============================================//
  227. // 2) 'mob_proto_test.txt'파일과 (a)localMap 맵으로
  228. // (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
  229. //0.
  230. set<int> vnumSet; //테스트용 파일 데이터중, 신규여부 확인에 사용.
  231. //1. 파일 읽어오기
  232. bool isTestFile = true;
  233. cCsvTable test_data;
  234. if(!test_data.Load("mob_proto_test.txt",'\t'))
  235. {
  236. fprintf(stderr, "테스트 파일이 없습니다. 그대로 진행합니다.\n");
  237. isTestFile = false;
  238. }
  239. //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) 맵 생성.
  240. map<DWORD, TMobTable *> test_map_mobTableByVnum;
  241. if (isTestFile) {
  242. test_data.Next(); //설명 로우 넘어가기.
  243.  
  244. //ㄱ. 테스트 몬스터 테이블 생성.
  245. TMobTable * test_mob_table = NULL;
  246. int test_MobTableSize = test_data.m_File.GetRowCount()-1;
  247. test_mob_table = new TMobTable[test_MobTableSize];
  248. memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);
  249.  
  250. //ㄴ. 테스트 몬스터 테이블에 값을 넣고, 맵에까지 넣기.
  251. while(test_data.Next()) {
  252.  
  253. if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
  254. {
  255. fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");
  256. }
  257.  
  258. test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));
  259.  
  260.  
  261. ++test_mob_table;
  262. }
  263.  
  264. }
  265.  
  266. // 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
  267. // (!)[mob_table] 테이블을 만든다.
  268. // <참고>
  269. // 각 row 들 중,
  270. // (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row는
  271. // (b)[test_map_mobTableByVnum]의 것을 사용한다.
  272.  
  273. //1. 파일 읽기.
  274. cCsvTable data;
  275. if(!data.Load("mob_proto.txt",'\t')) {
  276. fprintf(stderr, "mob_proto.txt 파일을 읽어오지 못했습니다\n");
  277. return false;
  278. }
  279. data.Next(); //설명 row 넘어가기
  280. //2. (!)[mob_table] 생성하기
  281. //2.1 새로 추가되는 갯수를 파악
  282. int addNumber = 0;
  283. while(data.Next()) {
  284. int vnum = atoi(data.AsStringByIndex(0));
  285. std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
  286. it_map_mobTable = test_map_mobTableByVnum.find(vnum);
  287. if(it_map_mobTable != test_map_mobTableByVnum.end()) {
  288. addNumber++;
  289. }
  290. }
  291. //data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
  292. data.Destroy();
  293. if(!data.Load("mob_proto.txt",'\t'))
  294. {
  295. fprintf(stderr, "mob_proto.txt 파일을 읽어오지 못했습니다\n");
  296. return false;
  297. }
  298. data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
  299. //2.2 크기에 맞게 mob_table 생성
  300. if (!m_vec_mobTable.empty())
  301. {
  302. sys_log(0, "RELOAD: mob_proto");
  303. m_vec_mobTable.clear();
  304. }
  305. m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
  306. memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
  307. TMobTable * mob_table = &m_vec_mobTable[0];
  308. //2.3 데이터 채우기
  309. while (data.Next())
  310. {
  311. int col = 0;
  312. //(b)[test_map_mobTableByVnum]에 같은 row가 있는지 조사.
  313. bool isSameRow = true;
  314. std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
  315. it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
  316. if(it_map_mobTable == test_map_mobTableByVnum.end()) {
  317. isSameRow = false;
  318. }
  319. //같은 row 가 있으면 (b)에서 읽어온다.
  320. if(isSameRow) {
  321. TMobTable *tempTable = it_map_mobTable->second;
  322.  
  323. mob_table->dwVnum = tempTable->dwVnum;
  324. strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName));
  325. strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
  326. mob_table->bRank = tempTable->bRank;
  327. mob_table->bType = tempTable->bType;
  328. mob_table->bBattleType = tempTable->bBattleType;
  329. mob_table->bLevel = tempTable->bLevel;
  330. mob_table->bSize = tempTable->bSize;
  331. mob_table->dwAIFlag = tempTable->dwAIFlag;
  332. mob_table->dwRaceFlag = tempTable->dwRaceFlag;
  333. mob_table->dwImmuneFlag = tempTable->dwImmuneFlag;
  334. mob_table->bEmpire = tempTable->bEmpire;
  335. strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName));
  336. mob_table->bOnClickType = tempTable->bOnClickType;
  337. mob_table->bStr = tempTable->bStr;
  338. mob_table->bDex = tempTable->bDex;
  339. mob_table->bCon = tempTable->bCon;
  340. mob_table->bInt = tempTable->bInt;
  341. mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0];
  342. mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1];
  343. mob_table->dwMaxHP = tempTable->dwMaxHP;
  344. mob_table->bRegenCycle = tempTable->bRegenCycle;
  345. mob_table->bRegenPercent = tempTable->bRegenPercent;
  346. mob_table->dwGoldMin = tempTable->dwGoldMin;
  347. mob_table->dwGoldMax = tempTable->dwGoldMax;
  348. mob_table->dwExp = tempTable->dwExp;
  349. mob_table->wDef = tempTable->wDef;
  350. mob_table->sAttackSpeed = tempTable->sAttackSpeed;
  351. mob_table->sMovingSpeed = tempTable->sMovingSpeed;
  352. mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct;
  353. mob_table->wAggressiveSight = tempTable->wAggressiveSight;
  354. mob_table->wAttackRange = tempTable->wAttackRange;
  355.  
  356. mob_table->dwDropItemVnum = tempTable->dwDropItemVnum;
  357. mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum;
  358. for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
  359. mob_table->cEnchants[i] = tempTable->cEnchants[i];
  360.  
  361. for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
  362. mob_table->cResists[i] = tempTable->cResists[i];
  363.  
  364. mob_table->fDamMultiply = tempTable->fDamMultiply;
  365. mob_table->dwSummonVnum = tempTable->dwSummonVnum;
  366. mob_table->dwDrainSP = tempTable->dwDrainSP;
  367. mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum;
  368.  
  369.  
  370. mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel;
  371. mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum;
  372. mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel;
  373. mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum;
  374. mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel;
  375. mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum;
  376. mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel;
  377. mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum;
  378. mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel;
  379. mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum;
  380.  
  381. mob_table->bBerserkPoint = tempTable->bBerserkPoint;
  382. mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint;
  383. mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint;
  384. mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint;
  385. mob_table->bRevivePoint = tempTable->bRevivePoint;
  386. } else {
  387.  
  388. if (!Set_Proto_Mob_Table(mob_table, data, localMap))
  389. {
  390. fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");
  391. }
  392.  
  393.  
  394. }
  395.  
  396. //셋에 vnum 추가
  397. vnumSet.insert(mob_table->dwVnum);
  398.  
  399.  
  400. sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
  401. ++mob_table;
  402.  
  403. }
  404. //_____________________________________________________//
  405.  
  406.  
  407. // 4) (b)[test_map_mobTableByVnum]의 row중, (!)[mob_table]에 없는 것을 추가한다.
  408. //파일 다시 읽어오기.
  409. test_data.Destroy();
  410. isTestFile = true;
  411. test_data;
  412. if(!test_data.Load("mob_proto_test.txt",'\t'))
  413. {
  414. fprintf(stderr, "테스트 파일이 없습니다. 그대로 진행합니다.\n");
  415. isTestFile = false;
  416. }
  417. if(isTestFile) {
  418. test_data.Next(); //설명 로우 넘어가기.
  419.  
  420. while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
  421. {
  422. //중복되는 부분이면 넘어간다.
  423. set<int>::iterator itVnum;
  424. itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
  425. if (itVnum != vnumSet.end()) {
  426. continue;
  427. }
  428.  
  429. if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
  430. {
  431. fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");
  432. }
  433.  
  434. sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
  435. ++mob_table;
  436.  
  437. }
  438. }
  439. sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
  440. return true;
  441. }
  442.  
  443. bool CClientManager::InitializeShopTable()
  444. {
  445. MYSQL_ROW data;
  446. int col;
  447.  
  448. static const char * s_szQuery =
  449. "SELECT "
  450. "shop.vnum, "
  451. "shop.npc_vnum, "
  452. "shop_item.item_vnum, "
  453. "shop_item.count "
  454. "FROM shop LEFT JOIN shop_item "
  455. "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
  456.  
  457. std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
  458.  
  459. // shop의 vnum은 있는데 shop_item 이 없을경우... 실패로 처리되니 주의 요망.
  460. // 고처야할부분
  461. SQLResult * pRes2 = pkMsg2->Get();
  462.  
  463. if (!pRes2->uiNumRows)
  464. {
  465. sys_err("InitializeShopTable : Table count is zero.");
  466. return false;
  467. }
  468.  
  469. std::map<int, TShopTable *> map_shop;
  470.  
  471. if (m_pShopTable)
  472. {
  473. delete [] (m_pShopTable);
  474. m_pShopTable = NULL;
  475. }
  476.  
  477. TShopTable * shop_table = m_pShopTable;
  478.  
  479. while ((data = mysql_fetch_row(pRes2->pSQLResult)))
  480. {
  481. col = 0;
  482.  
  483. int iShopVnum = 0;
  484. str_to_number(iShopVnum, data[col++]);
  485.  
  486. if (map_shop.end() == map_shop.find(iShopVnum))
  487. {
  488. shop_table = new TShopTable;
  489. memset(shop_table, 0, sizeof(TShopTable));
  490. shop_table->dwVnum = iShopVnum;
  491.  
  492. map_shop[iShopVnum] = shop_table;
  493. }
  494. else
  495. shop_table = map_shop[iShopVnum];
  496.  
  497. str_to_number(shop_table->dwNPCVnum, data[col++]);
  498.  
  499. if (!data[col]) // 아이템이 하나도 없으면 NULL이 리턴 되므로..
  500. continue;
  501.  
  502. TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
  503.  
  504. str_to_number(pItem->vnum, data[col++]);
  505. str_to_number(pItem->count, data[col++]);
  506.  
  507. ++shop_table->byItemCount;
  508. }
  509.  
  510. m_pShopTable = new TShopTable[map_shop.size()];
  511. m_iShopTableSize = map_shop.size();
  512.  
  513. __typeof(map_shop.begin()) it = map_shop.begin();
  514.  
  515. int i = 0;
  516.  
  517. while (it != map_shop.end())
  518. {
  519. thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
  520. sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
  521. ++i;
  522. }
  523.  
  524. return true;
  525. }
  526.  
  527. #ifdef ENABLE_GEM_SYSTEM
  528. bool CClientManager::InitializeGemShopTable()
  529. {
  530. MYSQL_ROW data;
  531. int col;
  532.  
  533. static const char * s_szQuery = "SELECT id, vnum, count, price, row FROM gem_shop ORDER BY id";
  534. std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
  535.  
  536. SQLResult * pRes2 = pkMsg2->Get();
  537.  
  538. if (!pRes2->uiNumRows)
  539. {
  540. sys_err("InitializeGemShopTable : Table count is zero.");
  541. return false;
  542. }
  543.  
  544. std::map<int, TGemShopTable *> map_shop;
  545.  
  546. if (m_pGemShopTable)
  547. {
  548. //delete [] (m_pGemShopTable);
  549. m_pGemShopTable = NULL;
  550. }
  551.  
  552. TGemShopTable * shop_table = m_pGemShopTable;
  553.  
  554. while ((data = mysql_fetch_row(pRes2->pSQLResult)))
  555. {
  556. col = 0;
  557.  
  558. int iShopId = 0;
  559. str_to_number(iShopId, data[col++]);
  560.  
  561. if (map_shop.end() == map_shop.find(iShopId))
  562. {
  563. shop_table = new TGemShopTable;
  564. memset(shop_table, 0, sizeof(TGemShopTable));
  565.  
  566. str_to_number(shop_table->dwVnum, data[col++]);
  567. str_to_number(shop_table->bCount, data[col++]);
  568. str_to_number(shop_table->dwPrice, data[col++]);
  569. str_to_number(shop_table->dwRow, data[col++]);
  570.  
  571. map_shop[iShopId] = shop_table;
  572. }
  573. else
  574. {
  575. shop_table = map_shop[iShopId];
  576. }
  577.  
  578. if (!data[col])
  579. continue;
  580. }
  581.  
  582. m_pGemShopTable = new TGemShopTable[map_shop.size()];
  583. m_iGemShopTableSize = map_shop.size();
  584.  
  585. __typeof(map_shop.begin()) it = map_shop.begin();
  586.  
  587. int i = 0;
  588.  
  589. while (it != map_shop.end())
  590. {
  591. thecore_memcpy((m_pGemShopTable + i), (it++)->second, sizeof(TGemShopTable));
  592. ++i;
  593. }
  594.  
  595. return true;
  596. }
  597. #endif
  598.  
  599. bool CClientManager::InitializeQuestItemTable()
  600. {
  601. using namespace std;
  602.  
  603. static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
  604.  
  605. char query[1024];
  606. snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
  607.  
  608. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  609. SQLResult * pRes = pkMsg->Get();
  610.  
  611. if (!pRes->uiNumRows)
  612. {
  613. sys_err("query error or no rows: %s", query);
  614. return false;
  615. }
  616.  
  617. MYSQL_ROW row;
  618.  
  619. while ((row = mysql_fetch_row(pRes->pSQLResult)))
  620. {
  621. int col = 0;
  622.  
  623. TItemTable tbl;
  624. memset(&tbl, 0, sizeof(tbl));
  625.  
  626. str_to_number(tbl.dwVnum, row[col++]);
  627.  
  628. if (row[col])
  629. strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
  630.  
  631. col++;
  632.  
  633. if (row[col])
  634. strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
  635.  
  636. col++;
  637.  
  638. if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
  639. {
  640. sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
  641. continue;
  642. }
  643.  
  644. tbl.bType = ITEM_QUEST; // quest_item_proto 테이블에 있는 것들은 모두 ITEM_QUEST 유형
  645. tbl.bSize = 1;
  646.  
  647. m_vec_itemTable.push_back(tbl);
  648. }
  649.  
  650. return true;
  651. }
  652.  
  653. bool CClientManager::InitializeItemTable()
  654. {
  655. //================== 함수 설명 ==================//
  656. //1. 요약 : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' 파일을 읽고,
  657. // <item_table>(TItemTable), <m_map_itemTableByVnum> 오브젝트를 생성한다.
  658. //2. 순서
  659. // 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
  660. // 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
  661. // (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
  662. // 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
  663. // (!)[item_table], <m_map_itemTableByVnum>을 만든다.
  664. // <참고>
  665. // 각 row 들 중,
  666. // (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row는
  667. // (b)[test_map_itemTableByVnum]의 것을 사용한다.
  668. // 4) (b)[test_map_itemTableByVnum]의 row중, (!)[item_table]에 없는 것을 추가한다.
  669. //3. 테스트
  670. // 1)'item_proto.txt' 정보가 item_table에 잘 들어갔는지. -> 완료
  671. // 2)'item_names.txt' 정보가 item_table에 잘 들어갔는지.
  672. // 3)'item_proto_test.txt' 에서 [겹치는] 정보가 item_table 에 잘 들어갔는지.
  673. // 4)'item_proto_test.txt' 에서 [새로운] 정보가 item_table 에 잘 들어갔는지.
  674. // 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
  675. //_______________________________________________//
  676.  
  677.  
  678.  
  679. //=================================================================================//
  680. // 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
  681. //=================================================================================//
  682. bool isNameFile = true;
  683. map<int,const char*> localMap;
  684. cCsvTable nameData;
  685. if(!nameData.Load("item_names.txt",'\t'))
  686. {
  687. fprintf(stderr, "item_names.txt 파일을 읽어오지 못했습니다\n");
  688. isNameFile = false;
  689. } else {
  690. nameData.Next();
  691. while(nameData.Next()) {
  692. localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  693. }
  694. }
  695. //_________________________________________________________________//
  696.  
  697. //=================================================================//
  698. // 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
  699. // (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
  700. //=================================================================//
  701. map<DWORD, TItemTable *> test_map_itemTableByVnum;
  702. //1. 파일 읽어오기.
  703. cCsvTable test_data;
  704. if(!test_data.Load("item_proto_test.txt",'\t'))
  705. {
  706. fprintf(stderr, "item_proto_test.txt 파일을 읽어오지 못했습니다\n");
  707. //return false;
  708. } else {
  709. test_data.Next(); //설명 로우 넘어가기.
  710.  
  711. //2. 테스트 아이템 테이블 생성.
  712. TItemTable * test_item_table = NULL;
  713. int test_itemTableSize = test_data.m_File.GetRowCount()-1;
  714. test_item_table = new TItemTable[test_itemTableSize];
  715. memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);
  716.  
  717. //3. 테스트 아이템 테이블에 값을 넣고, 맵에까지 넣기.
  718. while(test_data.Next()) {
  719.  
  720.  
  721. if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
  722. {
  723. fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");
  724. }
  725.  
  726. test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
  727. test_item_table++;
  728.  
  729. }
  730. }
  731. //______________________________________________________________________//
  732.  
  733.  
  734. //========================================================================//
  735. // 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
  736. // (!)[item_table], <m_map_itemTableByVnum>을 만든다.
  737. // <참고>
  738. // 각 row 들 중,
  739. // (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row는
  740. // (b)[test_map_itemTableByVnum]의 것을 사용한다.
  741. //========================================================================//
  742.  
  743. //vnum들을 저장할 셋. 새로운 테스트 아이템을 판별할때 사용된다.
  744. set<int> vnumSet;
  745.  
  746. //파일 읽어오기.
  747. cCsvTable data;
  748. if(!data.Load("item_proto.txt",'\t'))
  749. {
  750. fprintf(stderr, "item_proto.txt 파일을 읽어오지 못했습니다\n");
  751. return false;
  752. }
  753. data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
  754.  
  755. if (!m_vec_itemTable.empty())
  756. {
  757. sys_log(0, "RELOAD: item_proto");
  758. m_vec_itemTable.clear();
  759. m_map_itemTableByVnum.clear();
  760. }
  761.  
  762. //===== 아이템 테이블 생성 =====//
  763. //새로 추가되는 갯수를 파악한다.
  764. int addNumber = 0;
  765. while(data.Next()) {
  766. int vnum = atoi(data.AsStringByIndex(0));
  767. std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
  768. it_map_itemTable = test_map_itemTableByVnum.find(vnum);
  769. if(it_map_itemTable != test_map_itemTableByVnum.end()) {
  770. addNumber++;
  771. }
  772. }
  773. //data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
  774. data.Destroy();
  775. if(!data.Load("item_proto.txt",'\t'))
  776. {
  777. fprintf(stderr, "item_proto.txt 파일을 읽어오지 못했습니다\n");
  778. return false;
  779. }
  780. data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
  781.  
  782. m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
  783. memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
  784. int testValue = m_vec_itemTable.size();
  785.  
  786. TItemTable * item_table = &m_vec_itemTable[0];
  787.  
  788. while (data.Next())
  789. {
  790. int col = 0;
  791.  
  792. std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
  793. it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
  794. if(it_map_itemTable == test_map_itemTableByVnum.end()) {
  795. //각 칼럼 데이터 저장
  796.  
  797. if (!Set_Proto_Item_Table(item_table, data, localMap))
  798. {
  799. fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");
  800. }
  801.  
  802.  
  803.  
  804. } else { //$$$$$$$$$$$$$$$$$$$$$$$ 테스트 아이템 정보가 있다!
  805. TItemTable *tempTable = it_map_itemTable->second;
  806.  
  807. item_table->dwVnum = tempTable->dwVnum;
  808. strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName));
  809. strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
  810. item_table->bType = tempTable->bType;
  811. item_table->bSubType = tempTable->bSubType;
  812. item_table->bSize = tempTable->bSize;
  813. item_table->dwAntiFlags = tempTable->dwAntiFlags;
  814. item_table->dwFlags = tempTable->dwFlags;
  815. item_table->dwWearFlags = tempTable->dwWearFlags;
  816. item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
  817. item_table->dwGold = tempTable->dwGold;
  818. item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
  819. item_table->dwRefinedVnum =tempTable->dwRefinedVnum;
  820. item_table->wRefineSet =tempTable->wRefineSet;
  821. item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
  822. item_table->cLimitRealTimeFirstUseIndex = -1;
  823. item_table->cLimitTimerBasedOnWearIndex = -1;
  824.  
  825. int i;
  826.  
  827. for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  828. {
  829. item_table->aLimits[i].bType = tempTable->aLimits[i].bType;
  830. item_table->aLimits[i].lValue = tempTable->aLimits[i].lValue;
  831.  
  832. if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType)
  833. item_table->cLimitRealTimeFirstUseIndex = (char)i;
  834.  
  835. if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
  836. item_table->cLimitTimerBasedOnWearIndex = (char)i;
  837. }
  838.  
  839. for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  840. {
  841. item_table->aApplies[i].bType = tempTable->aApplies[i].bType;
  842. item_table->aApplies[i].lValue = tempTable->aApplies[i].lValue;
  843. }
  844.  
  845. for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  846. item_table->alValues[i] = tempTable->alValues[i];
  847.  
  848. item_table->bGainSocketPct = tempTable->bGainSocketPct;
  849. item_table->sAddonType = tempTable->sAddonType;
  850.  
  851. item_table->bWeight = tempTable->bWeight;
  852.  
  853. }
  854. vnumSet.insert(item_table->dwVnum);
  855. m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  856. ++item_table;
  857. }
  858. //_______________________________________________________________________//
  859.  
  860. //========================================================================//
  861. // 4) (b)[test_map_itemTableByVnum]의 row중, (!)[item_table]에 없는 것을 추가한다.
  862. //========================================================================//
  863. test_data.Destroy();
  864. if(!test_data.Load("item_proto_test.txt",'\t'))
  865. {
  866. fprintf(stderr, "item_proto_test.txt 파일을 읽어오지 못했습니다\n");
  867. //return false;
  868. } else {
  869. test_data.Next(); //설명 로우 넘어가기.
  870.  
  871. while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
  872. {
  873. //중복되는 부분이면 넘어간다.
  874. set<int>::iterator itVnum;
  875. itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
  876. if (itVnum != vnumSet.end()) {
  877. continue;
  878. }
  879.  
  880. if (!Set_Proto_Item_Table(item_table, test_data, localMap))
  881. {
  882. fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");
  883. }
  884.  
  885.  
  886. m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  887.  
  888. item_table++;
  889.  
  890. }
  891. }
  892.  
  893.  
  894.  
  895. // QUEST_ITEM_PROTO_DISABLE
  896. // InitializeQuestItemTable();
  897. // END_OF_QUEST_ITEM_PROTO_DISABLE
  898.  
  899. m_map_itemTableByVnum.clear();
  900.  
  901. itertype(m_vec_itemTable) it = m_vec_itemTable.begin();
  902.  
  903. while (it != m_vec_itemTable.end())
  904. {
  905. TItemTable * item_table = &(*(it++));
  906.  
  907. sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u",
  908. item_table->dwVnum,
  909. item_table->szName,
  910. item_table->szLocaleName,
  911. item_table->alValues[0],
  912. item_table->alValues[1],
  913. item_table->alValues[2],
  914. item_table->alValues[3],
  915. item_table->alValues[4],
  916. item_table->alValues[5],
  917. item_table->dwWearFlags,
  918. item_table->dwAntiFlags,
  919. item_table->dwImmuneFlag,
  920. item_table->dwRefinedVnum,
  921. item_table->wRefineSet,
  922. item_table->bAlterToMagicItemPct);
  923.  
  924. m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  925. }
  926. sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
  927. return true;
  928. }
  929.  
  930.  
  931. bool CClientManager::InitializeSkillTable()
  932. {
  933. char query[4096];
  934. snprintf(query, sizeof(query),
  935. "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
  936. "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
  937. "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
  938. "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
  939. "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
  940. "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
  941. "FROM skill_proto%s ORDER BY dwVnum",
  942. GetTablePostfix());
  943.  
  944. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  945. SQLResult * pRes = pkMsg->Get();
  946.  
  947. if (!pRes->uiNumRows)
  948. {
  949. sys_err("no result from skill_proto");
  950. return false;
  951. }
  952.  
  953. if (!m_vec_skillTable.empty())
  954. {
  955. sys_log(0, "RELOAD: skill_proto");
  956. m_vec_skillTable.clear();
  957. }
  958.  
  959. m_vec_skillTable.reserve(pRes->uiNumRows);
  960.  
  961. MYSQL_ROW data;
  962. int col;
  963.  
  964. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  965. {
  966. TSkillTable t;
  967. memset(&t, 0, sizeof(t));
  968.  
  969. col = 0;
  970.  
  971. str_to_number(t.dwVnum, data[col++]);
  972. strlcpy(t.szName, data[col++], sizeof(t.szName));
  973. str_to_number(t.bType, data[col++]);
  974. str_to_number(t.bMaxLevel, data[col++]);
  975. str_to_number(t.dwSplashRange, data[col++]);
  976.  
  977. strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
  978. strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
  979. strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
  980. strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
  981. strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
  982. strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
  983. strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));
  984.  
  985. str_to_number(t.dwFlag, data[col++]);
  986. str_to_number(t.dwAffectFlag, data[col++]);
  987.  
  988. strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
  989. strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
  990. strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
  991. str_to_number(t.dwAffectFlag2, data[col++]);
  992.  
  993. // ADD_GRANDMASTER_SKILL
  994. strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
  995. strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
  996. strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));
  997.  
  998. strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
  999. // END_OF_ADD_GRANDMASTER_SKILL
  1000.  
  1001. str_to_number(t.bLevelStep, data[col++]);
  1002. str_to_number(t.bLevelLimit, data[col++]);
  1003. str_to_number(t.preSkillVnum, data[col++]);
  1004. str_to_number(t.preSkillLevel, data[col++]);
  1005.  
  1006. str_to_number(t.lMaxHit, data[col++]);
  1007.  
  1008. strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));
  1009.  
  1010. str_to_number(t.bSkillAttrType, data[col++]);
  1011. str_to_number(t.dwTargetRange, data[col++]);
  1012.  
  1013. sys_log(0, "SKILL: #%d %s flag %u point %s affect %u cooldown %s", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
  1014.  
  1015. m_vec_skillTable.push_back(t);
  1016. }
  1017.  
  1018. return true;
  1019. }
  1020.  
  1021. bool CClientManager::InitializeBanwordTable()
  1022. {
  1023. m_vec_banwordTable.clear();
  1024.  
  1025. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
  1026.  
  1027. SQLResult * pRes = pkMsg->Get();
  1028.  
  1029. if (pRes->uiNumRows == 0)
  1030. return true;
  1031.  
  1032. MYSQL_ROW data;
  1033.  
  1034. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1035. {
  1036. TBanwordTable t;
  1037.  
  1038. if (data[0])
  1039. {
  1040. strlcpy(t.szWord, data[0], sizeof(t.szWord));
  1041. m_vec_banwordTable.push_back(t);
  1042. }
  1043. }
  1044.  
  1045. sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
  1046. return true;
  1047. }
  1048.  
  1049. bool CClientManager::InitializeItemAttrTable()
  1050. {
  1051. char query[4096];
  1052. snprintf(query, sizeof(query),
  1053. "SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear, "
  1054. #if defined(__PENDANT_SYSTEM__)
  1055. "pendant,"
  1056. #endif
  1057. #if defined(__GLOVE_SYSTEM__)
  1058. " glove "
  1059. #endif
  1060. "FROM item_attr%s ORDER BY apply",
  1061. GetTablePostfix());
  1062.  
  1063. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1064. SQLResult * pRes = pkMsg->Get();
  1065.  
  1066. if (!pRes->uiNumRows)
  1067. {
  1068. sys_err("no result from item_attr");
  1069. return false;
  1070. }
  1071.  
  1072. if (!m_vec_itemAttrTable.empty())
  1073. {
  1074. sys_log(0, "RELOAD: item_attr");
  1075. m_vec_itemAttrTable.clear();
  1076. }
  1077.  
  1078. m_vec_itemAttrTable.reserve(pRes->uiNumRows);
  1079.  
  1080. MYSQL_ROW data;
  1081.  
  1082. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1083. {
  1084. TItemAttrTable t;
  1085.  
  1086. memset(&t, 0, sizeof(TItemAttrTable));
  1087.  
  1088. int col = 0;
  1089.  
  1090. strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  1091. str_to_number(t.dwApplyIndex, data[col++]);
  1092. str_to_number(t.dwProb, data[col++]);
  1093. str_to_number(t.lValues[0], data[col++]);
  1094. str_to_number(t.lValues[1], data[col++]);
  1095. str_to_number(t.lValues[2], data[col++]);
  1096. str_to_number(t.lValues[3], data[col++]);
  1097. str_to_number(t.lValues[4], data[col++]);
  1098. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  1099. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  1100. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  1101. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  1102. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  1103. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  1104. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  1105. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  1106. #if defined(__PENDANT_SYSTEM__)
  1107. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_PENDANT], data[col++]);
  1108. #endif
  1109. #if defined(__GLOVE_SYSTEM__)
  1110. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_GLOVE], data[col++]);
  1111. #endif
  1112.  
  1113. sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d %d %d }",
  1114. t.szApply,
  1115. t.dwProb,
  1116. t.lValues[0],
  1117. t.lValues[1],
  1118. t.lValues[2],
  1119. t.lValues[3],
  1120. t.lValues[4],
  1121. t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  1122. t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  1123. t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  1124. t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  1125. t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  1126. t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  1127. t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  1128. t.bMaxLevelBySet[ATTRIBUTE_SET_EAR],
  1129. #if defined(__PENDANT_SYSTEM__)
  1130. t.bMaxLevelBySet[ATTRIBUTE_SET_PENDANT],
  1131. #endif
  1132. #if defined(__GLOVE_SYSTEM__)
  1133. t.bMaxLevelBySet[ATTRIBUTE_SET_GLOVE]
  1134. #endif
  1135. );
  1136.  
  1137.  
  1138. m_vec_itemAttrTable.push_back(t);
  1139. }
  1140.  
  1141. return true;
  1142. }
  1143.  
  1144. bool CClientManager::InitializeItemRareTable()
  1145. {
  1146. char query[4096];
  1147. snprintf(query, sizeof(query),
  1148. "SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr_rare%s ORDER BY apply",
  1149. GetTablePostfix());
  1150.  
  1151. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1152. SQLResult * pRes = pkMsg->Get();
  1153.  
  1154. if (!pRes->uiNumRows)
  1155. {
  1156. sys_err("no result from item_attr_rare");
  1157. return false;
  1158. }
  1159.  
  1160. if (!m_vec_itemRareTable.empty())
  1161. {
  1162. sys_log(0, "RELOAD: item_attr_rare");
  1163. m_vec_itemRareTable.clear();
  1164. }
  1165.  
  1166. m_vec_itemRareTable.reserve(pRes->uiNumRows);
  1167.  
  1168. MYSQL_ROW data;
  1169.  
  1170. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1171. {
  1172. TItemAttrTable t;
  1173.  
  1174. memset(&t, 0, sizeof(TItemAttrTable));
  1175.  
  1176. int col = 0;
  1177.  
  1178. strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  1179. str_to_number(t.dwApplyIndex, data[col++]);
  1180. str_to_number(t.dwProb, data[col++]);
  1181. str_to_number(t.lValues[0], data[col++]);
  1182. str_to_number(t.lValues[1], data[col++]);
  1183. str_to_number(t.lValues[2], data[col++]);
  1184. str_to_number(t.lValues[3], data[col++]);
  1185. str_to_number(t.lValues[4], data[col++]);
  1186. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  1187. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  1188. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  1189. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  1190. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  1191. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  1192. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  1193. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  1194.  
  1195. sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
  1196. t.szApply,
  1197. t.dwProb,
  1198. t.lValues[0],
  1199. t.lValues[1],
  1200. t.lValues[2],
  1201. t.lValues[3],
  1202. t.lValues[4],
  1203. t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  1204. t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  1205. t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  1206. t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  1207. t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  1208. t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  1209. t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  1210. t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
  1211.  
  1212. m_vec_itemRareTable.push_back(t);
  1213. }
  1214.  
  1215. return true;
  1216. }
  1217.  
  1218. bool CClientManager::InitializeLandTable()
  1219. {
  1220. using namespace building;
  1221.  
  1222. char query[4096];
  1223.  
  1224. snprintf(query, sizeof(query),
  1225. "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
  1226. "FROM land%s WHERE enable='YES' ORDER BY id",
  1227. GetTablePostfix());
  1228.  
  1229. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1230. SQLResult * pRes = pkMsg->Get();
  1231.  
  1232. if (!m_vec_kLandTable.empty())
  1233. {
  1234. sys_log(0, "RELOAD: land");
  1235. m_vec_kLandTable.clear();
  1236. }
  1237.  
  1238. m_vec_kLandTable.reserve(pRes->uiNumRows);
  1239.  
  1240. MYSQL_ROW data;
  1241.  
  1242. if (pRes->uiNumRows > 0)
  1243. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1244. {
  1245. TLand t;
  1246.  
  1247. memset(&t, 0, sizeof(t));
  1248.  
  1249. int col = 0;
  1250.  
  1251. str_to_number(t.dwID, data[col++]);
  1252. str_to_number(t.lMapIndex, data[col++]);
  1253. str_to_number(t.x, data[col++]);
  1254. str_to_number(t.y, data[col++]);
  1255. str_to_number(t.width, data[col++]);
  1256. str_to_number(t.height, data[col++]);
  1257. str_to_number(t.dwGuildID, data[col++]);
  1258. str_to_number(t.bGuildLevelLimit, data[col++]);
  1259. str_to_number(t.dwPrice, data[col++]);
  1260.  
  1261. sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
  1262.  
  1263. m_vec_kLandTable.push_back(t);
  1264. }
  1265.  
  1266. return true;
  1267. }
  1268.  
  1269. void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
  1270. {
  1271. // format: 10,1/20,3/300,50
  1272. const char * t = c_pszString;
  1273. const char * p = strchr(t, '/');
  1274. std::pair<int, int> k;
  1275.  
  1276. char szNum[32 + 1];
  1277. char * comma;
  1278.  
  1279. while (p)
  1280. {
  1281. if (isnhdigit(*t))
  1282. {
  1283. strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
  1284.  
  1285. comma = strchr(szNum, ',');
  1286.  
  1287. if (comma)
  1288. {
  1289. *comma = '\0';
  1290. str_to_number(k.second, comma+1);
  1291. }
  1292. else
  1293. k.second = 0;
  1294.  
  1295. str_to_number(k.first, szNum);
  1296. vec.push_back(k);
  1297. }
  1298.  
  1299. t = p + 1;
  1300. p = strchr(t, '/');
  1301. }
  1302.  
  1303. if (isnhdigit(*t))
  1304. {
  1305. strlcpy(szNum, t, sizeof(szNum));
  1306.  
  1307. comma = strchr(const_cast<char*>(t), ',');
  1308.  
  1309. if (comma)
  1310. {
  1311. *comma = '\0';
  1312. str_to_number(k.second, comma+1);
  1313. }
  1314. else
  1315. k.second = 0;
  1316.  
  1317. str_to_number(k.first, szNum);
  1318. vec.push_back(k);
  1319. }
  1320. }
  1321.  
  1322. bool CClientManager::InitializeObjectProto()
  1323. {
  1324. using namespace building;
  1325.  
  1326. char query[4096];
  1327. snprintf(query, sizeof(query),
  1328. "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
  1329. "FROM object_proto%s ORDER BY vnum",
  1330. GetTablePostfix());
  1331.  
  1332. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1333. SQLResult * pRes = pkMsg->Get();
  1334.  
  1335. if (!m_vec_kObjectProto.empty())
  1336. {
  1337. sys_log(0, "RELOAD: object_proto");
  1338. m_vec_kObjectProto.clear();
  1339. }
  1340.  
  1341. m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
  1342.  
  1343. MYSQL_ROW data;
  1344.  
  1345. if (pRes->uiNumRows > 0)
  1346. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1347. {
  1348. TObjectProto t;
  1349.  
  1350. memset(&t, 0, sizeof(t));
  1351.  
  1352. int col = 0;
  1353.  
  1354. str_to_number(t.dwVnum, data[col++]);
  1355. str_to_number(t.dwPrice, data[col++]);
  1356.  
  1357. std::vector<std::pair<int, int> > vec;
  1358. parse_pair_number_string(data[col++], vec);
  1359.  
  1360. for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
  1361. {
  1362. std::pair<int, int> & r = vec[i];
  1363.  
  1364. t.kMaterials[i].dwItemVnum = r.first;
  1365. t.kMaterials[i].dwCount = r.second;
  1366. }
  1367.  
  1368. str_to_number(t.dwUpgradeVnum, data[col++]);
  1369. str_to_number(t.dwUpgradeLimitTime, data[col++]);
  1370. str_to_number(t.lLife, data[col++]);
  1371. str_to_number(t.lRegion[0], data[col++]);
  1372. str_to_number(t.lRegion[1], data[col++]);
  1373. str_to_number(t.lRegion[2], data[col++]);
  1374. str_to_number(t.lRegion[3], data[col++]);
  1375.  
  1376. // ADD_BUILDING_NPC
  1377. str_to_number(t.dwNPCVnum, data[col++]);
  1378. str_to_number(t.dwGroupVnum, data[col++]);
  1379. str_to_number(t.dwDependOnGroupVnum, data[col++]);
  1380.  
  1381. t.lNPCX = 0;
  1382. t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
  1383. // END_OF_ADD_BUILDING_NPC
  1384.  
  1385. sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
  1386. t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
  1387.  
  1388. m_vec_kObjectProto.push_back(t);
  1389. }
  1390.  
  1391. return true;
  1392. }
  1393.  
  1394. bool CClientManager::InitializeObjectTable()
  1395. {
  1396. using namespace building;
  1397.  
  1398. char query[4096];
  1399. snprintf(query, sizeof(query), "SELECT id, land_id, vnum, map_index, x, y, x_rot, y_rot, z_rot, life FROM object%s ORDER BY id", GetTablePostfix());
  1400.  
  1401. std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1402. SQLResult * pRes = pkMsg->Get();
  1403.  
  1404. if (!m_map_pkObjectTable.empty())
  1405. {
  1406. sys_log(0, "RELOAD: object");
  1407. m_map_pkObjectTable.clear();
  1408. }
  1409.  
  1410. MYSQL_ROW data;
  1411.  
  1412. if (pRes->uiNumRows > 0)
  1413. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1414. {
  1415. TObject * k = new TObject;
  1416.  
  1417. memset(k, 0, sizeof(TObject));
  1418.  
  1419. int col = 0;
  1420.  
  1421. str_to_number(k->dwID, data[col++]);
  1422. str_to_number(k->dwLandID, data[col++]);
  1423. str_to_number(k->dwVnum, data[col++]);
  1424. str_to_number(k->lMapIndex, data[col++]);
  1425. str_to_number(k->x, data[col++]);
  1426. str_to_number(k->y, data[col++]);
  1427. str_to_number(k->xRot, data[col++]);
  1428. str_to_number(k->yRot, data[col++]);
  1429. str_to_number(k->zRot, data[col++]);
  1430. str_to_number(k->lLife, data[col++]);
  1431.  
  1432. sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
  1433. k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
  1434.  
  1435. m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
  1436. }
  1437.  
  1438. return true;
  1439. }
  1440.  
  1441. bool CClientManager::InitializeMonarch()
  1442. {
  1443. CMonarch::instance().LoadMonarch();
  1444.  
  1445. return true;
  1446. }
  1447.  
  1448. bool CClientManager::MirrorMobTableIntoDB()
  1449. {
  1450. for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
  1451. {
  1452. const TMobTable& t = *it;
  1453. char query[4096];
  1454. if (g_stLocaleNameColumn == "name")
  1455. {
  1456. snprintf(query, sizeof(query),
  1457. "replace into mob_proto%s "
  1458. "("
  1459. "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
  1460. "on_click, empire, drop_item, resurrection_vnum, folder, "
  1461. "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
  1462. "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
  1463.  
  1464. "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
  1465. "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
  1466. "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
  1467. "dam_multiply, summon, drain_sp, mob_color, "
  1468.  
  1469. "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
  1470. "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
  1471. "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
  1472. ") "
  1473. "values ("
  1474.  
  1475. "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
  1476. "%d, %d, %d, %d, '%s', "
  1477. "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1478. "%d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1479.  
  1480. "%d, %d, %d, %d, %d, %d, "
  1481. "%d, %d, %d, %d, %d, %d, "
  1482. "%d, %d, %d, %d, %d, "
  1483. "%f, %d, %d, %d, "
  1484.  
  1485. "%d, %d, %d, %d, %d, %d, "
  1486. "%d, %d, %d, %d, "
  1487. "%d, %d, %d, %d, %d"
  1488. ")",
  1489. GetTablePostfix(), /*g_stLocaleNameColumn.c_str(),*/
  1490.  
  1491. t.dwVnum, t.szName, /*t.szLocaleName, */t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
  1492. t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
  1493. t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
  1494.  
  1495. t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
  1496. t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
  1497. t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
  1498. t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10],
  1499. t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, t.dwMobColor,
  1500.  
  1501. t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
  1502. t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
  1503. t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
  1504. );
  1505. }
  1506. else
  1507. {
  1508. snprintf(query, sizeof(query),
  1509. "replace into mob_proto%s "
  1510. "("
  1511. "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
  1512. "on_click, empire, drop_item, resurrection_vnum, folder, "
  1513. "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
  1514. "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
  1515.  
  1516. "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
  1517. "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
  1518. "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
  1519. "dam_multiply, summon, drain_sp, mob_color, "
  1520.  
  1521. "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
  1522. "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
  1523. "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
  1524. ") "
  1525. "values ("
  1526.  
  1527. "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
  1528. "%d, %d, %d, %d, '%s', "
  1529. "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1530. "%d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1531.  
  1532. "%d, %d, %d, %d, %d, %d, "
  1533. "%d, %d, %d, %d, %d, %d, "
  1534. "%d, %d, %d, %d, %d, "
  1535. "%f, %d, %d, %d, "
  1536.  
  1537. "%d, %d, %d, %d, %d, %d, "
  1538. "%d, %d, %d, %d, "
  1539. "%d, %d, %d, %d, %d"
  1540. ")",
  1541. GetTablePostfix(), g_stLocaleNameColumn.c_str(),
  1542.  
  1543. t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
  1544. t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
  1545. t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
  1546.  
  1547. t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
  1548. t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
  1549. t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
  1550. t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10],
  1551. t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, t.dwMobColor,
  1552.  
  1553. t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
  1554. t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
  1555. t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
  1556. );
  1557. }
  1558.  
  1559. CDBManager::instance().AsyncQuery(query);
  1560. }
  1561. return true;
  1562. }
  1563.  
  1564. bool CClientManager::MirrorItemTableIntoDB()
  1565. {
  1566. for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
  1567. {
  1568. if (g_stLocaleNameColumn != "name")
  1569. {
  1570. const TItemTable& t = *it;
  1571. char query[4096];
  1572. snprintf(query, sizeof(query),
  1573. "replace into item_proto%s ("
  1574. "vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
  1575. "flag, wearflag, antiflag, immuneflag, "
  1576. "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, specular, "
  1577. "limittype0, limitvalue0, limittype1, limitvalue1, "
  1578. "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  1579. "value0, value1, value2, value3, value4, value5 ) "
  1580. "values ("
  1581. "%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
  1582. "%d, %d, %d, %d, "
  1583. "%d, %d, %d, %d, %d, %d, "
  1584. "%d, %d, %d, %d, "
  1585. "%d, %d, %d, %d, %d, %d, "
  1586. "%d, %d, %d, %d, %d, %d )",
  1587. GetTablePostfix(), g_stLocaleNameColumn.c_str(),
  1588. t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
  1589. t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
  1590. t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType, t.bSpecular,
  1591. t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
  1592. t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
  1593. t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
  1594. CDBManager::instance().AsyncQuery(query);
  1595. }
  1596. else
  1597. {
  1598. const TItemTable& t = *it;
  1599. char query[4096];
  1600. snprintf(query, sizeof(query),
  1601. "replace into item_proto%s ("
  1602. "vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
  1603. "flag, wearflag, antiflag, immuneflag, "
  1604. "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, specular, "
  1605. "limittype0, limitvalue0, limittype1, limitvalue1, "
  1606. "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  1607. "value0, value1, value2, value3, value4, value5 ) "
  1608. "values ("
  1609. "%d, %d, %d, \"%s\", %d, %d, %d, %d, "
  1610. "%d, %d, %d, %d, "
  1611. "%d, %d, %d, %d, %d, %d, "
  1612. "%d, %d, %d, %d, "
  1613. "%d, %d, %d, %d, %d, %d, "
  1614. "%d, %d, %d, %d, %d, %d )",
  1615. GetTablePostfix(),
  1616. t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
  1617. t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
  1618. t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType, t.bSpecular,
  1619. t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
  1620. t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
  1621. t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
  1622. CDBManager::instance().AsyncQuery(query);
  1623. }
  1624. }
  1625. return true;
  1626. }
  1627.  
Advertisement
Add Comment
Please, Sign In to add comment