DragonNest/Server/ServerCommon/DNMissionSystem.cpp

1389 lines
45 KiB
C++
Raw Permalink Normal View History

#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; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecMissionGainList[i] );
SAFE_DELETE_VEC( m_nVecMissionAchieveList[i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
// On/Off <20>̼<EFBFBD> <20><><EFBFBD><EFBFBD>.
bool bModifyGain = false;
for( int i=0; i<MISSIONMAX; i++ ) {
#if defined(PRE_MOD_SET_ACHIEVED_MISSION_GAINFLAG)
TMissionData *pData = g_pDataManager->GetMissionData(i);
if( !pData ) continue;
if( GetBitFlag( pMission->MissionAchieve, i ) )
{ //DB <20>󿡼<EFBFBD> Achieve <20><> <20>Ǿ<EFBFBD> <20>ִµ<D6B4> Gain <20><> <20>ȵȳ༮ Gain ó<><C3B3> <20><><EFBFBD>ش<EFBFBD>
if(!GetBitFlag(pMission->MissionGain, i))
{
SetBitFlag(pMission->MissionGain, i, true);
bModifyGain = true;
}
continue; //<2F>޼<EFBFBD><DEBC><EFBFBD> <20><EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
#else
// <20>̹<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( GetBitFlag( pMission->MissionAchieve, i ) ) continue;
TMissionData *pData = g_pDataManager->GetMissionData(i);
if( !pData ) continue;
#endif
// <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> Active <20><> <20>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( !pData->bActivate )
{
// <20>̹<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Active-False<73><65> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD>
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>Ե<EFBFBD> <20><><EFBFBD≯<EFBFBD> <20>ȵǹǷ<C7B9> Gain<69><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.(DB<44><42> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǵ帮<C7B5><E5B8AE> <20>ʴ´<CAB4>.)
if( GetBitFlag( pMission->MissionGain, i ) == true )
SetBitFlag( pMission->MissionGain, i, false );
continue;
}
// ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD> ȹ<><C8B9> <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( pData->GainCondition.cEvent == 0 ) {
if( GetBitFlag( pMission->MissionGain, i ) == false ) {
bModifyGain = true;
SetBitFlag( pMission->MissionGain, i, true );
}
}
// <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȰ<C8B5><C8B0><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>侲.
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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[Daily][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<DAILYMISSIONMAX; i++ ) {
if( pMission->DailyMission[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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[Weekly][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<WEEKLYMISSIONMAX; i++ ) {
if( pMission->WeeklyMission[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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[Monthly][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<MONTHLYMISSIONMAX; i++ ) {
if( pMission->MonthlyMission[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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[WeekendEvent][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<WEEKENDEVENTMISSIONMAX; i++ ) {
if( pMission->WeekendEventMission[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);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD> <20><><EFBFBD><EFBFBD>
void CDNMissionSystem::RefreshGuildWarMissionList()
{
// <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool bCreateMission = true;
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<GUILDWARMISSIONMAX; i++ )
{
if( pMission->GuildWarMission[i].nMissionID > 0 )
{
bCreateMission = false;
break;
}
}
if(bCreateMission)
{
if(InitGuildWarMissionList(false))
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴҰ<C6B4><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8>Ѵ<EFBFBD>.
if(!bIsGuildWarMission())
{
if(InitGuildWarMissionList(true))
return;
}
ScopeLock<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[GuildWar][i] );
}
for( int i=0; i<GUILDWARMISSIONMAX; i++ )
{
if( pMission->GuildWarMission[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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[PCBang][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
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()
{
//<2F><><EFBFBD><EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> Achieve <20>ص<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>ݺ<EFBFBD> Ŭ<><C5AC><EFBFBD><20><><EFBFBD><EFBFBD>
ScopeLock<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[GuildCommon][i] );
}
bool bAddedNewGuildMission = false;
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<GUILDCOMMONMISSIONMAX; i++ ) {
TDailyMissionData *pData = g_pDataManager->GetGuildCommonMissionData( 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<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ ) {
SAFE_DELETE_VEC( m_nVecDailyMissionList[WeekendRepeat][i] );
}
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( int i=0; i<WEEKENDREPEATMISSIONMAX; i++ )
{
if( pMission->WeekendRepeatMission[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; // <20>ϴ<EFBFBD> <20>߱<EFBFBD><DFB1><EFBFBD> <20>̺<EFBFBD>Ʈ <20>˾<EFBFBD><CBBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
#endif
// <20>̺<EFBFBD>Ʈ<EFBFBD>˾<EFBFBD><CBBE><EFBFBD><EFBFBD><EFBFBD>(AchieveList<73><74> <20><><EFBFBD><EFBFBD>)<29><> OnAchieveMission <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
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
//<2F><><EFBFBD><EFBFBD>.....<2E>̷<EFBFBD> <20><><EFBFBD><EFBFBD>... <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>...
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 );
// <20><><EFBFBD><20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>̼ǵ<CCBC> <20><><EFBFBD><EFBFBD>;
m_pUserSession->RefreshPCBangMissionList(); // <20><><EFBFBD>⼭ missionid <20><><EFBFBD><EFBFBD>
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; i<m_nVecMissionGainList[pData->GainCondition.cEvent].size(); i++ ) {
int nArrayIndex = m_nVecMissionGainList[pData->GainCondition.cEvent][i];
if( nArrayIndex == nTargetArrayIndex ) {
SetBitFlag( pMission->MissionGain, nArrayIndex, true );
OnGainMission( nArrayIndex );
// ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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<int> nVecAchieveList;
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( DWORD i=0; i<m_nVecMissionAchieveList[pData->AchieveCondition.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; i<nVecAchieveList.size(); i++ ) {
m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnMissionClear, 1, EventSystem::MissionID, nVecAchieveList[i] );
}
}
void CDNMissionSystem::RequestForceGainDailyMission( int nCount, ... )
{
va_list list;
va_start( list, nCount );
std::vector<int> nVecList;
for( int i=0; i<nCount; i++ ) {
nVecList.push_back( va_arg( list, int ) );
if( nVecList.size() == DAILYMISSIONMAX ) break;
}
va_end( list );
TMissionGroup *pMission = m_pUserSession->GetMissionData();
int nOffset = 0;
memset( pMission->DailyMission, 0, sizeof(pMission->DailyMission) );
for( DWORD i=0; i<nVecList.size(); i++ ) {
TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( 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; i<m_nVecDailyMissionList[Daily][pData->AchieveCondition.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<64><62><EFBFBD><EFBFBD>
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<int> nVecList;
for( int i=0; i<nCount; i++ ) {
nVecList.push_back( va_arg( list, int ) );
if( nVecList.size() == WEEKLYMISSIONMAX ) break;
}
va_end( list );
TMissionGroup *pMission = m_pUserSession->GetMissionData();
int nOffset = 0;
memset( pMission->WeeklyMission, 0, sizeof(pMission->WeeklyMission) );
for( DWORD i=0; i<nVecList.size(); i++ ) {
TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( 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; i<m_nVecDailyMissionList[Weekly][pData->AchieveCondition.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<64><62><EFBFBD><EFBFBD>
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<int> nVecList;
for( int i=0; i<nCount; i++ ) {
nVecList.push_back( va_arg( list, int ) );
if( nVecList.size() == MONTHLYMISSIONMAX ) break;
}
va_end( list );
TMissionGroup *pMission = m_pUserSession->GetMissionData();
int nOffset = 0;
memset( pMission->MonthlyMission, 0, sizeof(pMission->MonthlyMission) );
for( DWORD i=0; i<nVecList.size(); i++ ) {
TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( 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; i<m_nVecDailyMissionList[Monthly][pData->AchieveCondition.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<64><62><EFBFBD><EFBFBD>
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; i<m_nVecDailyMissionList[GuildWar][Event].size(); i++ )
{
nArrayIndex = m_nVecDailyMissionList[GuildWar][Event][i];
pDailyMission = &pMission->GuildWarMission[nArrayIndex];
if( pDailyMission->nMissionID == nItemID )
{
bool bAchieve = true;
bool bSecret = false;
pDailyMission->bAchieve = true;
pDailyMission->nCounter = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>
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; // <20><>ũ<EFBFBD><C5A9><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈó<C6AE><C3B3>
bSecret = true;
}
if (Event == EventSystem::OnDungeonClear && api_Mission_MapSubType(m_pUserSession) == GlobalEnum::MAPSUB_NONE)
{
int nLevelLimit = static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_LevelLimit));
if (m_pUserSession->GetLevel() <= nLevelLimit)
{
nRewardPoint = (int)(nRewardPoint * static_cast<float>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_Rate)));
if (nRewardPoint <= 0)
nRewardPoint = 1;
}
}
m_pUserSession->GetDBConnection()->QueryAddGuildWarPoint(m_pUserSession, pDailyMission->nMissionID, nRewardPoint);
pMission->nMissionScore++; // <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><C3B8><EFBFBD>.
OnAchieveDailyMission( GuildWar, nArrayIndex, bSecret);
m_pUserSession->GetDBConnection()->QueryModGuildWarMission(m_pUserSession, DAILYMISSION_GUILDWAR, nArrayIndex, pDailyMission, bAchieve); // db<64><62><EFBFBD><EFBFBD>
}
}
}
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; i<m_nVecDailyMissionList[GuildCommon][Event].size(); i++ )
{
nArrayIndex = m_nVecDailyMissionList[GuildCommon][Event][i];
pDailyMission = &pMission->GuildCommonMission[nArrayIndex];
if( pDailyMission->nMissionID == nItemID )
{
bool bAchieve = true;
pDailyMission->bAchieve = true;
pDailyMission->nCounter = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
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<64><62><EFBFBD><EFBFBD>
}
}
}
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 ; i<nCount ; ++i )
{
if( pDailyMission[i].nMissionID == nItemID )
return true;
}
return false;
}
bool CDNMissionSystem::bIsCommonMission( const int nItemID )
{
TMissionGroup *pMission = m_pUserSession->GetMissionData();
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;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD> <20>ʱ<EFBFBD>ȭ
bool CDNMissionSystem::InitGuildWarMissionList(bool bCheckAchieve)
{
bool bReset = false;
TMissionGroup *pMission = m_pUserSession->GetMissionData();
if(bCheckAchieve)
{
for( int i=0; i<GUILDWARMISSIONMAX; i++ )
{
if( pMission->GuildWarMission[i].bAchieve == true || pMission->GuildWarMission[i].nCounter > 0)
{
bReset = true; // <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD>
break;
}
}
}
else
{
bReset = true; // <20>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
if(!bReset)
return false; // <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20>ȵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̼<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>־<EFBFBD><D6BE>ش<EFBFBD>.
memset( pMission->GuildWarMission, 0, sizeof(pMission->GuildWarMission) );
{
ScopeLock<CSyncLock> Lock(m_Lock);
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ )
{
SAFE_DELETE_VEC( m_nVecDailyMissionList[GuildWar][i] );
}
int nMissionID = 0;
for( int i=0; i<GUILDWARMISSIONMAX; i++ )
{
TDailyMissionData *pData = g_pDataManager->GetGuildWarMissionData( 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<int> nVecAchieveList;
CheckMissionGain(Event); // ȹ<><C8B9> üũ
CheckMissionAchieve(Event, nVecAchieveList); // <20>޼<EFBFBD> üũ
CheckDailyMissionAchieve(Event); // DailyMission üũ
#if defined(PRE_ADD_ACTIVEMISSION) && defined(_GAMESERVER)
int nActiveMissionAchieveID = CheckActiveMissionAchieve(Event); // ActiveMission üũ
// <20>̾ȿ<CCBE><C8BF><EFBFBD> OnEvent <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>!
if( nActiveMissionAchieveID > 0 )
m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnActiveMissionClear, 1, EventSystem::ActiveMissionID, nActiveMissionAchieveID );
#endif
// <20>Ϲ<EFBFBD> Mission <20>޼<EFBFBD><DEBC><EFBFBD> OnMissionClear Event <20>߻<EFBFBD>.
if( !nVecAchieveList.empty() )
{
for( DWORD i=0; i<nVecAchieveList.size(); i++ )
m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnMissionClear, 1, EventSystem::MissionID, nVecAchieveList[i] );
}
return true;
}
bool CDNMissionSystem::CheckMetaMissionAchieveEvent( TMissionData *pData )
{
TMissionGroup *pMission = m_pUserSession->GetMissionData();
// <20><>Ÿ <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> and, or <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( pData->AchieveCondition.bCheckType == false ) {
for( int i=0; i<5; i++ ) {
if( pData->AchieveCondition.cType[i] == EventSystem::None ) continue; // <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD>
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; i<m_nVecMissionGainList[Event].size(); i++ ) {
nArrayIndex = m_nVecMissionGainList[Event][i];
TMissionData *pData = g_pDataManager->GetMissionData(nArrayIndex);
if(!pData) continue;
if( m_pUserSession->GetEventSystem()->CheckEventCondition( &pData->GainCondition ) == true ) {
SetBitFlag( pMission->MissionGain, nArrayIndex, true );
OnGainMission( nArrayIndex );
// ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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<int> &nVecAchieveList )
{
int nArrayIndex;
TMissionGroup *pMission = m_pUserSession->GetMissionData();
for( DWORD i=0; i<m_nVecMissionAchieveList[Event].size(); i++ ) {
nArrayIndex = m_nVecMissionAchieveList[Event][i];
TMissionData *pData = g_pDataManager->GetMissionData(nArrayIndex);
if(!pData) continue;
bool bAchieve = false;
if( pData->nType == MissionType_MetaShow || pData->nType == MissionType_MetaHide )
bAchieve = CheckMetaMissionAchieveEvent( pData ); // <20><>Ÿ<EFBFBD>̼<EFBFBD><CCBC>̶<EFBFBD><CCB6><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
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);
}
//<2F><>Ƽ<EFBFBD><C6BC> <20>̼<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD> <20>ش<EFBFBD> <20>̼<EFBFBD> ID <20><> return <20>մϴ<D5B4>.
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 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
{
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; i<m_nVecDailyMissionList[iMissionType][Event].size(); i++ ) {
nArrayIndex = m_nVecDailyMissionList[iMissionType][Event][i];
pDailyMission = GetDailyMission((CDNMissionSystem::DailyMissionTypeEnum)iMissionType, nArrayIndex);
if(!pDailyMission)
{
_DANGER_POINT();
continue;
}
TDailyMissionData *pData = g_pDataManager->GetDailyMissionData( pDailyMission->nMissionID );
if( !pData ) continue;
//<2F><><EFBFBD><EFBFBD> <20>̼<EFBFBD> <20>޼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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 ) //<2F>̼<EFBFBD> <20>޼<EFBFBD>
{
bool bSecret = false;
pDailyMission->bAchieve = true;
RequestDailyMissionReward( pDailyMission->nMissionID );
//<2F>ݺ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̼<EFBFBD>
if( iMissionType == WeekendRepeat || iMissionType == GuildWar || iMissionType == GuildCommon )
{
pDailyMission->nCounter = 0;
bIsRepeatMission = true;
}
else //<2F>ݺ<EFBFBD> Ŭ<><C5AC><EFBFBD><20>ƴѰ<C6B4><D1B0><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
{
m_nVecDailyMissionList[iMissionType][Event].erase( m_nVecDailyMissionList[iMissionType][Event].begin() + i );
i--;
}
//<2F>̼<EFBFBD> Ÿ<>Ժ<EFBFBD> <20>߰<EFBFBD> <20>۾<EFBFBD>
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 <20>̼<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ
if( iMissionType == Daily || iMissionType == Weekly )
{
if(bIsGuildWarMission())
{ //<2F><><EFBFBD><EFBFBD> GuildWar <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> OnDailyMissionClear, OnWeeklyMissionClear <20>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD> point ȹ<><C8B9> <20><EFBFBD><EBB5B5> <20><><EFBFBD><EFBFBD> <20><>(2012-08-14 by stupidfox)
EventSystem::EventTypeEnum MissionEvent = (iMissionType == Daily ? EventSystem::OnDailyMissionClear : EventSystem::OnWeeklyMissionClear);
OnEvent( MissionEvent );
}
}
}
else
{ //<2F>޼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> achieve count <20><> <20><><EFBFBD>ڶ<EFBFBD> <20><><EFBFBD><EFBFBD> count <20><> <20><><EFBFBD><EFBFBD>
OnCounterDailyMission( (CDNMissionSystem::DailyMissionTypeEnum)iMissionType, nArrayIndex, pDailyMission->nCounter );
}
// eDailyMissionType <20><> DailyMissionTypeEnum <20><><EFBFBD><EFBFBD> 1<><31> <20><><EFBFBD>̳<EFBFBD> => iMissionType+1
m_pUserSession->GetDBConnection()->QueryModDailyWeeklyMission(m_pUserSession, iMissionType+1, nArrayIndex, pDailyMission, bIsRepeatMission); // db<64><62><EFBFBD><EFBFBD>
}
}
}
bool CDNMissionSystem::AddGuildWarPoint( TDailyMission * pDailyMission, EventSystem::EventTypeEnum Event, TMissionGroup * pMission, int nArrayIndex )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
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; // <20><>ũ<EFBFBD><C5A9> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ó<><C3B3>
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<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_LevelLimit));
if (m_pUserSession->GetLevel() <= nLevelLimit)
{
nRewardPoint = (int)(nRewardPoint * static_cast<float>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::GuildWarMission_Rate)));
if (nRewardPoint <= 0)
nRewardPoint = 1;
}
}
m_pUserSession->GetDBConnection()->QueryAddGuildWarPoint(m_pUserSession, pDailyMission->nMissionID, nRewardPoint);
pMission->nMissionScore++; // <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
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)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
int nRewardPoint = g_pDataManager->GetDailyMissionRewarePoint(pDailyMission->nMissionID);
// <20><><EFBFBD>ѷ<EFBFBD> üũ
m_pUserSession->AddGuildPoint(GUILDPOINTTYPE_MISSION, nRewardPoint, pDailyMission->nMissionID);
}
bool CDNMissionSystem::bIsAchieveMission( const int nItemID ) const
{
if( 0 == nItemID ) // 1 -> 0 <20>̰<EFBFBD> 0 -> 0 <20>̶<EFBFBD><CCB6><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD>
{
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 );
}