#include #include #include #include #include #include #include #include "ContentLoader.h" #include "ItemBase.h" #include "StructItem.h" #include "GameDBUtil.h" #include "DBPerformanceTracker.h" #include "ADOConnection.h" struct dbItem : public CADORecordBinding, public ItemBaseServer { dbItem() { script_string[0] = '\0'; } int price; int effect_id; int enhance_effect_id; char limit_deva; char limit_asura; char limit_gaia; char limit_fighter; char limit_hunter; char limit_magician; char limit_summoner; int item_use_flag; _decimal_variant cst_weight; _decimal_variant dv_range; _decimal_variant base_var1[4]; _decimal_variant base_var2[4]; _decimal_variant opt_var1[4]; _decimal_variant opt_var2[4]; // _decimal_variant enhance_var1[4]; // _decimal_variant enhance_var2[4]; char script_string[513]; BEGIN_ADO_BINDING(dbItem) ADO_VARIABLE_LENGTH_ENTRY4( 1, adInteger, nCode, sizeof(nCode), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 2, adInteger, nNameId, sizeof(nNameId), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 4, adInteger, nType, sizeof(nType), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 5, adInteger, nGroup, sizeof(nGroup), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 6, adInteger, nClass, sizeof(nClass), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 7, adInteger, WearType, sizeof(WearType), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 8, adInteger, nSetID, sizeof(nSetID), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 9, adInteger, nSetPartFlag, sizeof(nSetPartFlag), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 10, adInteger, nGrade, sizeof(nGrade), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 11, adInteger, nRank, sizeof(nRank), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 12, adInteger, nLevel, sizeof(nLevel), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 13, adInteger, nEnhance, sizeof(nEnhance), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 14, adInteger, nSocketCount, sizeof(nSocketCount), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 15, adInteger, nInstanceFlag, sizeof(nInstanceFlag), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 16, adBoolean, limit_deva, sizeof(limit_deva), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 17, adBoolean, limit_asura, sizeof(limit_asura), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 18, adBoolean, limit_gaia, sizeof(limit_gaia), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 19, adTinyInt, nJobDepth, sizeof(nJobDepth), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 20, adBoolean, limit_fighter, sizeof(limit_gaia), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 21, adBoolean, limit_hunter, sizeof(limit_gaia), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 22, adBoolean, limit_magician, sizeof(limit_gaia), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 23, adBoolean, limit_summoner, sizeof(limit_gaia), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 24, adInteger, nMinLevel, sizeof(nMinLevel), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 25, adInteger, nMaxLevel, sizeof(nMaxLevel), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 26, adInteger, nTargetMinLevel, sizeof(nTargetMinLevel), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 27, adInteger, nTargetMaxLevel, sizeof(nTargetMaxLevel), FALSE ) ADO_NUMERIC_ENTRY2( 28, adDecimal, dv_range, 10,2,FALSE ) ADO_NUMERIC_ENTRY2( 29, adDecimal, cst_weight, 10,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 30, adInteger, price, sizeof(price), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 31, adInteger, nHuntaholicPoint, sizeof( nHuntaholicPoint ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 32, adInteger, nArenaPoint, sizeof( nArenaPoint ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 33, adInteger, nEtherealDurability, sizeof(nEtherealDurability), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 34, adInteger, nEndurance, sizeof(nEndurance), FALSE ) // 35: 재질 int 추가 클라 전용 ADO_VARIABLE_LENGTH_ENTRY4( 36, adInteger, nSummonId, sizeof(nSummonId), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 37, adInteger, item_use_flag, sizeof(item_use_flag), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 38, adInteger, available_time, sizeof(available_time), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 39, adTinyInt, decrease_type, sizeof(decrease_type), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 40, adInteger, nThrowRange, sizeof(nThrowRange), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 41, adSmallInt, nBaseType[0], sizeof(nBaseType[0]), FALSE ) ADO_NUMERIC_ENTRY2( 42, adDecimal, base_var1[0], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 43, adDecimal, base_var2[0], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 44, adSmallInt, nBaseType[1], sizeof(nBaseType[1]), FALSE ) ADO_NUMERIC_ENTRY2( 45, adDecimal, base_var1[1], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 46, adDecimal, base_var2[1], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 47, adSmallInt, nBaseType[2], sizeof(nBaseType[2]), FALSE ) ADO_NUMERIC_ENTRY2( 48, adDecimal, base_var1[2], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 49, adDecimal, base_var2[2], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 50, adSmallInt, nBaseType[3], sizeof(nBaseType[3]), FALSE ) ADO_NUMERIC_ENTRY2( 51, adDecimal, base_var1[3], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 52, adDecimal, base_var2[3], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 53, adSmallInt, nOptType[0], sizeof(nOptType[0]), FALSE ) ADO_NUMERIC_ENTRY2( 54, adDecimal, opt_var1[0], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 55, adDecimal, opt_var2[0], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 56, adSmallInt, nOptType[1], sizeof(nOptType[1]), FALSE ) ADO_NUMERIC_ENTRY2( 57, adDecimal, opt_var1[1], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 58, adDecimal, opt_var2[1], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 59, adSmallInt, nOptType[2], sizeof(nOptType[2]), FALSE ) ADO_NUMERIC_ENTRY2( 60, adDecimal, opt_var1[2], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 61, adDecimal, opt_var2[2], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 62, adSmallInt, nOptType[3], sizeof(nOptType[3]), FALSE ) ADO_NUMERIC_ENTRY2( 63, adDecimal, opt_var1[3], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 64, adDecimal, opt_var2[3], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 65, adInteger, effect_id, sizeof( effect_id ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 66, adInteger, enhance_effect_id, sizeof(enhance_effect_id), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 67, adInteger, nSkillID, sizeof(nSkillID), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 68, adInteger, nStateCode, sizeof(nStateCode), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 69, adInteger, nStateLevel, sizeof(nStateLevel), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 70, adInteger, nStateTime, sizeof(nStateTime), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 71, adInteger, nCoolTime, sizeof(nCoolTime), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 72, adSmallInt, nCoolTimeGroup, sizeof(nCoolTimeGroup), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 102, adVarChar, script_string, _countof(script_string), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 103, adInteger, nArrangeCode, sizeof(nArrangeCode), FALSE ) END_ADO_BINDING() }; static void onItemData( dbItem * emprs ) { emprs->Flag.Clear(); // 사거리 emprs->nRange = emprs->dv_range.getFloat() * GameRule::ATTACK_RANGE_UNIT; emprs->nPrice.SetRawData( emprs->price ); for( int x = 0; x < ItemBase::MAX_OPTION_NUMBER; ++x ) { emprs->fBaseVar1[x].set( emprs->base_var1[x].getMultipleInteger( 10000 ) ); emprs->fBaseVar2[x].set( emprs->base_var2[x].getMultipleInteger( 10000 ) ); emprs->fOptVar1[x].set( emprs->opt_var1[x].getMultipleInteger( 10000 ) ); emprs->fOptVar2[x].set( emprs->opt_var2[x].getMultipleInteger( 10000 ) ); if( emprs->nBaseType[ x ] == ITEM_EFFECT_INSTANT::WARP ) emprs->item_use_flag |= 1 << ItemBase::FLAG_WARP; if( emprs->nOptType[ x ] == ITEM_EFFECT_INSTANT::WARP ) emprs->item_use_flag |= 1 << ItemBase::FLAG_WARP; } emprs->Flag.CopyFrom( &emprs->item_use_flag ); emprs->nLimit = 0; if( emprs->limit_asura ) emprs->nLimit |= ItemBase::LIMIT_ASURA; if( emprs->limit_gaia ) emprs->nLimit |= ItemBase::LIMIT_GAIA; if( emprs->limit_deva ) emprs->nLimit |= ItemBase::LIMIT_DEVA; if( emprs->limit_hunter ) emprs->nLimit |= ItemBase::LIMIT_HUNTER; if( emprs->limit_fighter ) emprs->nLimit |= ItemBase::LIMIT_FIGHTER; if( emprs->limit_magician ) emprs->nLimit |= ItemBase::LIMIT_MAGICIAN; if( emprs->limit_summoner ) emprs->nLimit |= ItemBase::LIMIT_SUMMONER; emprs->fWeight = emprs->cst_weight.getFloat(); if( emprs->effect_id ) emprs->pvEffectList = GameContent::GetEffectInfoVector( emprs->effect_id ); else emprs->pvEffectList = NULL; if( emprs->enhance_effect_id ) emprs->pvEnhanceEffectList = GameContent::GetEnhanceEffectVector( emprs->enhance_effect_id ); else emprs->pvEnhanceEffectList = NULL; char * pszScript = emprs->script_string; // 빈 스크립트의 경우 띄어쓰기 한 칸이 들어가 있게 되므로 앞쪽 공백 제거 처리 if( *pszScript == '0' ) *pszScript = ' '; while( *pszScript == ' ' ) ++pszScript; emprs->strScript = pszScript; // 기간제 아이템 소멸 시 로그 남겨야 하는지에 대한 설정 별도 로딩 처리(기간제가 아니면 처리 필요 없음) // * 런타임 성능을 위해 기간제 아이템 만료 시 마다 설정 리스트를 체크하지 않고 ItemBase에 미리 세팅해 둠 if( emprs->decrease_type != ItemBase::PERMANENT ) { // 로딩 중에 GameRule::strLogRequiredItemList가 바뀔 일은 없다고 가정하고 static std::set 컨테이너에 토큰화시켜서 담아놓고 처리 함 static bool bInitComplete = false; static std::set< int /* ItemBase::ItemCode */ > setLogRequiredItemList; // 최초 1회만 토큰화 처리 적용 if( !bInitComplete ) { bInitComplete = true; std::vector< std::string > vTokenList; XStringUtil::Split( GameRule::strLogRequiredItemList.c_str(), vTokenList, "|", false ); for( std::vector< std::string >::const_iterator it = vTokenList.begin() ; it != vTokenList.end() ; ++it ) { int nItemID = atoi( (*it).c_str() ); if( nItemID ) setLogRequiredItemList.insert( nItemID ); } } if( setLogRequiredItemList.size() && setLogRequiredItemList.find( emprs->nCode ) != setLogRequiredItemList.end() ) emprs->bLogRequiredOnExpiration = true; else emprs->bLogRequiredOnExpiration = false; } else emprs->bLogRequiredOnExpiration = false; StructItem::RegisterItemBase( *emprs ); } static void onItemLocalData( dbItem * emprs ) { // 이미 로드되어 있는 데이터면 무시 if( StructItem::IsValidItemCode( emprs->nCode ) ) { _cprint( "Already loaded resource loaded from [ItemLocalResource]. id(%d)\n", emprs->nCode ); FILELOG( "Already loaded resource loaded from [ItemLocalResource]. id(%d)", emprs->nCode ); return; } } static bool LoadItemData( _ConnectionPtr & ConnPtr ) { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif size_t cnt = LoadDbResource< dbItem >( "ItemResource", ConnPtr, onItemData ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d Item loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d Item loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d Item loaded...\n", cnt ); FILELOG( "Total %d Item loaded...", cnt ); #endif #ifdef FRAUN_PERFORMANCE_LOG dwTime = GetSafeTickCount(); #endif try { cnt = 0; cnt = LoadDbResource< dbItem >( "ItemLocalResource", ConnPtr, onItemLocalData ); } catch( _com_error & e ) { if( e.Error() != DB_E_NOTABLE ) throw; } catch( ... ) { throw; } #ifdef FRAUN_PERFORMANCE_LOG loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d Item(local) loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d Item(local) loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d Item(local) info loaded...\n", cnt ); FILELOG( "Total %d Item(local) info loaded...", cnt ); #endif return true; } struct dbSetItemEffectInfo : public CADORecordBinding, public SetItemEffectInfo { int set_id; _decimal_variant base_var1[4]; _decimal_variant base_var2[4]; _decimal_variant opt_var1[4]; _decimal_variant opt_var2[4]; int effect_id; BEGIN_ADO_BINDING(dbSetItemEffectInfo) ADO_VARIABLE_LENGTH_ENTRY4( 1, adInteger, set_id, sizeof(set_id), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 2, adInteger, nSetPartID, sizeof(nSetPartID), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 5, adSmallInt, nBaseType[0], sizeof(nBaseType[0]), FALSE ) ADO_NUMERIC_ENTRY2( 6, adDecimal, base_var1[0], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 7, adDecimal, base_var2[0], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 8, adSmallInt, nBaseType[1], sizeof(nBaseType[1]), FALSE ) ADO_NUMERIC_ENTRY2( 9, adDecimal, base_var1[1], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 10, adDecimal, base_var2[1], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 11, adSmallInt, nBaseType[2], sizeof(nBaseType[2]), FALSE ) ADO_NUMERIC_ENTRY2( 12, adDecimal, base_var1[2], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 13, adDecimal, base_var2[2], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 14, adSmallInt, nBaseType[3], sizeof(nBaseType[3]), FALSE ) ADO_NUMERIC_ENTRY2( 15, adDecimal, base_var1[3], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 16, adDecimal, base_var2[3], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 17, adSmallInt, nOptType[0], sizeof(nOptType[0]), FALSE ) ADO_NUMERIC_ENTRY2( 18, adDecimal, opt_var1[0], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 19, adDecimal, opt_var2[0], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 20, adSmallInt, nOptType[1], sizeof(nOptType[1]), FALSE ) ADO_NUMERIC_ENTRY2( 21, adDecimal, opt_var1[1], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 22, adDecimal, opt_var2[1], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 23, adSmallInt, nOptType[2], sizeof(nOptType[2]), FALSE ) ADO_NUMERIC_ENTRY2( 24, adDecimal, opt_var1[2], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 25, adDecimal, opt_var2[2], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 26, adSmallInt, nOptType[3], sizeof(nOptType[3]), FALSE ) ADO_NUMERIC_ENTRY2( 27, adDecimal, opt_var1[3], 12,2,FALSE ) ADO_NUMERIC_ENTRY2( 28, adDecimal, opt_var2[3], 12,2,FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 29, adInteger, effect_id, sizeof( effect_id ), FALSE ) END_ADO_BINDING() }; static void onSetItemEffectData( dbSetItemEffectInfo * emprs ) { for( int x = 0; x < SetItemEffectInfo::MAX_OPTION_NUMBER; ++x ) { emprs->fBaseVar1[x].set( emprs->base_var1[x].getMultipleInteger( 10000 ) ); emprs->fBaseVar2[x].set( emprs->base_var2[x].getMultipleInteger( 10000 ) ); emprs->fOptVar1[x].set( emprs->opt_var1[x].getMultipleInteger( 10000 ) ); emprs->fOptVar2[x].set( emprs->opt_var2[x].getMultipleInteger( 10000 ) ); } if( emprs->effect_id ) emprs->pvEffectList = GameContent::GetEffectInfoVector( emprs->effect_id ); else emprs->pvEffectList = NULL; GameContent::RegisterSetItemEffectInfo( emprs->set_id, *emprs ); } static bool LoadSetItemEffectData( _ConnectionPtr & ConnPtr ) { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif size_t cnt = LoadDbResource< dbSetItemEffectInfo >( "SetItemEffectResource", ConnPtr, onSetItemEffectData ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d SetItemEffect loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d SetItemEffect loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d SetItemEffect loaded...\n", cnt ); FILELOG( "Total %d SetItemEffect loaded...", cnt ); #endif return true; } struct dbEffectInfo : public CADORecordBinding, public EffectInfo { int nID; _decimal_variant dvValue[ EffectInfo::NUMBER_OF_VALUE ]; BEGIN_ADO_BINDING(dbEffectInfo) ADO_VARIABLE_LENGTH_ENTRY4( 1, adInteger, nID, sizeof( nID ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 2, adInteger, nOrdinalID, sizeof( nOrdinalID ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 4, adInteger, nMinLevel, sizeof( nMinLevel ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 5, adInteger, nMaxLevel, sizeof( nMaxLevel ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 6, adInteger, eType, sizeof( eType ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 7, adInteger, nEffectID, sizeof( nEffectID ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 8, adInteger, nEffectLevel, sizeof( nEffectLevel ), FALSE ) ADO_NUMERIC_ENTRY2( 9, adDecimal, dvValue[ 0 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 10, adDecimal, dvValue[ 1 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 11, adDecimal, dvValue[ 2 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 12, adDecimal, dvValue[ 3 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 13, adDecimal, dvValue[ 4 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 14, adDecimal, dvValue[ 5 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 15, adDecimal, dvValue[ 6 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 16, adDecimal, dvValue[ 7 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 17, adDecimal, dvValue[ 8 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 18, adDecimal, dvValue[ 9 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 19, adDecimal, dvValue[ 10 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 20, adDecimal, dvValue[ 11 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 21, adDecimal, dvValue[ 12 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 22, adDecimal, dvValue[ 13 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 23, adDecimal, dvValue[ 14 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 24, adDecimal, dvValue[ 15 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 25, adDecimal, dvValue[ 16 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 26, adDecimal, dvValue[ 17 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 27, adDecimal, dvValue[ 18 ], 12, 2, FALSE ) ADO_NUMERIC_ENTRY2( 28, adDecimal, dvValue[ 19 ], 12, 2, FALSE ) END_ADO_BINDING() }; static void onEffectInfo( dbEffectInfo * emprs ) { for( int i = 0 ; i < EffectInfo::NUMBER_OF_VALUE ; ++i ) { emprs->fValue[ i ].set( emprs->dvValue[ i ].getMultipleInteger( 10000 ) ); } GameContent::RegisterEffectInfo( emprs->nID, *emprs ); } static bool LoadEffectData( _ConnectionPtr & ConnPtr ) { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif size_t cnt = LoadDbResource< dbEffectInfo >( "SELECT * FROM dbo.ItemEffectResource ORDER BY id, ordinal_id", ConnPtr, onEffectInfo, adCmdText ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d ItemEffect loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d ItemEffect loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d ItemEffect loaded...\n", cnt ); FILELOG( "Total %d ItemEffect loaded...", cnt ); #endif return true; } struct DbEnhanceEffectInfo : public CADORecordBinding, public EnhanceEffectInfo { _decimal_variant dvValue[ 25 ]; BEGIN_ADO_BINDING(DbEnhanceEffectInfo) ADO_VARIABLE_LENGTH_ENTRY4( 1, adInteger, nID, sizeof( nID ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 2, adSmallInt, nSubID, sizeof( nSubID ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 3, adSmallInt, nEnhanceEffectID, sizeof( nEnhanceEffectID ), FALSE ) ADO_NUMERIC_ENTRY2( 4, adDecimal, dvValue[ 0 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 5, adDecimal, dvValue[ 1 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 6, adDecimal, dvValue[ 2 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 7, adDecimal, dvValue[ 3 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 8, adDecimal, dvValue[ 4 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 9, adDecimal, dvValue[ 5 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 10, adDecimal, dvValue[ 6 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 11, adDecimal, dvValue[ 7 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 12, adDecimal, dvValue[ 8 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 13, adDecimal, dvValue[ 9 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 14, adDecimal, dvValue[ 10 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 15, adDecimal, dvValue[ 11 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 16, adDecimal, dvValue[ 12 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 17, adDecimal, dvValue[ 13 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 18, adDecimal, dvValue[ 14 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 19, adDecimal, dvValue[ 15 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 20, adDecimal, dvValue[ 16 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 21, adDecimal, dvValue[ 17 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 22, adDecimal, dvValue[ 18 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 23, adDecimal, dvValue[ 19 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 24, adDecimal, dvValue[ 20 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 25, adDecimal, dvValue[ 21 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 26, adDecimal, dvValue[ 22 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 27, adDecimal, dvValue[ 23 ], 10, 2, FALSE ) ADO_NUMERIC_ENTRY2( 28, adDecimal, dvValue[ 24 ], 10, 2, FALSE ) END_ADO_BINDING() }; static void onEnhanceEffectInfo( DbEnhanceEffectInfo * emprs ) { for( int i = 0 ; i < EnhanceEffectInfo::NUMBER_OF_VALUE_ENHANCE ; ++i ) { emprs->fValue[ i ].set( emprs->dvValue[ i ].getMultipleInteger( 10000 ) ); } GameContent::RigsterEnhanceEffectInfo( emprs->nID, emprs->nSubID, *emprs ); } static bool LoadEnhanceEffectData( _ConnectionPtr & ConnPtr ) { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif size_t cnt = LoadDbResource< DbEnhanceEffectInfo >( "SELECT * FROM dbo.EnhanceEffectResource ORDER BY sid, sub_id", ConnPtr, onEnhanceEffectInfo, adCmdText ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d EnhanceEffect loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d EnhanceEffect loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d EnhanceEffect loaded...\n", cnt ); FILELOG( "Total %d EnhanceEffect loaded...", cnt ); #endif return true; } struct dbItemConvertInfo : public CADORecordBinding { int nItemCodeOriginal; int nItemCodeTarget; BEGIN_ADO_BINDING(dbItemConvertInfo) ADO_VARIABLE_LENGTH_ENTRY4( 1, adInteger, nItemCodeOriginal, sizeof( nItemCodeOriginal ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4( 2, adInteger, nItemCodeTarget, sizeof( nItemCodeTarget ), FALSE ) END_ADO_BINDING() }; static void onItemConvertInfo( dbItemConvertInfo * emprs ) { if( !StructItem::RegisterConvertingInfo( emprs->nItemCodeOriginal, emprs->nItemCodeTarget ) ) { assert( 0 ); _cprint( "failed to insert item converting info: original[%d] target[%d]\n", emprs->nItemCodeOriginal, emprs->nItemCodeTarget ); _cprint( "failed to insert item converting info: original[%d] target[%d]", emprs->nItemCodeOriginal, emprs->nItemCodeTarget ); } } static bool LoadItemConvertData( _ConnectionPtr & ConnPtr ) { size_t cnt = LoadDbResource< dbItemConvertInfo >( "ItemConversionResource", ConnPtr, onItemConvertInfo ); _cprint( "Total %d item convert info loaded...\n", cnt ); FILELOG( "Total %d item convert info loaded...", cnt ); return true; } bool ItemLoader::onProcess( int nThreadNum ) { HRESULT hr = S_OK; DBPerformanceTrackHelper helper; try { _ConnectionPtr ConnPtr = NULL; InitContentDbConnection( ConnPtr ); helper.start(); LoadEffectData( ConnPtr ); LoadEnhanceEffectData( ConnPtr ); LoadSetItemEffectData( ConnPtr ); LoadItemData( ConnPtr ); LoadItemConvertData( ConnPtr ); helper.end( "ItemLoader" ); } catch( _com_error &e ) { helper.end( e.Error(), "ItemLoader" ); LogDBError( e, "ItemLoader", "ItemLoader::onProcess()" ); std::string strError = "ITEM RESOUCE DB ERROR : "; strError += e.Description(); throw XException( strError ); } ENV().Set( "game.item_loading", "complete" ); return true; }