#include #include #include #include #include "ContentLoader.h" #include "QuestBase.h" #include "StructQuest.h" #include "GameDBUtil.h" #include "DBPerformanceTracker.h" #include "ADOConnection.h" struct dbQuest : public CADORecordBinding, public QuestBaseServer { dbQuest() { script_drop_string[0] = '\0'; script_accept_string[0] = '\0'; script_clear_string[0] = '\0'; } char limit_deva; char limit_asura; char limit_gaia; char limit_fighter; char limit_hunter; char limit_magician; char limit_summoner; char is_repeatable; __int64 gold; char script_accept_string[513]; char script_clear_string[513]; char script_drop_string[513]; BEGIN_ADO_BINDING(dbQuest) ADO_VARIABLE_LENGTH_ENTRY4(1, adInteger, nCode, sizeof(nCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(2, adInteger, nQuestTextId, sizeof(nQuestTextId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(3, adInteger, nSummaryTextId, sizeof(nSummaryTextId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(4, adInteger, nStatusTextId, sizeof(nStatusTextId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(5, adInteger, nBeginTime, sizeof(nBeginTime), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(6, adInteger, nEndTime, sizeof(nEndTime), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(7, adInteger, nLimitLevel, sizeof(nLimitLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(8, adInteger, nLimitJobLevel, sizeof(nLimitJobLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(9, adInteger, nLimitMaxLevel, sizeof(nLimitMaxLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(10, adInteger, nLimitMaxJobLevel, sizeof(nLimitMaxJobLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(11, adBoolean, limit_deva, sizeof(limit_deva), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(12, adBoolean, limit_asura, sizeof(limit_asura), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(13, adBoolean, limit_gaia, sizeof(limit_gaia), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(14, adBoolean, limit_fighter, sizeof(limit_fighter), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(15, adBoolean, limit_hunter, sizeof(limit_hunter), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(16, adBoolean, limit_magician, sizeof(limit_magician), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(17, adBoolean, limit_summoner, sizeof(limit_summoner), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(18, adInteger, nLimitJob, sizeof(nLimitJob), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(19, adTinyInt, nJobDepth, sizeof(nJobDepth), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(20, adInteger, nLimitFavorGroupId, sizeof(nLimitFavorGroupId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(21, adInteger, nLimitFavor, sizeof(nLimitFavor), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(22, adBoolean, is_repeatable, sizeof(is_repeatable), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(23, adInteger, nInvokeCondition, sizeof(nInvokeCondition), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(24, adInteger, nInvokeValue, sizeof(nInvokeValue), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(25, adInteger, eTimeLimitType, sizeof( eTimeLimitType ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4(26, adInteger, nTimeLimit, sizeof( nTimeLimit ), FALSE ) ADO_VARIABLE_LENGTH_ENTRY4(27, adInteger, nType, sizeof(nType), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(28, adInteger, nValue[0], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(29, adInteger, nValue[1], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(30, adInteger, nValue[2], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(31, adInteger, nValue[3], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(32, adInteger, nValue[4], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(33, adInteger, nValue[5], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(34, adInteger, nValue[6], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(35, adInteger, nValue[7], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(36, adInteger, nValue[8], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(37, adInteger, nValue[9], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(38, adInteger, nValue[10], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(39, adInteger, nValue[11], 4, FALSE) ADO_VARIABLE_LENGTH_ENTRY4(40, adInteger, nDropGroupId, sizeof(nDropGroupId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(41, adInteger, nQuestDifficulty, sizeof(nQuestDifficulty), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(42, adInteger, nFavorGroupId, sizeof(nFavorGroupId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(43, adInteger, nHateGroupId, sizeof(nHateGroupId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(44, adInteger, nFavor, sizeof(nFavor), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(45, adBigInt, nExp, sizeof(nExp), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(46, adInteger, nJP, sizeof(nJP), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(47, adInteger, nHuntaholicPoint, sizeof(nHuntaholicPoint), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(48, adBigInt, gold, sizeof(gold), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(49, adInteger, DefaultReward.nItemCode, sizeof(DefaultReward.nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(50, adInteger, DefaultReward.nLevel, sizeof(DefaultReward.nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(51, adInteger, DefaultReward.nQuantity, sizeof(DefaultReward.nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(52, adInteger, OptionalReward[0].nItemCode, sizeof(OptionalReward[0].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(53, adInteger, OptionalReward[0].nLevel, sizeof(OptionalReward[0].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(54, adInteger, OptionalReward[0].nQuantity, sizeof(OptionalReward[0].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(55, adInteger, OptionalReward[1].nItemCode, sizeof(OptionalReward[1].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(56, adInteger, OptionalReward[1].nLevel, sizeof(OptionalReward[1].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(57, adInteger, OptionalReward[1].nQuantity, sizeof(OptionalReward[1].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(58, adInteger, OptionalReward[2].nItemCode, sizeof(OptionalReward[2].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(59, adInteger, OptionalReward[2].nLevel, sizeof(OptionalReward[2].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(60, adInteger, OptionalReward[2].nQuantity, sizeof(OptionalReward[2].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(61, adInteger, OptionalReward[3].nItemCode, sizeof(OptionalReward[3].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(62, adInteger, OptionalReward[3].nLevel, sizeof(OptionalReward[3].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(63, adInteger, OptionalReward[3].nQuantity, sizeof(OptionalReward[3].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(64, adInteger, OptionalReward[4].nItemCode, sizeof(OptionalReward[4].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(65, adInteger, OptionalReward[4].nLevel, sizeof(OptionalReward[4].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(66, adInteger, OptionalReward[4].nQuantity, sizeof(OptionalReward[4].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(67, adInteger, OptionalReward[5].nItemCode, sizeof(OptionalReward[5].nItemCode), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(68, adInteger, OptionalReward[5].nLevel, sizeof(OptionalReward[5].nLevel), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(69, adInteger, OptionalReward[5].nQuantity, sizeof(OptionalReward[5].nQuantity), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(70, adInteger, nForeQuest[0], sizeof(nForeQuest[0]), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(71, adInteger, nForeQuest[1], sizeof(nForeQuest[1]), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(72, adInteger, nForeQuest[2], sizeof(nForeQuest[2]), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(73, adBoolean, bForeCheckType, sizeof(bForeCheckType), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(74, adVarChar, script_accept_string, _countof(script_accept_string), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(75, adVarChar, script_clear_string, _countof(script_clear_string), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(76, adVarChar, script_drop_string, _countof(script_drop_string), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(80, adInteger, nCoolTime, sizeof(nCoolTime), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(81, adInteger, nDropCoolTime, sizeof(nDropCoolTime), FALSE) END_ADO_BINDING() }; struct dbQuestLink : public CADORecordBinding, public QuestLink { BEGIN_ADO_BINDING(dbQuestLink) ADO_VARIABLE_LENGTH_ENTRY4(1, adInteger, nNPCId, sizeof(nNPCId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(2, adInteger, code, sizeof(code), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(3, adBoolean, bLF_Start, sizeof(bLF_Start), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(4, adBoolean, bLF_Progress, sizeof(bLF_Progress), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(5, adBoolean, bLF_End, sizeof(bLF_End), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(6, adInteger, nStartTextId, sizeof(nStartTextId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(7, adInteger, nInProgressTextId, sizeof(nInProgressTextId), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(8, adInteger, nEndTextId, sizeof(nEndTextId), FALSE) END_ADO_BINDING() }; struct dbRandomPool : public CADORecordBinding { BEGIN_ADO_BINDING(dbRandomPool) ADO_VARIABLE_LENGTH_ENTRY4(1, adInteger, group_id, sizeof(group_id), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(2, adInteger, quest_target_id, sizeof(quest_target_id), FALSE) ADO_VARIABLE_LENGTH_ENTRY4(3, adInteger, target_level, sizeof(target_level), FALSE) END_ADO_BINDING() int group_id; int quest_target_id; int target_level; }; static void onQuestData( dbQuest * emprs ) { emprs->LimitFlag.Clear(); if( emprs->limit_asura ) emprs->LimitFlag.On( QuestBase::LIMIT_ASURA ); if( emprs->limit_gaia ) emprs->LimitFlag.On( QuestBase::LIMIT_GAIA ); if( emprs->limit_deva ) emprs->LimitFlag.On( QuestBase::LIMIT_DEVA ); if( emprs->limit_hunter ) emprs->LimitFlag.On( QuestBase::LIMIT_HUNTER ); if( emprs->limit_fighter ) emprs->LimitFlag.On( QuestBase::LIMIT_FIGHTER ); if( emprs->limit_magician ) emprs->LimitFlag.On( QuestBase::LIMIT_MAGICIAN ); if( emprs->limit_summoner ) emprs->LimitFlag.On( QuestBase::LIMIT_SUMMONER ); emprs->bIsRepeatable = emprs->is_repeatable; emprs->nGold.SetRawData( emprs->gold ); emprs->strAcceptScript = emprs->script_accept_string; emprs->strClearScript = emprs->script_clear_string; emprs->strDropScript = emprs->script_drop_string; if( strlen( emprs->script_accept_string ) < 3 ) emprs->strAcceptScript = ""; if( strlen( emprs->script_clear_string ) < 3 ) emprs->strClearScript = ""; if( strlen( emprs->script_drop_string ) < 3 ) emprs->strDropScript = ""; StructQuest::RegisterQuestBase( *emprs ); } static bool LoadQuestData() { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif _ConnectionPtr ConnPtr = NULL; InitContentDbConnection( ConnPtr ); size_t cnt = LoadDbResource< dbQuest >( "QuestResource", ConnPtr, onQuestData ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d Quest loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d Quest info loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d Quest loaded...d\n", cnt); FILELOG( "Total %d Quest info loaded...", cnt); #endif return true; } static void onQuestLinkData( dbQuestLink * emprs ) { if( emprs->nNPCId ) GameContent::RegisterQuestLink( *emprs ); else GameContent::RegisterQuestTextId( emprs->code, emprs->nStartTextId, emprs->nInProgressTextId, emprs->nEndTextId ); } static bool LoadQuestLinkData() { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif _ConnectionPtr ConnPtr = NULL; InitContentDbConnection( ConnPtr ); size_t cnt = LoadDbResource< dbQuestLink >( "QuestLinkResource", ConnPtr, onQuestLinkData ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d QuestLink loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d QuestLink info loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d QuestLink loaded...\n", cnt ); FILELOG( "Total %d QuestLink info loaded...", cnt ); #endif return true; } static void onRandomPoolData( dbRandomPool * emprs ) { GameContent::RegisterRandomPoolInfo( emprs->group_id, emprs->quest_target_id, emprs->target_level ); } static bool LoadRandomPoolData() { #ifdef FRAUN_PERFORMANCE_LOG DWORD dwTime = GetSafeTickCount(); #endif _ConnectionPtr ConnPtr = NULL; InitContentDbConnection( ConnPtr ); size_t cnt = LoadDbResource< dbRandomPool >( "RandomPoolResource", ConnPtr, onRandomPoolData ); #ifdef FRAUN_PERFORMANCE_LOG DWORD loadingTime = GetSafeTickCount() - dwTime; _cprint("Total %d RandomPool loaded; time taken: %d\n", cnt, loadingTime); FILELOG("Total %d RandomPool info loaded; time taken: %d", cnt, loadingTime); #else _cprint( "Total %d RandomPool loaded...\n", cnt ); FILELOG( "Total %d RandomPool info loaded...", cnt ); #endif return true; } bool QuestLoader::onProcess( int nThreadNum ) { HRESULT hr = S_OK; DBPerformanceTrackHelper helper; try { GameContent::ClearQuestLink(); helper.start(); LoadQuestData(); LoadQuestLinkData(); LoadRandomPoolData(); helper.end( "QuestLoader" ); } catch( _com_error &e ) { helper.end( e.Error(), "QuestLoader" ); LogDBError( e, "QuestLoader", "QuestLoader::onProcess()" ); std::string strError = "QUEST RESOUCE DB ERROR : "; strError += e.Description(); throw XException( strError ); } return true; }