Guest User

read from txt

a guest
Oct 16th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.00 KB | None | 0 0
  1. // vim:ts=4 sw=4
  2. #include <map>
  3. #include "stdafx.h"
  4. #include "ClientManager.h"
  5. #include "Main.h"
  6. #include "Monarch.h"
  7. #include "CsvReader.h"
  8. #include "ProtoReader.h"
  9.  
  10. using namespace std;
  11.  
  12. extern int g_test_server;
  13. extern std::string g_stLocaleNameColumn;
  14.  
  15. bool CClientManager::InitializeTables()
  16. {
  17. if (!InitializeMobTable())
  18. {
  19. sys_err("InitializeMobTable FAILED");
  20. return false;
  21. }
  22.  
  23. if (!InitializeItemTable())
  24. {
  25. sys_err("InitializeItemTable FAILED");
  26. return false;
  27. }
  28.  
  29. if (!InitializeShopTable())
  30. {
  31. sys_err("InitializeShopTable FAILED");
  32. return false;
  33. }
  34.  
  35. if (!InitializeSkillTable())
  36. {
  37. sys_err("InitializeSkillTable FAILED");
  38. return false;
  39. }
  40.  
  41. if (!InitializeRefineTable())
  42. {
  43. sys_err("InitializeRefineTable FAILED");
  44. return false;
  45. }
  46.  
  47. if (!InitializeItemAttrTable())
  48. {
  49. sys_err("InitializeItemAttrTable FAILED");
  50. return false;
  51. }
  52.  
  53. if (!InitializeItemRareTable())
  54. {
  55. sys_err("InitializeItemRareTable FAILED");
  56. return false;
  57. }
  58.  
  59. if (!InitializeBanwordTable())
  60. {
  61. sys_err("InitializeBanwordTable FAILED");
  62. return false;
  63. }
  64.  
  65. if (!InitializeLandTable())
  66. {
  67. sys_err("InitializeLandTable FAILED");
  68. return false;
  69. }
  70.  
  71. if (!InitializeObjectProto())
  72. {
  73. sys_err("InitializeObjectProto FAILED");
  74. return false;
  75. }
  76.  
  77. if (!InitializeObjectTable())
  78. {
  79. sys_err("InitializeObjectTable FAILED");
  80. return false;
  81. }
  82.  
  83. if (!InitializeMonarch())
  84. {
  85. sys_err("InitializeMonarch FAILED");
  86. return false;
  87. }
  88.  
  89.  
  90. return true;
  91. }
  92.  
  93. bool CClientManager::InitializeRefineTable()
  94. {
  95. char query[2048];
  96.  
  97. snprintf(query, sizeof(query),
  98. "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 FROM refine_proto%s",
  99. GetTablePostfix());
  100.  
  101. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  102. SQLResult * pRes = pkMsg->Get();
  103.  
  104. if (!pRes->uiNumRows)
  105. return true;
  106.  
  107. if (m_pRefineTable)
  108. {
  109. sys_log(0, "RELOAD: refine_proto");
  110. delete [] m_pRefineTable;
  111. m_pRefineTable = NULL;
  112. }
  113.  
  114. m_iRefineTableSize = pRes->uiNumRows;
  115.  
  116. m_pRefineTable = new TRefineTable[m_iRefineTableSize];
  117. memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
  118.  
  119. TRefineTable* prt = m_pRefineTable;
  120. MYSQL_ROW data;
  121.  
  122. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  123. {
  124. //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
  125. //"vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 "
  126.  
  127. int col = 0;
  128. //prt->src_vnum = atoi(data[col++]);
  129. //prt->result_vnum = atoi(data[col++]);
  130. str_to_number(prt->id, data[col++]);
  131. str_to_number(prt->cost, data[col++]);
  132. str_to_number(prt->prob, data[col++]);
  133.  
  134. for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
  135. {
  136. str_to_number(prt->materials[i].vnum, data[col++]);
  137. str_to_number(prt->materials[i].count, data[col++]);
  138. if (prt->materials[i].vnum == 0)
  139. {
  140. prt->material_count = i;
  141. break;
  142. }
  143. }
  144.  
  145. 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);
  146.  
  147. prt++;
  148. }
  149. return true;
  150. }
  151.  
  152. class FCompareVnum
  153. {
  154. public:
  155. bool operator () (const TEntityTable & a, const TEntityTable & b) const
  156. {
  157. return (a.dwVnum < b.dwVnum);
  158. }
  159. };
  160.  
  161. bool CClientManager::InitializeMobTable()
  162. {
  163. static const char * query =
  164. "SELECT vnum, name, locale_name, rank, type, battle_type, level, size, ai_flag+0, mount_capacity,"
  165. "setRaceFlag+0, setImmuneFlag+0, empire, folder, on_click, st, dx, ht, iq, damage_min, damage_max,"
  166. "max_hp, regen_cycle, regen_percent, gold_min, gold_max, exp, def, attack_speed, move_speed, aggressive_hp_pct,"
  167. "aggressive_sight, attack_range, drop_item, resurrection_vnum, enchant_curse, enchant_slow,"
  168. "enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, resist_sword, resist_twohand,"
  169. "resist_dagger, resist_bell, resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind,"
  170. "resist_poison, dam_multiply, summon, drain_sp, mob_color, polymorph_item, skill_level0, skill_vnum0,"
  171. "skill_level1, skill_vnum1, skill_level2, skill_vnum2, skill_level3, skill_vnum3, skill_level4, skill_vnum4,"
  172. "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive FROM mob_proto ORDER BY vnum";
  173. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  174. SQLResult * pRes = pkMsg->Get();
  175.  
  176. if (!pRes->uiNumRows)
  177. {
  178. sys_err("No result from Mob_Proto!");
  179. return false;
  180. }
  181. if (!m_vec_mobTable.empty())
  182. {
  183. sys_log(0, "RELOAD: mob_proto");
  184. m_vec_mobTable.clear();
  185. }
  186. m_vec_mobTable.reserve(pRes->uiNumRows);
  187.  
  188. MYSQL_ROW data;
  189. int col;
  190.  
  191. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  192. {
  193. TMobTable t;
  194. memset(&t, 0, sizeof(t));
  195.  
  196. col = 0;
  197.  
  198. str_to_number(t.dwVnum, data[col++]);
  199. strlcpy(t.szName, data[col++], sizeof(t.szName));
  200. strlcpy(t.szLocaleName, data[col++], sizeof(t.szLocaleName));
  201. str_to_number(t.bRank, data[col++]);
  202. str_to_number(t.bType, data[col++]);
  203. str_to_number(t.bBattleType, data[col++]);
  204. str_to_number(t.bLevel, data[col++]);
  205. str_to_number(t.bSize, data[col++]);
  206. str_to_number(t.dwAIFlag, data[col++]);
  207. str_to_number(t.bMountCapacity, data[col++]);
  208. str_to_number(t.dwRaceFlag, data[col++]);
  209. str_to_number(t.dwImmuneFlag, data[col++]);
  210. str_to_number(t.bEmpire, data[col++]);
  211. strlcpy(t.szFolder, data[col++], sizeof(t.szFolder));
  212. str_to_number(t.bOnClickType, data[col++]);
  213. str_to_number(t.bStr, data[col++]);
  214. str_to_number(t.bDex, data[col++]);
  215. str_to_number(t.bCon, data[col++]);
  216. str_to_number(t.bInt, data[col++]);
  217. str_to_number(t.dwDamageRange[0], data[col++]);
  218. str_to_number(t.dwDamageRange[1], data[col++]);
  219. str_to_number(t.dwMaxHP, data[col++]);
  220. str_to_number(t.bRegenCycle, data[col++]);
  221. str_to_number(t.bRegenPercent, data[col++]);
  222. str_to_number(t.dwGoldMin, data[col++]);
  223. str_to_number(t.dwGoldMax, data[col++]);
  224. str_to_number(t.dwExp, data[col++]);
  225. str_to_number(t.wDef, data[col++]);
  226. str_to_number(t.sAttackSpeed, data[col++]);
  227. str_to_number(t.sMovingSpeed, data[col++]);
  228. str_to_number(t.bAggresiveHPPct, data[col++]);
  229. str_to_number(t.wAggressiveSight, data[col++]);
  230. str_to_number(t.wAttackRange, data[col++]);
  231. str_to_number(t.dwDropItemVnum, data[col++]);
  232. str_to_number(t.dwResurrectionVnum, data[col++]);
  233. str_to_number(t.cEnchants[0], data[col++]);
  234. str_to_number(t.cEnchants[1], data[col++]);
  235. str_to_number(t.cEnchants[2], data[col++]);
  236. str_to_number(t.cEnchants[3], data[col++]);
  237. str_to_number(t.cEnchants[4], data[col++]);
  238. str_to_number(t.cEnchants[5], data[col++]);
  239. str_to_number(t.cResists[0], data[col++]);
  240. str_to_number(t.cResists[1], data[col++]);
  241. str_to_number(t.cResists[2], data[col++]);
  242. str_to_number(t.cResists[3], data[col++]);
  243. str_to_number(t.cResists[4], data[col++]);
  244. str_to_number(t.cResists[5], data[col++]);
  245. str_to_number(t.cResists[6], data[col++]);
  246. str_to_number(t.cResists[7], data[col++]);
  247. str_to_number(t.cResists[8], data[col++]);
  248. str_to_number(t.cResists[9], data[col++]);
  249. str_to_number(t.cResists[10], data[col++]);
  250. str_to_number(t.fDamMultiply, data[col++]);
  251. str_to_number(t.dwSummonVnum, data[col++]);
  252. str_to_number(t.dwDrainSP, data[col++]);
  253. str_to_number(t.dwMobColor, data[col++]);
  254. str_to_number(t.dwPolymorphItemVnum, data[col++]);
  255. str_to_number(t.Skills[0].bLevel, data[col++]);
  256. str_to_number(t.Skills[0].dwVnum, data[col++]);
  257. str_to_number(t.Skills[1].bLevel, data[col++]);
  258. str_to_number(t.Skills[1].dwVnum, data[col++]);
  259. str_to_number(t.Skills[2].bLevel, data[col++]);
  260. str_to_number(t.Skills[2].dwVnum, data[col++]);
  261. str_to_number(t.Skills[3].bLevel, data[col++]);
  262. str_to_number(t.Skills[3].dwVnum, data[col++]);
  263. str_to_number(t.Skills[4].bLevel, data[col++]);
  264. str_to_number(t.Skills[4].dwVnum, data[col++]);
  265. str_to_number(t.bBerserkPoint, data[col++]);
  266. str_to_number(t.bStoneSkinPoint, data[col++]);
  267. str_to_number(t.bGodSpeedPoint, data[col++]);
  268. str_to_number(t.bDeathBlowPoint, data[col++]);
  269. str_to_number(t.bRevivePoint, data[col++]);
  270.  
  271. sys_log(0, "Monster: %s loaded", t.szLocaleName);
  272.  
  273. m_vec_mobTable.push_back(t);
  274. }
  275.  
  276. return true;
  277. }
  278.  
  279. bool CClientManager::InitializeShopTable()
  280. {
  281. MYSQL_ROW data;
  282. int col;
  283.  
  284. static const char * s_szQuery =
  285. "SELECT "
  286. "shop.vnum, "
  287. "shop.npc_vnum, "
  288. "shop_item.item_vnum, "
  289. "shop_item.count "
  290. "FROM shop LEFT JOIN shop_item "
  291. "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
  292.  
  293. std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
  294.  
  295. // shop의 vnum은 있는데 shop_item 이 없을경우... 실패로 처리되니 주의 요망.
  296. // 고처야할부분
  297. SQLResult * pRes2 = pkMsg2->Get();
  298.  
  299. if (!pRes2->uiNumRows)
  300. {
  301. sys_err("InitializeShopTable : Table count is zero.");
  302. return false;
  303. }
  304.  
  305. std::map<int, TShopTable *> map_shop;
  306.  
  307. if (m_pShopTable)
  308. {
  309. delete [] (m_pShopTable);
  310. m_pShopTable = NULL;
  311. }
  312.  
  313. TShopTable * shop_table = m_pShopTable;
  314.  
  315. while ((data = mysql_fetch_row(pRes2->pSQLResult)))
  316. {
  317. col = 0;
  318.  
  319. int iShopVnum = 0;
  320. str_to_number(iShopVnum, data[col++]);
  321.  
  322. if (map_shop.end() == map_shop.find(iShopVnum))
  323. {
  324. shop_table = new TShopTable;
  325. memset(shop_table, 0, sizeof(TShopTable));
  326. shop_table->dwVnum = iShopVnum;
  327.  
  328. map_shop[iShopVnum] = shop_table;
  329. }
  330. else
  331. shop_table = map_shop[iShopVnum];
  332.  
  333. str_to_number(shop_table->dwNPCVnum, data[col++]);
  334.  
  335. if (!data[col]) // 아이템이 하나도 없으면 NULL이 리턴 되므로..
  336. continue;
  337.  
  338. TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
  339.  
  340. str_to_number(pItem->vnum, data[col++]);
  341. str_to_number(pItem->count, data[col++]);
  342.  
  343. ++shop_table->byItemCount;
  344. }
  345.  
  346. m_pShopTable = new TShopTable[map_shop.size()];
  347. m_iShopTableSize = map_shop.size();
  348.  
  349. typeof(map_shop.begin()) it = map_shop.begin();
  350.  
  351. int i = 0;
  352.  
  353. while (it != map_shop.end())
  354. {
  355. thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
  356. sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
  357. ++i;
  358. }
  359.  
  360. return true;
  361. }
  362.  
  363. bool CClientManager::InitializeQuestItemTable()
  364. {
  365. using namespace std;
  366.  
  367. static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
  368.  
  369. char query[1024];
  370. snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
  371.  
  372. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  373. SQLResult * pRes = pkMsg->Get();
  374.  
  375. if (!pRes->uiNumRows)
  376. {
  377. sys_err("query error or no rows: %s", query);
  378. return false;
  379. }
  380.  
  381. MYSQL_ROW row;
  382.  
  383. while ((row = mysql_fetch_row(pRes->pSQLResult)))
  384. {
  385. int col = 0;
  386.  
  387. TItemTable tbl;
  388. memset(&tbl, 0, sizeof(tbl));
  389.  
  390. str_to_number(tbl.dwVnum, row[col++]);
  391.  
  392. if (row[col])
  393. strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
  394.  
  395. col++;
  396.  
  397. if (row[col])
  398. strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
  399.  
  400. col++;
  401.  
  402. if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
  403. {
  404. sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
  405. continue;
  406. }
  407.  
  408. tbl.bType = ITEM_QUEST; // quest_item_proto 테이블에 있는 것들은 모두 ITEM_QUEST 유형
  409. tbl.bSize = 1;
  410.  
  411. m_vec_itemTable.push_back(tbl);
  412. }
  413.  
  414. return true;
  415. }
  416.  
  417. bool CClientManager::InitializeItemTable()
  418. {
  419. /* I needed to make 2 mysql queries because with only 1 there was always a stackoverflow....
  420. * However^^ It works so idc :)
  421. */
  422. char query[4096];
  423. snprintf(query, sizeof(query),
  424. "SELECT vnum, vnum_range, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, "
  425. "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
  426. "limittype0, limitvalue0, limittype1, limitvalue1, "
  427. "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  428. "value0, value1, value2, value3, value4, value5 "
  429. "FROM item_proto%s ORDER BY vnum",
  430. g_stLocaleNameColumn.c_str(), GetTablePostfix());
  431.  
  432. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  433. SQLResult * pRes = pkMsg->Get();
  434.  
  435. if (!pRes->uiNumRows)
  436. {
  437. sys_err("Could not load item_proto. No results!");
  438. return false;
  439. }
  440.  
  441. sys_log(0, "ITEM_PROTO loading...");
  442.  
  443. if (!m_vec_itemTable.empty())
  444. {
  445. sys_log(0, "RELOAD: item_proto");
  446. m_vec_itemTable.clear();
  447. m_map_itemTableByVnum.clear();
  448. }
  449.  
  450. m_vec_itemTable.resize(pRes->uiNumRows);
  451. memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
  452. TItemTable * item_table = &m_vec_itemTable[0];
  453.  
  454. MYSQL_ROW data;
  455. int col;
  456.  
  457. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  458. {
  459. col = 0;
  460.  
  461. str_to_number(item_table->dwVnum, data[col++]);
  462. str_to_number(item_table->dwVnumRange, data[col++]);
  463. strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
  464. strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
  465. str_to_number(item_table->bType, data[col++]);
  466. str_to_number(item_table->bSubType, data[col++]);
  467. str_to_number(item_table->dwGold, data[col++]);
  468. str_to_number(item_table->dwShopBuyPrice, data[col++]);
  469. str_to_number(item_table->bWeight, data[col++]);
  470. str_to_number(item_table->bSize, data[col++]);
  471. str_to_number(item_table->dwFlags, data[col++]);
  472. str_to_number(item_table->dwWearFlags, data[col++]);
  473. str_to_number(item_table->dwAntiFlags, data[col++]);
  474. str_to_number(item_table->dwImmuneFlag, data[col++]);
  475. str_to_number(item_table->dwRefinedVnum, data[col++]);
  476. str_to_number(item_table->wRefineSet, data[col++]);
  477. str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
  478. str_to_number(item_table->bGainSocketPct, data[col++]);
  479. str_to_number(item_table->sAddonType, data[col++]);
  480.  
  481. item_table->cLimitRealTimeFirstUseIndex = -1;
  482. item_table->cLimitTimerBasedOnWearIndex = -1;
  483.  
  484. int i;
  485. for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  486. {
  487. str_to_number(item_table->aLimits[i].bType, data[col++]);
  488. str_to_number(item_table->aLimits[i].lValue, data[col++]);
  489.  
  490. if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType)
  491. item_table->cLimitRealTimeFirstUseIndex = (char)i;
  492.  
  493. if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
  494. item_table->cLimitTimerBasedOnWearIndex = (char)i;
  495. }
  496.  
  497. for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  498. {
  499. str_to_number(item_table->aApplies[i].bType, data[col++]);
  500. str_to_number(item_table->aApplies[i].lValue, data[col++]);
  501. }
  502.  
  503. for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  504. str_to_number(item_table->alValues[i], data[col++]);
  505.  
  506. 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",
  507. item_table->dwVnum,item_table->szName,item_table->szLocaleName,
  508. item_table->alValues[0],item_table->alValues[1],item_table->alValues[2],
  509. item_table->alValues[3],item_table->alValues[4],item_table->alValues[5],
  510. item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag,
  511. item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct);
  512.  
  513. m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  514. ++item_table;
  515. }
  516.  
  517. sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
  518. sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.n", m_vec_itemTable.size());
  519. return true;
  520. }
  521.  
  522.  
  523. bool CClientManager::InitializeSkillTable()
  524. {
  525. char query[4096];
  526. snprintf(query, sizeof(query),
  527. "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
  528. "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
  529. "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
  530. "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
  531. "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
  532. "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
  533. "FROM skill_proto%s ORDER BY dwVnum",
  534. GetTablePostfix());
  535.  
  536. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  537. SQLResult * pRes = pkMsg->Get();
  538.  
  539. if (!pRes->uiNumRows)
  540. {
  541. sys_err("no result from skill_proto");
  542. return false;
  543. }
  544.  
  545. if (!m_vec_skillTable.empty())
  546. {
  547. sys_log(0, "RELOAD: skill_proto");
  548. m_vec_skillTable.clear();
  549. }
  550.  
  551. m_vec_skillTable.reserve(pRes->uiNumRows);
  552.  
  553. MYSQL_ROW data;
  554. int col;
  555.  
  556. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  557. {
  558. TSkillTable t;
  559. memset(&t, 0, sizeof(t));
  560.  
  561. col = 0;
  562.  
  563. str_to_number(t.dwVnum, data[col++]);
  564. strlcpy(t.szName, data[col++], sizeof(t.szName));
  565. str_to_number(t.bType, data[col++]);
  566. str_to_number(t.bMaxLevel, data[col++]);
  567. str_to_number(t.dwSplashRange, data[col++]);
  568.  
  569. strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
  570. strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
  571. strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
  572. strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
  573. strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
  574. strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
  575. strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));
  576.  
  577. str_to_number(t.dwFlag, data[col++]);
  578. str_to_number(t.dwAffectFlag, data[col++]);
  579.  
  580. strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
  581. strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
  582. strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
  583. str_to_number(t.dwAffectFlag2, data[col++]);
  584.  
  585. // ADD_GRANDMASTER_SKILL
  586. strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
  587. strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
  588. strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));
  589.  
  590. strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
  591. // END_OF_ADD_GRANDMASTER_SKILL
  592.  
  593. str_to_number(t.bLevelStep, data[col++]);
  594. str_to_number(t.bLevelLimit, data[col++]);
  595. str_to_number(t.preSkillVnum, data[col++]);
  596. str_to_number(t.preSkillLevel, data[col++]);
  597.  
  598. str_to_number(t.lMaxHit, data[col++]);
  599.  
  600. strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));
  601.  
  602. str_to_number(t.bSkillAttrType, data[col++]);
  603. str_to_number(t.dwTargetRange, data[col++]);
  604.  
  605. 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);
  606.  
  607. m_vec_skillTable.push_back(t);
  608. }
  609.  
  610. return true;
  611. }
  612.  
  613. bool CClientManager::InitializeBanwordTable()
  614. {
  615. m_vec_banwordTable.clear();
  616.  
  617. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
  618.  
  619. SQLResult * pRes = pkMsg->Get();
  620.  
  621. if (pRes->uiNumRows == 0)
  622. return true;
  623.  
  624. MYSQL_ROW data;
  625.  
  626. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  627. {
  628. TBanwordTable t;
  629.  
  630. if (data[0])
  631. {
  632. strlcpy(t.szWord, data[0], sizeof(t.szWord));
  633. m_vec_banwordTable.push_back(t);
  634. }
  635. }
  636.  
  637. sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
  638. return true;
  639. }
  640.  
  641. bool CClientManager::InitializeItemAttrTable()
  642. {
  643. char query[4096];
  644. snprintf(query, sizeof(query),
  645. "SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr%s ORDER BY apply",
  646. GetTablePostfix());
  647.  
  648. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  649. SQLResult * pRes = pkMsg->Get();
  650.  
  651. if (!pRes->uiNumRows)
  652. {
  653. sys_err("no result from item_attr");
  654. return false;
  655. }
  656.  
  657. if (!m_vec_itemAttrTable.empty())
  658. {
  659. sys_log(0, "RELOAD: item_attr");
  660. m_vec_itemAttrTable.clear();
  661. }
  662.  
  663. m_vec_itemAttrTable.reserve(pRes->uiNumRows);
  664.  
  665. MYSQL_ROW data;
  666.  
  667. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  668. {
  669. TItemAttrTable t;
  670.  
  671. memset(&t, 0, sizeof(TItemAttrTable));
  672.  
  673. int col = 0;
  674.  
  675. strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  676. str_to_number(t.dwApplyIndex, data[col++]);
  677. str_to_number(t.dwProb, data[col++]);
  678. str_to_number(t.lValues[0], data[col++]);
  679. str_to_number(t.lValues[1], data[col++]);
  680. str_to_number(t.lValues[2], data[col++]);
  681. str_to_number(t.lValues[3], data[col++]);
  682. str_to_number(t.lValues[4], data[col++]);
  683. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  684. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  685. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  686. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  687. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  688. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  689. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  690. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  691.  
  692. sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
  693. t.szApply,
  694. t.dwProb,
  695. t.lValues[0],
  696. t.lValues[1],
  697. t.lValues[2],
  698. t.lValues[3],
  699. t.lValues[4],
  700. t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  701. t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  702. t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  703. t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  704. t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  705. t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  706. t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  707. t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
  708.  
  709. m_vec_itemAttrTable.push_back(t);
  710. }
  711.  
  712. return true;
  713. }
  714.  
  715. bool CClientManager::InitializeItemRareTable()
  716. {
  717. char query[4096];
  718. snprintf(query, sizeof(query),
  719. "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",
  720. GetTablePostfix());
  721.  
  722. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  723. SQLResult * pRes = pkMsg->Get();
  724.  
  725. if (!pRes->uiNumRows)
  726. {
  727. sys_err("no result from item_attr_rare");
  728. return false;
  729. }
  730.  
  731. if (!m_vec_itemRareTable.empty())
  732. {
  733. sys_log(0, "RELOAD: item_attr_rare");
  734. m_vec_itemRareTable.clear();
  735. }
  736.  
  737. m_vec_itemRareTable.reserve(pRes->uiNumRows);
  738.  
  739. MYSQL_ROW data;
  740.  
  741. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  742. {
  743. TItemAttrTable t;
  744.  
  745. memset(&t, 0, sizeof(TItemAttrTable));
  746.  
  747. int col = 0;
  748.  
  749. strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  750. str_to_number(t.dwApplyIndex, data[col++]);
  751. str_to_number(t.dwProb, data[col++]);
  752. str_to_number(t.lValues[0], data[col++]);
  753. str_to_number(t.lValues[1], data[col++]);
  754. str_to_number(t.lValues[2], data[col++]);
  755. str_to_number(t.lValues[3], data[col++]);
  756. str_to_number(t.lValues[4], data[col++]);
  757. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  758. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  759. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  760. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  761. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  762. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  763. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  764. str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  765.  
  766. sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
  767. t.szApply,
  768. t.dwProb,
  769. t.lValues[0],
  770. t.lValues[1],
  771. t.lValues[2],
  772. t.lValues[3],
  773. t.lValues[4],
  774. t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  775. t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  776. t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  777. t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  778. t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  779. t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  780. t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  781. t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
  782.  
  783. m_vec_itemRareTable.push_back(t);
  784. }
  785.  
  786. return true;
  787. }
  788.  
  789. bool CClientManager::InitializeLandTable()
  790. {
  791. using namespace building;
  792.  
  793. char query[4096];
  794.  
  795. snprintf(query, sizeof(query),
  796. "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
  797. "FROM land%s WHERE enable='YES' ORDER BY id",
  798. GetTablePostfix());
  799.  
  800. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  801. SQLResult * pRes = pkMsg->Get();
  802.  
  803. if (!m_vec_kLandTable.empty())
  804. {
  805. sys_log(0, "RELOAD: land");
  806. m_vec_kLandTable.clear();
  807. }
  808.  
  809. m_vec_kLandTable.reserve(pRes->uiNumRows);
  810.  
  811. MYSQL_ROW data;
  812.  
  813. if (pRes->uiNumRows > 0)
  814. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  815. {
  816. TLand t;
  817.  
  818. memset(&t, 0, sizeof(t));
  819.  
  820. int col = 0;
  821.  
  822. str_to_number(t.dwID, data[col++]);
  823. str_to_number(t.lMapIndex, data[col++]);
  824. str_to_number(t.x, data[col++]);
  825. str_to_number(t.y, data[col++]);
  826. str_to_number(t.width, data[col++]);
  827. str_to_number(t.height, data[col++]);
  828. str_to_number(t.dwGuildID, data[col++]);
  829. str_to_number(t.bGuildLevelLimit, data[col++]);
  830. str_to_number(t.dwPrice, data[col++]);
  831.  
  832. 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);
  833.  
  834. m_vec_kLandTable.push_back(t);
  835. }
  836.  
  837. return true;
  838. }
  839.  
  840. void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
  841. {
  842. // format: 10,1/20,3/300,50
  843. const char * t = c_pszString;
  844. const char * p = strchr(t, '/');
  845. std::pair<int, int> k;
  846.  
  847. char szNum[32 + 1];
  848. char * comma;
  849.  
  850. while (p)
  851. {
  852. if (isnhdigit(*t))
  853. {
  854. strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
  855.  
  856. comma = strchr(szNum, ',');
  857.  
  858. if (comma)
  859. {
  860. *comma = '\0';
  861. str_to_number(k.second, comma+1);
  862. }
  863. else
  864. k.second = 0;
  865.  
  866. str_to_number(k.first, szNum);
  867. vec.push_back(k);
  868. }
  869.  
  870. t = p + 1;
  871. p = strchr(t, '/');
  872. }
  873.  
  874. if (isnhdigit(*t))
  875. {
  876. strlcpy(szNum, t, sizeof(szNum));
  877.  
  878. comma = strchr(const_cast<char*>(t), ',');
  879.  
  880. if (comma)
  881. {
  882. *comma = '\0';
  883. str_to_number(k.second, comma+1);
  884. }
  885. else
  886. k.second = 0;
  887.  
  888. str_to_number(k.first, szNum);
  889. vec.push_back(k);
  890. }
  891. }
  892.  
  893. bool CClientManager::InitializeObjectProto()
  894. {
  895. using namespace building;
  896.  
  897. char query[4096];
  898. snprintf(query, sizeof(query),
  899. "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
  900. "FROM object_proto%s ORDER BY vnum",
  901. GetTablePostfix());
  902.  
  903. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  904. SQLResult * pRes = pkMsg->Get();
  905.  
  906. if (!m_vec_kObjectProto.empty())
  907. {
  908. sys_log(0, "RELOAD: object_proto");
  909. m_vec_kObjectProto.clear();
  910. }
  911.  
  912. m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
  913.  
  914. MYSQL_ROW data;
  915.  
  916. if (pRes->uiNumRows > 0)
  917. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  918. {
  919. TObjectProto t;
  920.  
  921. memset(&t, 0, sizeof(t));
  922.  
  923. int col = 0;
  924.  
  925. str_to_number(t.dwVnum, data[col++]);
  926. str_to_number(t.dwPrice, data[col++]);
  927.  
  928. std::vector<std::pair<int, int> > vec;
  929. parse_pair_number_string(data[col++], vec);
  930.  
  931. for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
  932. {
  933. std::pair<int, int> & r = vec[i];
  934.  
  935. t.kMaterials[i].dwItemVnum = r.first;
  936. t.kMaterials[i].dwCount = r.second;
  937. }
  938.  
  939. str_to_number(t.dwUpgradeVnum, data[col++]);
  940. str_to_number(t.dwUpgradeLimitTime, data[col++]);
  941. str_to_number(t.lLife, data[col++]);
  942. str_to_number(t.lRegion[0], data[col++]);
  943. str_to_number(t.lRegion[1], data[col++]);
  944. str_to_number(t.lRegion[2], data[col++]);
  945. str_to_number(t.lRegion[3], data[col++]);
  946.  
  947. // ADD_BUILDING_NPC
  948. str_to_number(t.dwNPCVnum, data[col++]);
  949. str_to_number(t.dwGroupVnum, data[col++]);
  950. str_to_number(t.dwDependOnGroupVnum, data[col++]);
  951.  
  952. t.lNPCX = 0;
  953. t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
  954. // END_OF_ADD_BUILDING_NPC
  955.  
  956. sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
  957. t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
  958.  
  959. m_vec_kObjectProto.push_back(t);
  960. }
  961.  
  962. return true;
  963. }
  964.  
  965. bool CClientManager::InitializeObjectTable()
  966. {
  967. using namespace building;
  968.  
  969. char query[4096];
  970. 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());
  971.  
  972. std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  973. SQLResult * pRes = pkMsg->Get();
  974.  
  975. if (!m_map_pkObjectTable.empty())
  976. {
  977. sys_log(0, "RELOAD: object");
  978. m_map_pkObjectTable.clear();
  979. }
  980.  
  981. MYSQL_ROW data;
  982.  
  983. if (pRes->uiNumRows > 0)
  984. while ((data = mysql_fetch_row(pRes->pSQLResult)))
  985. {
  986. TObject * k = new TObject;
  987.  
  988. memset(k, 0, sizeof(TObject));
  989.  
  990. int col = 0;
  991.  
  992. str_to_number(k->dwID, data[col++]);
  993. str_to_number(k->dwLandID, data[col++]);
  994. str_to_number(k->dwVnum, data[col++]);
  995. str_to_number(k->lMapIndex, data[col++]);
  996. str_to_number(k->x, data[col++]);
  997. str_to_number(k->y, data[col++]);
  998. str_to_number(k->xRot, data[col++]);
  999. str_to_number(k->yRot, data[col++]);
  1000. str_to_number(k->zRot, data[col++]);
  1001. str_to_number(k->lLife, data[col++]);
  1002.  
  1003. sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
  1004. k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
  1005.  
  1006. m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
  1007. }
  1008.  
  1009. return true;
  1010. }
  1011.  
  1012. bool CClientManager::InitializeMonarch()
  1013. {
  1014. CMonarch::instance().LoadMonarch();
  1015.  
  1016. return true;
  1017. }
Advertisement
Add Comment
Please, Sign In to add comment