SHARE
TWEET

Untitled

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