Jump to content

Retail

Inactive Member
  • Posts

    28
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by Retail

  1.  I've got some Errors in the database Syserr:

    SYSERR: Mar 23 10:07:48 :: ChildLoop: AsyncSQL: query failed: Column count doesn't match value count at row 1 (query: replace into mob_proto  (vnum, name, locale_name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, on_click, empire, drop_item, resurrection_vnum, folder, st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, dam_multiply, summon, drain_sp, skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, skill_vnum3, skill_level3, skill_vnum4, skill_level4, sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive) values (101, "???", "Wildhund" , 0, 0

     

    I found the Error, it's the ClientManagerBoot.cpp in the Database Source!

    I understand, mob_color & mount_capacity is missing! Because - in my SQL_DB (mob_proto) there are these tables and in my mob_proto.txt too.

    And in the ClientManagerBoot, there is nothing!

     

    i added the missing mob_color, mount_capacity

     

    Now the Syserr displays:

    SYSERR: Mar 23 15:55:55 :: ChildLoop: AsyncSQL: query failed: Column count doesn't match value count at row 1 (query: replace into mob_proto  (vnum, name, locale_name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, on_click, empire, drop_item, resurrection_vnum, folder, st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, dam_multiply, summon, drain_sp, skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, skill_vnum3, skill_level3, skill_vnum4, skill_level4, sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity) values (101, "???",

    Now there is the missing mob_color, mount_capacity!

     

    But, my Problem is...the mob_proto_SQL, the mob_proto.txt and the ClientManagerBoot are identical and i get also this Error! ....
     

    I marked my changes
    For Exampe:

     


    [ClientManagerBoot.cpp]

    Spoiler

     

                // vim:ts=4 sw=4
                #include <map>
                #include "stdafx.h"
                #include "ClientManager.h"
                #include "Main.h"
                #include "Monarch.h"
                #include "CsvReader.h"
                #include "ProtoReader.h"
                #include "Config.h"
                #include <cstddef>

                #if !defined(nullptr)
                #define nullptr NULL
                #endif

                using namespace std;

                extern int g_test_server;
                extern std::string g_stLocaleNameColumn;
                // NOTXT_STARTUP_BEGIN
                extern int g_noTXT;
                // NOTXT_STARTUP_END

                bool CClientManager::InitializeTables()
                {
                // NOTXT_STARTUP_BEGIN
                    if (g_noTXT) // item and mob proto
                    {
                    if (!InitializeMobTableSQL())
                    {
                        sys_err("InitializeMobTableSQL FAILED");
                        return false;
                    }
                    if (!InitializeItemTableSQL())
                    {
                        sys_err("InitializeItemTableSQL FAILED");
                        return false;
                    }
                }
                else
                {
                    if (!InitializeMobTableTXT())
                    {
                        sys_err("InitializeMobTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorMobTableIntoDB())
                    {
                        sys_err("MirrorMobTableIntoDB FAILED");
                        return false;
                    }
                 
                    if (!InitializeItemTableTXT())
                    {
                        sys_err("InitializeItemTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorItemTableIntoDB())
                    {
                        sys_err("MirrorItemTableIntoDB FAILED");
                        return false;
                    }
                }
                // NOTXT_STARTUP_END

                    if (!InitializeShopTable())
                    {
                        sys_err("InitializeShopTable FAILED");
                        return false;
                    }

                    if (!InitializeSkillTable())
                    {
                        sys_err("InitializeSkillTable FAILED");
                        return false;
                    }

                    if (!InitializeRefineTable())
                    {
                        sys_err("InitializeRefineTable FAILED");
                        return false;
                    }

                    if (!InitializeItemAttrTable())
                    {
                        sys_err("InitializeItemAttrTable FAILED");
                        return false;
                    }

                    if (!InitializeItemRareTable())
                    {
                        sys_err("InitializeItemRareTable FAILED");
                        return false;
                    }

                    if (!InitializeBanwordTable())
                    {
                        sys_err("InitializeBanwordTable FAILED");
                        return false;
                    }

                    if (!InitializeLandTable())
                    {
                        sys_err("InitializeLandTable FAILED");
                        return false;
                    }

                    if (!InitializeObjectProto())
                    {
                        sys_err("InitializeObjectProto FAILED");
                        return false;
                    }

                    if (!InitializeObjectTable())
                    {
                        sys_err("InitializeObjectTable FAILED");
                        return false;
                    }

                    if (!InitializeMonarch())
                    {
                        sys_err("InitializeMonarch FAILED");
                        return false;
                    }


                    return true;
                }

                bool CClientManager::InitializeRefineTable()
                {
                    char query[2048];

                    snprintf(query, sizeof(query),
                            "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 FROM refine_proto%s",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                        return true;

                    if (m_pRefineTable)
                    {
                        sys_log(0, "RELOAD: refine_proto");
                        delete [] m_pRefineTable;
                        m_pRefineTable = NULL;
                    }

                    m_iRefineTableSize = pRes->uiNumRows;

                    m_pRefineTable    = new TRefineTable[m_iRefineTableSize];
                    memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);

                    TRefineTable* prt = m_pRefineTable;
                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
                        //"vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 "

                        int col = 0;
                        //prt->src_vnum = atoi(data[col++]);
                        //prt->result_vnum = atoi(data[col++]);
                        str_to_number(prt->id, data[col++]);
                        str_to_number(prt->cost, data[col++]);
                        str_to_number(prt->prob, data[col++]);

                        for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
                        {
                            str_to_number(prt->materials.vnum, data[col++]);
                            str_to_number(prt->materials.count, data[col++]);
                            if (prt->materials.vnum == 0)
                            {
                                prt->material_count = i;
                                break;
                            }
                        }

                        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);

                        prt++;
                    }
                    return true;
                }

                class FCompareVnum
                {
                    public:
                        bool operator () (const TEntityTable & a, const TEntityTable & B) const
                        {
                            return (a.dwVnum < b.dwVnum);
                        }
                };

                bool CClientManager::InitializeMobTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ??? ??,
                    //        (!)[mob_table] ??? ????? ????. (?? : TMobTable)
                    //2. ??
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'mob_proto_test.txt'??? (a)[localMap] ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.
                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //3. ???
                    //    1)'mob_proto.txt' ??? mob_table? ? ?????. -> ??
                    //    2)'mob_names.txt' ??? mob_table? ? ?????.
                    //    3)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    4)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//


                    //===============================================//
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap] ?? ???.
                    //<(a)localMap ? ??>
                    map<int,const char*> localMap;
                    bool isNameFile = true;
                    //<?? ??>
                    cCsvTable nameData;
                    if(!nameData.Load("mob_names.txt",'\t'))
                    {
                        fprintf(stderr, "mob_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();    //??row ??.
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //________________________________________________//

                    
                    //===============================================//
                    //    2) 'mob_proto_test.txt'??? (a)localMap ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //0.
                    set<int> vnumSet;    //???? ?? ????, ???? ??? ??.
                    //1. ?? ????
                    bool isTestFile = true;
                    cCsvTable test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) ? ??.
                    map<DWORD, TMobTable *> test_map_mobTableByVnum;
                    if (isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        //?. ??? ??? ??? ??.
                        TMobTable * test_mob_table = NULL;
                        int test_MobTableSize = test_data.m_File.GetRowCount()-1;
                        test_mob_table = new TMobTable[test_MobTableSize];
                        memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);

                        //?. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {

                            if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));

                            
                            ++test_mob_table;
                            }

                    }

                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.

                    //1. ?? ??.
                    cCsvTable data;
                    if(!data.Load("mob_proto.txt",'\t')) {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next();                    //?? row ????
                    //2. (!)[mob_table] ????
                    //2.1 ?? ???? ??? ??
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(vnum);
                        if(it_map_mobTable != test_map_mobTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("mob_proto.txt",'\t'))
                    {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)
                    //2.2 ??? ?? mob_table ??
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                    m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                    //2.3 ??? ???
                    while (data.Next())
                    {
                        int col = 0;
                        //(b)[test_map_mobTableByVnum]? ?? row? ??? ??.
                        bool isSameRow = true;
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_mobTable == test_map_mobTableByVnum.end()) {
                            isSameRow = false;
                        }
                        //?? row ? ??? (b)?? ????.
                        if(isSameRow) {
                            TMobTable *tempTable = it_map_mobTable->second;

                            mob_table->dwVnum = tempTable->dwVnum;
                            strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName));
                            strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
                            mob_table->bRank = tempTable->bRank;
                            mob_table->bType = tempTable->bType;
                            mob_table->bBattleType = tempTable->bBattleType;
                            mob_table->bLevel = tempTable->bLevel;
                            mob_table->bSize = tempTable->bSize;
                            mob_table->dwAIFlag = tempTable->dwAIFlag;
                            mob_table->bMountCapacity = tempTable->bMountCapacity;
                            mob_table->dwRaceFlag = tempTable->dwRaceFlag;
                            mob_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            mob_table->bEmpire = tempTable->bEmpire;
                            strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName));
                            mob_table->bOnClickType = tempTable->bOnClickType;
                            mob_table->bStr = tempTable->bStr;
                            mob_table->bDex = tempTable->bDex;
                            mob_table->bCon = tempTable->bCon;
                            mob_table->bInt = tempTable->bInt;
                            mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0];
                            mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1];
                            mob_table->dwMaxHP = tempTable->dwMaxHP;
                            mob_table->bRegenCycle = tempTable->bRegenCycle;
                            mob_table->bRegenPercent = tempTable->bRegenPercent;
                            mob_table->dwGoldMin = tempTable->dwGoldMin;
                            mob_table->dwGoldMax = tempTable->dwGoldMax;
                            mob_table->dwExp = tempTable->dwExp;
                            mob_table->wDef = tempTable->wDef;
                            mob_table->sAttackSpeed = tempTable->sAttackSpeed;
                            mob_table->sMovingSpeed = tempTable->sMovingSpeed;
                            mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct;
                            mob_table->wAggressiveSight = tempTable->wAggressiveSight;
                            mob_table->wAttackRange = tempTable->wAttackRange;
                                
                            mob_table->dwDropItemVnum = tempTable->dwDropItemVnum;
                            mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum;
                            for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                                mob_table->cEnchants = tempTable->cEnchants;
                                
                            for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                                mob_table->cResists = tempTable->cResists;
                                
                            mob_table->fDamMultiply = tempTable->fDamMultiply;
                            mob_table->dwSummonVnum = tempTable->dwSummonVnum;
                            mob_table->dwDrainSP = tempTable->dwDrainSP;
                            mob_table->dwMobColor = tempTable->dwMobColor;
                            mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum;
                                
                            
                            mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel;
                            mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum;
                            mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel;
                            mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum;
                            mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel;
                            mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum;
                            mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel;
                            mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum;
                            mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel;
                            mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum;
                                
                            mob_table->bBerserkPoint = tempTable->bBerserkPoint;
                            mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint;
                            mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint;
                            mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint;
                            mob_table->bRevivePoint = tempTable->bRevivePoint;
                        } else {

                            if (!Set_Proto_Mob_Table(mob_table, data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                                        
                        }

                        //?? vnum ??
                        vnumSet.insert(mob_table->dwVnum);
                        

                        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);
                        ++mob_table;

                    }
                    //_____________________________________________________//


                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //?? ?? ????.
                    test_data.Destroy();
                    isTestFile = true;
                    test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    if(isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }

                            if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            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);
                            ++mob_table;

                        }
                    }
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    return true;
                }

                bool CClientManager::InitializeShopTable()
                {
                    MYSQL_ROW    data;
                    int        col;

                    static const char * s_szQuery =
                        "SELECT "
                        "shop.vnum, "
                        "shop.npc_vnum, "
                        "shop_item.item_vnum, "
                        "shop_item.count "
                        "FROM shop LEFT JOIN shop_item "
                        "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";

                    std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));

                    // shop? vnum? ??? shop_item ? ????... ??? ???? ?? ??.
                    // ??????
                    SQLResult * pRes2 = pkMsg2->Get();

                    if (!pRes2->uiNumRows)
                    {
                        sys_err("InitializeShopTable : Table count is zero.");
                        return false;
                    }

                    std::map<int, TShopTable *> map_shop;

                    if (m_pShopTable)
                    {
                        delete [] (m_pShopTable);
                        m_pShopTable = NULL;
                    }

                    TShopTable * shop_table = m_pShopTable;

                    while ((data = mysql_fetch_row(pRes2->pSQLResult)))
                    {
                        col = 0;

                        int iShopVnum = 0;
                        str_to_number(iShopVnum, data[col++]);

                        if (map_shop.end() == map_shop.find(iShopVnum))
                        {
                            shop_table = new TShopTable;
                            memset(shop_table, 0, sizeof(TShopTable));
                            shop_table->dwVnum    = iShopVnum;

                            map_shop[iShopVnum] = shop_table;
                        }
                        else
                            shop_table = map_shop[iShopVnum];

                        str_to_number(shop_table->dwNPCVnum, data[col++]);

                        if (!data[col])    // ???? ??? ??? NULL? ?? ???..
                            continue;

                        TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];

                        str_to_number(pItem->vnum, data[col++]);
                        str_to_number(pItem->count, data[col++]);

                        ++shop_table->byItemCount;
                    }

                    m_pShopTable = new TShopTable[map_shop.size()];
                    m_iShopTableSize = map_shop.size();

                    __typeof(map_shop.begin()) it = map_shop.begin();

                    int i = 0;

                    while (it != map_shop.end())
                    {
                        thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
                        sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
                        ++i;
                    }

                    return true;
                }

                bool CClientManager::InitializeQuestItemTable()
                {
                    using namespace std;

                    static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";

                    char query[1024];
                    snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("query error or no rows: %s", query);
                        return false;
                    }

                    MYSQL_ROW row;

                    while ((row = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        int col = 0;

                        TItemTable tbl;
                        memset(&tbl, 0, sizeof(tbl));

                        str_to_number(tbl.dwVnum, row[col++]);

                        if (row[col])
                            strlcpy(tbl.szName, row[col], sizeof(tbl.szName));

                        col++;

                        if (row[col])
                            strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));

                        col++;

                        if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
                        {
                            sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
                            continue;
                        }

                        tbl.bType = ITEM_QUEST; // quest_item_proto ???? ?? ??? ?? ITEM_QUEST ??
                        tbl.bSize = 1;

                        m_vec_itemTable.push_back(tbl);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ??? ??,
                    //        <item_table>(TItemTable), <m_map_itemTableByVnum> ????? ????.
                    //2. ??
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //3. ???
                    //    1)'item_proto.txt' ??? item_table? ? ?????. -> ??
                    //    2)'item_names.txt' ??? item_table? ? ?????.
                    //    3)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    4)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//

                 

                    //=================================================================================//
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //=================================================================================//
                    bool isNameFile = true;
                    map<int,const char*> localMap;
                    cCsvTable nameData;
                    if(!nameData.Load("item_names.txt",'\t'))
                    {
                        fprintf(stderr, "item_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //_________________________________________________________________//

                    //=================================================================//
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //=================================================================//
                    map<DWORD, TItemTable *> test_map_itemTableByVnum;
                    //1. ?? ????.
                    cCsvTable test_data;
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        //2. ??? ??? ??? ??.
                        TItemTable * test_item_table = NULL;
                        int test_itemTableSize = test_data.m_File.GetRowCount()-1;
                        test_item_table = new TItemTable[test_itemTableSize];
                        memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);

                        //3. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {


                            if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }

                            test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
                            test_item_table++;

                        }
                    }
                    //______________________________________________________________________//


                    //========================================================================//
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //========================================================================//

                    //vnum?? ??? ?. ??? ??? ???? ???? ????.
                    set<int> vnumSet;

                    //?? ????.
                    cCsvTable data;
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }

                    //===== ??? ??? ?? =====//
                    //?? ???? ??? ????.
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(vnum);
                        if(it_map_itemTable != test_map_itemTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    int testValue =  m_vec_itemTable.size();

                    TItemTable * item_table = &m_vec_itemTable[0];

                    while (data.Next())
                    {
                        int col = 0;

                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_itemTable == test_map_itemTableByVnum.end()) {
                            //? ?? ??? ??
                            
                            if (!Set_Proto_Item_Table(item_table, data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            
                        } else {    //$$$$$$$$$$$$$$$$$$$$$$$ ??? ??? ??? ??!    
                            TItemTable *tempTable = it_map_itemTable->second;

                            item_table->dwVnum = tempTable->dwVnum;
                            strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName));
                            strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
                            item_table->bType = tempTable->bType;
                            item_table->bSubType = tempTable->bSubType;
                            item_table->bSize = tempTable->bSize;
                            item_table->dwAntiFlags = tempTable->dwAntiFlags;
                            item_table->dwFlags = tempTable->dwFlags;
                            item_table->dwWearFlags = tempTable->dwWearFlags;
                            item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            item_table->dwGold = tempTable->dwGold;
                            item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
                            item_table->dwRefinedVnum =tempTable->dwRefinedVnum;
                            item_table->wRefineSet =tempTable->wRefineSet;
                            item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
                            item_table->cLimitRealTimeFirstUseIndex = -1;
                            item_table->cLimitTimerBasedOnWearIndex = -1;

                            int i;

                            for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                            {
                                item_table->aLimits.bType = tempTable->aLimits.bType;
                                item_table->aLimits.lValue = tempTable->aLimits.lValue;

                                if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                    item_table->cLimitRealTimeFirstUseIndex = (char)i;

                                if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                    item_table->cLimitTimerBasedOnWearIndex = (char)i;
                            }

                            for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                            {
                                item_table->aApplies.bType = tempTable->aApplies.bType;
                                item_table->aApplies.lValue = tempTable->aApplies.lValue;
                            }

                            for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                                item_table->alValues = tempTable->alValues;

                            item_table->bGainSocketPct = tempTable->bGainSocketPct;
                            item_table->sAddonType = tempTable->sAddonType;

                            item_table->bWeight  = tempTable->bWeight;

                        }
                        vnumSet.insert(item_table->dwVnum);
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                    //_______________________________________________________________________//

                    //========================================================================//
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //========================================================================//
                    test_data.Destroy();
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }
                            
                            if (!Set_Proto_Item_Table(item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));

                            item_table++;

                        }
                    }

                 

                    // QUEST_ITEM_PROTO_DISABLE
                    // InitializeQuestItemTable();
                    // END_OF_QUEST_ITEM_PROTO_DISABLE

                    m_map_itemTableByVnum.clear();

                    itertype(m_vec_itemTable) it = m_vec_itemTable.begin();

                    while (it != m_vec_itemTable.end())
                    {
                        TItemTable * item_table = &(*(it++));

                        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",
                                item_table->dwVnum,
                                item_table->szName,
                                item_table->szLocaleName,
                                item_table->alValues[0],
                                item_table->alValues[1],
                                item_table->alValues[2],
                                item_table->alValues[3],
                                item_table->alValues[4],
                                item_table->alValues[5],
                                item_table->dwWearFlags,
                                item_table->dwAntiFlags,
                                item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,
                                item_table->wRefineSet,
                                item_table->bAlterToMagicItemPct);

                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                    }
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    return true;
                }


                bool CClientManager::InitializeSkillTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
                        "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
                        "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
                        "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
                        "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
                        "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
                        "FROM skill_proto%s ORDER BY dwVnum",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from skill_proto");
                        return false;
                    }

                    if (!m_vec_skillTable.empty())
                    {
                        sys_log(0, "RELOAD: skill_proto");
                        m_vec_skillTable.clear();
                    }

                    m_vec_skillTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;
                    int        col;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TSkillTable t;
                        memset(&t, 0, sizeof(t));

                        col = 0;

                        str_to_number(t.dwVnum, data[col++]);
                        strlcpy(t.szName, data[col++], sizeof(t.szName));
                        str_to_number(t.bType, data[col++]);
                        str_to_number(t.bMaxLevel, data[col++]);
                        str_to_number(t.dwSplashRange, data[col++]);

                        strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
                        strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
                        strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
                        strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
                        strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
                        strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
                        strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));

                        str_to_number(t.dwFlag, data[col++]);
                        str_to_number(t.dwAffectFlag, data[col++]);

                        strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
                        strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
                        strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
                        str_to_number(t.dwAffectFlag2, data[col++]);

                        // ADD_GRANDMASTER_SKILL
                        strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
                        strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
                        strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));

                        strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
                        // END_OF_ADD_GRANDMASTER_SKILL

                        str_to_number(t.bLevelStep, data[col++]);
                        str_to_number(t.bLevelLimit, data[col++]);
                        str_to_number(t.preSkillVnum, data[col++]);
                        str_to_number(t.preSkillLevel, data[col++]);

                        str_to_number(t.lMaxHit, data[col++]);

                        strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));

                        str_to_number(t.bSkillAttrType, data[col++]);
                        str_to_number(t.dwTargetRange, data[col++]);

                        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);

                        m_vec_skillTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeBanwordTable()
                {
                    m_vec_banwordTable.clear();

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));

                    SQLResult * pRes = pkMsg->Get();

                    if (pRes->uiNumRows == 0)
                        return true;

                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TBanwordTable t;

                        if (data[0])
                        {
                            strlcpy(t.szWord, data[0], sizeof(t.szWord));
                            m_vec_banwordTable.push_back(t);
                        }
                    }

                    sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
                    return true;
                }

                bool CClientManager::InitializeItemAttrTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr");
                        return false;
                    }

                    if (!m_vec_itemAttrTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr");
                        m_vec_itemAttrTable.clear();
                    }

                    m_vec_itemAttrTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemAttrTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemRareTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr_rare");
                        return false;
                    }

                    if (!m_vec_itemRareTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr_rare");
                        m_vec_itemRareTable.clear();
                    }

                    m_vec_itemRareTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemRareTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeLandTable()
                {
                    using namespace building;

                    char query[4096];

                    snprintf(query, sizeof(query),
                        "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
                        "FROM land%s WHERE enable='YES' ORDER BY id",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kLandTable.empty())
                    {
                        sys_log(0, "RELOAD: land");
                        m_vec_kLandTable.clear();
                    }

                    m_vec_kLandTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TLand t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwID, data[col++]);
                            str_to_number(t.lMapIndex, data[col++]);
                            str_to_number(t.x, data[col++]);
                            str_to_number(t.y, data[col++]);
                            str_to_number(t.width, data[col++]);
                            str_to_number(t.height, data[col++]);
                            str_to_number(t.dwGuildID, data[col++]);
                            str_to_number(t.bGuildLevelLimit, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            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);

                            m_vec_kLandTable.push_back(t);
                        }

                    return true;
                }

                void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
                {
                    // format: 10,1/20,3/300,50
                    const char * t = c_pszString;
                    const char * p = strchr(t, '/');
                    std::pair<int, int> k;

                    char szNum[32 + 1];
                    char * comma;

                    while (p)
                    {
                        if (isnhdigit(*t))
                        {
                            strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));

                            comma = strchr(szNum, ',');

                            if (comma)
                            {
                                *comma = '\0';
                                str_to_number(k.second, comma+1);
                            }
                            else
                                k.second = 0;

                            str_to_number(k.first, szNum);
                            vec.push_back(k);
                        }

                        t = p + 1;
                        p = strchr(t, '/');
                    }

                    if (isnhdigit(*t))
                    {
                        strlcpy(szNum, t, sizeof(szNum));

                        comma = strchr(const_cast<char*>(t), ',');

                        if (comma)
                        {
                            *comma = '\0';
                            str_to_number(k.second, comma+1);
                        }
                        else
                            k.second = 0;

                        str_to_number(k.first, szNum);
                        vec.push_back(k);
                    }
                }

                bool CClientManager::InitializeObjectProto()
                {
                    using namespace building;

                    char query[4096];
                    snprintf(query, sizeof(query),
                            "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
                            "FROM object_proto%s ORDER BY vnum",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kObjectProto.empty())
                    {
                        sys_log(0, "RELOAD: object_proto");
                        m_vec_kObjectProto.clear();
                    }

                    m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObjectProto t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwVnum, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            std::vector<std::pair<int, int> > vec;
                            parse_pair_number_string(data[col++], vec);

                            for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
                            {
                                std::pair<int, int> & r = vec;

                                t.kMaterials.dwItemVnum = r.first;
                                t.kMaterials.dwCount = r.second;
                            }

                            str_to_number(t.dwUpgradeVnum, data[col++]);
                            str_to_number(t.dwUpgradeLimitTime, data[col++]);
                            str_to_number(t.lLife, data[col++]);
                            str_to_number(t.lRegion[0], data[col++]);
                            str_to_number(t.lRegion[1], data[col++]);
                            str_to_number(t.lRegion[2], data[col++]);
                            str_to_number(t.lRegion[3], data[col++]);

                            // ADD_BUILDING_NPC
                            str_to_number(t.dwNPCVnum, data[col++]);
                            str_to_number(t.dwGroupVnum, data[col++]);
                            str_to_number(t.dwDependOnGroupVnum, data[col++]);

                            t.lNPCX = 0;
                            t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
                            // END_OF_ADD_BUILDING_NPC

                            sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
                                    t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);

                            m_vec_kObjectProto.push_back(t);
                        }

                    return true;
                }

                bool CClientManager::InitializeObjectTable()
                {
                    using namespace building;

                    char query[4096];
                    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());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_map_pkObjectTable.empty())
                    {
                        sys_log(0, "RELOAD: object");
                        m_map_pkObjectTable.clear();
                    }

                    MYSQL_ROW data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObject * k = new TObject;

                            memset(k, 0, sizeof(TObject));

                            int col = 0;

                            str_to_number(k->dwID, data[col++]);
                            str_to_number(k->dwLandID, data[col++]);
                            str_to_number(k->dwVnum, data[col++]);
                            str_to_number(k->lMapIndex, data[col++]);
                            str_to_number(k->x, data[col++]);
                            str_to_number(k->y, data[col++]);
                            str_to_number(k->xRot, data[col++]);
                            str_to_number(k->yRot, data[col++]);
                            str_to_number(k->zRot, data[col++]);
                            str_to_number(k->lLife, data[col++]);

                            sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
                                    k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);

                            m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
                        }

                    return true;
                }

                bool CClientManager::InitializeMonarch()
                {
                    CMonarch::instance().LoadMonarch();

                    return true;
                }

                bool CClientManager::MirrorMobTableIntoDB()
                {
                    for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
                    {
                        const TMobTable& t = *it;
                        char query[4096];
                        if (g_stLocaleNameColumn == "name")
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(),
                                t.dwVnum, t.szName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }
                        else
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }

                        CDBManager::instance().AsyncQuery(query);
                    }

                    return true;
                }

                bool CClientManager::MirrorItemTableIntoDB()
                {
                    for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
                    {
                        if (g_stLocaleNameColumn != "name")
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                        else
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                    }
                    return true;
                }

                // NOTXT_STARTUP_BEGIN
                bool CClientManager::InitializeMobTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, rank, battle_type, level, "
                        "size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "
                        "on_click, empire, drop_item, resurrection_vnum, folder, "
                        "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                        "gold_min, gold_max, def, attack_speed, move_speed, "
                        "aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
                        "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                        "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                        "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                        "dam_multiply, summon, drain_sp, "
                        "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"
                        "skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "
                        "sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity "
                        "FROM mob_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load mob_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "MOB_PROTO loading...");
                 
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                 
                    m_vec_mobTable.resize(pRes->uiNumRows);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                        str_to_number(mob_table->dwVnum, data[col++]);
                        strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName));
                        strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));
                        str_to_number(mob_table->bType, data[col++]);
                        str_to_number(mob_table->bRank, data[col++]);
                        str_to_number(mob_table->bBattleType, data[col++]);
                        str_to_number(mob_table->bLevel, data[col++]);
                        str_to_number(mob_table->bSize, data[col++]);
                        str_to_number(mob_table->dwAIFlag, data[col++]);
                        str_to_number(mob_table->bMountCapacity, data[col++]);
                        str_to_number(mob_table->dwRaceFlag, data[col++]);
                        str_to_number(mob_table->dwImmuneFlag, data[col++]);
                        str_to_number(mob_table->bOnClickType, data[col++]);
                        str_to_number(mob_table->bEmpire, data[col++]);
                        str_to_number(mob_table->dwDropItemVnum, data[col++]);
                        str_to_number(mob_table->dwResurrectionVnum, data[col++]);
                        strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
                        str_to_number(mob_table->bStr, data[col++]);
                        str_to_number(mob_table->bDex, data[col++]);
                        str_to_number(mob_table->bCon, data[col++]);
                        str_to_number(mob_table->bInt, data[col++]);
                        str_to_number(mob_table->dwDamageRange[0], data[col++]);
                        str_to_number(mob_table->dwDamageRange[1], data[col++]);
                        str_to_number(mob_table->dwMaxHP, data[col++]);
                        str_to_number(mob_table->bRegenCycle, data[col++]);
                        str_to_number(mob_table->bRegenPercent, data[col++]);
                        str_to_number(mob_table->dwExp, data[col++]);
                        str_to_number(mob_table->dwGoldMin, data[col++]);
                        str_to_number(mob_table->dwGoldMax, data[col++]);
                        str_to_number(mob_table->wDef, data[col++]);
                        str_to_number(mob_table->sAttackSpeed, data[col++]);
                        str_to_number(mob_table->sMovingSpeed, data[col++]);
                        str_to_number(mob_table->bAggresiveHPPct, data[col++]);
                        str_to_number(mob_table->wAggressiveSight, data[col++]);
                        str_to_number(mob_table->wAttackRange, data[col++]);
                        str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);
                 
                        int i;
                        for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cEnchants, data[col++]);
                 
                        for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cResists, data[col++]);
                 
                        str_to_number(mob_table->fDamMultiply, data[col++]);
                        str_to_number(mob_table->dwSummonVnum, data[col++]);
                        str_to_number(mob_table->dwDrainSP, data[col++]);
                        str_to_number(mob_table->dwMobColor, data[col++]);
                 
                        for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)
                        {
                            str_to_number(mob_table->Skills.dwVnum, data[col++]);
                            str_to_number(mob_table->Skills.bLevel, data[col++]);
                        }
                 
                        str_to_number(mob_table->bBerserkPoint, data[col++]);
                        str_to_number(mob_table->bStoneSkinPoint, data[col++]);
                        str_to_number(mob_table->bGodSpeedPoint, data[col++]);
                        str_to_number(mob_table->bDeathBlowPoint, data[col++]);
                        str_to_number(mob_table->bRevivePoint, data[col++]);
                 
                        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);
                        ++mob_table;
                    }
                 
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.\n", m_vec_mobTable.size());
                    return true;
                }
                 
                bool CClientManager::InitializeItemTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, "
                        "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                        "limittype0, limitvalue0, limittype1, limitvalue1, "
                        "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                        "value0, value1, value2, value3, value4, value5 "
                        "FROM item_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load item_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "ITEM_PROTO loading...");
                 
                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }
                 
                    m_vec_itemTable.resize(pRes->uiNumRows);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    TItemTable * item_table = &m_vec_itemTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                 
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                 
                        str_to_number(item_table->dwVnum, data[col++]);
                        strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
                        strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
                        str_to_number(item_table->bType, data[col++]);
                        str_to_number(item_table->bSubType, data[col++]);
                        str_to_number(item_table->dwGold, data[col++]);
                        str_to_number(item_table->dwShopBuyPrice, data[col++]);
                        str_to_number(item_table->bWeight, data[col++]);
                        str_to_number(item_table->bSize, data[col++]);
                        str_to_number(item_table->dwFlags, data[col++]);
                        str_to_number(item_table->dwWearFlags, data[col++]);
                        str_to_number(item_table->dwAntiFlags, data[col++]);
                        str_to_number(item_table->dwImmuneFlag, data[col++]);
                        str_to_number(item_table->dwRefinedVnum, data[col++]);
                        str_to_number(item_table->wRefineSet, data[col++]);
                        str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
                        str_to_number(item_table->bGainSocketPct, data[col++]);
                        str_to_number(item_table->sAddonType, data[col++]);
                 
                        item_table->cLimitRealTimeFirstUseIndex = -1;
                        item_table->cLimitTimerBasedOnWearIndex = -1;
                 
                        int i;
                        for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aLimits.bType, data[col++]);
                            str_to_number(item_table->aLimits.lValue, data[col++]);
                 
                            if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                item_table->cLimitRealTimeFirstUseIndex = (char)i;
                 
                            if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                item_table->cLimitTimerBasedOnWearIndex = (char)i;
                        }
                 
                        for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aApplies.bType, data[col++]);
                            str_to_number(item_table->aApplies.lValue, data[col++]);
                        }
                 
                        for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                            str_to_number(item_table->alValues, data[col++]);
                 
                        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",
                                item_table->dwVnum,item_table->szName,item_table->szLocaleName,
                                item_table->alValues[0],item_table->alValues[1],item_table->alValues[2],
                                item_table->alValues[3],item_table->alValues[4],item_table->alValues[5],
                                item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct);
                 
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                 
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.\n", m_vec_itemTable.size());
                    return true;
                }
                // NOTXT_STARTUP_END

    [ClientManagerBoot.cpp]

                // vim:ts=4 sw=4
                #include <map>
                #include "stdafx.h"
                #include "ClientManager.h"
                #include "Main.h"
                #include "Monarch.h"
                #include "CsvReader.h"
                #include "ProtoReader.h"
                #include "Config.h"
                #include <cstddef>

                #if !defined(nullptr)
                #define nullptr NULL
                #endif

                using namespace std;

                extern int g_test_server;
                extern std::string g_stLocaleNameColumn;
                // NOTXT_STARTUP_BEGIN
                extern int g_noTXT;
                // NOTXT_STARTUP_END

                bool CClientManager::InitializeTables()
                {
                // NOTXT_STARTUP_BEGIN
                    if (g_noTXT) // item and mob proto
                    {
                    if (!InitializeMobTableSQL())
                    {
                        sys_err("InitializeMobTableSQL FAILED");
                        return false;
                    }
                    if (!InitializeItemTableSQL())
                    {
                        sys_err("InitializeItemTableSQL FAILED");
                        return false;
                    }
                }
                else
                {
                    if (!InitializeMobTableTXT())
                    {
                        sys_err("InitializeMobTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorMobTableIntoDB())
                    {
                        sys_err("MirrorMobTableIntoDB FAILED");
                        return false;
                    }
                 
                    if (!InitializeItemTableTXT())
                    {
                        sys_err("InitializeItemTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorItemTableIntoDB())
                    {
                        sys_err("MirrorItemTableIntoDB FAILED");
                        return false;
                    }
                }
                // NOTXT_STARTUP_END

                    if (!InitializeShopTable())
                    {
                        sys_err("InitializeShopTable FAILED");
                        return false;
                    }

                    if (!InitializeSkillTable())
                    {
                        sys_err("InitializeSkillTable FAILED");
                        return false;
                    }

                    if (!InitializeRefineTable())
                    {
                        sys_err("InitializeRefineTable FAILED");
                        return false;
                    }

                    if (!InitializeItemAttrTable())
                    {
                        sys_err("InitializeItemAttrTable FAILED");
                        return false;
                    }

                    if (!InitializeItemRareTable())
                    {
                        sys_err("InitializeItemRareTable FAILED");
                        return false;
                    }

                    if (!InitializeBanwordTable())
                    {
                        sys_err("InitializeBanwordTable FAILED");
                        return false;
                    }

                    if (!InitializeLandTable())
                    {
                        sys_err("InitializeLandTable FAILED");
                        return false;
                    }

                    if (!InitializeObjectProto())
                    {
                        sys_err("InitializeObjectProto FAILED");
                        return false;
                    }

                    if (!InitializeObjectTable())
                    {
                        sys_err("InitializeObjectTable FAILED");
                        return false;
                    }

                    if (!InitializeMonarch())
                    {
                        sys_err("InitializeMonarch FAILED");
                        return false;
                    }


                    return true;
                }

                bool CClientManager::InitializeRefineTable()
                {
                    char query[2048];

                    snprintf(query, sizeof(query),
                            "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 FROM refine_proto%s",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                        return true;

                    if (m_pRefineTable)
                    {
                        sys_log(0, "RELOAD: refine_proto");
                        delete [] m_pRefineTable;
                        m_pRefineTable = NULL;
                    }

                    m_iRefineTableSize = pRes->uiNumRows;

                    m_pRefineTable    = new TRefineTable[m_iRefineTableSize];
                    memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);

                    TRefineTable* prt = m_pRefineTable;
                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
                        //"vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 "

                        int col = 0;
                        //prt->src_vnum = atoi(data[col++]);
                        //prt->result_vnum = atoi(data[col++]);
                        str_to_number(prt->id, data[col++]);
                        str_to_number(prt->cost, data[col++]);
                        str_to_number(prt->prob, data[col++]);

                        for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
                        {
                            str_to_number(prt->materials.vnum, data[col++]);
                            str_to_number(prt->materials.count, data[col++]);
                            if (prt->materials.vnum == 0)
                            {
                                prt->material_count = i;
                                break;
                            }
                        }

                        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);

                        prt++;
                    }
                    return true;
                }

                class FCompareVnum
                {
                    public:
                        bool operator () (const TEntityTable & a, const TEntityTable & B) const
                        {
                            return (a.dwVnum < b.dwVnum);
                        }
                };

                bool CClientManager::InitializeMobTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ??? ??,
                    //        (!)[mob_table] ??? ????? ????. (?? : TMobTable)
                    //2. ??
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'mob_proto_test.txt'??? (a)[localMap] ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.
                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //3. ???
                    //    1)'mob_proto.txt' ??? mob_table? ? ?????. -> ??
                    //    2)'mob_names.txt' ??? mob_table? ? ?????.
                    //    3)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    4)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//


                    //===============================================//
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap] ?? ???.
                    //<(a)localMap ? ??>
                    map<int,const char*> localMap;
                    bool isNameFile = true;
                    //<?? ??>
                    cCsvTable nameData;
                    if(!nameData.Load("mob_names.txt",'\t'))
                    {
                        fprintf(stderr, "mob_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();    //??row ??.
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //________________________________________________//

                    
                    //===============================================//
                    //    2) 'mob_proto_test.txt'??? (a)localMap ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //0.
                    set<int> vnumSet;    //???? ?? ????, ???? ??? ??.
                    //1. ?? ????
                    bool isTestFile = true;
                    cCsvTable test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) ? ??.
                    map<DWORD, TMobTable *> test_map_mobTableByVnum;
                    if (isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        //?. ??? ??? ??? ??.
                        TMobTable * test_mob_table = NULL;
                        int test_MobTableSize = test_data.m_File.GetRowCount()-1;
                        test_mob_table = new TMobTable[test_MobTableSize];
                        memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);

                        //?. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {

                            if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));

                            
                            ++test_mob_table;
                            }

                    }

                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.

                    //1. ?? ??.
                    cCsvTable data;
                    if(!data.Load("mob_proto.txt",'\t')) {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next();                    //?? row ????
                    //2. (!)[mob_table] ????
                    //2.1 ?? ???? ??? ??
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(vnum);
                        if(it_map_mobTable != test_map_mobTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("mob_proto.txt",'\t'))
                    {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)
                    //2.2 ??? ?? mob_table ??
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                    m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                    //2.3 ??? ???
                    while (data.Next())
                    {
                        int col = 0;
                        //(b)[test_map_mobTableByVnum]? ?? row? ??? ??.
                        bool isSameRow = true;
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_mobTable == test_map_mobTableByVnum.end()) {
                            isSameRow = false;
                        }
                        //?? row ? ??? (b)?? ????.
                        if(isSameRow) {
                            TMobTable *tempTable = it_map_mobTable->second;

                            mob_table->dwVnum = tempTable->dwVnum;
                            strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName));
                            strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
                            mob_table->bRank = tempTable->bRank;
                            mob_table->bType = tempTable->bType;
                            mob_table->bBattleType = tempTable->bBattleType;
                            mob_table->bLevel = tempTable->bLevel;
                            mob_table->bSize = tempTable->bSize;
                            mob_table->dwAIFlag = tempTable->dwAIFlag;
                            mob_table->bMountCapacity = tempTable->bMountCapacity;
                            mob_table->dwRaceFlag = tempTable->dwRaceFlag;
                            mob_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            mob_table->bEmpire = tempTable->bEmpire;
                            strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName));
                            mob_table->bOnClickType = tempTable->bOnClickType;
                            mob_table->bStr = tempTable->bStr;
                            mob_table->bDex = tempTable->bDex;
                            mob_table->bCon = tempTable->bCon;
                            mob_table->bInt = tempTable->bInt;
                            mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0];
                            mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1];
                            mob_table->dwMaxHP = tempTable->dwMaxHP;
                            mob_table->bRegenCycle = tempTable->bRegenCycle;
                            mob_table->bRegenPercent = tempTable->bRegenPercent;
                            mob_table->dwGoldMin = tempTable->dwGoldMin;
                            mob_table->dwGoldMax = tempTable->dwGoldMax;
                            mob_table->dwExp = tempTable->dwExp;
                            mob_table->wDef = tempTable->wDef;
                            mob_table->sAttackSpeed = tempTable->sAttackSpeed;
                            mob_table->sMovingSpeed = tempTable->sMovingSpeed;
                            mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct;
                            mob_table->wAggressiveSight = tempTable->wAggressiveSight;
                            mob_table->wAttackRange = tempTable->wAttackRange;
                                
                            mob_table->dwDropItemVnum = tempTable->dwDropItemVnum;
                            mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum;
                            for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                                mob_table->cEnchants = tempTable->cEnchants;
                                
                            for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                                mob_table->cResists = tempTable->cResists;
                                
                            mob_table->fDamMultiply = tempTable->fDamMultiply;
                            mob_table->dwSummonVnum = tempTable->dwSummonVnum;
                            mob_table->dwDrainSP = tempTable->dwDrainSP;
                            mob_table->dwMobColor = tempTable->dwMobColor;
                            mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum;
                                
                            
                            mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel;
                            mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum;
                            mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel;
                            mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum;
                            mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel;
                            mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum;
                            mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel;
                            mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum;
                            mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel;
                            mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum;
                                
                            mob_table->bBerserkPoint = tempTable->bBerserkPoint;
                            mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint;
                            mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint;
                            mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint;
                            mob_table->bRevivePoint = tempTable->bRevivePoint;
                        } else {

                            if (!Set_Proto_Mob_Table(mob_table, data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                                        
                        }

                        //?? vnum ??
                        vnumSet.insert(mob_table->dwVnum);
                        

                        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);
                        ++mob_table;

                    }
                    //_____________________________________________________//


                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //?? ?? ????.
                    test_data.Destroy();
                    isTestFile = true;
                    test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    if(isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }

                            if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            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);
                            ++mob_table;

                        }
                    }
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    return true;
                }

                bool CClientManager::InitializeShopTable()
                {
                    MYSQL_ROW    data;
                    int        col;

                    static const char * s_szQuery =
                        "SELECT "
                        "shop.vnum, "
                        "shop.npc_vnum, "
                        "shop_item.item_vnum, "
                        "shop_item.count "
                        "FROM shop LEFT JOIN shop_item "
                        "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";

                    std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));

                    // shop? vnum? ??? shop_item ? ????... ??? ???? ?? ??.
                    // ??????
                    SQLResult * pRes2 = pkMsg2->Get();

                    if (!pRes2->uiNumRows)
                    {
                        sys_err("InitializeShopTable : Table count is zero.");
                        return false;
                    }

                    std::map<int, TShopTable *> map_shop;

                    if (m_pShopTable)
                    {
                        delete [] (m_pShopTable);
                        m_pShopTable = NULL;
                    }

                    TShopTable * shop_table = m_pShopTable;

                    while ((data = mysql_fetch_row(pRes2->pSQLResult)))
                    {
                        col = 0;

                        int iShopVnum = 0;
                        str_to_number(iShopVnum, data[col++]);

                        if (map_shop.end() == map_shop.find(iShopVnum))
                        {
                            shop_table = new TShopTable;
                            memset(shop_table, 0, sizeof(TShopTable));
                            shop_table->dwVnum    = iShopVnum;

                            map_shop[iShopVnum] = shop_table;
                        }
                        else
                            shop_table = map_shop[iShopVnum];

                        str_to_number(shop_table->dwNPCVnum, data[col++]);

                        if (!data[col])    // ???? ??? ??? NULL? ?? ???..
                            continue;

                        TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];

                        str_to_number(pItem->vnum, data[col++]);
                        str_to_number(pItem->count, data[col++]);

                        ++shop_table->byItemCount;
                    }

                    m_pShopTable = new TShopTable[map_shop.size()];
                    m_iShopTableSize = map_shop.size();

                    __typeof(map_shop.begin()) it = map_shop.begin();

                    int i = 0;

                    while (it != map_shop.end())
                    {
                        thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
                        sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
                        ++i;
                    }

                    return true;
                }

                bool CClientManager::InitializeQuestItemTable()
                {
                    using namespace std;

                    static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";

                    char query[1024];
                    snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("query error or no rows: %s", query);
                        return false;
                    }

                    MYSQL_ROW row;

                    while ((row = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        int col = 0;

                        TItemTable tbl;
                        memset(&tbl, 0, sizeof(tbl));

                        str_to_number(tbl.dwVnum, row[col++]);

                        if (row[col])
                            strlcpy(tbl.szName, row[col], sizeof(tbl.szName));

                        col++;

                        if (row[col])
                            strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));

                        col++;

                        if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
                        {
                            sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
                            continue;
                        }

                        tbl.bType = ITEM_QUEST; // quest_item_proto ???? ?? ??? ?? ITEM_QUEST ??
                        tbl.bSize = 1;

                        m_vec_itemTable.push_back(tbl);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ??? ??,
                    //        <item_table>(TItemTable), <m_map_itemTableByVnum> ????? ????.
                    //2. ??
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //3. ???
                    //    1)'item_proto.txt' ??? item_table? ? ?????. -> ??
                    //    2)'item_names.txt' ??? item_table? ? ?????.
                    //    3)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    4)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//

                 

                    //=================================================================================//
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //=================================================================================//
                    bool isNameFile = true;
                    map<int,const char*> localMap;
                    cCsvTable nameData;
                    if(!nameData.Load("item_names.txt",'\t'))
                    {
                        fprintf(stderr, "item_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //_________________________________________________________________//

                    //=================================================================//
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //=================================================================//
                    map<DWORD, TItemTable *> test_map_itemTableByVnum;
                    //1. ?? ????.
                    cCsvTable test_data;
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        //2. ??? ??? ??? ??.
                        TItemTable * test_item_table = NULL;
                        int test_itemTableSize = test_data.m_File.GetRowCount()-1;
                        test_item_table = new TItemTable[test_itemTableSize];
                        memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);

                        //3. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {


                            if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }

                            test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
                            test_item_table++;

                        }
                    }
                    //______________________________________________________________________//


                    //========================================================================//
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //========================================================================//

                    //vnum?? ??? ?. ??? ??? ???? ???? ????.
                    set<int> vnumSet;

                    //?? ????.
                    cCsvTable data;
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }

                    //===== ??? ??? ?? =====//
                    //?? ???? ??? ????.
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(vnum);
                        if(it_map_itemTable != test_map_itemTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    int testValue =  m_vec_itemTable.size();

                    TItemTable * item_table = &m_vec_itemTable[0];

                    while (data.Next())
                    {
                        int col = 0;

                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_itemTable == test_map_itemTableByVnum.end()) {
                            //? ?? ??? ??
                            
                            if (!Set_Proto_Item_Table(item_table, data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            
                        } else {    //$$$$$$$$$$$$$$$$$$$$$$$ ??? ??? ??? ??!    
                            TItemTable *tempTable = it_map_itemTable->second;

                            item_table->dwVnum = tempTable->dwVnum;
                            strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName));
                            strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
                            item_table->bType = tempTable->bType;
                            item_table->bSubType = tempTable->bSubType;
                            item_table->bSize = tempTable->bSize;
                            item_table->dwAntiFlags = tempTable->dwAntiFlags;
                            item_table->dwFlags = tempTable->dwFlags;
                            item_table->dwWearFlags = tempTable->dwWearFlags;
                            item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            item_table->dwGold = tempTable->dwGold;
                            item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
                            item_table->dwRefinedVnum =tempTable->dwRefinedVnum;
                            item_table->wRefineSet =tempTable->wRefineSet;
                            item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
                            item_table->cLimitRealTimeFirstUseIndex = -1;
                            item_table->cLimitTimerBasedOnWearIndex = -1;

                            int i;

                            for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                            {
                                item_table->aLimits.bType = tempTable->aLimits.bType;
                                item_table->aLimits.lValue = tempTable->aLimits.lValue;

                                if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                    item_table->cLimitRealTimeFirstUseIndex = (char)i;

                                if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                    item_table->cLimitTimerBasedOnWearIndex = (char)i;
                            }

                            for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                            {
                                item_table->aApplies.bType = tempTable->aApplies.bType;
                                item_table->aApplies.lValue = tempTable->aApplies.lValue;
                            }

                            for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                                item_table->alValues = tempTable->alValues;

                            item_table->bGainSocketPct = tempTable->bGainSocketPct;
                            item_table->sAddonType = tempTable->sAddonType;

                            item_table->bWeight  = tempTable->bWeight;

                        }
                        vnumSet.insert(item_table->dwVnum);
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                    //_______________________________________________________________________//

                    //========================================================================//
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //========================================================================//
                    test_data.Destroy();
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }
                            
                            if (!Set_Proto_Item_Table(item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));

                            item_table++;

                        }
                    }

                 

                    // QUEST_ITEM_PROTO_DISABLE
                    // InitializeQuestItemTable();
                    // END_OF_QUEST_ITEM_PROTO_DISABLE

                    m_map_itemTableByVnum.clear();

                    itertype(m_vec_itemTable) it = m_vec_itemTable.begin();

                    while (it != m_vec_itemTable.end())
                    {
                        TItemTable * item_table = &(*(it++));

                        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",
                                item_table->dwVnum,
                                item_table->szName,
                                item_table->szLocaleName,
                                item_table->alValues[0],
                                item_table->alValues[1],
                                item_table->alValues[2],
                                item_table->alValues[3],
                                item_table->alValues[4],
                                item_table->alValues[5],
                                item_table->dwWearFlags,
                                item_table->dwAntiFlags,
                                item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,
                                item_table->wRefineSet,
                                item_table->bAlterToMagicItemPct);

                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                    }
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    return true;
                }


                bool CClientManager::InitializeSkillTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
                        "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
                        "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
                        "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
                        "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
                        "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
                        "FROM skill_proto%s ORDER BY dwVnum",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from skill_proto");
                        return false;
                    }

                    if (!m_vec_skillTable.empty())
                    {
                        sys_log(0, "RELOAD: skill_proto");
                        m_vec_skillTable.clear();
                    }

                    m_vec_skillTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;
                    int        col;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TSkillTable t;
                        memset(&t, 0, sizeof(t));

                        col = 0;

                        str_to_number(t.dwVnum, data[col++]);
                        strlcpy(t.szName, data[col++], sizeof(t.szName));
                        str_to_number(t.bType, data[col++]);
                        str_to_number(t.bMaxLevel, data[col++]);
                        str_to_number(t.dwSplashRange, data[col++]);

                        strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
                        strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
                        strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
                        strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
                        strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
                        strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
                        strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));

                        str_to_number(t.dwFlag, data[col++]);
                        str_to_number(t.dwAffectFlag, data[col++]);

                        strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
                        strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
                        strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
                        str_to_number(t.dwAffectFlag2, data[col++]);

                        // ADD_GRANDMASTER_SKILL
                        strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
                        strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
                        strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));

                        strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
                        // END_OF_ADD_GRANDMASTER_SKILL

                        str_to_number(t.bLevelStep, data[col++]);
                        str_to_number(t.bLevelLimit, data[col++]);
                        str_to_number(t.preSkillVnum, data[col++]);
                        str_to_number(t.preSkillLevel, data[col++]);

                        str_to_number(t.lMaxHit, data[col++]);

                        strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));

                        str_to_number(t.bSkillAttrType, data[col++]);
                        str_to_number(t.dwTargetRange, data[col++]);

                        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);

                        m_vec_skillTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeBanwordTable()
                {
                    m_vec_banwordTable.clear();

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));

                    SQLResult * pRes = pkMsg->Get();

                    if (pRes->uiNumRows == 0)
                        return true;

                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TBanwordTable t;

                        if (data[0])
                        {
                            strlcpy(t.szWord, data[0], sizeof(t.szWord));
                            m_vec_banwordTable.push_back(t);
                        }
                    }

                    sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
                    return true;
                }

                bool CClientManager::InitializeItemAttrTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr");
                        return false;
                    }

                    if (!m_vec_itemAttrTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr");
                        m_vec_itemAttrTable.clear();
                    }

                    m_vec_itemAttrTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemAttrTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemRareTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr_rare");
                        return false;
                    }

                    if (!m_vec_itemRareTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr_rare");
                        m_vec_itemRareTable.clear();
                    }

                    m_vec_itemRareTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemRareTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeLandTable()
                {
                    using namespace building;

                    char query[4096];

                    snprintf(query, sizeof(query),
                        "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
                        "FROM land%s WHERE enable='YES' ORDER BY id",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kLandTable.empty())
                    {
                        sys_log(0, "RELOAD: land");
                        m_vec_kLandTable.clear();
                    }

                    m_vec_kLandTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TLand t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwID, data[col++]);
                            str_to_number(t.lMapIndex, data[col++]);
                            str_to_number(t.x, data[col++]);
                            str_to_number(t.y, data[col++]);
                            str_to_number(t.width, data[col++]);
                            str_to_number(t.height, data[col++]);
                            str_to_number(t.dwGuildID, data[col++]);
                            str_to_number(t.bGuildLevelLimit, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            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);

                            m_vec_kLandTable.push_back(t);
                        }

                    return true;
                }

                void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
                {
                    // format: 10,1/20,3/300,50
                    const char * t = c_pszString;
                    const char * p = strchr(t, '/');
                    std::pair<int, int> k;

                    char szNum[32 + 1];
                    char * comma;

                    while (p)
                    {
                        if (isnhdigit(*t))
                        {
                            strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));

                            comma = strchr(szNum, ',');

                            if (comma)
                            {
                                *comma = '\0';
                                str_to_number(k.second, comma+1);
                            }
                            else
                                k.second = 0;

                            str_to_number(k.first, szNum);
                            vec.push_back(k);
                        }

                        t = p + 1;
                        p = strchr(t, '/');
                    }

                    if (isnhdigit(*t))
                    {
                        strlcpy(szNum, t, sizeof(szNum));

                        comma = strchr(const_cast<char*>(t), ',');

                        if (comma)
                        {
                            *comma = '\0';
                            str_to_number(k.second, comma+1);
                        }
                        else
                            k.second = 0;

                        str_to_number(k.first, szNum);
                        vec.push_back(k);
                    }
                }

                bool CClientManager::InitializeObjectProto()
                {
                    using namespace building;

                    char query[4096];
                    snprintf(query, sizeof(query),
                            "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
                            "FROM object_proto%s ORDER BY vnum",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kObjectProto.empty())
                    {
                        sys_log(0, "RELOAD: object_proto");
                        m_vec_kObjectProto.clear();
                    }

                    m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObjectProto t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwVnum, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            std::vector<std::pair<int, int> > vec;
                            parse_pair_number_string(data[col++], vec);

                            for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
                            {
                                std::pair<int, int> & r = vec;

                                t.kMaterials.dwItemVnum = r.first;
                                t.kMaterials.dwCount = r.second;
                            }

                            str_to_number(t.dwUpgradeVnum, data[col++]);
                            str_to_number(t.dwUpgradeLimitTime, data[col++]);
                            str_to_number(t.lLife, data[col++]);
                            str_to_number(t.lRegion[0], data[col++]);
                            str_to_number(t.lRegion[1], data[col++]);
                            str_to_number(t.lRegion[2], data[col++]);
                            str_to_number(t.lRegion[3], data[col++]);

                            // ADD_BUILDING_NPC
                            str_to_number(t.dwNPCVnum, data[col++]);
                            str_to_number(t.dwGroupVnum, data[col++]);
                            str_to_number(t.dwDependOnGroupVnum, data[col++]);

                            t.lNPCX = 0;
                            t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
                            // END_OF_ADD_BUILDING_NPC

                            sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
                                    t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);

                            m_vec_kObjectProto.push_back(t);
                        }

                    return true;
                }

                bool CClientManager::InitializeObjectTable()
                {
                    using namespace building;

                    char query[4096];
                    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());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_map_pkObjectTable.empty())
                    {
                        sys_log(0, "RELOAD: object");
                        m_map_pkObjectTable.clear();
                    }

                    MYSQL_ROW data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObject * k = new TObject;

                            memset(k, 0, sizeof(TObject));

                            int col = 0;

                            str_to_number(k->dwID, data[col++]);
                            str_to_number(k->dwLandID, data[col++]);
                            str_to_number(k->dwVnum, data[col++]);
                            str_to_number(k->lMapIndex, data[col++]);
                            str_to_number(k->x, data[col++]);
                            str_to_number(k->y, data[col++]);
                            str_to_number(k->xRot, data[col++]);
                            str_to_number(k->yRot, data[col++]);
                            str_to_number(k->zRot, data[col++]);
                            str_to_number(k->lLife, data[col++]);

                            sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
                                    k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);

                            m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
                        }

                    return true;
                }

                bool CClientManager::InitializeMonarch()
                {
                    CMonarch::instance().LoadMonarch();

                    return true;
                }

                bool CClientManager::MirrorMobTableIntoDB()
                {
                    for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
                    {
                        const TMobTable& t = *it;
                        char query[4096];
                        if (g_stLocaleNameColumn == "name")
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(),
                                t.dwVnum, t.szName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }
                        else
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }

                        CDBManager::instance().AsyncQuery(query);
                    }

                    return true;
                }

                bool CClientManager::MirrorItemTableIntoDB()
                {
                    for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
                    {
                        if (g_stLocaleNameColumn != "name")
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                        else
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                    }
                    return true;
                }

                // NOTXT_STARTUP_BEGIN
                bool CClientManager::InitializeMobTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, rank, battle_type, level, "
                        "size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "
                        "on_click, empire, drop_item, resurrection_vnum, folder, "
                        "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                        "gold_min, gold_max, def, attack_speed, move_speed, "
                        "aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
                        "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                        "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                        "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                        "dam_multiply, summon, drain_sp, "
                        "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"
                        "skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "
                        "sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity "
                        "FROM mob_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load mob_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "MOB_PROTO loading...");
                 
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                 
                    m_vec_mobTable.resize(pRes->uiNumRows);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                        str_to_number(mob_table->dwVnum, data[col++]);
                        strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName));
                        strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));
                        str_to_number(mob_table->bType, data[col++]);
                        str_to_number(mob_table->bRank, data[col++]);
                        str_to_number(mob_table->bBattleType, data[col++]);
                        str_to_number(mob_table->bLevel, data[col++]);
                        str_to_number(mob_table->bSize, data[col++]);
                        str_to_number(mob_table->dwAIFlag, data[col++]);
                        str_to_number(mob_table->bMountCapacity, data[col++]);
                        str_to_number(mob_table->dwRaceFlag, data[col++]);
                        str_to_number(mob_table->dwImmuneFlag, data[col++]);
                        str_to_number(mob_table->bOnClickType, data[col++]);
                        str_to_number(mob_table->bEmpire, data[col++]);
                        str_to_number(mob_table->dwDropItemVnum, data[col++]);
                        str_to_number(mob_table->dwResurrectionVnum, data[col++]);
                        strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
                        str_to_number(mob_table->bStr, data[col++]);
                        str_to_number(mob_table->bDex, data[col++]);
                        str_to_number(mob_table->bCon, data[col++]);
                        str_to_number(mob_table->bInt, data[col++]);
                        str_to_number(mob_table->dwDamageRange[0], data[col++]);
                        str_to_number(mob_table->dwDamageRange[1], data[col++]);
                        str_to_number(mob_table->dwMaxHP, data[col++]);
                        str_to_number(mob_table->bRegenCycle, data[col++]);
                        str_to_number(mob_table->bRegenPercent, data[col++]);
                        str_to_number(mob_table->dwExp, data[col++]);
                        str_to_number(mob_table->dwGoldMin, data[col++]);
                        str_to_number(mob_table->dwGoldMax, data[col++]);
                        str_to_number(mob_table->wDef, data[col++]);
                        str_to_number(mob_table->sAttackSpeed, data[col++]);
                        str_to_number(mob_table->sMovingSpeed, data[col++]);
                        str_to_number(mob_table->bAggresiveHPPct, data[col++]);
                        str_to_number(mob_table->wAggressiveSight, data[col++]);
                        str_to_number(mob_table->wAttackRange, data[col++]);
                        str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);
                 
                        int i;
                        for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cEnchants, data[col++]);
                 
                        for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cResists, data[col++]);
                 
                        str_to_number(mob_table->fDamMultiply, data[col++]);
                        str_to_number(mob_table->dwSummonVnum, data[col++]);
                        str_to_number(mob_table->dwDrainSP, data[col++]);
                        str_to_number(mob_table->dwMobColor, data[col++]);
                 
                        for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)
                        {
                            str_to_number(mob_table->Skills.dwVnum, data[col++]);
                            str_to_number(mob_table->Skills.bLevel, data[col++]);
                        }
                 
                        str_to_number(mob_table->bBerserkPoint, data[col++]);
                        str_to_number(mob_table->bStoneSkinPoint, data[col++]);
                        str_to_number(mob_table->bGodSpeedPoint, data[col++]);
                        str_to_number(mob_table->bDeathBlowPoint, data[col++]);
                        str_to_number(mob_table->bRevivePoint, data[col++]);
                 
                        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);
                        ++mob_table;
                    }
                 
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.\n", m_vec_mobTable.size());
                    return true;
                }
                 
                bool CClientManager::InitializeItemTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, "
                        "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                        "limittype0, limitvalue0, limittype1, limitvalue1, "
                        "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                        "value0, value1, value2, value3, value4, value5 "
                        "FROM item_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load item_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "ITEM_PROTO loading...");
                 
                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }
                 
                    m_vec_itemTable.resize(pRes->uiNumRows);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    TItemTable * item_table = &m_vec_itemTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                 
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                 
                        str_to_number(item_table->dwVnum, data[col++]);
                        strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
                        strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
                        str_to_number(item_table->bType, data[col++]);
                        str_to_number(item_table->bSubType, data[col++]);
                        str_to_number(item_table->dwGold, data[col++]);
                        str_to_number(item_table->dwShopBuyPrice, data[col++]);
                        str_to_number(item_table->bWeight, data[col++]);
                        str_to_number(item_table->bSize, data[col++]);
                        str_to_number(item_table->dwFlags, data[col++]);
                        str_to_number(item_table->dwWearFlags, data[col++]);
                        str_to_number(item_table->dwAntiFlags, data[col++]);
                        str_to_number(item_table->dwImmuneFlag, data[col++]);
                        str_to_number(item_table->dwRefinedVnum, data[col++]);
                        str_to_number(item_table->wRefineSet, data[col++]);
                        str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
                        str_to_number(item_table->bGainSocketPct, data[col++]);
                        str_to_number(item_table->sAddonType, data[col++]);
                 
                        item_table->cLimitRealTimeFirstUseIndex = -1;
                        item_table->cLimitTimerBasedOnWearIndex = -1;
                 
                        int i;
                        for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aLimits.bType, data[col++]);
                            str_to_number(item_table->aLimits.lValue, data[col++]);
                 
                            if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                item_table->cLimitRealTimeFirstUseIndex = (char)i;
                 
                            if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                item_table->cLimitTimerBasedOnWearIndex = (char)i;
                        }
                 
                        for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aApplies.bType, data[col++]);
                            str_to_number(item_table->aApplies.lValue, data[col++]);
                        }
                 
                        for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                            str_to_number(item_table->alValues, data[col++]);
                 
                        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",
                                item_table->dwVnum,item_table->szName,item_table->szLocaleName,
                                item_table->alValues[0],item_table->alValues[1],item_table->alValues[2],
                                item_table->alValues[3],item_table->alValues[4],item_table->alValues[5],
                                item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct);
                 
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                 
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.\n", m_vec_itemTable.size());
                    return true;
                }
                // NOTXT_STARTUP_END

    [ClientManagerBoot.cpp]

                // vim:ts=4 sw=4
                #include <map>
                #include "stdafx.h"
                #include "ClientManager.h"
                #include "Main.h"
                #include "Monarch.h"
                #include "CsvReader.h"
                #include "ProtoReader.h"
                #include "Config.h"
                #include <cstddef>

                #if !defined(nullptr)
                #define nullptr NULL
                #endif

                using namespace std;

                extern int g_test_server;
                extern std::string g_stLocaleNameColumn;
                // NOTXT_STARTUP_BEGIN
                extern int g_noTXT;
                // NOTXT_STARTUP_END

                bool CClientManager::InitializeTables()
                {
                // NOTXT_STARTUP_BEGIN
                    if (g_noTXT) // item and mob proto
                    {
                    if (!InitializeMobTableSQL())
                    {
                        sys_err("InitializeMobTableSQL FAILED");
                        return false;
                    }
                    if (!InitializeItemTableSQL())
                    {
                        sys_err("InitializeItemTableSQL FAILED");
                        return false;
                    }
                }
                else
                {
                    if (!InitializeMobTableTXT())
                    {
                        sys_err("InitializeMobTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorMobTableIntoDB())
                    {
                        sys_err("MirrorMobTableIntoDB FAILED");
                        return false;
                    }
                 
                    if (!InitializeItemTableTXT())
                    {
                        sys_err("InitializeItemTableTXT FAILED");
                        return false;
                    }
                 
                    if (!MirrorItemTableIntoDB())
                    {
                        sys_err("MirrorItemTableIntoDB FAILED");
                        return false;
                    }
                }
                // NOTXT_STARTUP_END

                    if (!InitializeShopTable())
                    {
                        sys_err("InitializeShopTable FAILED");
                        return false;
                    }

                    if (!InitializeSkillTable())
                    {
                        sys_err("InitializeSkillTable FAILED");
                        return false;
                    }

                    if (!InitializeRefineTable())
                    {
                        sys_err("InitializeRefineTable FAILED");
                        return false;
                    }

                    if (!InitializeItemAttrTable())
                    {
                        sys_err("InitializeItemAttrTable FAILED");
                        return false;
                    }

                    if (!InitializeItemRareTable())
                    {
                        sys_err("InitializeItemRareTable FAILED");
                        return false;
                    }

                    if (!InitializeBanwordTable())
                    {
                        sys_err("InitializeBanwordTable FAILED");
                        return false;
                    }

                    if (!InitializeLandTable())
                    {
                        sys_err("InitializeLandTable FAILED");
                        return false;
                    }

                    if (!InitializeObjectProto())
                    {
                        sys_err("InitializeObjectProto FAILED");
                        return false;
                    }

                    if (!InitializeObjectTable())
                    {
                        sys_err("InitializeObjectTable FAILED");
                        return false;
                    }

                    if (!InitializeMonarch())
                    {
                        sys_err("InitializeMonarch FAILED");
                        return false;
                    }


                    return true;
                }

                bool CClientManager::InitializeRefineTable()
                {
                    char query[2048];

                    snprintf(query, sizeof(query),
                            "SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 FROM refine_proto%s",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                        return true;

                    if (m_pRefineTable)
                    {
                        sys_log(0, "RELOAD: refine_proto");
                        delete [] m_pRefineTable;
                        m_pRefineTable = NULL;
                    }

                    m_iRefineTableSize = pRes->uiNumRows;

                    m_pRefineTable    = new TRefineTable[m_iRefineTableSize];
                    memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);

                    TRefineTable* prt = m_pRefineTable;
                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        //const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
                        //"vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 "

                        int col = 0;
                        //prt->src_vnum = atoi(data[col++]);
                        //prt->result_vnum = atoi(data[col++]);
                        str_to_number(prt->id, data[col++]);
                        str_to_number(prt->cost, data[col++]);
                        str_to_number(prt->prob, data[col++]);

                        for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
                        {
                            str_to_number(prt->materials.vnum, data[col++]);
                            str_to_number(prt->materials.count, data[col++]);
                            if (prt->materials.vnum == 0)
                            {
                                prt->material_count = i;
                                break;
                            }
                        }

                        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);

                        prt++;
                    }
                    return true;
                }

                class FCompareVnum
                {
                    public:
                        bool operator () (const TEntityTable & a, const TEntityTable & B) const
                        {
                            return (a.dwVnum < b.dwVnum);
                        }
                };

                bool CClientManager::InitializeMobTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ??? ??,
                    //        (!)[mob_table] ??? ????? ????. (?? : TMobTable)
                    //2. ??
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'mob_proto_test.txt'??? (a)[localMap] ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.
                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //3. ???
                    //    1)'mob_proto.txt' ??? mob_table? ? ?????. -> ??
                    //    2)'mob_names.txt' ??? mob_table? ? ?????.
                    //    3)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    4)'mob_proto_test.txt' ?? [???] ??? mob_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//


                    //===============================================//
                    //    1) 'mob_names.txt' ??? ??? (a)[localMap] ?? ???.
                    //<(a)localMap ? ??>
                    map<int,const char*> localMap;
                    bool isNameFile = true;
                    //<?? ??>
                    cCsvTable nameData;
                    if(!nameData.Load("mob_names.txt",'\t'))
                    {
                        fprintf(stderr, "mob_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();    //??row ??.
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //________________________________________________//

                    
                    //===============================================//
                    //    2) 'mob_proto_test.txt'??? (a)localMap ???
                    //        (b)[test_map_mobTableByVnum](vnum:TMobTable) ?? ????.
                    //0.
                    set<int> vnumSet;    //???? ?? ????, ???? ??? ??.
                    //1. ?? ????
                    bool isTestFile = true;
                    cCsvTable test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    //2. (c)[test_map_mobTableByVnum](vnum:TMobTable) ? ??.
                    map<DWORD, TMobTable *> test_map_mobTableByVnum;
                    if (isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        //?. ??? ??? ??? ??.
                        TMobTable * test_mob_table = NULL;
                        int test_MobTableSize = test_data.m_File.GetRowCount()-1;
                        test_mob_table = new TMobTable[test_MobTableSize];
                        memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);

                        //?. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {

                            if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));

                            
                            ++test_mob_table;
                            }

                    }

                    //    3) 'mob_proto.txt' ???  (a)[localMap] ???
                    //        (!)[mob_table] ???? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_mobTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_mobTableByVnum]? ?? ????.

                    //1. ?? ??.
                    cCsvTable data;
                    if(!data.Load("mob_proto.txt",'\t')) {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next();                    //?? row ????
                    //2. (!)[mob_table] ????
                    //2.1 ?? ???? ??? ??
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(vnum);
                        if(it_map_mobTable != test_map_mobTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("mob_proto.txt",'\t'))
                    {
                        fprintf(stderr, "mob_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)
                    //2.2 ??? ?? mob_table ??
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                    m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                    //2.3 ??? ???
                    while (data.Next())
                    {
                        int col = 0;
                        //(b)[test_map_mobTableByVnum]? ?? row? ??? ??.
                        bool isSameRow = true;
                        std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
                        it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_mobTable == test_map_mobTableByVnum.end()) {
                            isSameRow = false;
                        }
                        //?? row ? ??? (b)?? ????.
                        if(isSameRow) {
                            TMobTable *tempTable = it_map_mobTable->second;

                            mob_table->dwVnum = tempTable->dwVnum;
                            strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName));
                            strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
                            mob_table->bRank = tempTable->bRank;
                            mob_table->bType = tempTable->bType;
                            mob_table->bBattleType = tempTable->bBattleType;
                            mob_table->bLevel = tempTable->bLevel;
                            mob_table->bSize = tempTable->bSize;
                            mob_table->dwAIFlag = tempTable->dwAIFlag;
                            mob_table->bMountCapacity = tempTable->bMountCapacity;
                            mob_table->dwRaceFlag = tempTable->dwRaceFlag;
                            mob_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            mob_table->bEmpire = tempTable->bEmpire;
                            strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName));
                            mob_table->bOnClickType = tempTable->bOnClickType;
                            mob_table->bStr = tempTable->bStr;
                            mob_table->bDex = tempTable->bDex;
                            mob_table->bCon = tempTable->bCon;
                            mob_table->bInt = tempTable->bInt;
                            mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0];
                            mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1];
                            mob_table->dwMaxHP = tempTable->dwMaxHP;
                            mob_table->bRegenCycle = tempTable->bRegenCycle;
                            mob_table->bRegenPercent = tempTable->bRegenPercent;
                            mob_table->dwGoldMin = tempTable->dwGoldMin;
                            mob_table->dwGoldMax = tempTable->dwGoldMax;
                            mob_table->dwExp = tempTable->dwExp;
                            mob_table->wDef = tempTable->wDef;
                            mob_table->sAttackSpeed = tempTable->sAttackSpeed;
                            mob_table->sMovingSpeed = tempTable->sMovingSpeed;
                            mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct;
                            mob_table->wAggressiveSight = tempTable->wAggressiveSight;
                            mob_table->wAttackRange = tempTable->wAttackRange;
                                
                            mob_table->dwDropItemVnum = tempTable->dwDropItemVnum;
                            mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum;
                            for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                                mob_table->cEnchants = tempTable->cEnchants;
                                
                            for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                                mob_table->cResists = tempTable->cResists;
                                
                            mob_table->fDamMultiply = tempTable->fDamMultiply;
                            mob_table->dwSummonVnum = tempTable->dwSummonVnum;
                            mob_table->dwDrainSP = tempTable->dwDrainSP;
                            mob_table->dwMobColor = tempTable->dwMobColor;
                            mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum;
                                
                            
                            mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel;
                            mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum;
                            mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel;
                            mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum;
                            mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel;
                            mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum;
                            mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel;
                            mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum;
                            mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel;
                            mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum;
                                
                            mob_table->bBerserkPoint = tempTable->bBerserkPoint;
                            mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint;
                            mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint;
                            mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint;
                            mob_table->bRevivePoint = tempTable->bRevivePoint;
                        } else {

                            if (!Set_Proto_Mob_Table(mob_table, data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                                        
                        }

                        //?? vnum ??
                        vnumSet.insert(mob_table->dwVnum);
                        

                        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);
                        ++mob_table;

                    }
                    //_____________________________________________________//


                    //    4) (b)[test_map_mobTableByVnum]? row?, (!)[mob_table]? ?? ?? ????.
                    //?? ?? ????.
                    test_data.Destroy();
                    isTestFile = true;
                    test_data;
                    if(!test_data.Load("mob_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "??? ??? ????. ??? ?????.\n");
                        isTestFile = false;
                    }
                    if(isTestFile) {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }

                            if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
                            {
                                fprintf(stderr, "? ??? ??? ?? ??.\n");            
                            }

                            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);
                            ++mob_table;

                        }
                    }
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    return true;
                }

                bool CClientManager::InitializeShopTable()
                {
                    MYSQL_ROW    data;
                    int        col;

                    static const char * s_szQuery =
                        "SELECT "
                        "shop.vnum, "
                        "shop.npc_vnum, "
                        "shop_item.item_vnum, "
                        "shop_item.count "
                        "FROM shop LEFT JOIN shop_item "
                        "ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";

                    std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));

                    // shop? vnum? ??? shop_item ? ????... ??? ???? ?? ??.
                    // ??????
                    SQLResult * pRes2 = pkMsg2->Get();

                    if (!pRes2->uiNumRows)
                    {
                        sys_err("InitializeShopTable : Table count is zero.");
                        return false;
                    }

                    std::map<int, TShopTable *> map_shop;

                    if (m_pShopTable)
                    {
                        delete [] (m_pShopTable);
                        m_pShopTable = NULL;
                    }

                    TShopTable * shop_table = m_pShopTable;

                    while ((data = mysql_fetch_row(pRes2->pSQLResult)))
                    {
                        col = 0;

                        int iShopVnum = 0;
                        str_to_number(iShopVnum, data[col++]);

                        if (map_shop.end() == map_shop.find(iShopVnum))
                        {
                            shop_table = new TShopTable;
                            memset(shop_table, 0, sizeof(TShopTable));
                            shop_table->dwVnum    = iShopVnum;

                            map_shop[iShopVnum] = shop_table;
                        }
                        else
                            shop_table = map_shop[iShopVnum];

                        str_to_number(shop_table->dwNPCVnum, data[col++]);

                        if (!data[col])    // ???? ??? ??? NULL? ?? ???..
                            continue;

                        TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];

                        str_to_number(pItem->vnum, data[col++]);
                        str_to_number(pItem->count, data[col++]);

                        ++shop_table->byItemCount;
                    }

                    m_pShopTable = new TShopTable[map_shop.size()];
                    m_iShopTableSize = map_shop.size();

                    __typeof(map_shop.begin()) it = map_shop.begin();

                    int i = 0;

                    while (it != map_shop.end())
                    {
                        thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
                        sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
                        ++i;
                    }

                    return true;
                }

                bool CClientManager::InitializeQuestItemTable()
                {
                    using namespace std;

                    static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";

                    char query[1024];
                    snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("query error or no rows: %s", query);
                        return false;
                    }

                    MYSQL_ROW row;

                    while ((row = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        int col = 0;

                        TItemTable tbl;
                        memset(&tbl, 0, sizeof(tbl));

                        str_to_number(tbl.dwVnum, row[col++]);

                        if (row[col])
                            strlcpy(tbl.szName, row[col], sizeof(tbl.szName));

                        col++;

                        if (row[col])
                            strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));

                        col++;

                        if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
                        {
                            sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
                            continue;
                        }

                        tbl.bType = ITEM_QUEST; // quest_item_proto ???? ?? ??? ?? ITEM_QUEST ??
                        tbl.bSize = 1;

                        m_vec_itemTable.push_back(tbl);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemTableTXT()
                {
                    //================== ?? ?? ==================//
                    //1. ?? : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ??? ??,
                    //        <item_table>(TItemTable), <m_map_itemTableByVnum> ????? ????.
                    //2. ??
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //3. ???
                    //    1)'item_proto.txt' ??? item_table? ? ?????. -> ??
                    //    2)'item_names.txt' ??? item_table? ? ?????.
                    //    3)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    4)'item_proto_test.txt' ?? [???] ??? item_table ? ? ?????.
                    //    5) (??) ?? ??????? ??? ?? ???.
                    //_______________________________________________//

                 

                    //=================================================================================//
                    //    1) 'item_names.txt' ??? ??? (a)[localMap](vnum:name) ?? ???.
                    //=================================================================================//
                    bool isNameFile = true;
                    map<int,const char*> localMap;
                    cCsvTable nameData;
                    if(!nameData.Load("item_names.txt",'\t'))
                    {
                        fprintf(stderr, "item_names.txt ??? ???? ?????\n");
                        isNameFile = false;
                    } else {
                        nameData.Next();
                        while(nameData.Next()) {
                            localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
                        }
                    }
                    //_________________________________________________________________//

                    //=================================================================//
                    //    2) 'item_proto_text.txt'??? (a)[localMap] ???
                    //        (b)[test_map_itemTableByVnum](vnum:TItemTable) ?? ????.
                    //=================================================================//
                    map<DWORD, TItemTable *> test_map_itemTableByVnum;
                    //1. ?? ????.
                    cCsvTable test_data;
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        //2. ??? ??? ??? ??.
                        TItemTable * test_item_table = NULL;
                        int test_itemTableSize = test_data.m_File.GetRowCount()-1;
                        test_item_table = new TItemTable[test_itemTableSize];
                        memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);

                        //3. ??? ??? ???? ?? ??, ???? ??.
                        while(test_data.Next()) {


                            if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }

                            test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
                            test_item_table++;

                        }
                    }
                    //______________________________________________________________________//


                    //========================================================================//
                    //    3) 'item_proto.txt' ???  (a)[localMap] ???
                    //        (!)[item_table], <m_map_itemTableByVnum>? ???.
                    //            <??>
                    //            ? row ? ?,
                    //            (b)[test_map_itemTableByVnum],(!)[mob_table] ??? ?? row?
                    //            (b)[test_map_itemTableByVnum]? ?? ????.
                    //========================================================================//

                    //vnum?? ??? ?. ??? ??? ???? ???? ????.
                    set<int> vnumSet;

                    //?? ????.
                    cCsvTable data;
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }

                    //===== ??? ??? ?? =====//
                    //?? ???? ??? ????.
                    int addNumber = 0;
                    while(data.Next()) {
                        int vnum = atoi(data.AsStringByIndex(0));
                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(vnum);
                        if(it_map_itemTable != test_map_itemTableByVnum.end()) {
                            addNumber++;
                        }
                    }
                    //data? ?? ??? ???.(?? ????;;)
                    data.Destroy();
                    if(!data.Load("item_proto.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto.txt ??? ???? ?????\n");
                        return false;
                    }
                    data.Next(); //? ?? ?? (??? ??? ???? ??)

                    m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    int testValue =  m_vec_itemTable.size();

                    TItemTable * item_table = &m_vec_itemTable[0];

                    while (data.Next())
                    {
                        int col = 0;

                        std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
                        it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
                        if(it_map_itemTable == test_map_itemTableByVnum.end()) {
                            //? ?? ??? ??
                            
                            if (!Set_Proto_Item_Table(item_table, data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            
                        } else {    //$$$$$$$$$$$$$$$$$$$$$$$ ??? ??? ??? ??!    
                            TItemTable *tempTable = it_map_itemTable->second;

                            item_table->dwVnum = tempTable->dwVnum;
                            strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName));
                            strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
                            item_table->bType = tempTable->bType;
                            item_table->bSubType = tempTable->bSubType;
                            item_table->bSize = tempTable->bSize;
                            item_table->dwAntiFlags = tempTable->dwAntiFlags;
                            item_table->dwFlags = tempTable->dwFlags;
                            item_table->dwWearFlags = tempTable->dwWearFlags;
                            item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
                            item_table->dwGold = tempTable->dwGold;
                            item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
                            item_table->dwRefinedVnum =tempTable->dwRefinedVnum;
                            item_table->wRefineSet =tempTable->wRefineSet;
                            item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
                            item_table->cLimitRealTimeFirstUseIndex = -1;
                            item_table->cLimitTimerBasedOnWearIndex = -1;

                            int i;

                            for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                            {
                                item_table->aLimits.bType = tempTable->aLimits.bType;
                                item_table->aLimits.lValue = tempTable->aLimits.lValue;

                                if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                    item_table->cLimitRealTimeFirstUseIndex = (char)i;

                                if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                    item_table->cLimitTimerBasedOnWearIndex = (char)i;
                            }

                            for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                            {
                                item_table->aApplies.bType = tempTable->aApplies.bType;
                                item_table->aApplies.lValue = tempTable->aApplies.lValue;
                            }

                            for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                                item_table->alValues = tempTable->alValues;

                            item_table->bGainSocketPct = tempTable->bGainSocketPct;
                            item_table->sAddonType = tempTable->sAddonType;

                            item_table->bWeight  = tempTable->bWeight;

                        }
                        vnumSet.insert(item_table->dwVnum);
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                    //_______________________________________________________________________//

                    //========================================================================//
                    //    4) (b)[test_map_itemTableByVnum]? row?, (!)[item_table]? ?? ?? ????.
                    //========================================================================//
                    test_data.Destroy();
                    if(!test_data.Load("item_proto_test.txt",'\t'))
                    {
                        fprintf(stderr, "item_proto_test.txt ??? ???? ?????\n");
                        //return false;
                    } else {
                        test_data.Next();    //?? ?? ????.

                        while (test_data.Next())    //??? ??? ??? ?????,??? ?? ????.
                        {
                            //???? ???? ????.
                            set<int>::iterator itVnum;
                            itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
                            if (itVnum != vnumSet.end()) {
                                continue;
                            }
                            
                            if (!Set_Proto_Item_Table(item_table, test_data, localMap))
                            {
                                fprintf(stderr, "??? ??? ??? ?? ??.\n");            
                            }


                            m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));

                            item_table++;

                        }
                    }

                 

                    // QUEST_ITEM_PROTO_DISABLE
                    // InitializeQuestItemTable();
                    // END_OF_QUEST_ITEM_PROTO_DISABLE

                    m_map_itemTableByVnum.clear();

                    itertype(m_vec_itemTable) it = m_vec_itemTable.begin();

                    while (it != m_vec_itemTable.end())
                    {
                        TItemTable * item_table = &(*(it++));

                        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",
                                item_table->dwVnum,
                                item_table->szName,
                                item_table->szLocaleName,
                                item_table->alValues[0],
                                item_table->alValues[1],
                                item_table->alValues[2],
                                item_table->alValues[3],
                                item_table->alValues[4],
                                item_table->alValues[5],
                                item_table->dwWearFlags,
                                item_table->dwAntiFlags,
                                item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,
                                item_table->wRefineSet,
                                item_table->bAlterToMagicItemPct);

                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                    }
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    return true;
                }


                bool CClientManager::InitializeSkillTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
                        "szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
                        "szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
                        "szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
                        "szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
                        "bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
                        "FROM skill_proto%s ORDER BY dwVnum",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from skill_proto");
                        return false;
                    }

                    if (!m_vec_skillTable.empty())
                    {
                        sys_log(0, "RELOAD: skill_proto");
                        m_vec_skillTable.clear();
                    }

                    m_vec_skillTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;
                    int        col;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TSkillTable t;
                        memset(&t, 0, sizeof(t));

                        col = 0;

                        str_to_number(t.dwVnum, data[col++]);
                        strlcpy(t.szName, data[col++], sizeof(t.szName));
                        str_to_number(t.bType, data[col++]);
                        str_to_number(t.bMaxLevel, data[col++]);
                        str_to_number(t.dwSplashRange, data[col++]);

                        strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
                        strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
                        strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
                        strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
                        strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
                        strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
                        strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));

                        str_to_number(t.dwFlag, data[col++]);
                        str_to_number(t.dwAffectFlag, data[col++]);

                        strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
                        strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
                        strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
                        str_to_number(t.dwAffectFlag2, data[col++]);

                        // ADD_GRANDMASTER_SKILL
                        strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
                        strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
                        strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));

                        strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
                        // END_OF_ADD_GRANDMASTER_SKILL

                        str_to_number(t.bLevelStep, data[col++]);
                        str_to_number(t.bLevelLimit, data[col++]);
                        str_to_number(t.preSkillVnum, data[col++]);
                        str_to_number(t.preSkillLevel, data[col++]);

                        str_to_number(t.lMaxHit, data[col++]);

                        strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));

                        str_to_number(t.bSkillAttrType, data[col++]);
                        str_to_number(t.dwTargetRange, data[col++]);

                        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);

                        m_vec_skillTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeBanwordTable()
                {
                    m_vec_banwordTable.clear();

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));

                    SQLResult * pRes = pkMsg->Get();

                    if (pRes->uiNumRows == 0)
                        return true;

                    MYSQL_ROW data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TBanwordTable t;

                        if (data[0])
                        {
                            strlcpy(t.szWord, data[0], sizeof(t.szWord));
                            m_vec_banwordTable.push_back(t);
                        }
                    }

                    sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
                    return true;
                }

                bool CClientManager::InitializeItemAttrTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr");
                        return false;
                    }

                    if (!m_vec_itemAttrTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr");
                        m_vec_itemAttrTable.clear();
                    }

                    m_vec_itemAttrTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemAttrTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeItemRareTable()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                            "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",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!pRes->uiNumRows)
                    {
                        sys_err("no result from item_attr_rare");
                        return false;
                    }

                    if (!m_vec_itemRareTable.empty())
                    {
                        sys_log(0, "RELOAD: item_attr_rare");
                        m_vec_itemRareTable.clear();
                    }

                    m_vec_itemRareTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        TItemAttrTable t;

                        memset(&t, 0, sizeof(TItemAttrTable));

                        int col = 0;

                        strlcpy(t.szApply, data[col++], sizeof(t.szApply));
                        str_to_number(t.dwApplyIndex, data[col++]);
                        str_to_number(t.dwProb, data[col++]);
                        str_to_number(t.lValues[0], data[col++]);
                        str_to_number(t.lValues[1], data[col++]);
                        str_to_number(t.lValues[2], data[col++]);
                        str_to_number(t.lValues[3], data[col++]);
                        str_to_number(t.lValues[4], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
                        str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);

                        sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
                                t.szApply,
                                t.dwProb,
                                t.lValues[0],
                                t.lValues[1],
                                t.lValues[2],
                                t.lValues[3],
                                t.lValues[4],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
                                t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);

                        m_vec_itemRareTable.push_back(t);
                    }

                    return true;
                }

                bool CClientManager::InitializeLandTable()
                {
                    using namespace building;

                    char query[4096];

                    snprintf(query, sizeof(query),
                        "SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
                        "FROM land%s WHERE enable='YES' ORDER BY id",
                        GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kLandTable.empty())
                    {
                        sys_log(0, "RELOAD: land");
                        m_vec_kLandTable.clear();
                    }

                    m_vec_kLandTable.reserve(pRes->uiNumRows);

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TLand t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwID, data[col++]);
                            str_to_number(t.lMapIndex, data[col++]);
                            str_to_number(t.x, data[col++]);
                            str_to_number(t.y, data[col++]);
                            str_to_number(t.width, data[col++]);
                            str_to_number(t.height, data[col++]);
                            str_to_number(t.dwGuildID, data[col++]);
                            str_to_number(t.bGuildLevelLimit, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            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);

                            m_vec_kLandTable.push_back(t);
                        }

                    return true;
                }

                void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
                {
                    // format: 10,1/20,3/300,50
                    const char * t = c_pszString;
                    const char * p = strchr(t, '/');
                    std::pair<int, int> k;

                    char szNum[32 + 1];
                    char * comma;

                    while (p)
                    {
                        if (isnhdigit(*t))
                        {
                            strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));

                            comma = strchr(szNum, ',');

                            if (comma)
                            {
                                *comma = '\0';
                                str_to_number(k.second, comma+1);
                            }
                            else
                                k.second = 0;

                            str_to_number(k.first, szNum);
                            vec.push_back(k);
                        }

                        t = p + 1;
                        p = strchr(t, '/');
                    }

                    if (isnhdigit(*t))
                    {
                        strlcpy(szNum, t, sizeof(szNum));

                        comma = strchr(const_cast<char*>(t), ',');

                        if (comma)
                        {
                            *comma = '\0';
                            str_to_number(k.second, comma+1);
                        }
                        else
                            k.second = 0;

                        str_to_number(k.first, szNum);
                        vec.push_back(k);
                    }
                }

                bool CClientManager::InitializeObjectProto()
                {
                    using namespace building;

                    char query[4096];
                    snprintf(query, sizeof(query),
                            "SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
                            "FROM object_proto%s ORDER BY vnum",
                            GetTablePostfix());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_vec_kObjectProto.empty())
                    {
                        sys_log(0, "RELOAD: object_proto");
                        m_vec_kObjectProto.clear();
                    }

                    m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));

                    MYSQL_ROW    data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObjectProto t;

                            memset(&t, 0, sizeof(t));

                            int col = 0;

                            str_to_number(t.dwVnum, data[col++]);
                            str_to_number(t.dwPrice, data[col++]);

                            std::vector<std::pair<int, int> > vec;
                            parse_pair_number_string(data[col++], vec);

                            for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
                            {
                                std::pair<int, int> & r = vec;

                                t.kMaterials.dwItemVnum = r.first;
                                t.kMaterials.dwCount = r.second;
                            }

                            str_to_number(t.dwUpgradeVnum, data[col++]);
                            str_to_number(t.dwUpgradeLimitTime, data[col++]);
                            str_to_number(t.lLife, data[col++]);
                            str_to_number(t.lRegion[0], data[col++]);
                            str_to_number(t.lRegion[1], data[col++]);
                            str_to_number(t.lRegion[2], data[col++]);
                            str_to_number(t.lRegion[3], data[col++]);

                            // ADD_BUILDING_NPC
                            str_to_number(t.dwNPCVnum, data[col++]);
                            str_to_number(t.dwGroupVnum, data[col++]);
                            str_to_number(t.dwDependOnGroupVnum, data[col++]);

                            t.lNPCX = 0;
                            t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
                            // END_OF_ADD_BUILDING_NPC

                            sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
                                    t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);

                            m_vec_kObjectProto.push_back(t);
                        }

                    return true;
                }

                bool CClientManager::InitializeObjectTable()
                {
                    using namespace building;

                    char query[4096];
                    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());

                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();

                    if (!m_map_pkObjectTable.empty())
                    {
                        sys_log(0, "RELOAD: object");
                        m_map_pkObjectTable.clear();
                    }

                    MYSQL_ROW data;

                    if (pRes->uiNumRows > 0)
                        while ((data = mysql_fetch_row(pRes->pSQLResult)))
                        {
                            TObject * k = new TObject;

                            memset(k, 0, sizeof(TObject));

                            int col = 0;

                            str_to_number(k->dwID, data[col++]);
                            str_to_number(k->dwLandID, data[col++]);
                            str_to_number(k->dwVnum, data[col++]);
                            str_to_number(k->lMapIndex, data[col++]);
                            str_to_number(k->x, data[col++]);
                            str_to_number(k->y, data[col++]);
                            str_to_number(k->xRot, data[col++]);
                            str_to_number(k->yRot, data[col++]);
                            str_to_number(k->zRot, data[col++]);
                            str_to_number(k->lLife, data[col++]);

                            sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
                                    k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);

                            m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
                        }

                    return true;
                }

                bool CClientManager::InitializeMonarch()
                {
                    CMonarch::instance().LoadMonarch();

                    return true;
                }

                bool CClientManager::MirrorMobTableIntoDB()
                {
                    for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
                    {
                        const TMobTable& t = *it;
                        char query[4096];
                        if (g_stLocaleNameColumn == "name")
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(),
                                t.dwVnum, t.szName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }
                        else
                        {
                            snprintf(query, sizeof(query),
                                "replace into mob_proto%s "
                                "("
                                "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
                                "on_click, empire, drop_item, resurrection_vnum, folder, "
                                "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                                "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "

                                "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                                "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                                "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                                "dam_multiply, summon, drain_sp, "

                                "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
                                "skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
                                "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity"
                                ") "
                                "values ("

                                "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, "
                                "%d, %d, %d, %d, '%s', "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%f, %d, %d, "

                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, %d"
                                ")",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
                                t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
                                t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,

                                t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
                                t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
                                t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
                                t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.cResists[11],
                                t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP,

                                t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel,
                                t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel,
                                t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint, t.dwMobColor, t.bMountCapacity
                                );
                        }

                        CDBManager::instance().AsyncQuery(query);
                    }

                    return true;
                }

                bool CClientManager::MirrorItemTableIntoDB()
                {
                    for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
                    {
                        if (g_stLocaleNameColumn != "name")
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(), g_stLocaleNameColumn.c_str(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                        else
                        {
                            const TItemTable& t = *it;
                            char query[4096];
                            snprintf(query, sizeof(query),
                                "replace into item_proto%s ("
                                "vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
                                "flag, wearflag, antiflag, immuneflag, "
                                "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                                "limittype0, limitvalue0, limittype1, limitvalue1, "
                                "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                                "value0, value1, value2, value3, value4, value5 ) "
                                "values ("
                                "%d, %d, %d, \"%s\", %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d, "
                                "%d, %d, %d, %d, %d, %d )",
                                GetTablePostfix(),
                                t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
                                t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag,
                                t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
                                t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
                                t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
                                t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
                            CDBManager::instance().AsyncQuery(query);
                        }
                    }
                    return true;
                }

                // NOTXT_STARTUP_BEGIN
                bool CClientManager::InitializeMobTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, rank, battle_type, level, "
                        "size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "
                        "on_click, empire, drop_item, resurrection_vnum, folder, "
                        "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
                        "gold_min, gold_max, def, attack_speed, move_speed, "
                        "aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
                        "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
                        "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
                        "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
                        "dam_multiply, summon, drain_sp, "
                        "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"
                        "skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "
                        "sp_godspeed, sp_deathblow, sp_revive, mob_color, mount_capacity "
                        "FROM mob_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load mob_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "MOB_PROTO loading...");
                 
                    if (!m_vec_mobTable.empty())
                    {
                        sys_log(0, "RELOAD: mob_proto");
                        m_vec_mobTable.clear();
                    }
                 
                    m_vec_mobTable.resize(pRes->uiNumRows);
                    memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
                    TMobTable * mob_table = &m_vec_mobTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                        str_to_number(mob_table->dwVnum, data[col++]);
                        strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName));
                        strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));
                        str_to_number(mob_table->bType, data[col++]);
                        str_to_number(mob_table->bRank, data[col++]);
                        str_to_number(mob_table->bBattleType, data[col++]);
                        str_to_number(mob_table->bLevel, data[col++]);
                        str_to_number(mob_table->bSize, data[col++]);
                        str_to_number(mob_table->dwAIFlag, data[col++]);
                        str_to_number(mob_table->bMountCapacity, data[col++]);
                        str_to_number(mob_table->dwRaceFlag, data[col++]);
                        str_to_number(mob_table->dwImmuneFlag, data[col++]);
                        str_to_number(mob_table->bOnClickType, data[col++]);
                        str_to_number(mob_table->bEmpire, data[col++]);
                        str_to_number(mob_table->dwDropItemVnum, data[col++]);
                        str_to_number(mob_table->dwResurrectionVnum, data[col++]);
                        strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
                        str_to_number(mob_table->bStr, data[col++]);
                        str_to_number(mob_table->bDex, data[col++]);
                        str_to_number(mob_table->bCon, data[col++]);
                        str_to_number(mob_table->bInt, data[col++]);
                        str_to_number(mob_table->dwDamageRange[0], data[col++]);
                        str_to_number(mob_table->dwDamageRange[1], data[col++]);
                        str_to_number(mob_table->dwMaxHP, data[col++]);
                        str_to_number(mob_table->bRegenCycle, data[col++]);
                        str_to_number(mob_table->bRegenPercent, data[col++]);
                        str_to_number(mob_table->dwExp, data[col++]);
                        str_to_number(mob_table->dwGoldMin, data[col++]);
                        str_to_number(mob_table->dwGoldMax, data[col++]);
                        str_to_number(mob_table->wDef, data[col++]);
                        str_to_number(mob_table->sAttackSpeed, data[col++]);
                        str_to_number(mob_table->sMovingSpeed, data[col++]);
                        str_to_number(mob_table->bAggresiveHPPct, data[col++]);
                        str_to_number(mob_table->wAggressiveSight, data[col++]);
                        str_to_number(mob_table->wAttackRange, data[col++]);
                        str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);
                 
                        int i;
                        for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cEnchants, data[col++]);
                 
                        for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
                            str_to_number(mob_table->cResists, data[col++]);
                 
                        str_to_number(mob_table->fDamMultiply, data[col++]);
                        str_to_number(mob_table->dwSummonVnum, data[col++]);
                        str_to_number(mob_table->dwDrainSP, data[col++]);
                        str_to_number(mob_table->dwMobColor, data[col++]);
                 
                        for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)
                        {
                            str_to_number(mob_table->Skills.dwVnum, data[col++]);
                            str_to_number(mob_table->Skills.bLevel, data[col++]);
                        }
                 
                        str_to_number(mob_table->bBerserkPoint, data[col++]);
                        str_to_number(mob_table->bStoneSkinPoint, data[col++]);
                        str_to_number(mob_table->bGodSpeedPoint, data[col++]);
                        str_to_number(mob_table->bDeathBlowPoint, data[col++]);
                        str_to_number(mob_table->bRevivePoint, data[col++]);
                 
                        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);
                        ++mob_table;
                    }
                 
                    sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.\n", m_vec_mobTable.size());
                    return true;
                }
                 
                bool CClientManager::InitializeItemTableSQL()
                {
                    char query[4096];
                    snprintf(query, sizeof(query),
                        "SELECT vnum, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, "
                        "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
                        "limittype0, limitvalue0, limittype1, limitvalue1, "
                        "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
                        "value0, value1, value2, value3, value4, value5 "
                        "FROM item_proto%s ORDER BY vnum",
                        g_stLocaleNameColumn.c_str(), GetTablePostfix());
                 
                    std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
                    SQLResult * pRes = pkMsg->Get();
                 
                    if (!pRes->uiNumRows)
                    {
                        sys_err("Could not load item_proto. No results!");
                        return false;
                    }
                 
                    sys_log(0, "ITEM_PROTO loading...");
                 
                    if (!m_vec_itemTable.empty())
                    {
                        sys_log(0, "RELOAD: item_proto");
                        m_vec_itemTable.clear();
                        m_map_itemTableByVnum.clear();
                    }
                 
                    m_vec_itemTable.resize(pRes->uiNumRows);
                    memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
                    TItemTable * item_table = &m_vec_itemTable[0];
                 
                    MYSQL_ROW data;
                    int col;
                 
                    while ((data = mysql_fetch_row(pRes->pSQLResult)))
                    {
                        col = 0;
                 
                        str_to_number(item_table->dwVnum, data[col++]);
                        strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
                        strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
                        str_to_number(item_table->bType, data[col++]);
                        str_to_number(item_table->bSubType, data[col++]);
                        str_to_number(item_table->dwGold, data[col++]);
                        str_to_number(item_table->dwShopBuyPrice, data[col++]);
                        str_to_number(item_table->bWeight, data[col++]);
                        str_to_number(item_table->bSize, data[col++]);
                        str_to_number(item_table->dwFlags, data[col++]);
                        str_to_number(item_table->dwWearFlags, data[col++]);
                        str_to_number(item_table->dwAntiFlags, data[col++]);
                        str_to_number(item_table->dwImmuneFlag, data[col++]);
                        str_to_number(item_table->dwRefinedVnum, data[col++]);
                        str_to_number(item_table->wRefineSet, data[col++]);
                        str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
                        str_to_number(item_table->bGainSocketPct, data[col++]);
                        str_to_number(item_table->sAddonType, data[col++]);
                 
                        item_table->cLimitRealTimeFirstUseIndex = -1;
                        item_table->cLimitTimerBasedOnWearIndex = -1;
                 
                        int i;
                        for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aLimits.bType, data[col++]);
                            str_to_number(item_table->aLimits.lValue, data[col++]);
                 
                            if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits.bType)
                                item_table->cLimitRealTimeFirstUseIndex = (char)i;
                 
                            if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits.bType)
                                item_table->cLimitTimerBasedOnWearIndex = (char)i;
                        }
                 
                        for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
                        {
                            str_to_number(item_table->aApplies.bType, data[col++]);
                            str_to_number(item_table->aApplies.lValue, data[col++]);
                        }
                 
                        for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
                            str_to_number(item_table->alValues, data[col++]);
                 
                        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",
                                item_table->dwVnum,item_table->szName,item_table->szLocaleName,
                                item_table->alValues[0],item_table->alValues[1],item_table->alValues[2],
                                item_table->alValues[3],item_table->alValues[4],item_table->alValues[5],
                                item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag,
                                item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct);
                 
                        m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                        ++item_table;
                    }
                 
                    sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
                    sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.\n", m_vec_itemTable.size());
                    return true;
                }
                // NOTXT_STARTUP_END

     

     

     

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.