#include "StdAfx.h" #include "DnMissionSystem.h" #include "DNMissionCommonAPI.h" #include "DNUserData.h" #include "DnTableDB.h" #include "DNGameDataManager.h" #include "EtUIXML.h" #include "DNUserSendManager.h" #include "DNDBConnectionManager.h" #include "DNLogConnection.h" #include "DnAppellation.h" #include "DNMissionScheduler.h" #include "DNUserSession.h" #include "DNDBConnection.h" #include "DNMailSender.h" #if defined( _VILLAGESERVER ) #include "DNMasterConnection.h" #else #include "DNMasterConnectionManager.h" #endif #include "DNGuildSystem.h" #if defined(_VILLAGESERVER) #include "DNGuildWarManager.h" #endif // #if defined(_VILLAGESERVER) #if defined( PRE_ADD_STAMPSYSTEM ) #include "DNStampSystem.h" #endif // #if defined( PRE_ADD_STAMPSYSTEM ) /* CDNMissionSystem::MissionInfoStruct CDNMissionSystem::s_MissionInfoStruct[] = { { CDNMissionSystem::AttainPlayerLevel, 2, api_AttainPlayerLevel }, }; */ CDNMissionSystem::CDNMissionSystem( CDNUserSession *pUser ) #if defined(PRE_ADD_ACTIVEMISSION) : m_ActiveMissionState(ActiveMission::NOT_ASSIGNED) ,m_pActiveMission(NULL) #endif { m_pUserSession = pUser; } CDNMissionSystem::~CDNMissionSystem() { } bool CDNMissionSystem::LoadUserData() { RefreshOnOffMissionList(); RefreshDailyMissionList(); RefreshWeeklyMissionList(); #if defined(PRE_ADD_MONTHLY_MISSION) RefreshMonthlyMissionList(); #endif // #if defined(PRE_ADD_MONTHLY_MISSION) RefreshWeekendEventMissionList(); RefreshGuildWarMissionList(); RefreshPCBangMissionList(); RefreshGuildCommonMissionList(); RefreshWeekendRepeatMissionList(); return true; } void CDNMissionSystem::RefreshOnOffMissionList() { for( int i=0; iGetMissionData(); // On/Off ¹Ì¼Ç ¼³Á¤. bool bModifyGain = false; for( int i=0; iGetMissionData(i); if( !pData ) continue; if( GetBitFlag( pMission->MissionAchieve, i ) ) { //DB »ó¿¡¼­ Achieve °¡ µÇ¾î Àִµ¥ Gain ÀÌ ¾ÈµÈ³à¼® Gain ó¸® ÇØÁØ´Ù if(!GetBitFlag(pMission->MissionGain, i)) { SetBitFlag(pMission->MissionGain, i, true); bModifyGain = true; } continue; //´Þ¼ºµÈ ³à¼®µéÀº ¹ö¸°´Ù. } #else // ÀÌ¹Ì ´Þ¼ºµÌÀ¸¸é ¹ö¸°´Ù. if( GetBitFlag( pMission->MissionAchieve, i ) ) continue; TMissionData *pData = g_pDataManager->GetMissionData(i); if( !pData ) continue; #endif // Å×À̺í»ó Active °¡ ¾ÈµÇÀÖÀ¸¸é ¹ö¸°´Ù. if( !pData->bActivate ) { // ÀÌ¹Ì Å¬¶óÀÌ¾ðÆ®°¡ ¾ò¾îµÐ ¹Ì¼ÇÀ» ¿©·¯°¡Áö »çÁ¤¿¡ ÀÇÇØ Active-False·Î ¹Ù²Ü °æ¿ì // Ŭ¶óÀÌ¾ðÆ®¿¡°Ôµµ º¸ÀÌ¸é ¾ÈµÇ¹Ç·Î GainÀ» °­Á¦·Î ¼öÁ¤ÇÑ´Ù.(DB¿¡ ±â·ÏµÈ °ªÀº °Çµå¸®Áö ¾Ê´Â´Ù.) if( GetBitFlag( pMission->MissionGain, i ) == true ) SetBitFlag( pMission->MissionGain, i, false ); continue; } // ȹµæ Á¶°ÇÀÌ ¾øÀ¸¸é DB »óÀÇ È¹µæ Ç÷¹±×¸¦ ÄÑÁà¾ß ÇÑ´Ù. »ý¼º½Ã ÄÑÁÖÀÚ. if( pData->GainCondition.cEvent == 0 ) { if( GetBitFlag( pMission->MissionGain, i ) == false ) { bModifyGain = true; SetBitFlag( pMission->MissionGain, i, true ); } } // ´Þ¼ºÁ¶°ÇÀº ¾øÀ»¼ö °¡ ¾ø´Ù. ¾ø´Ù¸é ¼ÂÆÃÀÌ ¾ÈµÈ°ÍÀ¸¹Ç·Î Æä¾². if( pData->AchieveCondition.cEvent == 0 ) continue; if( GetBitFlag( pMission->MissionGain, i ) == false ) m_nVecMissionGainList[pData->GainCondition.cEvent].push_back(i); else m_nVecMissionAchieveList[pData->AchieveCondition.cEvent].push_back(i); } m_pUserSession->GetDBConnection()->QueryMissionGain( m_pUserSession ); } void CDNMissionSystem::RefreshDailyMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iDailyMission[i].nMissionID < 1 ) continue; if( pMission->DailyMission[i].bAchieve ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->DailyMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[Daily][pData->AchieveCondition.cEvent].push_back(i); } } void CDNMissionSystem::RefreshWeeklyMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iWeeklyMission[i].nMissionID < 1 ) continue; if( pMission->WeeklyMission[i].bAchieve ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->WeeklyMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[Weekly][pData->AchieveCondition.cEvent].push_back(i); } } #if defined( PRE_ADD_MONTHLY_MISSION ) void CDNMissionSystem::RefreshMonthlyMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iMonthlyMission[i].nMissionID < 1 ) continue; if( pMission->MonthlyMission[i].bAchieve ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->MonthlyMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[Monthly][pData->AchieveCondition.cEvent].push_back(i); } } #endif // #if defined( PRE_ADD_MONTHLY_MISSION ) void CDNMissionSystem::RefreshWeekendEventMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iWeekendEventMission[i].nMissionID < 1 ) continue; if( pMission->WeekendEventMission[i].bAchieve ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->WeekendEventMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[WeekendEvent][pData->AchieveCondition.cEvent].push_back(i); } } // ±æµå¹Ì¼Ç °»½Å void CDNMissionSystem::RefreshGuildWarMissionList() { // Ãʱ⠵¥ÀÌÅͰ¡ ¾øÀ» °æ¿ì ¸®¼Â bool bCreateMission = true; TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( int i=0; iGuildWarMission[i].nMissionID > 0 ) { bCreateMission = false; break; } } if(bCreateMission) { if(InitGuildWarMissionList(false)) return; } // ¿¹¼±ÀüÀÌ ¾Æ´Ò°æ¿ì ¸®¼Â󸮸¦ ¹Ì¸®ÇÑ´Ù. if(!bIsGuildWarMission()) { if(InitGuildWarMissionList(true)) return; } ScopeLock Lock(m_Lock); for( int i=0; iGuildWarMission[i].nMissionID < 1 ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->GuildWarMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[GuildWar][pData->AchieveCondition.cEvent].push_back(i); } } void CDNMissionSystem::RefreshPCBangMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for (int i = 0; i < PCBangMissionMax; i++){ if( pMission->PCBangMission[i].nMissionID < 1 ) continue; if( pMission->PCBangMission[i].bAchieve ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->PCBangMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[PCBang][pData->AchieveCondition.cEvent].push_back(i); } } void CDNMissionSystem::RefreshGuildCommonMissionList() { //±æµå ¹Ì¼ÇÀº Achieve ÇØµµ »èÁ¦ ÇÏÁö ¾Ê°í ¹Ýº¹ Ŭ¸®¾î°¡ °¡´É ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iGetGuildCommonMissionData( i ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; if( pMission->GuildCommonMission[i].nMissionID < 1 ) { pMission->GuildCommonMission[i].nMissionID = pData->nItemID; bAddedNewGuildMission = true; } m_nVecDailyMissionList[GuildCommon][pData->AchieveCondition.cEvent].push_back(i); } if(bAddedNewGuildMission) m_pUserSession->GetDBConnection()->QuerySetGuildCommonMission(m_pUserSession); } void CDNMissionSystem::RefreshWeekendRepeatMissionList() { ScopeLock Lock(m_Lock); for( int i=0; iGetMissionData(); for( int i=0; iWeekendRepeatMission[i].nMissionID < 1 ) continue; TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pMission->WeekendRepeatMission[i].nMissionID ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; m_nVecDailyMissionList[WeekendRepeat][pData->AchieveCondition.cEvent].push_back(i); } } void CDNMissionSystem::OnGainMission( int nArrayIndex ) { m_pUserSession->SendMissionGain( nArrayIndex ); } void CDNMissionSystem::OnAchieveMission( int nArrayIndex ) { m_pUserSession->SendMissionAchieve( nArrayIndex ); m_pUserSession->GetDBConnection()->QueryMissionAchieve(m_pUserSession, nArrayIndex); } void CDNMissionSystem::OnCounterDailyMission( DailyMissionTypeEnum Type, int nArrayIndex, int nCounter ) { m_pUserSession->SendDailyMissionCount( Type, nArrayIndex, nCounter ); } void CDNMissionSystem::OnAchieveDailyMission( DailyMissionTypeEnum Type, int nArrayIndex, bool bSecret /*=false*/ ) { m_pUserSession->SendDailyMissionAchieve( Type, nArrayIndex, bSecret ); #if defined( PRE_ADD_STAMPSYSTEM ) m_pUserSession->GetStampSystem()->OnCompleteDailyMission( nArrayIndex ); #endif // #if defined( PRE_ADD_STAMPSYSTEM ) } void CDNMissionSystem::OnEventPopUp( int nArrayIndex ) { #if defined(_CH) && !defined(PRE_FIX_26377) return; // ÀÏ´Ü Áß±¹Àº À̺¥Æ® ÆË¾÷±â´ÉÀ» Á¤ÁöÇÕ´Ï´Ù. #endif // À̺¥Æ®ÆË¾÷¿©ºÎ(AchieveList¿¡ Æ÷ÇÔ)´Â OnAchieveMission ÇÔ¼ö¸¦ ÅëÇØ DB¿¡ÀúÀåÇÑ´Ù m_pUserSession->SendMissionEventPopUp( nArrayIndex ); } void CDNMissionSystem::OnHelpAlarm( int nArrayIndex ) { m_pUserSession->SendMissionHelpAlarm( nArrayIndex ); } void CDNMissionSystem::RequestMissionReward( int nArrayIndex ) { TMissionData *pData = g_pDataManager->GetMissionData(nArrayIndex); if( !pData ) return; if(pData->nMailID > 0){ char cPayMethod = 0; switch(pData->nType) { case MissionType_TimeEvent: cPayMethod = DBDNWorldDef::PayMethodCode::Event; break; default: cPayMethod = DBDNWorldDef::PayMethodCode::Mission; break; } CDNMailSender::Process(m_pUserSession, pData->nMailID, cPayMethod, nArrayIndex); } else { #ifdef PRE_ADD_JOINGUILD_SUPPORT //¾îÈÄ.....ÀÌ·± ½á±Û... ÇϵåÄÚµù... if (nArrayIndex == 43) { int nMailID = pData->nMailID; char cPayMethod = 0; switch(pData->nType) { case MissionType_TimeEvent: cPayMethod = DBDNWorldDef::PayMethodCode::Event; break; default: cPayMethod = DBDNWorldDef::PayMethodCode::Mission; break; } if (m_pUserSession) { int nRewardMailID = g_pDataManager->GetRewardFisrtGuildJoinMailID(m_pUserSession->GetLevel()); if (nRewardMailID > 0) CDNMailSender::Process(m_pUserSession, nRewardMailID, cPayMethod, nArrayIndex); else _DANGER_POINT(); } } #endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT } if( pData->nRewardAppellation != -1 ) { m_pUserSession->GetAppellation()->RequestAddAppellation( pData->nRewardAppellation ); } if( pData->bIsAchieveNotice ) { #if defined(_VILLAGESERVER) g_pMasterConnection->SendWorldSystemMsg( m_pUserSession->GetAccountDBID(), WORLDCHATTYPE_MISSION, nArrayIndex, 0 ); #else g_pMasterConnectionManager->SendWorldSystemMsg( m_pUserSession->GetWorldSetID(), m_pUserSession->GetAccountDBID(), WORLDCHATTYPE_MISSION, nArrayIndex, 0 ); #endif } } void CDNMissionSystem::RequestDailyMissionReward( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); if(pData->nType != DAILYMISSION_PCBANG) pMission->nMissionScore += pData->nRewardPoint; if(pData->nMailID > 0){ CDNMailSender::Process(m_pUserSession, pData->nMailID, DBDNWorldDef::PayMethodCode::Mission, nItemID); } if( pData->nRewardAppellation != -1 ) { m_pUserSession->GetAppellation()->RequestAddAppellation( pData->nRewardAppellation ); } } void CDNMissionSystem::UpdateLastAchieveList( int nArrayIndex ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( int i=LASTMISSIONACHIEVEMAX - 1; i>0; i-- ) { pMission->wLastMissionAchieve[i] = pMission->wLastMissionAchieve[i-1]; } pMission->wLastMissionAchieve[0] = nArrayIndex; } void CDNMissionSystem::RequestDailyMissionList( DailyMissionTypeEnum Type, int nRandomSeed, bool bSend ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); switch( Type ) { case Daily: { CDNMissionScheduler::GetInstance().RefreshDailyMissionList( nRandomSeed, m_pUserSession->GetMissionData(), m_pUserSession->GetLevel(), m_pUserSession->GetClassID() ); RefreshDailyMissionList(); if( bSend ) m_pUserSession->SendDailyMissionList( Daily, pMission->DailyMission ); m_pUserSession->GetDBConnection()->QuerySetDailyMission( m_pUserSession ); // ¿©±â¿¡ ÇǾ¾¹æ ¹Ì¼Çµµ °°ÀÌ; m_pUserSession->RefreshPCBangMissionList(); // ¿©±â¼­ missionid ¼¼ÆÃ RefreshPCBangMissionList(); m_pUserSession->GetDBConnection()->QuerySetPCBangMission(m_pUserSession); } break; case Weekly: { CDNMissionScheduler::GetInstance().RefreshWeeklyMissionList( nRandomSeed, m_pUserSession->GetMissionData(), m_pUserSession->GetLevel(), m_pUserSession->GetClassID() ); RefreshWeeklyMissionList(); if( bSend ) m_pUserSession->SendDailyMissionList( Weekly, pMission->WeeklyMission ); m_pUserSession->GetDBConnection()->QuerySetWeeklyMission( m_pUserSession ); } break; #if defined(PRE_ADD_MONTHLY_MISSION) case Monthly: { CDNMissionScheduler::GetInstance().RefreshMonthlyMissionList( nRandomSeed, m_pUserSession->GetMissionData(), m_pUserSession->GetLevel(), m_pUserSession->GetClassID() ); RefreshMonthlyMissionList(); if( bSend ) m_pUserSession->SendDailyMissionList( Monthly, pMission->MonthlyMission ); m_pUserSession->GetDBConnection()->QuerySetMonthlyMission( m_pUserSession ); } break; #endif // #if defined(PRE_ADD_MONTHLY_MISSION) case WeekendEvent: { CDNMissionScheduler::GetInstance().RefreshWeekendEventMissionList( m_pUserSession->GetMissionData() ); RefreshWeekendEventMissionList(); if( bSend ) m_pUserSession->SendDailyMissionList( WeekendEvent, pMission->WeekendEventMission ); m_pUserSession->GetDBConnection()->QuerySetWeekendEventMission( m_pUserSession ); } break; case WeekendRepeat: { CDNMissionScheduler::GetInstance().RefreshWeekendRepeatMissionList( m_pUserSession->GetMissionData() ); RefreshWeekendRepeatMissionList(); if( bSend ) m_pUserSession->SendDailyMissionList( WeekendRepeat, pMission->WeekendRepeatMission ); m_pUserSession->GetDBConnection()->QuerySetWeekendRepeatMission( m_pUserSession ); } break; } } void CDNMissionSystem::RequestDailyMissionAlarm( DailyMissionTypeEnum Type ) { m_pUserSession->SendDailyMissionAlarm( Type ); } void CDNMissionSystem::RequestForceGainMission( int nItemID ) { DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMISSION ); int nTargetArrayIndex = pSox->GetArrayIndex( nItemID ); TMissionData *pData = g_pDataManager->GetMissionData( nTargetArrayIndex ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( DWORD i=0; iGainCondition.cEvent].size(); i++ ) { int nArrayIndex = m_nVecMissionGainList[pData->GainCondition.cEvent][i]; if( nArrayIndex == nTargetArrayIndex ) { SetBitFlag( pMission->MissionGain, nArrayIndex, true ); OnGainMission( nArrayIndex ); // ȹµæ ¼º°øÀÌ¸é ´Þ¼º¸®½ºÆ®¿¡ Ãß°¡ÇØÁà¾ßÇÑ´Ù. m_nVecMissionAchieveList[pData->AchieveCondition.cEvent].push_back(nArrayIndex); /////////////////////////////////////////////// m_nVecMissionGainList[pData->GainCondition.cEvent].erase( m_nVecMissionGainList[pData->GainCondition.cEvent].begin() + i ); i--; } } } void CDNMissionSystem::RequestForceAchieveMission( int nItemID ) { DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMISSION ); int nTargetArrayIndex = pSox->GetArrayIndex( nItemID ); TMissionData *pData = g_pDataManager->GetMissionData( nTargetArrayIndex ); if( !pData ) return; std::vector nVecAchieveList; TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( DWORD i=0; iAchieveCondition.cEvent].size(); i++ ) { int nArrayIndex = m_nVecMissionAchieveList[pData->AchieveCondition.cEvent][i]; if( nArrayIndex == nTargetArrayIndex ) { SetBitFlag( pMission->MissionAchieve, nArrayIndex, true ); RequestMissionReward( nArrayIndex ); OnAchieveMission( nArrayIndex ); if( pData->nType == MissionType_Normal || pData->nType == MissionType_MetaShow ) UpdateLastAchieveList( nArrayIndex ); nVecAchieveList.push_back( nArrayIndex + 1 ); m_nVecMissionAchieveList[pData->AchieveCondition.cEvent].erase( m_nVecMissionAchieveList[pData->AchieveCondition.cEvent].begin() + i ); i--; } } for( DWORD i=0; iGetEventSystem()->OnEvent( EventSystem::OnMissionClear, 1, EventSystem::MissionID, nVecAchieveList[i] ); } } void CDNMissionSystem::RequestForceGainDailyMission( int nCount, ... ) { va_list list; va_start( list, nCount ); std::vector nVecList; for( int i=0; iGetMissionData(); int nOffset = 0; memset( pMission->DailyMission, 0, sizeof(pMission->DailyMission) ); for( DWORD i=0; iGetDailyMissionData( nVecList[i] ); if( !pData ) continue; pMission->DailyMission[nOffset].nMissionID = nVecList[i]; nOffset++; } RefreshDailyMissionList(); m_pUserSession->SendDailyMissionList( Daily, pMission->DailyMission ); } void CDNMissionSystem::RequestForceAchieveDailyMission( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); TDailyMission *pDailyMission; for( DWORD i=0; iAchieveCondition.cEvent].size(); i++ ) { int nArrayIndex = m_nVecDailyMissionList[Daily][pData->AchieveCondition.cEvent][i]; pDailyMission = &pMission->DailyMission[ nArrayIndex ]; if( pDailyMission->nMissionID == nItemID ) { pDailyMission->bAchieve = true; pDailyMission->nCounter = pData->nCounterParam; RequestDailyMissionReward( pDailyMission->nMissionID ); OnAchieveDailyMission( Daily, nArrayIndex ); m_pUserSession->GetDBConnection()->QueryModDailyWeeklyMission( m_pUserSession, DAILYMISSION_DAY, nArrayIndex, pDailyMission); // dbÀúÀå m_nVecDailyMissionList[Daily][pData->AchieveCondition.cEvent].erase( m_nVecDailyMissionList[Daily][pData->AchieveCondition.cEvent].begin() + i ); break; } } } void CDNMissionSystem::RequestForceGainWeeklyMission( int nCount, ... ) { va_list list; va_start( list, nCount ); std::vector nVecList; for( int i=0; iGetMissionData(); int nOffset = 0; memset( pMission->WeeklyMission, 0, sizeof(pMission->WeeklyMission) ); for( DWORD i=0; iGetDailyMissionData( nVecList[i] ); if( !pData ) continue; pMission->WeeklyMission[nOffset].nMissionID = nVecList[i]; nOffset++; } RefreshWeeklyMissionList(); m_pUserSession->SendDailyMissionList( Weekly, pMission->WeeklyMission ); } void CDNMissionSystem::RequestForceAchieveWeeklyMission( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); TDailyMission *pWeeklyMission; for( DWORD i=0; iAchieveCondition.cEvent].size(); i++ ) { int nArrayIndex = m_nVecDailyMissionList[Weekly][pData->AchieveCondition.cEvent][i]; pWeeklyMission = &pMission->WeeklyMission[ nArrayIndex ]; if( pWeeklyMission->nMissionID == nItemID ) { pWeeklyMission->bAchieve = true; pWeeklyMission->nCounter = pData->nCounterParam; RequestDailyMissionReward( pWeeklyMission->nMissionID ); OnAchieveDailyMission( Weekly, nArrayIndex ); m_pUserSession->GetDBConnection()->QueryModDailyWeeklyMission(m_pUserSession, DAILYMISSION_WEEK, nArrayIndex, pWeeklyMission); // dbÀúÀå m_nVecDailyMissionList[Weekly][pData->AchieveCondition.cEvent].erase( m_nVecDailyMissionList[Weekly][pData->AchieveCondition.cEvent].begin() + i ); break; } } } #if defined(PRE_ADD_MONTHLY_MISSION) void CDNMissionSystem::RequestForceGainMonthlyMission( int nCount, ... ) { va_list list; va_start( list, nCount ); std::vector nVecList; for( int i=0; iGetMissionData(); int nOffset = 0; memset( pMission->MonthlyMission, 0, sizeof(pMission->MonthlyMission) ); for( DWORD i=0; iGetDailyMissionData( nVecList[i] ); if( !pData ) continue; pMission->MonthlyMission[nOffset].nMissionID = nVecList[i]; nOffset++; } RefreshMonthlyMissionList(); m_pUserSession->SendDailyMissionList( Monthly, pMission->MonthlyMission ); } void CDNMissionSystem::RequestForceAchieveMonthlyMission( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); TDailyMission *pMonthlyMission; for( DWORD i=0; iAchieveCondition.cEvent].size(); i++ ) { int nArrayIndex = m_nVecDailyMissionList[Monthly][pData->AchieveCondition.cEvent][i]; pMonthlyMission = &pMission->MonthlyMission[ nArrayIndex ]; if( pMonthlyMission->nMissionID == nItemID ) { pMonthlyMission->bAchieve = true; pMonthlyMission->nCounter = pData->nCounterParam; RequestDailyMissionReward( pMonthlyMission->nMissionID ); OnAchieveDailyMission( Monthly, nArrayIndex ); m_pUserSession->GetDBConnection()->QueryModDailyWeeklyMission(m_pUserSession, DAILYMISSION_MONTH, nArrayIndex, pMonthlyMission); // dbÀúÀå m_nVecDailyMissionList[Monthly][pData->AchieveCondition.cEvent].erase( m_nVecDailyMissionList[Monthly][pData->AchieveCondition.cEvent].begin() + i ); break; } } } #endif // #if defined(PRE_ADD_MONTHLY_MISSION) void CDNMissionSystem::RequestForceAchieveGuildWarMission( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); if(!pMission) return; int nArrayIndex = 0; char Event = pData->AchieveCondition.cEvent; TDailyMission *pDailyMission; for( DWORD i=0; iGuildWarMission[nArrayIndex]; if( pDailyMission->nMissionID == nItemID ) { bool bAchieve = true; bool bSecret = false; pDailyMission->bAchieve = true; pDailyMission->nCounter = 0; // ¿¹¼±ÀüÆ÷ÀÎÆ®´©Àû int nRewardPoint = g_pDataManager->GetDailyMissionRewarePoint(pDailyMission->nMissionID); #if defined(_VILLAGESERVER) if(g_pGuildWarManager->IsSecretMission(m_pUserSession->GetGuildSelfView().cTeamColorCode, pDailyMission->nMissionID)) #elif defined(_GAMESERVER) if(g_pMasterConnectionManager->IsSecretMission(m_pUserSession->GetWorldSetID(), m_pUserSession->GetGuildSelfView().cTeamColorCode, pDailyMission->nMissionID)) #endif { nRewardPoint *= 2; // ½ÃÅ©¸´¹ßµ¿»óÅÂÀϰæ¿ì2¹è·ÎÆ÷ÀÎÆ®Ã³¸® bSecret = true; } if (Event == EventSystem::OnDungeonClear && api_Mission_MapSubType(m_pUserSession) == GlobalEnum::MAPSUB_NONE) { int nLevelLimit = static_cast(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_LevelLimit)); if (m_pUserSession->GetLevel() <= nLevelLimit) { nRewardPoint = (int)(nRewardPoint * static_cast(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_Rate))); if (nRewardPoint <= 0) nRewardPoint = 1; } } m_pUserSession->GetDBConnection()->QueryAddGuildWarPoint(m_pUserSession, pDailyMission->nMissionID, nRewardPoint); pMission->nMissionScore++; // ±æµå¹Ì¼ÇÀº1Á¡¾¿¿Ã¸°´Ù. OnAchieveDailyMission( GuildWar, nArrayIndex, bSecret); m_pUserSession->GetDBConnection()->QueryModGuildWarMission(m_pUserSession, DAILYMISSION_GUILDWAR, nArrayIndex, pDailyMission, bAchieve); // dbÀúÀå } } } void CDNMissionSystem::RequestForceAchieveGuildCommonMission( int nItemID ) { TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( nItemID ); if( !pData ) return; TMissionGroup *pMission = m_pUserSession->GetMissionData(); if(!pMission) return; int nArrayIndex = 0; char Event = pData->AchieveCondition.cEvent; TDailyMission *pDailyMission; for( DWORD i=0; iGuildCommonMission[nArrayIndex]; if( pDailyMission->nMissionID == nItemID ) { bool bAchieve = true; pDailyMission->bAchieve = true; pDailyMission->nCounter = 0; // ±æµåÆ÷ÀÎÆ® ´©Àû int nRewardPoint = g_pDataManager->GetDailyMissionRewarePoint(pDailyMission->nMissionID); m_pUserSession->AddGuildPoint(GUILDPOINTTYPE_MISSION, nRewardPoint, pDailyMission->nMissionID); RequestDailyMissionReward( pDailyMission->nMissionID ); OnAchieveDailyMission(GuildCommon, nArrayIndex); m_pUserSession->GetDBConnection()->QueryModGuildWarMission(m_pUserSession, DAILYMISSION_GUILDCOMMON, nArrayIndex, pDailyMission, bAchieve); // dbÀúÀå } } } bool CDNMissionSystem::bIsDailyMission( const int nItemID ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( UINT i=0 ; i<_countof(pMission->DailyMission) ; ++i ) { if( pMission->DailyMission[i].nMissionID == nItemID ) return true; } return false; } bool CDNMissionSystem::bIsWeeklyMission( const int nItemID ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( UINT i=0 ; i<_countof(pMission->WeeklyMission) ; ++i ) { if( pMission->WeeklyMission[i].nMissionID == nItemID ) return true; } return false; } #if defined(PRE_MOD_MISSION_HELPER) bool CDNMissionSystem::bCheckDailyMission( const int nItemID, DNNotifier::Type::eType eType ) { if( eType == DNNotifier::Type::NormalMission ) return bIsCommonMission(nItemID); TMissionGroup *pMission = m_pUserSession->GetMissionData(); if(!pMission) return false; TDailyMission *pDailyMission = NULL; int nCount = 0; switch(eType) { case DNNotifier::Type::DailyMission: pDailyMission = pMission->DailyMission; nCount = _countof(pMission->DailyMission); break; case DNNotifier::Type::WeeklyMission: pDailyMission = pMission->WeeklyMission; nCount = _countof(pMission->WeeklyMission); break; #if defined(PRE_ADD_MONTHLY_MISSION) case DNNotifier::Type::MonthlyMission: pDailyMission = pMission->MonthlyMission; nCount = _countof(pMission->MonthlyMission); break; #endif // #if defined(PRE_ADD_MONTHLY_MISSION) case DNNotifier::Type::GuildWarMission: pDailyMission = pMission->GuildWarMission; nCount = _countof(pMission->GuildWarMission); break; case DNNotifier::Type::PCBangMission: pDailyMission = pMission->PCBangMission; nCount = _countof(pMission->PCBangMission); break; case DNNotifier::Type::GuildCommonMission: pDailyMission = pMission->GuildCommonMission; nCount = _countof(pMission->GuildCommonMission); break; case DNNotifier::Type::WeekendEventMission: pDailyMission = pMission->WeekendEventMission; nCount = _countof(pMission->WeekendEventMission); break; case DNNotifier::Type::WeekendRepeatMission: pDailyMission = pMission->WeekendRepeatMission; nCount = _countof(pMission->WeekendRepeatMission); break; } if(!pDailyMission) return false; for( int i=0 ; iGetMissionData(); if( GetBitFlag( pMission->MissionGain, nItemID ) ) return true; return false; } #endif bool CDNMissionSystem::bIsGuildWarMission() { short wScheduleID = 0; char cStep = 0; #if defined(_VILLAGESERVER) wScheduleID = g_pGuildWarManager->GetScheduleID(); cStep = g_pGuildWarManager->GetStepIndex(); #elif(_GAMESERVER) wScheduleID = g_pMasterConnectionManager->GetGuildWarScheduleID(m_pUserSession->GetWorldSetID()); cStep = g_pMasterConnectionManager->GetGuildWarStepIndex(m_pUserSession->GetWorldSetID()); #endif // #elif(_GAMESERVER) if(wScheduleID <= 0) return false; if(wScheduleID != m_pUserSession->GetGuildSelfView().wWarSchduleID || cStep != GUILDWAR_STEP_TRIAL) return false; const TGuildUID GuildUID = m_pUserSession->GetGuildUID(); if(!GuildUID.IsSet()) return false; return true; } // ±æµå¹Ì¼ÇÀ» ÃʱâÈ­ bool CDNMissionSystem::InitGuildWarMissionList(bool bCheckAchieve) { bool bReset = false; TMissionGroup *pMission = m_pUserSession->GetMissionData(); if(bCheckAchieve) { for( int i=0; iGuildWarMission[i].bAchieve == true || pMission->GuildWarMission[i].nCounter > 0) { bReset = true; // ÃʱâÈ­ ÁøÇà break; } } } else { bReset = true; // ¹Ì¼ÇÀ» »õ·Î ¸¸µç´Ù. } if(!bReset) return false; // ÃʱâÈ­°¡ ¾ÈµÉ °æ¿ì ¹Ì¼Ç ¸®½ºÆ®¸¦ ³Ö¾îÁØ´Ù. memset( pMission->GuildWarMission, 0, sizeof(pMission->GuildWarMission) ); { ScopeLock Lock(m_Lock); for( int i=0; iGetGuildWarMissionData( i ); if( !pData ) continue; if( pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount ) continue; pMission->GuildWarMission[i].nMissionID = pData->nItemID; m_nVecDailyMissionList[GuildWar][pData->AchieveCondition.cEvent].push_back(i); } } m_pUserSession->GetDBConnection()->QuerySetGuildWarMission(m_pUserSession); return true; } bool CDNMissionSystem::OnEvent( EventSystem::EventTypeEnum Event ) { std::vector nVecAchieveList; CheckMissionGain(Event); // ȹµæ üũ CheckMissionAchieve(Event, nVecAchieveList); // ´Þ¼º üũ CheckDailyMissionAchieve(Event); // DailyMission üũ #if defined(PRE_ADD_ACTIVEMISSION) && defined(_GAMESERVER) int nActiveMissionAchieveID = CheckActiveMissionAchieve(Event); // ActiveMission üũ // À̾ȿ¡¼­ OnEvent Àç±Í È£Ãâ½Ã ¼ø¼­¸¦ Àß ÁöÄÑ ÁÖ¼¼¿ä! if( nActiveMissionAchieveID > 0 ) m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnActiveMissionClear, 1, EventSystem::ActiveMissionID, nActiveMissionAchieveID ); #endif // ÀÏ¹Ý Mission ´Þ¼º½Ã OnMissionClear Event ¹ß»ý. if( !nVecAchieveList.empty() ) { for( DWORD i=0; iGetEventSystem()->OnEvent( EventSystem::OnMissionClear, 1, EventSystem::MissionID, nVecAchieveList[i] ); } return true; } bool CDNMissionSystem::CheckMetaMissionAchieveEvent( TMissionData *pData ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); // ¸ÞŸ ¾÷Àû ó¸® ¿ª½Ã and, or ¿¬»êÀ» Áö¿øÇÑ´Ù. if( pData->AchieveCondition.bCheckType == false ) { for( int i=0; i<5; i++ ) { if( pData->AchieveCondition.cType[i] == EventSystem::None ) continue; // Á¶°Ç¿¡ ¾øÀ½À̶ó ÇØµ×À¸¸é ÆÐ½º if( GetBitFlag( pMission->MissionAchieve, pData->AchieveCondition.nParam[i] ) == false ) return false; } return true; } else { for( int i=0; i<5; i++ ) { if( pData->AchieveCondition.cType[i] == EventSystem::None ) continue; if( GetBitFlag( pMission->MissionAchieve, pData->AchieveCondition.nParam[i] ) == true ) return true; } return false; } return false; } void CDNMissionSystem::CheckMissionGain( EventSystem::EventTypeEnum Event ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); bool bMissionGain = false; int nArrayIndex; for( DWORD i=0; iGetMissionData(nArrayIndex); if(!pData) continue; if( m_pUserSession->GetEventSystem()->CheckEventCondition( &pData->GainCondition ) == true ) { SetBitFlag( pMission->MissionGain, nArrayIndex, true ); OnGainMission( nArrayIndex ); // ȹµæ ¼º°øÀÌ¸é ´Þ¼º¸®½ºÆ®¿¡ Ãß°¡ÇØÁà¾ßÇÑ´Ù. m_nVecMissionAchieveList[pData->AchieveCondition.cEvent].push_back(nArrayIndex); m_nVecMissionGainList[Event].erase( m_nVecMissionGainList[Event].begin() + i ); i--; bMissionGain = true; } } if( bMissionGain == true ) m_pUserSession->GetDBConnection()->QueryMissionGain(m_pUserSession); } void CDNMissionSystem::CheckMissionAchieve( EventSystem::EventTypeEnum Event, std::vector &nVecAchieveList ) { int nArrayIndex; TMissionGroup *pMission = m_pUserSession->GetMissionData(); for( DWORD i=0; iGetMissionData(nArrayIndex); if(!pData) continue; bool bAchieve = false; if( pData->nType == MissionType_MetaShow || pData->nType == MissionType_MetaHide ) bAchieve = CheckMetaMissionAchieveEvent( pData ); // ¸ÞŸ¹Ì¼ÇÀ̶ó¸é ´Ù¸¥ ¹æ¹ýÀ¸·Î üũÇÑ´Ù. else bAchieve = m_pUserSession->GetEventSystem()->CheckEventCondition( &pData->AchieveCondition ); if( bAchieve ) { SetBitFlag( pMission->MissionAchieve, nArrayIndex, true ); RequestMissionReward( nArrayIndex ); OnAchieveMission( nArrayIndex ); switch( pData->nType ) { case MissionType_Normal: case MissionType_MetaShow: UpdateLastAchieveList( nArrayIndex ); break; case MissionType_EventPopUp: OnEventPopUp( nArrayIndex ); break; case MissionType_HelpAlarm: OnHelpAlarm( nArrayIndex ); break; case MissionType_MetaHide: case MissionType_Quest: break; } nVecAchieveList.push_back( nArrayIndex + 1 ); m_nVecMissionAchieveList[Event].erase( m_nVecMissionAchieveList[Event].begin() + i ); i--; } } } #if defined(PRE_ADD_ACTIVEMISSION) void CDNMissionSystem::ResetActiveMission() { m_pActiveMission = NULL; m_ActiveMissionState = ActiveMission::NOT_ASSIGNED; } void CDNMissionSystem::SetActiveMission( TActiveMissionData *pData ) { if(!pData) return; m_pActiveMission = pData; m_ActiveMissionState = ActiveMission::GAIN_MISSION; m_pUserSession->SendActiveMissionGain(pData->nIndex); } //¾×Ƽºê ¹Ì¼Ç ´Þ¼º½Ã ÇØ´ç ¹Ì¼Ç ID ¸¦ return ÇÕ´Ï´Ù. int CDNMissionSystem::CheckActiveMissionAchieve( EventSystem::EventTypeEnum Event ) { if(m_ActiveMissionState != ActiveMission::GAIN_MISSION) return 0; if(!m_pActiveMission || m_pActiveMission->AchieveCondition.cEvent != Event ) return 0; if(m_pUserSession->GetEventSystem()->CheckEventCondition( &m_pActiveMission->AchieveCondition )) { m_ActiveMissionState = ActiveMission::COMPLETE_MISSION; m_pUserSession->SendActiveMissionAchieve( m_pActiveMission->nIndex ); if(m_pActiveMission->nMailID > 0){ CDNMailSender::Process(m_pUserSession, m_pActiveMission->nMailID, DBDNWorldDef::PayMethodCode::ActiveMission, m_pActiveMission->nIndex); } return m_pActiveMission->nIndex; } return 0; } #endif //#if defined(PRE_ADD_ACTIVEMISSION) TDailyMission * CDNMissionSystem::GetDailyMission(CDNMissionSystem::DailyMissionTypeEnum iMissionType,int nArrayIndex) { if( nArrayIndex < 0 ) return NULL; TMissionGroup *pMission = m_pUserSession->GetMissionData(); switch(iMissionType) { case CDNMissionSystem::Daily: if( nArrayIndex >= DAILYMISSIONMAX ) return NULL; return &pMission->DailyMission[nArrayIndex]; case CDNMissionSystem::Weekly: if( nArrayIndex >= WEEKLYMISSIONMAX ) return NULL; return &pMission->WeeklyMission[nArrayIndex]; #if defined( PRE_ADD_MONTHLY_MISSION ) case CDNMissionSystem::Monthly: if( nArrayIndex >= MONTHLYMISSIONMAX ) return NULL; return &pMission->MonthlyMission[nArrayIndex]; #endif // #if defined( PRE_ADD_MONTHLY_MISSION ) case CDNMissionSystem::GuildWar: if( nArrayIndex >= GUILDWARMISSIONMAX ) return NULL; return &pMission->GuildWarMission[nArrayIndex]; case CDNMissionSystem::PCBang: if( nArrayIndex >= PCBangMissionMax ) return NULL; return &pMission->PCBangMission[nArrayIndex]; case CDNMissionSystem::GuildCommon: if( nArrayIndex >= GUILDCOMMONMISSIONMAX ) return NULL; return &pMission->GuildCommonMission[nArrayIndex]; case CDNMissionSystem::WeekendEvent: if( nArrayIndex >= WEEKENDEVENTMISSIONMAX ) return NULL; return &pMission->WeekendEventMission[nArrayIndex]; case CDNMissionSystem::WeekendRepeat: if( nArrayIndex >= WEEKENDREPEATMISSIONMAX ) return NULL; return &pMission->WeekendRepeatMission[nArrayIndex]; default: return NULL; } } void CDNMissionSystem::CheckDailyMissionAchieve( EventSystem::EventTypeEnum Event ) { TMissionGroup *pMission = m_pUserSession->GetMissionData(); TDailyMission *pDailyMission; int nArrayIndex; for( int iMissionType = 0 ; iMissionType < DailyMissionTypeEnum_Amount; iMissionType++ ) { if( iMissionType == GuildWar ) //GuildWar ÀÎ °æ¿ì Á¶°Ç üũ { if( !bIsGuildWarMission() ) continue; #if defined( PRE_USA_FATIGUE ) #if defined( _GAMESERVER) if( Event == EventSystem::OnDungeonClear && m_pUserSession->bIsNoFatigueEnter()) { m_pUserSession->SendServerMsg( CHATTYPE_SYSTEM, CEtUIXML::idCategory1, SERVERMSG_INDEX125); continue; } #endif #endif } if( iMissionType == GuildCommon && !m_pUserSession->GetGuildUID().IsSet() ) continue; for( DWORD i=0; iGetDailyMissionData( pDailyMission->nMissionID ); if( !pData ) continue; //ÀÏÀÏ ¹Ì¼Ç ´Þ¼º Á¶°Ç ¸¸Á· if( m_pUserSession->GetEventSystem()->CheckEventCondition(&pData->AchieveCondition) ) pDailyMission->nCounter++; else continue; bool bAchieve = true; switch( pData->cCounterOperator ) { case 0: if( !( pDailyMission->nCounter == pData->nCounterParam ) ) bAchieve = false; break; case 1: if( !( pDailyMission->nCounter != pData->nCounterParam ) ) bAchieve = false; break; case 2: if( !( pDailyMission->nCounter > pData->nCounterParam ) ) bAchieve = false; break; case 3: if( !( pDailyMission->nCounter < pData->nCounterParam ) ) bAchieve = false; break; case 4: if( !( pDailyMission->nCounter >= pData->nCounterParam ) ) bAchieve = false; break; case 5: if( !( pDailyMission->nCounter <= pData->nCounterParam ) ) bAchieve = false; break; } bool bIsRepeatMission = false; if( bAchieve ) //¹Ì¼Ç ´Þ¼º { bool bSecret = false; pDailyMission->bAchieve = true; RequestDailyMissionReward( pDailyMission->nMissionID ); //¹Ýº¹ Ŭ¸®¾î °¡´É ¹Ì¼Ç if( iMissionType == WeekendRepeat || iMissionType == GuildWar || iMissionType == GuildCommon ) { pDailyMission->nCounter = 0; bIsRepeatMission = true; } else //¹Ýº¹ Ŭ¸®¾î°¡ ¾Æ´Ñ°æ¿ì ´Þ¼ºÇÑ ³à¼®Àº »èÁ¦ÇØ ÁØ´Ù. { m_nVecDailyMissionList[iMissionType][Event].erase( m_nVecDailyMissionList[iMissionType][Event].begin() + i ); i--; } //¹Ì¼Ç ŸÀÔº° Ãß°¡ ÀÛ¾÷ if( iMissionType == GuildWar ) { bSecret = AddGuildWarPoint(pDailyMission, Event, pMission, nArrayIndex); } else if( iMissionType == PCBang ) { ApplyPCBangMissionEffect(Event); } else if( iMissionType == GuildCommon ) { AddGuildPoint(pDailyMission); } OnAchieveDailyMission( (CDNMissionSystem::DailyMissionTypeEnum)iMissionType, nArrayIndex, bSecret ); //Daily, Weekly ¹Ì¼Ç Ŭ¸®¾î À̺¥Æ® if( iMissionType == Daily || iMissionType == Weekly ) { if(bIsGuildWarMission()) { //ÇöÀç GuildWar ÁßÀÏ ¶§¸¸ OnDailyMissionClear, OnWeeklyMissionClear ¹Ì¼ÇÀ» ±æµå point ȹµæ ¿ëµµ·Î »ç¿ë Áß(2012-08-14 by stupidfox) EventSystem::EventTypeEnum MissionEvent = (iMissionType == Daily ? EventSystem::OnDailyMissionClear : EventSystem::OnWeeklyMissionClear); OnEvent( MissionEvent ); } } } else { //´Þ¼º Á¶°ÇÀº ¸¸Á·ÇßÁö¸¸ achieve count °¡ ¸ðÀÚ¶õ °æ¿ì count ¸¸ Áõ°¡ OnCounterDailyMission( (CDNMissionSystem::DailyMissionTypeEnum)iMissionType, nArrayIndex, pDailyMission->nCounter ); } // eDailyMissionType ÀÌ DailyMissionTypeEnum °ª°ú 1¾¿ Â÷À̳² => iMissionType+1 m_pUserSession->GetDBConnection()->QueryModDailyWeeklyMission(m_pUserSession, iMissionType+1, nArrayIndex, pDailyMission, bIsRepeatMission); // dbÀúÀå } } } bool CDNMissionSystem::AddGuildWarPoint( TDailyMission * pDailyMission, EventSystem::EventTypeEnum Event, TMissionGroup * pMission, int nArrayIndex ) { // ¿¹¼±Àü Æ÷ÀÎÆ® ´©Àû int nRewardPoint = g_pDataManager->GetDailyMissionRewarePoint(pDailyMission->nMissionID); bool bSecret = false; #if defined(_VILLAGESERVER) if(g_pGuildWarManager->IsSecretMission(m_pUserSession->GetGuildSelfView().cTeamColorCode, pDailyMission->nMissionID)) #elif defined(_GAMESERVER) if(g_pMasterConnectionManager->IsSecretMission(m_pUserSession->GetWorldSetID(), m_pUserSession->GetGuildSelfView().cTeamColorCode, pDailyMission->nMissionID)) #endif { nRewardPoint *= 2; // ½ÃÅ©¸´ ¹ßµ¿»óÅÂÀÏ °æ¿ì 2¹è·Î Æ÷ÀÎÆ® ó¸® bSecret = true; } int nMapSubType = api_Mission_MapSubType(m_pUserSession); if (Event == EventSystem::OnDungeonClear && ( GlobalEnum::MAPSUB_NONE == nMapSubType || GlobalEnum::MAPSUB_TREASURESTAGE == nMapSubType ) ) { int nLevelLimit = static_cast(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_LevelLimit)); if (m_pUserSession->GetLevel() <= nLevelLimit) { nRewardPoint = (int)(nRewardPoint * static_cast(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_Rate))); if (nRewardPoint <= 0) nRewardPoint = 1; } } m_pUserSession->GetDBConnection()->QueryAddGuildWarPoint(m_pUserSession, pDailyMission->nMissionID, nRewardPoint); pMission->nMissionScore++; // ±æµå¹Ì¼ÇÀº 1Á¡¾¿ ¿Ã¸°´Ù. return bSecret; } void CDNMissionSystem::ApplyPCBangMissionEffect( EventSystem::EventTypeEnum Event ) { switch(Event) { case EventSystem::OnPCBang_Fatigue: m_pUserSession->SetDefaultPCBangFatigue(); break; case EventSystem::OnPCBang_RebirthCoin: m_pUserSession->SetDefaultPCBangRebirthCoin(); break; } } void CDNMissionSystem::AddGuildPoint(TDailyMission * pDailyMission) { // ±æµåÆ÷ÀÎÆ® ´©Àû int nRewardPoint = g_pDataManager->GetDailyMissionRewarePoint(pDailyMission->nMissionID); // Á¦ÇÑ·® üũ m_pUserSession->AddGuildPoint(GUILDPOINTTYPE_MISSION, nRewardPoint, pDailyMission->nMissionID); } bool CDNMissionSystem::bIsAchieveMission( const int nItemID ) const { if( 0 == nItemID ) // 1 -> 0 À̰í 0 -> 0 ÀÌ¶ó¼­ ¸ðÈ£¼º Á¦°Å { return false; } DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMISSION ); int nTargetArrayIndex = pSox->GetArrayIndex( nItemID ); TMissionData * pData = g_pDataManager->GetMissionData( nTargetArrayIndex ); if( NULL == pData || false == pData->bActivate ) { return false; } TMissionGroup *pMission = m_pUserSession->GetMissionData(); return GetBitFlag( pMission->MissionAchieve, nTargetArrayIndex ); }