You last visited: Today at 00:26
Advertisement
40K DB
Discussion on 40K DB within the Metin2 Private Server forum part of the Metin2 category.
05/27/2014, 23:00
#1
elite*gold: 0
Join Date: May 2009
Posts: 533
Received Thanks: 464
40K DB
Hey leute
Besteht die Möglichkeit das die Datenbank nicht immer aus der Mob_proto.txt. und item_proto.txt liest sondern einfach nur aus der Datenbank wie bei der 28k Game?
05/27/2014, 23:39
#2
elite*gold: 315
Join Date: Jun 2012
Posts: 5,158
Received Thanks: 4,814
ja die möglichkeit gibt es.
öffne ClientManagerBoot.cpp und such nach:
CClientManager::InitializeItemTable
und ändere das:
PHP Code:
bool CClientManager :: InitializeItemTable () { //================== ÇÔ¼ö ¼³¸í ==================// //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 was loaded successfully.\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 was loaded successfully.\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 was loaded successfully.\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 was loaded successfully.\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 [ i ]. bType = tempTable -> aLimits [ i ]. bType ; item_table -> aLimits [ i ]. lValue = tempTable -> aLimits [ i ]. lValue ; if ( LIMIT_REAL_TIME_START_FIRST_USE == item_table -> aLimits [ i ]. bType ) item_table -> cLimitRealTimeFirstUseIndex = ( char ) i ; if ( LIMIT_TIMER_BASED_ON_WEAR == item_table -> aLimits [ i ]. bType ) item_table -> cLimitTimerBasedOnWearIndex = ( char ) i ; } for ( i = 0 ; i < ITEM_APPLY_MAX_NUM ; ++ i ) { item_table -> aApplies [ i ]. bType = tempTable -> aApplies [ i ]. bType ; item_table -> aApplies [ i ]. lValue = tempTable -> aApplies [ i ]. lValue ; } for ( i = 0 ; i < ITEM_VALUES_MAX_NUM ; ++ i ) item_table -> alValues [ i ] = tempTable -> alValues [ i ]; 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 was loaded successfully.\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 ; }
in
PHP Code:
bool CClientManager :: InitializeItemTable () { std :: ostringstream query ; query << "SELECT vnum, type, subtype, name, " << g_stLocaleNameColumn << ", 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, socket0, socket1, socket2 FROM item_proto ORDER BY vnum" ; SQLMsg * sqlMsg = CDBManager :: instance (). DirectQuery ( query . str (). c_str (), 0 ); if ( sqlMsg == nullptr ) { sys_err ( "libdb::InitializeItemTable" , __LINE__ , "Could not load item_proto. Query failed!" ); return false ; } MYSQL_RES * pRes = sqlMsg -> vec_pkResult [ 0 ]-> pSQLResult ; if ( pRes == nullptr ) { sys_err ( "libdb::InitializeItemTable" , __LINE__ , "Could not load item_proto. No result!" ); return 0 ; } if (! m_vec_itemTable .empty()) { sys_log ( __LINE__ , " Reloading item_proto" ); m_vec_itemTable . clear (); } MYSQL_ROW row ; while (( row = mysql_fetch_row ( pRes ))) { SItemTable temp = {}; if ( row [ 0 ]&&* row [ 0 ]) temp . dwVnum = strtoul ( row [ 0 ], NULL , 10 ); if ( row [ 1 ]&&* row [ 1 ]) temp . bType = strtoul ( row [ 1 ], NULL , 10 ); if ( row [ 2 ]&&* row [ 2 ]) temp . bSubType = strtoul ( row [ 2 ], NULL , 10 ); if ( row [ 3 ]&&* row [ 3 ]) snprintf ( temp . szName , 25 , "%s" , row [ 3 ]); if ( row [ 4 ]&&* row [ 4 ]) snprintf ( temp . szLocaleName , 25 , "%s" , row [ 4 ]); if ( row [ 5 ]&&* row [ 5 ]) temp . dwGold = strtoul ( row [ 5 ], NULL , 10 ); if ( row [ 6 ]&&* row [ 6 ]) temp . dwShopBuyPrice = strtoul ( row [ 6 ], NULL , 10 ); if ( row [ 7 ]&&* row [ 7 ]) temp . bWeight = strtoul ( row [ 7 ], NULL , 10 ); if ( row [ 8 ]&&* row [ 8 ]) temp . bSize = strtoul ( row [ 8 ], NULL , 10 ); if ( row [ 9 ]&&* row [ 9 ]) temp . dwFlags = strtoul ( row [ 9 ], NULL , 10 ); if ( row [ 10 ]&&* row [ 10 ]) temp . dwWearFlags = strtoul ( row [ 10 ], NULL , 10 ); if ( row [ 11 ]&&* row [ 11 ]) temp . dwAntiFlags = strtoul ( row [ 11 ], NULL , 10 ); if ( row [ 12 ]&&* row [ 12 ]) temp . dwImmuneFlag = strtoul ( row [ 12 ], NULL , 10 ); if ( row [ 13 ]&&* row [ 13 ]) temp . dwRefinedVnum = strtoul ( row [ 13 ], NULL , 10 ); if ( row [ 14 ]&&* row [ 14 ]) temp . wRefineSet = strtoul ( row [ 14 ], NULL , 10 ); if ( row [ 15 ]&&* row [ 15 ]) temp . bAlterToMagicItemPct = strtoul ( row [ 15 ], NULL , 10 ); if ( row [ 16 ]&&* row [ 16 ]) temp . bGainSocketPct = strtoul ( row [ 16 ], NULL , 10 ); if ( row [ 17 ]&&* row [ 17 ]) temp . sAddonType = strtoul ( row [ 17 ], NULL , 10 ); if ( row [ 18 ]&&* row [ 18 ]) temp . aLimits [ 0 ]. bType = strtoul ( row [ 18 ], NULL , 10 ); if ( row [ 19 ]&&* row [ 19 ]) temp . aLimits [ 0 ]. lValue = strtoul ( row [ 19 ], NULL , 10 ); if ( row [ 20 ]&&* row [ 20 ]) temp . aLimits [ 1 ]. bType = strtoul ( row [ 20 ], NULL , 10 ); if ( row [ 21 ]&&* row [ 21 ]) temp . aLimits [ 1 ]. lValue = strtoul ( row [ 21 ], NULL , 10 ); if ( row [ 22 ]&&* row [ 22 ]) temp . aApplies [ 0 ]. bType = strtoul ( row [ 22 ], NULL , 10 ); if ( row [ 23 ]&&* row [ 23 ]) temp . aApplies [ 0 ]. lValue = strtoul ( row [ 23 ], NULL , 10 ); if ( row [ 24 ]&&* row [ 24 ]) temp . aApplies [ 1 ]. bType = strtoul ( row [ 24 ], NULL , 10 ); if ( row [ 25 ]&&* row [ 25 ]) temp . aApplies [ 1 ]. lValue = strtoul ( row [ 25 ], NULL , 10 ); if ( row [ 26 ]&&* row [ 26 ]) temp . aApplies [ 2 ]. bType = strtoul ( row [ 26 ], NULL , 10 ); if ( row [ 27 ]&&* row [ 27 ]) temp . aApplies [ 2 ]. lValue = strtoul ( row [ 27 ], NULL , 10 ); if ( row [ 28 ]&&* row [ 28 ]) temp . alValues [ 0 ] = strtoul ( row [ 28 ], NULL , 10 ); if ( row [ 29 ]&&* row [ 29 ]) temp . alValues [ 1 ] = strtoul ( row [ 29 ], NULL , 10 ); if ( row [ 30 ]&&* row [ 30 ]) temp . alValues [ 2 ] = strtoul ( row [ 30 ], NULL , 10 ); if ( row [ 31 ]&&* row [ 31 ]) temp . alValues [ 3 ] = strtoul ( row [ 31 ], NULL , 10 ); if ( row [ 32 ]&&* row [ 32 ]) temp . alValues [ 4 ] = strtoul ( row [ 32 ], NULL , 10 ); if ( row [ 33 ]&&* row [ 33 ]) temp . alValues [ 5 ] = strtoul ( row [ 33 ], NULL , 10 ); temp . cLimitRealTimeFirstUseIndex = - 1 ; temp . cLimitTimerBasedOnWearIndex = - 1 ; for ( int i = 0 ; i < ITEM_LIMIT_MAX_NUM ; ++ i ) { if ( LIMIT_REAL_TIME_START_FIRST_USE == temp . aLimits [ i ]. bType ) temp . cLimitRealTimeFirstUseIndex = ( char ) i ; if ( LIMIT_TIMER_BASED_ON_WEAR == temp . aLimits [ i ]. bType ) temp . cLimitTimerBasedOnWearIndex = ( char ) i ; } m_vec_itemTable . push_back ( temp ); } std :: cout << "CClientManager::InitializeItemTable:: " << m_vec_itemTable . size () << " items loaded." << std :: endl ; mysql_free_result ( pRes ); m_map_itemTableByVnum . clear (); auto 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 ; }
mfg
05/28/2014, 00:14
#3
elite*gold: 11
Join Date: Nov 2010
Posts: 1,709
Received Thanks: 3,828
You can also use Vanilla Core it has this option in CONFIG
05/28/2014, 02:42
#4
elite*gold: 0
Join Date: Apr 2014
Posts: 186
Received Thanks: 158
Quote:
Originally Posted by
.Shōgun
You can also use Vanilla Core it has this option in CONFIG
he could, but with the source you can work a lot better...
05/28/2014, 03:00
#5
elite*gold: 11
Join Date: Nov 2010
Posts: 1,709
Received Thanks: 3,828
Quote:
Originally Posted by
.PsychoMantis™
he could, but with the source you can work a lot better...
You think someone who thinks txt proto files are complicated would want to mess with C++?
05/28/2014, 07:14
#6
elite*gold: 0
Join Date: May 2009
Posts: 533
Received Thanks: 464
Quote:
Originally Posted by
Lauling
ja die möglichkeit gibt es.
öffne ClientManagerBoot.cpp und such nach:
CClientManager::InitializeItemTable
und ändere das:
PHP Code:
bool CClientManager :: InitializeItemTable ()
{
//================== ÇÔ¼ö ¼³¸í ==================//
//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 was loaded successfully.\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 was loaded successfully.\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 was loaded successfully.\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 was loaded successfully.\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 [ i ]. bType = tempTable -> aLimits [ i ]. bType ;
item_table -> aLimits [ i ]. lValue = tempTable -> aLimits [ i ]. lValue ;
if ( LIMIT_REAL_TIME_START_FIRST_USE == item_table -> aLimits [ i ]. bType )
item_table -> cLimitRealTimeFirstUseIndex = ( char ) i ;
if ( LIMIT_TIMER_BASED_ON_WEAR == item_table -> aLimits [ i ]. bType )
item_table -> cLimitTimerBasedOnWearIndex = ( char ) i ;
}
for ( i = 0 ; i < ITEM_APPLY_MAX_NUM ; ++ i )
{
item_table -> aApplies [ i ]. bType = tempTable -> aApplies [ i ]. bType ;
item_table -> aApplies [ i ]. lValue = tempTable -> aApplies [ i ]. lValue ;
}
for ( i = 0 ; i < ITEM_VALUES_MAX_NUM ; ++ i )
item_table -> alValues [ i ] = tempTable -> alValues [ i ];
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 was loaded successfully.\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 ;
}
in
PHP Code:
bool CClientManager :: InitializeItemTable () {
std :: ostringstream query ;
query << "SELECT vnum, type, subtype, name, " << g_stLocaleNameColumn << ", 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, socket0, socket1, socket2 FROM item_proto ORDER BY vnum" ;
SQLMsg * sqlMsg = CDBManager :: instance (). DirectQuery ( query . str (). c_str (), 0 );
if ( sqlMsg == nullptr ) {
sys_err ( "libdb::InitializeItemTable" , __LINE__ , "Could not load item_proto. Query failed!" );
return false ;
}
MYSQL_RES * pRes = sqlMsg -> vec_pkResult [ 0 ]-> pSQLResult ;
if ( pRes == nullptr ) {
sys_err ( "libdb::InitializeItemTable" , __LINE__ , "Could not load item_proto. No result!" );
return 0 ;
}
if (! m_vec_itemTable .empty()) {
sys_log ( __LINE__ , " Reloading item_proto" );
m_vec_itemTable . clear ();
}
MYSQL_ROW row ;
while (( row = mysql_fetch_row ( pRes ))) {
SItemTable temp = {};
if ( row [ 0 ]&&* row [ 0 ]) temp . dwVnum = strtoul ( row [ 0 ], NULL , 10 );
if ( row [ 1 ]&&* row [ 1 ]) temp . bType = strtoul ( row [ 1 ], NULL , 10 );
if ( row [ 2 ]&&* row [ 2 ]) temp . bSubType = strtoul ( row [ 2 ], NULL , 10 );
if ( row [ 3 ]&&* row [ 3 ]) snprintf ( temp . szName , 25 , "%s" , row [ 3 ]);
if ( row [ 4 ]&&* row [ 4 ]) snprintf ( temp . szLocaleName , 25 , "%s" , row [ 4 ]);
if ( row [ 5 ]&&* row [ 5 ]) temp . dwGold = strtoul ( row [ 5 ], NULL , 10 );
if ( row [ 6 ]&&* row [ 6 ]) temp . dwShopBuyPrice = strtoul ( row [ 6 ], NULL , 10 );
if ( row [ 7 ]&&* row [ 7 ]) temp . bWeight = strtoul ( row [ 7 ], NULL , 10 );
if ( row [ 8 ]&&* row [ 8 ]) temp . bSize = strtoul ( row [ 8 ], NULL , 10 );
if ( row [ 9 ]&&* row [ 9 ]) temp . dwFlags = strtoul ( row [ 9 ], NULL , 10 );
if ( row [ 10 ]&&* row [ 10 ]) temp . dwWearFlags = strtoul ( row [ 10 ], NULL , 10 );
if ( row [ 11 ]&&* row [ 11 ]) temp . dwAntiFlags = strtoul ( row [ 11 ], NULL , 10 );
if ( row [ 12 ]&&* row [ 12 ]) temp . dwImmuneFlag = strtoul ( row [ 12 ], NULL , 10 );
if ( row [ 13 ]&&* row [ 13 ]) temp . dwRefinedVnum = strtoul ( row [ 13 ], NULL , 10 );
if ( row [ 14 ]&&* row [ 14 ]) temp . wRefineSet = strtoul ( row [ 14 ], NULL , 10 );
if ( row [ 15 ]&&* row [ 15 ]) temp . bAlterToMagicItemPct = strtoul ( row [ 15 ], NULL , 10 );
if ( row [ 16 ]&&* row [ 16 ]) temp . bGainSocketPct = strtoul ( row [ 16 ], NULL , 10 );
if ( row [ 17 ]&&* row [ 17 ]) temp . sAddonType = strtoul ( row [ 17 ], NULL , 10 );
if ( row [ 18 ]&&* row [ 18 ]) temp . aLimits [ 0 ]. bType = strtoul ( row [ 18 ], NULL , 10 );
if ( row [ 19 ]&&* row [ 19 ]) temp . aLimits [ 0 ]. lValue = strtoul ( row [ 19 ], NULL , 10 );
if ( row [ 20 ]&&* row [ 20 ]) temp . aLimits [ 1 ]. bType = strtoul ( row [ 20 ], NULL , 10 );
if ( row [ 21 ]&&* row [ 21 ]) temp . aLimits [ 1 ]. lValue = strtoul ( row [ 21 ], NULL , 10 );
if ( row [ 22 ]&&* row [ 22 ]) temp . aApplies [ 0 ]. bType = strtoul ( row [ 22 ], NULL , 10 );
if ( row [ 23 ]&&* row [ 23 ]) temp . aApplies [ 0 ]. lValue = strtoul ( row [ 23 ], NULL , 10 );
if ( row [ 24 ]&&* row [ 24 ]) temp . aApplies [ 1 ]. bType = strtoul ( row [ 24 ], NULL , 10 );
if ( row [ 25 ]&&* row [ 25 ]) temp . aApplies [ 1 ]. lValue = strtoul ( row [ 25 ], NULL , 10 );
if ( row [ 26 ]&&* row [ 26 ]) temp . aApplies [ 2 ]. bType = strtoul ( row [ 26 ], NULL , 10 );
if ( row [ 27 ]&&* row [ 27 ]) temp . aApplies [ 2 ]. lValue = strtoul ( row [ 27 ], NULL , 10 );
if ( row [ 28 ]&&* row [ 28 ]) temp . alValues [ 0 ] = strtoul ( row [ 28 ], NULL , 10 );
if ( row [ 29 ]&&* row [ 29 ]) temp . alValues [ 1 ] = strtoul ( row [ 29 ], NULL , 10 );
if ( row [ 30 ]&&* row [ 30 ]) temp . alValues [ 2 ] = strtoul ( row [ 30 ], NULL , 10 );
if ( row [ 31 ]&&* row [ 31 ]) temp . alValues [ 3 ] = strtoul ( row [ 31 ], NULL , 10 );
if ( row [ 32 ]&&* row [ 32 ]) temp . alValues [ 4 ] = strtoul ( row [ 32 ], NULL , 10 );
if ( row [ 33 ]&&* row [ 33 ]) temp . alValues [ 5 ] = strtoul ( row [ 33 ], NULL , 10 );
temp . cLimitRealTimeFirstUseIndex = - 1 ;
temp . cLimitTimerBasedOnWearIndex = - 1 ;
for ( int i = 0 ; i < ITEM_LIMIT_MAX_NUM ; ++ i ) {
if ( LIMIT_REAL_TIME_START_FIRST_USE == temp . aLimits [ i ]. bType )
temp . cLimitRealTimeFirstUseIndex = ( char ) i ;
if ( LIMIT_TIMER_BASED_ON_WEAR == temp . aLimits [ i ]. bType )
temp . cLimitTimerBasedOnWearIndex = ( char ) i ;
}
m_vec_itemTable . push_back ( temp );
}
std :: cout << "CClientManager::InitializeItemTable:: " << m_vec_itemTable . size () << " items loaded." << std :: endl ;
mysql_free_result ( pRes );
m_map_itemTableByVnum . clear ();
auto 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 ;
}
mfg
Danke für deine Antwort. Weißt du wo ClientManagerBoot.cpp ist?
All times are GMT +2. The time now is 00:26 .