Advertisement
P3NG3R

ClientManagerBoot.cpp

Feb 14th, 2015
497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 41.66 KB | None | 0 0
  1. #include <map>
  2. #include "stdafx.h"
  3. #include "ClientManager.h"
  4. #include "Main.h"
  5. #include "Monarch.h"
  6. #include "CsvReader.h"
  7. #include "ProtoReader.h"
  8.  
  9. using namespace std;
  10.  
  11. extern int g_test_server;
  12. extern std::string g_stLocaleNameColumn;
  13. // NOTXT_STARTUP_BEGIN
  14. extern int g_noTXT;
  15. // NOTXT_STARTUP_END
  16.  
  17. bool CClientManager::InitializeTables()
  18. {
  19.     // NOTXT_STARTUP_BEGIN
  20.     if (g_noTXT)
  21.     {
  22.         if (!InitializeMobTableSQL())
  23.         {
  24.             sys_err("InitializeMobTableSQL FAILED");
  25.             return false;
  26.         }
  27.         if (!InitializeItemTableSQL())
  28.         {
  29.             sys_err("InitializeItemTableSQL FAILED");
  30.             return false;
  31.         }
  32.     }
  33.     else
  34.     {
  35.         if (!InitializeMobTableTXT())
  36.         {
  37.             sys_err("InitializeMobTableTXT FAILED");
  38.             return false;
  39.         }
  40.  
  41.         if (!MirrorMobTableIntoDB())
  42.         {
  43.             sys_err("MirrorMobTableIntoDB FAILED");
  44.             return false;
  45.         }
  46.  
  47.         if (!InitializeItemTableTXT())
  48.         {
  49.             sys_err("InitializeItemTableTXT FAILED");
  50.             return false;
  51.         }
  52.  
  53.         if (!MirrorItemTableIntoDB())
  54.         {
  55.             sys_err("MirrorItemTableIntoDB FAILED");
  56.             return false;
  57.         }
  58.     }
  59.     // NOTXT_STARTUP_END
  60.  
  61.     if (!InitializeShopTable())
  62.     {
  63.         sys_err("InitializeShopTable FAILED");
  64.         return false;
  65.     }
  66.  
  67.     if (!InitializeSkillTable())
  68.     {
  69.         sys_err("InitializeSkillTable FAILED");
  70.         return false;
  71.     }
  72.  
  73.     if (!InitializeRefineTable())
  74.     {
  75.         sys_err("InitializeRefineTable FAILED");
  76.         return false;
  77.     }
  78.  
  79.     if (!InitializeItemAttrTable())
  80.     {
  81.         sys_err("InitializeItemAttrTable FAILED");
  82.         return false;
  83.     }
  84.  
  85.     if (!InitializeItemRareTable())
  86.     {
  87.         sys_err("InitializeItemRareTable FAILED");
  88.         return false;
  89.     }
  90.  
  91.     if (!InitializeBanwordTable())
  92.     {
  93.         sys_err("InitializeBanwordTable FAILED");
  94.         return false;
  95.     }
  96.  
  97.     if (!InitializeLandTable())
  98.     {
  99.         sys_err("InitializeLandTable FAILED");
  100.         return false;
  101.     }
  102.  
  103.     if (!InitializeObjectProto())
  104.     {
  105.         sys_err("InitializeObjectProto FAILED");
  106.         return false;
  107.     }
  108.  
  109.     if (!InitializeObjectTable())
  110.     {
  111.         sys_err("InitializeObjectTable FAILED");
  112.         return false;
  113.     }
  114.  
  115.     if (!InitializeMonarch())
  116.     {
  117.         sys_err("InitializeMonarch FAILED");
  118.         return false;
  119.     }
  120.  
  121.     return true;
  122. }
  123.  
  124. bool CClientManager::InitializeRefineTable()
  125. {
  126.     char query[2048];
  127.  
  128.     snprintf(query, sizeof(query),
  129.             "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 FROM refine_proto%s",
  130.             GetTablePostfix());
  131.  
  132.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  133.     SQLResult * pRes = pkMsg->Get();
  134.  
  135.     if (!pRes->uiNumRows)
  136.     {
  137.         sys_err("InitializeRefineTable : Table count is zero.");
  138.         return false;
  139.     }
  140.  
  141.     if (m_pRefineTable)
  142.     {
  143.         sys_log(0, "RELOAD: refine_proto");
  144.         delete [] m_pRefineTable;
  145.         m_pRefineTable = NULL;
  146.     }
  147.  
  148.     m_iRefineTableSize = pRes->uiNumRows;
  149.  
  150.     m_pRefineTable = new TRefineTable[m_iRefineTableSize];
  151.     memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
  152.  
  153.     TRefineTable* prt = m_pRefineTable;
  154.     MYSQL_ROW data;
  155.  
  156.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  157.     {
  158.         //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
  159.         //"vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 "
  160.  
  161.         int col = 0;
  162.         //prt->src_vnum = atoi(data[col++]);
  163.         //prt->result_vnum = atoi(data[col++]);
  164.         str_to_number(prt->id, data[col++]);
  165.         str_to_number(prt->cost, data[col++]);
  166.         str_to_number(prt->prob, data[col++]);
  167.         for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
  168.         {
  169.             str_to_number(prt->materials[i].vnum, data[col++]);
  170.             str_to_number(prt->materials[i].count, data[col++]);
  171.             if (prt->materials[i].vnum == 0)
  172.             {
  173.                 prt->material_count = i;
  174.                 break;
  175.             }
  176.         }
  177.         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);
  178.         prt++;
  179.     }
  180.     return true;
  181. }
  182.  
  183. class FCompareVnum
  184. {
  185.     public:
  186.         bool operator () (const TEntityTable & a, const TEntityTable & b) const
  187.         {
  188.             return (a.dwVnum < b.dwVnum);
  189.         }
  190. };
  191.  
  192. bool CClientManager::InitializeMobTableTXT()
  193. {
  194.     map<int,const char*> localMap;
  195.     bool isNameFile = true;
  196.     cCsvTable nameData;
  197.     if(!nameData.Load("mob_names.txt",'\t'))
  198.     {
  199.         fprintf(stderr, "Could not load mob_names.txt\n");
  200.         isNameFile = false;
  201.     } else {
  202.         nameData.Next();
  203.         while(nameData.Next()) {
  204.             localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  205.         }
  206.     }
  207.  
  208.  
  209.  
  210.     cCsvTable data;
  211.     if(!data.Load("mob_proto.txt",'\t'))
  212.     {
  213.         fprintf(stderr, "Could not load mob_proto.txt.\n");
  214.         return false;
  215.     }
  216.  
  217.     data.Next();
  218.  
  219.     if (!m_vec_mobTable.empty())
  220.     {
  221.         sys_log(0, "RELOAD: mob_proto");
  222.         m_vec_mobTable.clear();
  223.     }
  224.     m_vec_mobTable.resize(data.m_File.GetRowCount()-1);
  225.     memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
  226.     TMobTable * mob_table = &m_vec_mobTable[0];
  227.  
  228.     while (data.Next())
  229.     {
  230.         if (!Set_Proto_Mob_Table(mob_table, data, localMap))
  231.         {
  232.             fprintf(stderr, "Could not process entry.\n");
  233.         }
  234.         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);
  235.         ++mob_table;
  236.     }
  237.     sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
  238.     return true;
  239. }
  240.  
  241. bool CClientManager::InitializeShopTable()
  242. {
  243.     MYSQL_ROW data;
  244.     int col;
  245.  
  246.     static const char * s_szQuery =
  247.         "SELECT "
  248.         "shop.vnum, "
  249.         "shop.npc_vnum, "
  250.         "shop_item.item_vnum, "
  251.         "shop_item.count "
  252.         "FROM shop LEFT JOIN shop_item "
  253.         "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
  254.  
  255.     std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
  256.  
  257.     // shopŔÇ vnumŔş ŔִµĄ shop_item ŔĚ ľřŔ»°ćżě... ˝ÇĆĐ·Î Ăł¸®µÇ´Ď ÁÖŔÇ żä¸Á.
  258.     // °íĂłľßÇҺκĐ
  259.     SQLResult * pRes2 = pkMsg2->Get();
  260.  
  261.     if (!pRes2->uiNumRows)
  262.     {
  263.         sys_err("InitializeShopTable : Table count is zero.");
  264.         return false;
  265.     }
  266.  
  267.     std::map<int, TShopTable *> map_shop;
  268.  
  269.     if (m_pShopTable)
  270.     {
  271.         delete [] (m_pShopTable);
  272.         m_pShopTable = NULL;
  273.     }
  274.  
  275.     TShopTable * shop_table = m_pShopTable;
  276.  
  277.     while ((data = mysql_fetch_row(pRes2->pSQLResult)))
  278.     {
  279.         col = 0;
  280.  
  281.         int iShopVnum = 0;
  282.         str_to_number(iShopVnum, data[col++]);
  283.  
  284.         if (map_shop.end() == map_shop.find(iShopVnum))
  285.         {
  286.             shop_table = new TShopTable;
  287.             memset(shop_table, 0, sizeof(TShopTable));
  288.             shop_table->dwVnum = iShopVnum;
  289.             map_shop[iShopVnum] = shop_table;
  290.         }
  291.         else
  292.             shop_table = map_shop[iShopVnum];
  293.  
  294.         str_to_number(shop_table->dwNPCVnum, data[col++]);
  295.  
  296.         if (!data[col]) // ľĆŔĚĹŰŔĚ ÇĎłŞµµ ľřŔ¸¸é NULLŔĚ ¸®ĹĎ µÇąÇ·Î..
  297.             continue;
  298.  
  299.         TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
  300.  
  301.         str_to_number(pItem->vnum, data[col++]);
  302.         str_to_number(pItem->count, data[col++]);
  303.  
  304.         ++shop_table->byItemCount;
  305.     }
  306.  
  307.     m_pShopTable = new TShopTable[map_shop.size()];
  308.     m_iShopTableSize = map_shop.size();
  309.  
  310.     typeof(map_shop.begin()) it = map_shop.begin();
  311.  
  312.     int i = 0;
  313.     while (it != map_shop.end())
  314.     {
  315.         thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
  316.         sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
  317.         ++i;
  318.     }
  319.  
  320.     return true;
  321. }
  322.  
  323. bool CClientManager::InitializeQuestItemTable()
  324. {
  325.     using namespace std;
  326.  
  327.     static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
  328.  
  329.     char query[1024];
  330.     snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
  331.  
  332.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  333.     SQLResult * pRes = pkMsg->Get();
  334.  
  335.     if (!pRes->uiNumRows)
  336.     {
  337.         sys_err("query error or no rows: %s", query);
  338.         return false;
  339.     }
  340.  
  341.     MYSQL_ROW row;
  342.  
  343.     while ((row = mysql_fetch_row(pRes->pSQLResult)))
  344.     {
  345.         int col = 0;
  346.  
  347.         TItemTable tbl;
  348.         memset(&tbl, 0, sizeof(tbl));
  349.  
  350.         str_to_number(tbl.dwVnum, row[col++]);
  351.  
  352.         if (row[col])
  353.             strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
  354.  
  355.         col++;
  356.  
  357.         if (row[col])
  358.             strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
  359.  
  360.         col++;
  361.  
  362.         if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
  363.         {
  364.             sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
  365.             continue;
  366.         }
  367.  
  368.         tbl.bType = ITEM_QUEST; // quest_item_proto Ĺ×ŔĚşíżˇ ŔÖ´Â °ÍµéŔş ¸đµÎ ITEM_QUEST ŔŻÇü
  369.         tbl.bSize = 1;
  370.  
  371.         m_vec_itemTable.push_back(tbl);
  372.     }
  373.  
  374.     return true;
  375. }
  376.  
  377. bool CClientManager::InitializeItemTableTXT()
  378. {
  379.     bool isNameFile = true;
  380.     map<int,const char*> localMap;
  381.     cCsvTable nameData;
  382.     if(!nameData.Load("item_names.txt",'\t'))
  383.     {
  384.         fprintf(stderr, "Could not load item_names.txt.\n");
  385.         isNameFile = false;
  386.     }
  387.     else
  388.     {
  389.         nameData.Next();
  390.         while(nameData.Next()) {
  391.             localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  392.         }
  393.     }
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.     cCsvTable data;
  403.     if(!data.Load("item_proto.txt",'\t'))
  404.     {
  405.         fprintf(stderr, "Could not load item_proto.txt.\n");
  406.         return false;
  407.     }
  408.  
  409.     data.Next();
  410.  
  411.     if (!m_vec_itemTable.empty())
  412.     {
  413.         sys_log(0, "RELOAD: item_proto");
  414.         m_vec_itemTable.clear();
  415.         m_map_itemTableByVnum.clear();
  416.     }
  417.  
  418.     m_vec_itemTable.resize(data.m_File.GetRowCount() - 1);
  419.     memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
  420.  
  421.     TItemTable * item_table = &m_vec_itemTable[0];
  422.  
  423.     while (data.Next())
  424.     {
  425.         if (!Set_Proto_Item_Table(item_table, data, localMap))
  426.         {
  427.             fprintf(stderr, "Could not process item_proto entry.\n");
  428.         }
  429.         m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  430.         ++item_table;
  431.     }
  432.     // QUEST_ITEM_PROTO_DISABLE
  433.     // InitializeQuestItemTable();
  434.     // END_OF_QUEST_ITEM_PROTO_DISABLE
  435.  
  436.     m_map_itemTableByVnum.clear();
  437.     itertype(m_vec_itemTable) it = m_vec_itemTable.begin();
  438.     while (it != m_vec_itemTable.end())
  439.     {
  440.         TItemTable * item_table = &(*(it++));
  441.         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",
  442.                 item_table->dwVnum,
  443.                 item_table->szName,
  444.                 item_table->szLocaleName,
  445.                 item_table->alValues[0],
  446.                 item_table->alValues[1],
  447.                 item_table->alValues[2],
  448.                 item_table->alValues[3],
  449.                 item_table->alValues[4],
  450.                 item_table->alValues[5],
  451.                 item_table->dwWearFlags,
  452.                 item_table->dwAntiFlags,
  453.                 item_table->dwImmuneFlag,
  454.                 item_table->dwRefinedVnum,
  455.                 item_table->wRefineSet,
  456.                 item_table->bAlterToMagicItemPct);
  457.  
  458.         m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  459.     }
  460.     sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
  461.     return true;
  462. }
  463.  
  464. // NOTXT_STARTUP_BEGIN
  465. bool CClientManager::InitializeMobTableSQL()
  466. {
  467.     char query[4096];
  468.     snprintf(query, sizeof(query),
  469.         "SELECT vnum, name, %s, type, rank, battle_type, level, "
  470.         "size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "
  471.         "on_click, empire, drop_item, resurrection_vnum, folder, "
  472.         "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
  473.         "gold_min, gold_max, def, attack_speed, move_speed, "
  474.         "aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
  475.         "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
  476.         "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
  477.         "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
  478.         "dam_multiply, summon, drain_sp, "
  479.         "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"
  480.         "skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "
  481.         "sp_godspeed, sp_deathblow, sp_revive "
  482.         "FROM mob_proto%s ORDER BY vnum",
  483.         g_stLocaleNameColumn.c_str(), GetTablePostfix());
  484.  
  485.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  486.     SQLResult * pRes = pkMsg->Get();
  487.  
  488.     if (!pRes->uiNumRows)
  489.     {
  490.         sys_err("Could not load mob_proto. No results!");
  491.         return false;
  492.     }
  493.  
  494.     sys_log(0, "MOB_PROTO loading...");
  495.  
  496.     if (!m_vec_mobTable.empty())
  497.     {
  498.         sys_log(0, "RELOAD: mob_proto");
  499.         m_vec_mobTable.clear();
  500.     }
  501.  
  502.     m_vec_mobTable.resize(pRes->uiNumRows);
  503.     memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
  504.     TMobTable * mob_table = &m_vec_mobTable[0];
  505.  
  506.     MYSQL_ROW data;
  507.     int col;
  508.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  509.     {
  510.         col = 0;
  511.         str_to_number(mob_table->dwVnum, data[col++]);
  512.         strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName));
  513.         strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));
  514.         str_to_number(mob_table->bType, data[col++]);
  515.         str_to_number(mob_table->bRank, data[col++]);
  516.         str_to_number(mob_table->bBattleType, data[col++]);
  517.         str_to_number(mob_table->bLevel, data[col++]);
  518.         str_to_number(mob_table->bSize, data[col++]);
  519.         str_to_number(mob_table->dwAIFlag, data[col++]);
  520.         str_to_number(mob_table->dwRaceFlag, data[col++]);
  521.         str_to_number(mob_table->dwImmuneFlag, data[col++]);
  522.         str_to_number(mob_table->bOnClickType, data[col++]);
  523.         str_to_number(mob_table->bEmpire, data[col++]);
  524.         str_to_number(mob_table->dwDropItemVnum, data[col++]);
  525.         str_to_number(mob_table->dwResurrectionVnum, data[col++]);
  526.         strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
  527.         str_to_number(mob_table->bStr, data[col++]);
  528.         str_to_number(mob_table->bDex, data[col++]);
  529.         str_to_number(mob_table->bCon, data[col++]);
  530.         str_to_number(mob_table->bInt, data[col++]);
  531.         str_to_number(mob_table->dwDamageRange[0], data[col++]);
  532.         str_to_number(mob_table->dwDamageRange[1], data[col++]);
  533.         str_to_number(mob_table->dwMaxHP, data[col++]);
  534.         str_to_number(mob_table->bRegenCycle, data[col++]);
  535.         str_to_number(mob_table->bRegenPercent, data[col++]);
  536.         str_to_number(mob_table->dwExp, data[col++]);
  537.         str_to_number(mob_table->dwGoldMin, data[col++]);
  538.         str_to_number(mob_table->dwGoldMax, data[col++]);
  539.         str_to_number(mob_table->wDef, data[col++]);
  540.         str_to_number(mob_table->sAttackSpeed, data[col++]);
  541.         str_to_number(mob_table->sMovingSpeed, data[col++]);
  542.         str_to_number(mob_table->bAggresiveHPPct, data[col++]);
  543.         str_to_number(mob_table->wAggressiveSight, data[col++]);
  544.         str_to_number(mob_table->wAttackRange, data[col++]);
  545.         str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);
  546.  
  547.         int i;
  548.         for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
  549.             str_to_number(mob_table->cEnchants[i], data[col++]);
  550.  
  551.         for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
  552.             str_to_number(mob_table->cResists[i], data[col++]);
  553.  
  554.         str_to_number(mob_table->fDamMultiply, data[col++]);
  555.         str_to_number(mob_table->dwSummonVnum, data[col++]);
  556.         str_to_number(mob_table->dwDrainSP, data[col++]);
  557.  
  558.         for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)
  559.         {
  560.             str_to_number(mob_table->Skills[i].dwVnum, data[col++]);
  561.             str_to_number(mob_table->Skills[i].bLevel, data[col++]);
  562.         }
  563.  
  564.         str_to_number(mob_table->bBerserkPoint, data[col++]);
  565.         str_to_number(mob_table->bStoneSkinPoint, data[col++]);
  566.         str_to_number(mob_table->bGodSpeedPoint, data[col++]);
  567.         str_to_number(mob_table->bDeathBlowPoint, data[col++]);
  568.         str_to_number(mob_table->bRevivePoint, data[col++]);
  569.  
  570.         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);
  571.         ++mob_table;
  572.     }
  573.  
  574.  
  575.     sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
  576.     sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.\n", m_vec_mobTable.size());
  577.     return true;
  578. }
  579.  
  580. bool CClientManager::InitializeItemTableSQL()
  581. {
  582.     char query[4096];
  583.     snprintf(query, sizeof(query),
  584.         "SELECT vnum, vnum_range, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, "
  585.         "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
  586.         "limittype0, limitvalue0, limittype1, limitvalue1, "
  587.         "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  588.         "value0, value1, value2, value3, value4, value5 "
  589.         "FROM item_proto%s ORDER BY vnum",
  590.         g_stLocaleNameColumn.c_str(), GetTablePostfix());
  591.  
  592.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  593.     SQLResult * pRes = pkMsg->Get();
  594.  
  595.     if (!pRes->uiNumRows)
  596.     {
  597.         sys_err("Could not load item_proto. No results!");
  598.         return false;
  599.     }
  600.  
  601.     sys_log(0, "ITEM_PROTO loading...");
  602.  
  603.     if (!m_vec_itemTable.empty())
  604.     {
  605.         sys_log(0, "RELOAD: item_proto");
  606.         m_vec_itemTable.clear();
  607.         m_map_itemTableByVnum.clear();
  608.     }
  609.  
  610.     m_vec_itemTable.resize(pRes->uiNumRows);
  611.     memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
  612.     TItemTable * item_table = &m_vec_itemTable[0];
  613.  
  614.     MYSQL_ROW data;
  615.     int col;
  616.  
  617.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  618.     {
  619.         col = 0;
  620.  
  621.         str_to_number(item_table->dwVnum, data[col++]);
  622.         str_to_number(item_table->dwVnumRange, data[col++]);
  623.         strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
  624.         strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
  625.         str_to_number(item_table->bType, data[col++]);
  626.         str_to_number(item_table->bSubType, data[col++]);
  627.         str_to_number(item_table->dwGold, data[col++]);
  628.         str_to_number(item_table->dwShopBuyPrice, data[col++]);
  629.         str_to_number(item_table->bWeight, data[col++]);
  630.         str_to_number(item_table->bSize, data[col++]);
  631.         str_to_number(item_table->dwFlags, data[col++]);
  632.         str_to_number(item_table->dwWearFlags, data[col++]);
  633.         str_to_number(item_table->dwAntiFlags, data[col++]);
  634.         str_to_number(item_table->dwImmuneFlag, data[col++]);
  635.         str_to_number(item_table->dwRefinedVnum, data[col++]);
  636.         str_to_number(item_table->wRefineSet, data[col++]);
  637.         str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
  638.         str_to_number(item_table->bGainSocketPct, data[col++]);
  639.         str_to_number(item_table->sAddonType, data[col++]);
  640.  
  641.  
  642.         item_table->cLimitRealTimeFirstUseIndex = -1;
  643.         item_table->cLimitTimerBasedOnWearIndex = -1;
  644.  
  645.         int i;
  646.         for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  647.         {
  648.             str_to_number(item_table->aLimits[i].bType, data[col++]);
  649.             str_to_number(item_table->aLimits[i].lValue, data[col++]);
  650.  
  651.             if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType)
  652.                 item_table->cLimitRealTimeFirstUseIndex = (char)i;
  653.  
  654.             if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
  655.                 item_table->cLimitTimerBasedOnWearIndex = (char)i;
  656.         }
  657.  
  658.         for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  659.         {
  660.             str_to_number(item_table->aApplies[i].bType, data[col++]);
  661.             str_to_number(item_table->aApplies[i].lValue, data[col++]);
  662.         }
  663.  
  664.         for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  665.             str_to_number(item_table->alValues[i], data[col++]);
  666.  
  667.         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",
  668.                 item_table->dwVnum,item_table->szName,item_table->szLocaleName,
  669.                 item_table->alValues[0],item_table->alValues[1],item_table->alValues[2],
  670.                 item_table->alValues[3],item_table->alValues[4],item_table->alValues[5],
  671.                 item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag,
  672.                 item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct);
  673.  
  674.  
  675.  
  676.  
  677.         m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
  678.         ++item_table;
  679.     }
  680.  
  681.  
  682.  
  683.  
  684.     sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
  685.     sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.\n", m_vec_itemTable.size());
  686.     return true;
  687. }
  688. // NOTXT_STARTUP_END
  689.  
  690. bool CClientManager::InitializeSkillTable()
  691. {
  692.     char query[4096];
  693.     snprintf(query, sizeof(query),
  694.         "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
  695.         "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
  696.         "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
  697.         "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
  698.         "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
  699.         "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
  700.         "FROM skill_proto%s ORDER BY dwVnum",
  701.         GetTablePostfix());
  702.  
  703.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  704.     SQLResult * pRes = pkMsg->Get();
  705.  
  706.     if (!pRes->uiNumRows)
  707.     {
  708.         sys_err("no result from skill_proto");
  709.         return false;
  710.     }
  711.  
  712.     if (!m_vec_skillTable.empty())
  713.     {
  714.         sys_log(0, "RELOAD: skill_proto");
  715.         m_vec_skillTable.clear();
  716.     }
  717.  
  718.     m_vec_skillTable.reserve(pRes->uiNumRows);
  719.  
  720.     MYSQL_ROW data;
  721.     int col;
  722.  
  723.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  724.     {
  725.         TSkillTable t;
  726.         memset(&t, 0, sizeof(t));
  727.  
  728.         col = 0;
  729.  
  730.         str_to_number(t.dwVnum, data[col++]);
  731.         strlcpy(t.szName, data[col++], sizeof(t.szName));
  732.         str_to_number(t.bType, data[col++]);
  733.         str_to_number(t.bMaxLevel, data[col++]);
  734.         str_to_number(t.dwSplashRange, data[col++]);
  735.  
  736.         strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
  737.         strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
  738.         strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
  739.         strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
  740.         strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
  741.         strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
  742.         strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));
  743.  
  744.         str_to_number(t.dwFlag, data[col++]);
  745.         str_to_number(t.dwAffectFlag, data[col++]);
  746.  
  747.         strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
  748.         strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
  749.         strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
  750.         str_to_number(t.dwAffectFlag2, data[col++]);
  751.  
  752.         // ADD_GRANDMASTER_SKILL
  753.         strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
  754.         strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
  755.         strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));
  756.  
  757.         strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
  758.         // END_OF_ADD_GRANDMASTER_SKILL
  759.  
  760.         str_to_number(t.bLevelStep, data[col++]);
  761.         str_to_number(t.bLevelLimit, data[col++]);
  762.         str_to_number(t.preSkillVnum, data[col++]);
  763.         str_to_number(t.preSkillLevel, data[col++]);
  764.  
  765.         str_to_number(t.lMaxHit, data[col++]);
  766.  
  767.         strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));
  768.  
  769.         str_to_number(t.bSkillAttrType, data[col++]);
  770.         str_to_number(t.dwTargetRange, data[col++]);
  771.  
  772.         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);
  773.  
  774.         m_vec_skillTable.push_back(t);
  775.     }
  776.  
  777.     return true;
  778. }
  779.  
  780. bool CClientManager::InitializeBanwordTable()
  781. {
  782.     m_vec_banwordTable.clear();
  783.  
  784.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
  785.  
  786.     SQLResult * pRes = pkMsg->Get();
  787.  
  788.     if (pRes->uiNumRows == 0)
  789.         return true;
  790.  
  791.     MYSQL_ROW data;
  792.  
  793.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  794.     {
  795.         TBanwordTable t;
  796.  
  797.         if (data[0])
  798.         {
  799.             strlcpy(t.szWord, data[0], sizeof(t.szWord));
  800.             m_vec_banwordTable.push_back(t);
  801.         }
  802.     }
  803.  
  804.     sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
  805.     return true;
  806. }
  807.  
  808. bool CClientManager::InitializeItemAttrTable()
  809. {
  810.     char query[4096];
  811.     snprintf(query, sizeof(query),
  812.             "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",
  813.             GetTablePostfix());
  814.  
  815.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  816.     SQLResult * pRes = pkMsg->Get();
  817.  
  818.     if (!pRes->uiNumRows)
  819.     {
  820.         sys_err("no result from item_attr");
  821.         return false;
  822.     }
  823.  
  824.     if (!m_vec_itemAttrTable.empty())
  825.     {
  826.         sys_log(0, "RELOAD: item_attr");
  827.         m_vec_itemAttrTable.clear();
  828.     }
  829.  
  830.     m_vec_itemAttrTable.reserve(pRes->uiNumRows);
  831.  
  832.     MYSQL_ROW data;
  833.  
  834.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  835.     {
  836.         TItemAttrTable t;
  837.  
  838.         memset(&t, 0, sizeof(TItemAttrTable));
  839.  
  840.         int col = 0;
  841.  
  842.         strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  843.         str_to_number(t.dwApplyIndex, data[col++]);
  844.         str_to_number(t.dwProb, data[col++]);
  845.         str_to_number(t.lValues[0], data[col++]);
  846.         str_to_number(t.lValues[1], data[col++]);
  847.         str_to_number(t.lValues[2], data[col++]);
  848.         str_to_number(t.lValues[3], data[col++]);
  849.         str_to_number(t.lValues[4], data[col++]);
  850.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  851.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  852.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  853.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  854.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  855.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  856.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  857.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  858.  
  859.         sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
  860.                 t.szApply,
  861.                 t.dwProb,
  862.                 t.lValues[0],
  863.                 t.lValues[1],
  864.                 t.lValues[2],
  865.                 t.lValues[3],
  866.                 t.lValues[4],
  867.                 t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  868.                 t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  869.                 t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  870.                 t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  871.                 t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  872.                 t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  873.                 t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  874.                 t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
  875.  
  876.         m_vec_itemAttrTable.push_back(t);
  877.     }
  878.  
  879.     return true;
  880. }
  881.  
  882. bool CClientManager::InitializeItemRareTable()
  883. {
  884.     char query[4096];
  885.     snprintf(query, sizeof(query),
  886.             "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",
  887.             GetTablePostfix());
  888.  
  889.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  890.     SQLResult * pRes = pkMsg->Get();
  891.  
  892.     if (!pRes->uiNumRows)
  893.     {
  894.         sys_err("no result from item_attr_rare");
  895.         return false;
  896.     }
  897.  
  898.     if (!m_vec_itemRareTable.empty())
  899.     {
  900.         sys_log(0, "RELOAD: item_attr_rare");
  901.         m_vec_itemRareTable.clear();
  902.     }
  903.  
  904.     m_vec_itemRareTable.reserve(pRes->uiNumRows);
  905.  
  906.     MYSQL_ROW data;
  907.  
  908.     while ((data = mysql_fetch_row(pRes->pSQLResult)))
  909.     {
  910.         TItemAttrTable t;
  911.  
  912.         memset(&t, 0, sizeof(TItemAttrTable));
  913.  
  914.         int col = 0;
  915.  
  916.         strlcpy(t.szApply, data[col++], sizeof(t.szApply));
  917.         str_to_number(t.dwApplyIndex, data[col++]);
  918.         str_to_number(t.dwProb, data[col++]);
  919.         str_to_number(t.lValues[0], data[col++]);
  920.         str_to_number(t.lValues[1], data[col++]);
  921.         str_to_number(t.lValues[2], data[col++]);
  922.         str_to_number(t.lValues[3], data[col++]);
  923.         str_to_number(t.lValues[4], data[col++]);
  924.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
  925.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
  926.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
  927.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
  928.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
  929.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
  930.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
  931.         str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
  932.  
  933.         sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
  934.                 t.szApply,
  935.                 t.dwProb,
  936.                 t.lValues[0],
  937.                 t.lValues[1],
  938.                 t.lValues[2],
  939.                 t.lValues[3],
  940.                 t.lValues[4],
  941.                 t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
  942.                 t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
  943.                 t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
  944.                 t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
  945.                 t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
  946.                 t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
  947.                 t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
  948.                 t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
  949.  
  950.         m_vec_itemRareTable.push_back(t);
  951.     }
  952.  
  953.     return true;
  954. }
  955.  
  956. bool CClientManager::InitializeLandTable()
  957. {
  958.     using namespace building;
  959.  
  960.     char query[4096];
  961.  
  962.     snprintf(query, sizeof(query),
  963.         "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
  964.         "FROM land%s WHERE enable='YES' ORDER BY id",
  965.         GetTablePostfix());
  966.  
  967.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  968.     SQLResult * pRes = pkMsg->Get();
  969.  
  970.     if (!m_vec_kLandTable.empty())
  971.     {
  972.         sys_log(0, "RELOAD: land");
  973.         m_vec_kLandTable.clear();
  974.     }
  975.  
  976.     m_vec_kLandTable.reserve(pRes->uiNumRows);
  977.  
  978.     MYSQL_ROW data;
  979.  
  980.     if (pRes->uiNumRows > 0)
  981.         while ((data = mysql_fetch_row(pRes->pSQLResult)))
  982.         {
  983.             TLand t;
  984.  
  985.             memset(&t, 0, sizeof(t));
  986.  
  987.             int col = 0;
  988.  
  989.             str_to_number(t.dwID, data[col++]);
  990.             str_to_number(t.lMapIndex, data[col++]);
  991.             str_to_number(t.x, data[col++]);
  992.             str_to_number(t.y, data[col++]);
  993.             str_to_number(t.width, data[col++]);
  994.             str_to_number(t.height, data[col++]);
  995.             str_to_number(t.dwGuildID, data[col++]);
  996.             str_to_number(t.bGuildLevelLimit, data[col++]);
  997.             str_to_number(t.dwPrice, data[col++]);
  998.  
  999.             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);
  1000.  
  1001.             m_vec_kLandTable.push_back(t);
  1002.         }
  1003.  
  1004.     return true;
  1005. }
  1006.  
  1007. void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
  1008. {
  1009.     // format: 10,1/20,3/300,50
  1010.     const char * t = c_pszString;
  1011.     const char * p = strchr(t, '/');
  1012.     std::pair<int, int> k;
  1013.  
  1014.     char szNum[32 + 1];
  1015.     char * comma;
  1016.  
  1017.     while (p)
  1018.     {
  1019.         if (isnhdigit(*t))
  1020.         {
  1021.             strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
  1022.  
  1023.             comma = strchr(szNum, ',');
  1024.  
  1025.             if (comma)
  1026.             {
  1027.                 *comma = '\0';
  1028.                 str_to_number(k.second, comma+1);
  1029.             }
  1030.             else
  1031.                 k.second = 0;
  1032.  
  1033.             str_to_number(k.first, szNum);
  1034.             vec.push_back(k);
  1035.         }
  1036.  
  1037.         t = p + 1;
  1038.         p = strchr(t, '/');
  1039.     }
  1040.  
  1041.     if (isnhdigit(*t))
  1042.     {
  1043.         strlcpy(szNum, t, sizeof(szNum));
  1044.  
  1045.         comma = strchr(const_cast<char*>(t), ',');
  1046.  
  1047.         if (comma)
  1048.         {
  1049.             *comma = '\0';
  1050.             str_to_number(k.second, comma+1);
  1051.         }
  1052.         else
  1053.             k.second = 0;
  1054.  
  1055.         str_to_number(k.first, szNum);
  1056.         vec.push_back(k);
  1057.     }
  1058. }
  1059.  
  1060. bool CClientManager::InitializeObjectProto()
  1061. {
  1062.     using namespace building;
  1063.  
  1064.     char query[4096];
  1065.     snprintf(query, sizeof(query),
  1066.             "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
  1067.             "FROM object_proto%s ORDER BY vnum",
  1068.             GetTablePostfix());
  1069.  
  1070.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1071.     SQLResult * pRes = pkMsg->Get();
  1072.  
  1073.     if (!m_vec_kObjectProto.empty())
  1074.     {
  1075.         sys_log(0, "RELOAD: object_proto");
  1076.         m_vec_kObjectProto.clear();
  1077.     }
  1078.  
  1079.     m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
  1080.  
  1081.     MYSQL_ROW data;
  1082.  
  1083.     if (pRes->uiNumRows > 0)
  1084.         while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1085.         {
  1086.             TObjectProto t;
  1087.  
  1088.             memset(&t, 0, sizeof(t));
  1089.  
  1090.             int col = 0;
  1091.  
  1092.             str_to_number(t.dwVnum, data[col++]);
  1093.             str_to_number(t.dwPrice, data[col++]);
  1094.  
  1095.             std::vector<std::pair<int, int> > vec;
  1096.             parse_pair_number_string(data[col++], vec);
  1097.  
  1098.             for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
  1099.             {
  1100.                 std::pair<int, int> & r = vec[i];
  1101.  
  1102.                 t.kMaterials[i].dwItemVnum = r.first;
  1103.                 t.kMaterials[i].dwCount = r.second;
  1104.             }
  1105.  
  1106.             str_to_number(t.dwUpgradeVnum, data[col++]);
  1107.             str_to_number(t.dwUpgradeLimitTime, data[col++]);
  1108.             str_to_number(t.lLife, data[col++]);
  1109.             str_to_number(t.lRegion[0], data[col++]);
  1110.             str_to_number(t.lRegion[1], data[col++]);
  1111.             str_to_number(t.lRegion[2], data[col++]);
  1112.             str_to_number(t.lRegion[3], data[col++]);
  1113.  
  1114.             // ADD_BUILDING_NPC
  1115.             str_to_number(t.dwNPCVnum, data[col++]);
  1116.             str_to_number(t.dwGroupVnum, data[col++]);
  1117.             str_to_number(t.dwDependOnGroupVnum, data[col++]);
  1118.  
  1119.             t.lNPCX = 0;
  1120.             t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
  1121.             // END_OF_ADD_BUILDING_NPC
  1122.  
  1123.             sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
  1124.                     t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
  1125.  
  1126.             m_vec_kObjectProto.push_back(t);
  1127.         }
  1128.  
  1129.     return true;
  1130. }
  1131.  
  1132. bool CClientManager::InitializeObjectTable()
  1133. {
  1134.     using namespace building;
  1135.  
  1136.     char query[4096];
  1137.     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());
  1138.  
  1139.     std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
  1140.     SQLResult * pRes = pkMsg->Get();
  1141.  
  1142.     if (!m_map_pkObjectTable.empty())
  1143.     {
  1144.         sys_log(0, "RELOAD: object");
  1145.         m_map_pkObjectTable.clear();
  1146.     }
  1147.  
  1148.     MYSQL_ROW data;
  1149.  
  1150.     if (pRes->uiNumRows > 0)
  1151.         while ((data = mysql_fetch_row(pRes->pSQLResult)))
  1152.         {
  1153.             TObject * k = new TObject;
  1154.  
  1155.             memset(k, 0, sizeof(TObject));
  1156.  
  1157.             int col = 0;
  1158.  
  1159.             str_to_number(k->dwID, data[col++]);
  1160.             str_to_number(k->dwLandID, data[col++]);
  1161.             str_to_number(k->dwVnum, data[col++]);
  1162.             str_to_number(k->lMapIndex, data[col++]);
  1163.             str_to_number(k->x, data[col++]);
  1164.             str_to_number(k->y, data[col++]);
  1165.             str_to_number(k->xRot, data[col++]);
  1166.             str_to_number(k->yRot, data[col++]);
  1167.             str_to_number(k->zRot, data[col++]);
  1168.             str_to_number(k->lLife, data[col++]);
  1169.  
  1170.             sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
  1171.                     k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
  1172.  
  1173.             m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
  1174.         }
  1175.  
  1176.     return true;
  1177. }
  1178.  
  1179. bool CClientManager::InitializeMonarch()
  1180. {
  1181.     CMonarch::instance().LoadMonarch();
  1182.  
  1183.     return true;
  1184. }
  1185.  
  1186. bool CClientManager::MirrorMobTableIntoDB()
  1187. {
  1188.     for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
  1189.     {
  1190.         const TMobTable& t = *it;
  1191.         char query[4096];
  1192.         if (g_stLocaleNameColumn == "name")
  1193.         {
  1194.             snprintf(query, sizeof(query),
  1195.                 "replace into mob_proto%s "
  1196.                 "("
  1197.                 "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
  1198.                 "on_click, empire, drop_item, resurrection_vnum, folder, "
  1199.                 "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
  1200.                 "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
  1201.  
  1202.                 "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
  1203.                 "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
  1204.                 "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
  1205.                 "dam_multiply, summon, drain_sp, "
  1206.  
  1207.                 "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
  1208.                 "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
  1209.                 "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
  1210.                 ") "
  1211.                 "values ("
  1212.  
  1213.                 "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
  1214.                 "%d, %d, %d, %d, '%s', "
  1215.                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1216.                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1217.  
  1218.                 "%d, %d, %d, %d, %d, %d, "
  1219.                 "%d, %d, %d, %d, %d, %d, "
  1220.                 "%d, %d, %d, %d, %d, "
  1221.                 "%f, %d, %d, "
  1222.  
  1223.                 "%d, %d, %d, %d, %d, %d, "
  1224.                 "%d, %d, %d, %d, "
  1225.                 "%d, %d, %d, %d, %d"
  1226.                 ")",
  1227.                 GetTablePostfix(), /*g_stLocaleNameColumn.c_str(),*/
  1228.  
  1229.                 t.dwVnum, t.szName, /*t.szLocaleName, */t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
  1230.                 t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
  1231.                 t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
  1232.  
  1233.                 t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
  1234.                 t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
  1235.                 t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
  1236.                 t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10],
  1237.                 t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,
  1238.  
  1239.                 t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
  1240.                 t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
  1241.                 t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
  1242.                 );
  1243.         }
  1244.         else
  1245.         {
  1246.             snprintf(query, sizeof(query),
  1247.                 "replace into mob_proto%s "
  1248.                 "("
  1249.                 "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
  1250.                 "on_click, empire, drop_item, resurrection_vnum, folder, "
  1251.                 "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
  1252.                 "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
  1253.  
  1254.                 "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
  1255.                 "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
  1256.                 "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
  1257.                 "dam_multiply, summon, drain_sp, "
  1258.  
  1259.                 "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
  1260.                 "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
  1261.                 "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
  1262.                 ") "
  1263.                 "values ("
  1264.  
  1265.                 "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
  1266.                 "%d, %d, %d, %d, '%s', "
  1267.                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1268.                 "%d, %d, %d, %d, %d, %d, %d, %d, %d, "
  1269.  
  1270.                 "%d, %d, %d, %d, %d, %d, "
  1271.                 "%d, %d, %d, %d, %d, %d, "
  1272.                 "%d, %d, %d, %d, %d, "
  1273.                 "%f, %d, %d, "
  1274.  
  1275.                 "%d, %d, %d, %d, %d, %d, "
  1276.                 "%d, %d, %d, %d, "
  1277.                 "%d, %d, %d, %d, %d"
  1278.                 ")",
  1279.                 GetTablePostfix(), g_stLocaleNameColumn.c_str(),
  1280.  
  1281.                 t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
  1282.                 t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
  1283.                 t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
  1284.                 t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
  1285.  
  1286.                 t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
  1287.                 t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
  1288.                 t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10],
  1289.                 t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,
  1290.  
  1291.                 t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
  1292.                 t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
  1293.                 t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
  1294.                 );
  1295.         }
  1296.  
  1297.         CDBManager::instance().AsyncQuery(query);
  1298.     }
  1299.     return true;
  1300. }
  1301.  
  1302. bool CClientManager::MirrorItemTableIntoDB()
  1303. {
  1304.     for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
  1305.     {
  1306.         if (g_stLocaleNameColumn != "name")
  1307.         {
  1308.             const TItemTable& t = *it;
  1309.             char query[4096];
  1310.             snprintf(query, sizeof(query),
  1311.                 "replace into item_proto%s ("
  1312.                 "vnum, vnum_range, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
  1313.                 "flag, wearflag, antiflag, immuneflag, "
  1314.                 "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
  1315.                 "limittype0, limitvalue0, limittype1, limitvalue1, "
  1316.                 "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  1317.                 "value0, value1, value2, value3, value4, value5 ) "
  1318.                 "values ("
  1319.                 "%d, %d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
  1320.                 "%d, %d, %d, %d, "
  1321.                 "%d, %d, %d, %d, %d, "
  1322.                 "%d, %ld, %d, %ld, "
  1323.                 "%d, %ld, %d, %ld, %d, %ld, "
  1324.                 "%ld, %ld, %ld, %ld, %ld, %ld )",
  1325.                 GetTablePostfix(), g_stLocaleNameColumn.c_str(),
  1326.                 t.dwVnum, t.dwVnumRange, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
  1327.                 t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
  1328.                 t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
  1329.                 t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
  1330.                 t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
  1331.                 t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
  1332.             CDBManager::instance().AsyncQuery(query);
  1333.         }
  1334.         else
  1335.         {
  1336.             const TItemTable& t = *it;
  1337.             char query[4096];
  1338.             snprintf(query, sizeof(query),
  1339.                 "replace into item_proto%s ("
  1340.                 "vnum, vnum_range, type, subtype, name, gold, shop_buy_price, weight, size, "
  1341.                 "flag, wearflag, antiflag, immuneflag, "
  1342.                 "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
  1343.                 "limittype0, limitvalue0, limittype1, limitvalue1, "
  1344.                 "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
  1345.                 "value0, value1, value2, value3, value4, value5 ) "
  1346.                 "values ("
  1347.                 "%d, %d, %d, %d, \"%s\", %d, %d, %d, %d, "
  1348.                 "%d, %d, %d, %d, "
  1349.                 "%d, %d, %d, %d, %d, "
  1350.                 "%d, %ld, %d, %ld, "
  1351.                 "%d, %ld, %d, %ld, %d, %ld, "
  1352.                 "%ld, %ld, %ld, %ld, %ld, %ld )",
  1353.                 GetTablePostfix(),
  1354.                 t.dwVnum, t.dwVnumRange, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
  1355.                 t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
  1356.                 t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
  1357.                 t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
  1358.                 t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
  1359.                 t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
  1360.             CDBManager::instance().AsyncQuery(query);
  1361.         }
  1362.     }
  1363.     return true;
  1364. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement