DragonNest/Server/ServerCommon/DNUserQuest.cpp

2153 lines
61 KiB
C++
Raw Permalink Normal View History

#include "Stdafx.h"
#include "DNUserQuest.h"
#include "DNUserSendManager.h"
#include "DNQuestManager.h"
#include "DNQuest.h"
#include "DNGameDataManager.h"
#include "DNLogConnection.h"
#include "DNDBConnectionManager.h"
#include "DNUserSession.h"
#include "DNMissionSystem.h"
#include "DNDBConnection.h"
#include "DNQuestCondition.h"
#include "DNPeriodQuestSystem.h"
#if defined( PRE_ADD_STAMPSYSTEM )
#include "DNStampSystem.h"
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined(_VILLAGESERVER)
#include "DNScriptAPI.h"
extern TVillageConfig g_Config;
#elif defined(_GAMESERVER)
#include "DNGameRoom.h"
#include "DNActor.h"
#include "DNGameServerScriptAPI.h"
#endif
CDNUserQuest::CDNUserQuest(CDNUserSession *pSession)
{
m_pSession = pSession;
m_RewardQuestID = 0;
m_RewardCheck = 0;
m_pQuest = pSession->GetQuestData();
memset(&m_PacketReward, 0x00, sizeof(m_PacketReward));
memset(&m_QuestReward, 0, sizeof(m_QuestReward));
}
CDNUserQuest::~CDNUserQuest()
{
#if defined(PRE_ADD_REMOTE_QUEST)
_ResetRemoteQuest();
#endif
}
int CDNUserQuest::AddHuntingQuest(int nQuestID, int nQuestStep, int nJournalStep, int nCountingSlot, int nCountingType, int nCountingIndex, int nTargetCnt)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
if( _FindPlayingQuest(nQuestID) > -1 )
{
#ifndef _FINAL_BUILD
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>Դϴ<D4B4>. : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -2;
}
int nEmptyIdx = _FindEmptyPlayQuestIndex();
if( nEmptyIdx == -1 )
{
#ifndef _FINAL_BUILD
// <20><><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ϸ<EFBFBD><CFB7>ϼ<EFBFBD><CFBC><EFBFBD>. : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -1;
}
int nQuestType = g_pQuestManager->GetQuestType(nQuestID);
if( nQuestType <= QuestType_Min || nQuestType >= QuestType_Max )
{
#ifndef _FINAL_BUILD
// <20><><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -1;
}
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>մϴ<D5B4>.
QuestCondition * pQuestCondition = g_pDataManager->GetQuestCondition( nQuestID );
if( pQuestCondition )
{
if( pQuestCondition->Check( m_pSession ) == false )
{
g_Log.Log(LogType::_QUESTHACK, 0, m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), 0, L"[ADBID:%u, CDBID:%I64d] [AddQuest - ConditionCheck] [QID:%d]\r\n",
m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), nQuestID);
#ifdef _WORK
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ϴ<EFBFBD>");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#else
if( m_pSession->GetAccountLevel() == AccountLevel_QA )
{
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ϴ<EFBFBD>");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
}
else
{
m_pSession->DetachConnection(L"AddQuest - ConditionCheck");
return -1;
}
#endif // #ifdef _WORK
}
}
if( nCountingSlot < 0 || nCountingSlot >= QUEST_EXTRACOUNT_MAX) return -3;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> üũ
if( nCountingType < 1 || nCountingType >= CountingType_Max || nTargetCnt < 1 || nTargetCnt > 31000 || nCountingIndex < 0 ) return -4;
// <20><><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD>
m_pQuest->Quest[nEmptyIdx].nQuestID = nQuestID;
m_pQuest->Quest[nEmptyIdx].cQuestState = QuestState_Playing;
m_pQuest->Quest[nEmptyIdx].nQuestStep = nQuestStep;
m_pQuest->Quest[nEmptyIdx].cQuestJournal = nJournalStep;
TCount* pCount = (TCount*)m_pQuest->Quest[nEmptyIdx].Extra;
pCount[nCountingSlot].cType = nCountingType;
pCount[nCountingSlot].nIndex = nCountingIndex;
pCount[nCountingSlot].nCnt = 0;
pCount[nCountingSlot].nTargetCnt = nTargetCnt;
CDNUserItem *pItem = m_pSession->GetItem();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>
if( nCountingType == CountingType_Item && pItem )
{
// <20>̹<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
int nIdx = pItem->GetInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
OnAddItem(nCountingIndex, nIdx);
// Ȥ<><C8A4> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
OnAddItem(nCountingIndex,nIdx );
}
#ifndef _FINAL_BUILD
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID);
m_pSession->GetDBConnection()->QueryAddQuest( m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestGain, 1, EventSystem::QuestID, nQuestID );
return 1;
}
int CDNUserQuest::AddQuest(int nQuestID, bool bSendErrorMsg/*=false*/)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
if(IsClearQuest(nQuestID)) {
g_Log.Log(LogType::_QUESTHACK, 0, m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), 0, L"[ADBID:%u, CDBID:%I64d] [AddQuest - IsClearQuest] [QID:%d]\r\n",
m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), nQuestID
);
m_pSession->DetachConnection(L"AddQuest - IsClearQuest");
return -1;
}
if( _FindPlayingQuest(nQuestID) > -1 )
{
#ifndef _FINAL_BUILD
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>Դϴ<D4B4>. : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
#if defined(PRE_ADD_REMOTE_QUEST)
if(bSendErrorMsg)
m_pSession->SendQuestResult(ERROR_QUEST_ALREADY_PLAYING);
#endif
return -2;
}
int nEmptyIdx = _FindEmptyPlayQuestIndex();
if( nEmptyIdx == -1 )
{
#ifndef _FINAL_BUILD
// <20><><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ϸ<EFBFBD><CFB7>ϼ<EFBFBD><CFBC><EFBFBD>. : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
#if defined(PRE_ADD_REMOTE_QUEST)
if(bSendErrorMsg)
m_pSession->SendQuestResult(ERROR_QUEST_FULLOFCOUNT_PLAYING);
#endif
return -1;
}
int nQuestType = g_pQuestManager->GetQuestType(nQuestID);
if( nQuestType <= QuestType_Min || nQuestType >= QuestType_Max )
{
#ifndef _FINAL_BUILD
// <20><><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -1;
}
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><CBBB>մϴ<D5B4>.
QuestCondition * pQuestCondition = g_pDataManager->GetQuestCondition( nQuestID );
if( pQuestCondition )
{
if( pQuestCondition->Check( m_pSession ) == false )
{
g_Log.Log(LogType::_QUESTHACK, 0, m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), 0, L"[ADBID:%u, CDBID:%I64d] [AddQuest - ConditionCheck] [QID:%d]\r\n",
m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), nQuestID);
#ifdef _WORK
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ϴ<EFBFBD>");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#else
if( m_pSession->GetAccountLevel() == AccountLevel_QA )
{
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ϴ<EFBFBD>");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
}
else
{
m_pSession->DetachConnection(L"AddQuest - ConditionCheck");
return -1;
}
#endif // #ifdef _WORK
}
}
// <20><><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD>
m_pQuest->Quest[nEmptyIdx].nQuestID = nQuestID;
m_pQuest->Quest[nEmptyIdx].cQuestState = QuestState_Playing;
#if defined(PRE_ADD_REMOTE_QUEST)
RemoveRemoteQuestFromAcceptWaitList(nQuestID);
#endif
#ifndef _FINAL_BUILD
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID);
m_pSession->GetDBConnection()->QueryAddQuest(m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestGain, 1, EventSystem::QuestID, nQuestID );
return 1;
}
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!(<28>Ϻ<EFBFBD> <20><><EFBFBD><EFBFBD> ForceCompleteQuest<73><74> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.)
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҽ<EFBFBD> <20><><EFBFBD>ô<EFBFBD> <20>п<EFBFBD><D0BF>Դ<EFBFBD> <20>˼<EFBFBD>!
// 0. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ó<><C3B3>
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD>
// 2. <20><><EFBFBD><EFBFBD>Ʈ <20>˻<EFBFBD>
// 3. <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><>ŷ
// 4. <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
int CDNUserQuest::RewardAfterCompletingQuest(int nQuestID, bool bDelPlayList)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE)
{
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
// <20>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> LUA<55><41>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QuestTable <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7>Ѵ<EFBFBD>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(nQuestID);
if(!pQuest)
{
m_pSession->SendQuestResult(ERROR_QUEST_NOTFOUND);
return -2;
}
bool bRepeat = (pQuest->GetQuestInfo().cRepeatable == 1) ? true : false;
//--------------------------------------------------------------------------------------------------------------------------
// 0. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈó<C6AE><C3B3>(<28><>ŷ-><3E>Ϸ<EFBFBD>)
if(m_RewardQuestID == 0 && m_PacketReward.nIndex == 0 )
{
// <20>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if(bRepeat == false)
MarkingCompleteQuest(nQuestID);
return CompleteQuest(nQuestID, bDelPlayList, bRepeat);
}
//--------------------------------------------------------------------------------------------------------------------------
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>˻<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>API<50><49><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴº<CFB4><C2BA><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>Ѵ<EFBFBD>)
#if defined(PRE_FIX_QUEST_GUILD_BOARD)
if( m_PacketReward.nIndex != m_QuestReward.nIndex || m_QuestReward.nQuestID != nQuestID )
#else
if( m_PacketReward.nIndex != m_QuestReward.nIndex )
#endif
{
m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL);
return -1;
}
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(0 != m_QuestReward.nCoin && !m_pSession->CheckMaxCoin(m_QuestReward.nCoin))
{
m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL);
return -1;
}
int nResult = CheckInvenForQuestReward(m_pSession, m_QuestReward, m_PacketReward.SelectArray);
if (nResult < 1)
return -1;
//--------------------------------------------------------------------------------------------------------------------------
// 2. <20><><EFBFBD><EFBFBD>Ʈ <20>˻<EFBFBD>
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot == -1 || nSlot >= MAX_PLAY_QUEST )
{
m_pSession->SendQuestResult(ERROR_QUEST_NOTFOUND);
return -2;
}
#if defined(PRE_FIX_QUEST_GUILD_BOARD)
// <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( GetQuestStep(nQuestID) != m_QuestReward.nQuestStep )
{
m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL);
return -1;
}
#endif
//--------------------------------------------------------------------------------------------------------------------------
// 3. <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>ŷ
std::wstring wszMsg;
// <20>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if(bRepeat == false)
MarkingCompleteQuest(nQuestID);
//--------------------------------------------------------------------------------------------------------------------------
// 4. <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
CompleteQuest(nQuestID, bDelPlayList, bRepeat);
//--------------------------------------------------------------------------------------------------------------------------
// 5. <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
OnSelectRewardEx(m_PacketReward.SelectArray, m_PacketReward.SelectCashArray);
return 1;
}
void CDNUserQuest::ResetRewardFlag()
{
m_RewardQuestID = 0;
m_RewardCheck = 0;
memset(&m_PacketReward, 0x00, sizeof(m_PacketReward));
#if defined(PRE_FIX_QUEST_GUILD_BOARD)
memset(&m_QuestReward, 0, sizeof(m_QuestReward));
#endif
}
int CDNUserQuest::CompleteQuest(int nQuestID, bool bDelPlayList, bool bRepeat)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot == -1 || nSlot >= MAX_PLAY_QUEST )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ƴ<EFBFBD>
return -2;
}
#ifndef _FINAL_BUILD
// <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>Ų<EFBFBD><C5B2>
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD>
if( bDelPlayList )
{
_RemoveQuest(nQuestID, true, bRepeat);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
m_pSession->SendCompleteQuest(true, nSlot, nQuestID, false);
#if defined( PRE_ADD_STAMPSYSTEM )
m_pSession->GetStampSystem()->OnCompleteQuest( nQuestID );
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
return 1;
}
m_pSession->SendCompleteQuest(false, nSlot, nQuestID, false);
#if defined( PRE_ADD_STAMPSYSTEM )
m_pSession->GetStampSystem()->OnCompleteQuest( nQuestID );
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
return 1;
}
int CDNUserQuest::MarkingCompleteQuest(int nQuestID)
{
/////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>Դϴ<D4B4>. <20><>ũ<EFBFBD><C5A9>Ʈ <20>ܿ<EFBFBD><DCBF><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(nQuestID);
if(!pQuest)
{
ASSERT(0);
return -2;
}
if(pQuest->GetQuestInfo().cRepeatable == 1)
return 1;
/////////////////////////////////////////////////////////////////
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot == -1 || nSlot >= MAX_PLAY_QUEST )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ƴ<EFBFBD>
return -2;
}
#ifndef _FINAL_BUILD
// <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>Ų<EFBFBD><C5B2>
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>ŷ!: %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// <20><><EFBFBD><20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
SetCompleteQuestFlag(nQuestID, true);
if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID))
AddCompletedPeriodQuest(nQuestID);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
m_pSession->SendMarkingCompleteQuest(nQuestID);
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestClear, 1, EventSystem::QuestID, nQuestID );
return 1;
}
int CDNUserQuest::ForceCompleteQuest(int nQuestID, int nQuestCode, int bDoMark, int bDoDelete, int bDoRepeat)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>δ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(bDoMark) {
#ifndef _FINAL_BUILD
// <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>Ų<EFBFBD><C5B2>
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><>ŷ!: %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// <20><><EFBFBD><20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
SetCompleteQuestFlag(nQuestID, true);
if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID))
AddCompletedPeriodQuest(nQuestID);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
m_pSession->SendMarkingCompleteQuest(nQuestID);
}
int nSlot = _FindPlayingQuest(nQuestID);
if(0 <= nSlot)
{
int nResult = CompleteQuest(nQuestID, ((bDoDelete)?(true):(false)), ((bDoRepeat)?(true):(false)));
if( nResult < 0 ) {
#ifndef _FINAL_BUILD
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ϸῡ <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
#endif // _FINAL_BUILD
return -3;
}
}
else {
m_pSession->GetDBConnection()->QueryForceCompleteQuest(m_pSession, nQuestID, nQuestCode, GetQuestCompleteBinary());
// m_pSession->SendCompleteQuest(true, nSlot, nQuestID, false); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>̹Ƿ<CCB9> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʺ<EFBFBD><CABA><EFBFBD><EFBFBD><EFBFBD> <20><> ???
}
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestClear, 1, EventSystem::QuestID, nQuestID );
return 1;
}
int CDNUserQuest::GetPlayingQuestCount()
{
int nCnt = 0;
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
#if defined(PRE_ADD_REMOTE_QUEST)
if( m_pQuest->Quest[i].nQuestID > 0 && m_pQuest->Quest[i].cQuestState >= QuestState_Playing )
#else
if( m_pQuest->Quest[i].nQuestID > 0 && m_pQuest->Quest[i].cQuestState == QuestState_Playing )
#endif
{
nCnt++;
}
}
return nCnt;
}
short CDNUserQuest::HasQuest(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
return m_pQuest->Quest[nSlot].nQuestStep;
}
int CDNUserQuest::_RemoveQuest(int nQuestID, bool bComplete, bool bRepeat)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
//---------------------------------------------------------------------------------------------
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>
std::set<int> questItemSet;
g_pDataManager->GetQuestItemSet(nQuestID, questItemSet);
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20>ɺ<EFBFBD><C9BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::set<int>::iterator it = questItemSet.begin();
for( it ; it != questItemSet.end() ; it++ )
{
int nQuestItemIndex = *it;
#if defined(_VILLAGESERVER)
int nCount = api_quest_HasQuestItem(nUserID, nQuestItemIndex, 1);
#elif defined(_GAMESERVER)
int nCount = api_quest_HasQuestItem(m_pSession->GetGameRoom(), nUserID, nQuestItemIndex, 1);
#endif // _VILLAGESERVER
if( nCount > 0 )
{
#if defined(_VILLAGESERVER)
int nReturn = api_quest_DelQuestItem(nUserID, nQuestItemIndex, nCount, nQuestID);
#elif defined(_GAMESERVER)
int nReturn = api_quest_DelQuestItem(m_pSession->GetGameRoom(), nUserID, nQuestItemIndex, nCount, nQuestID);
#endif // _VILLAGESERVER
//if(nReturn < 0 ) return nReturn;
}
// 0 <20><><EFBFBD><EFBFBD> <20>۴ٸ<DBB4> <20><><EFBFBD><EFBFBD>.
//else return nCount;
}
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
m_pQuest->Quest[nSlot].nQuestID = 0;
m_pQuest->Quest[nSlot].cQuestState = QuestState_None;
ZeroMemory( &(m_pQuest->Quest[nSlot]), sizeof(TQuest));
m_pSession->GetDBConnection()->QueryDelQuest( m_pSession, nSlot, nQuestID, bComplete, bRepeat, m_pQuest->CompleteQuest);
if(bComplete)
{
int nScheduleID = -1;
__time64_t tExpireDate = 0;
if(g_pPeriodQuestSystem->FindEventScheduleID(nQuestID, nScheduleID, tExpireDate) && nScheduleID > 0 && tExpireDate > 0)
m_pSession->GetDBConnection()->QueryCompleteEventQuest(m_pSession, nScheduleID, tExpireDate);
}
#ifndef _FINAL_BUILD
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return nSlot;
}
int CDNUserQuest::_FindPlayingQuest(int nQuestID)
{
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
#if defined(PRE_ADD_REMOTE_QUEST)
if( m_pQuest->Quest[i].nQuestID == nQuestID && m_pQuest->Quest[i].cQuestState >= QuestState_Playing )
#else
if( m_pQuest->Quest[i].nQuestID == nQuestID && m_pQuest->Quest[i].cQuestState == QuestState_Playing )
#endif
return i;
}
return -1;
}
int CDNUserQuest::_FindEmptyPlayQuestIndex()
{
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
if( m_pQuest->Quest[i].nQuestID < 1 )
return i;
}
return -1;
}
int CDNUserQuest::SetQuestStepAndJournalStep(int nQuestID, short nQuestStep, int nJournalStep, bool bFromScript)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 ) // <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -1;
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>..
m_pQuest->Quest[nSlot].nQuestStep = nQuestStep;
m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep;
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d step: %d, journal: %d" , nQuestID, (int)nQuestStep, (int)nJournalStep );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_STEPANDJOURNAL, nQuestID);
#if defined( PRE_ADD_REMOTE_QUEST )
CDNQuest * pQuest = g_pQuestManager->GetQuest( nQuestID );
if( bFromScript && pQuest && QuestType_RemoteQuest == pQuest->GetQuestInfo().cQuestType && pQuest->GetQuestInfo().bCheckRemoteComplete )
{
#if defined(_VILLAGESERVER)
if( pQuest->CanRemoteCompleteStep( m_pSession->GetObjectID(), nQuestStep ) )
#elif defined(_GAMESERVER)
if( pQuest->CanRemoteCompleteStep( m_pSession->GetGameRoom(), m_pSession->GetSessionID(), nQuestStep ) )
#endif // _VILLAGESERVER
{
m_pQuest->Quest[nSlot].cQuestState = QuestState_Recompense;
m_pSession->SendCompleteRemoteQuest( nQuestID );
}
}
#endif // #if defined( PRE_ADD_REMOTE_QUEST )
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 100128
return 1;
}
int CDNUserQuest::SetQuestStep(int nQuestID, short nQuestStep)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -1;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>..
m_pQuest->Quest[nSlot].nQuestStep = nQuestStep;
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d step: %d" , nQuestID, (int)nQuestStep );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_STEP, nQuestID);
#if defined( PRE_ADD_REMOTE_QUEST )
CDNQuest * pQuest = g_pQuestManager->GetQuest( nQuestID );
if( pQuest && QuestType_RemoteQuest == pQuest->GetQuestInfo().cQuestType && pQuest->GetQuestInfo().bCheckRemoteComplete )
{
#if defined(_VILLAGESERVER)
if( pQuest->CanRemoteCompleteStep( m_pSession->GetObjectID(), nQuestStep ) )
#elif defined(_GAMESERVER)
if( pQuest->CanRemoteCompleteStep( m_pSession->GetGameRoom(), m_pSession->GetSessionID(), nQuestStep ) )
#endif // _VILLAGESERVER
{
m_pQuest->Quest[nSlot].cQuestState = QuestState_Recompense;
m_pSession->SendCompleteRemoteQuest( nQuestID );
}
}
#endif // #if defined( PRE_ADD_REMOTE_QUEST )
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 100128
return 1;
}
short CDNUserQuest::GetQuestStep(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>..
return m_pQuest->Quest[nSlot].nQuestStep;
}
int CDNUserQuest::SetJournalStep(int nQuestID, int nJournalStep)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -1;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>..
m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep;
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d step: %d" , nQuestID, (int)nJournalStep );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_JOURNAL, nQuestID);
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 100128
return 1;
}
int CDNUserQuest::GetJournalStep(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>..
return m_pQuest->Quest[nSlot].cQuestJournal;
}
int CDNUserQuest::SetQuestMemo(int nQuestID, char nMemoIndex, TP_QUESTMEMO nVal)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) {
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
DN_RETURN(-3);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DN_RETURN(-2);
}
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD>
m_pQuest->Quest[nSlot].nMemo[nMemoIndex] = nVal;
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD> : %d Memo: %d / %d" , nQuestID, (int)nMemoIndex, nVal );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
m_pSession->GetDBConnection()->QueryModQuest( m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 20100128
return 1;
}
TP_QUESTMEMO CDNUserQuest::GetQuestMemo(int nQuestID, char nMemoIndex)
{
if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) {
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
DN_RETURN(-3);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DN_RETURN(-2);
}
return(m_pQuest->Quest[nSlot].nMemo[nMemoIndex]);
}
int CDNUserQuest::IncQuestMemo(int nQuestID, char nMemoIndex)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return LONG_MIN;
}
#endif
if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) {
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
DN_RETURN(LONG_MIN);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DN_RETURN(LONG_MIN);
}
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD>
TP_QUESTMEMO nRetVal = ++m_pQuest->Quest[nSlot].nMemo[nMemoIndex];
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD> : %d Memo: %d / %d" , nQuestID, (int)nMemoIndex, nRetVal);
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 20100128
return nRetVal;
}
int CDNUserQuest::DecQuestMemo(int nQuestID, char nMemoIndex)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return LONG_MAX;
}
#endif
if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) {
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
DN_RETURN(LONG_MAX);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DN_RETURN(LONG_MAX);
}
// <20><><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD>
TP_QUESTMEMO nRetVal = --m_pQuest->Quest[nSlot].nMemo[nMemoIndex];
#ifndef _FINAL_BUILD
// <20>̰<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>׵<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5>ٵ<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>޸<EFBFBD> <20><><EFBFBD><EFBFBD> : %d Memo: %d / %d" , nQuestID, (int)nMemoIndex, nRetVal);
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 20100128
return nRetVal;
}
int CDNUserQuest::SetCountingInfo(int nQuestID, int nCountingSlot, int nCountingType, int nCountingIndex, int nTargetCnt)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
if( nCountingSlot < 0 || nCountingSlot >= QUEST_EXTRACOUNT_MAX)
{
return -3;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> üũ
if( nCountingType < 1 || nCountingType >= CountingType_Max || nTargetCnt < 1 || nTargetCnt > 31000 || nCountingIndex < 0 )
{
return -4;
}
TCount* pCount = (TCount*)m_pQuest->Quest[nSlot].Extra;
pCount[nCountingSlot].cType = nCountingType;
pCount[nCountingSlot].nIndex = nCountingIndex;
pCount[nCountingSlot].nCnt = 0;
pCount[nCountingSlot].nTargetCnt = nTargetCnt;
CDNUserItem* pItem = NULL;
m_pSession->GetDBConnection()->QueryModQuest( m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 20100128
pItem = m_pSession->GetItem();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>
if( nCountingType == CountingType_Item && pItem )
{
// <20>̹<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
int nIdx = pItem->GetInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
{
OnAddItem(nCountingIndex, nIdx);
}
// Ȥ<><C8A4> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
{
OnAddItem(nCountingIndex,nIdx );
}
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID);
return 1;
}
int CDNUserQuest::ClearCountingInfo(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
ZeroMemory( &(m_pQuest->Quest[nSlot].Extra), ExtraSize);
m_pSession->GetDBConnection()->QueryModQuest( m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 20100128
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID);
return 1;
}
int CDNUserQuest::IsAllCompleteCounting(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
if( m_pQuest->Quest[nSlot].cQuestState == QuestState_Playing )
{
bool CompleteAllCounting = false;
TCount* pCount = (TCount*)m_pQuest->Quest[nSlot].Extra;
for( int j = 0 ; j < QUEST_EXTRACOUNT_MAX ; j++ )
{
if( pCount[j].cType != CountingType_None && pCount[j].cType != CountingType_Max )
{
// <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5> <20><> <20><>ä<EFBFBD><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( pCount[j].nCnt < pCount[j].nTargetCnt )
{
return -3;
}
else if( pCount[j].nCnt == pCount[j].nTargetCnt )
{
CompleteAllCounting = true;
}
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( CompleteAllCounting )
{
return 1;
}
}
return -3;
}
#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
void CDNUserQuest::OnCounting(int nCountingType, int nCountItemID, int nItemCount)
#else
void CDNUserQuest::OnCounting(int nCountingType, int nCountItemID)
#endif // #if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
//m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return;
}
#endif
// P.S.> <20><> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ <20><> <20>Ʒ<EFBFBD><C6B7>κп<CEBA> TQuest::Extra <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><>ƾ <20>߰<EFBFBD><DFB0><EFBFBD> return <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool bCounting[MAX_PLAY_QUEST] = {0,};
bool bComplete[MAX_PLAY_QUEST] = {0,};
bool bModifyQuestExtra[MAX_PLAY_QUEST] = { false, };
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
if( m_pQuest->Quest[i].cQuestState == QuestState_Playing )
{
TCount* pCount = (TCount*)m_pQuest->Quest[i].Extra;
for( int j = 0 ; j < QUEST_EXTRACOUNT_MAX ; j++ )
{
// ī<><C4AB><EFBFBD><EFBFBD> <20><> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̰<EFBFBD>
bool bNeedContinue = false;
bool bNeedCount = true;
// ī<><C4AB><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> ī<><C4AB><EFBFBD><EFBFBD> <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD><EFBFBD>.
if( pCount[j].cType == CountingType_MyMonsterKill && nCountingType == CountingType_MyMonsterKill )
{
bNeedContinue = false;
}
// <20><>ü ī<><C4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD>( <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
else if( pCount[j].cType == CountingType_AllMonsterKill && nCountingType == CountingType_AllMonsterKill )
{
bNeedContinue = false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if( pCount[j].cType == CountingType_Item && nCountingType == CountingType_Item )
{
bNeedContinue = false;
}
/*
// <20>ɺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if( pCount[j].cType == CountingType_SymbolItem && nCountingType == CountingType_SymbolItem )
{
bNeedContinue = false;
}
*/
else if( pCount[j].cType == CountingType_StageClear && nCountingType == CountingType_StageClear )
{
bNeedContinue = false;
bNeedCount = false;
}
// <20>׿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
else
{
bNeedContinue = true;
}
if( bNeedContinue )
continue;
//<2F><> <20>ε<EFBFBD><CEB5><EFBFBD> <20>϶<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
if( pCount[j].nIndex == nCountItemID )
{
#if defined( PRE_MOD_QUEST_COUNTING )
if( pCount[j].nCnt < pCount[j].nTargetCnt ) // ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̰<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD> ǥ<><C7A5><EFBFBD>ȴ<EFBFBD>.
#else // #if defined( PRE_MOD_QUEST_COUNTING )
// OnCounting<6E><67> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
#endif // #if defined( PRE_MOD_QUEST_COUNTING )
{
bCounting[i] = true;
if(bNeedCount)
{
#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
if( nCountingType == CountingType_Item && nItemCount > 0) // Ȥ<><C8A4> <20>𸣴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> üũ<C3BC>մϴ<D5B4>.
pCount[j].nCnt += nItemCount;
else
#endif //#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
++pCount[j].nCnt;
bModifyQuestExtra[i] = true;
}
// <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(m_pQuest->Quest[i].nQuestID);
if( pQuest )
{
#if defined(_VILLAGESERVER)
pQuest->OnCounting(GetUserObjID(), pCount[j]);
#elif defined(_GAMESERVER)
pQuest->OnCounting(m_pSession->GetGameRoom(), GetUserObjID(), pCount[j]);
#endif // _VILLAGESERVER
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COUNTING, m_pQuest->Quest[i].nQuestID);
}
}
#if defined ( PRE_MOD_QUEST_COUNTING )
if( pCount[j].nCnt >= pCount[j].nTargetCnt && true == bCounting[i] ) // OnCounting<6E><67> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
#else // #if defined( PRE_MOD_QUEST_COUNTING )
if( pCount[j].nCnt >= pCount[j].nTargetCnt )
#endif // #if defined( PRE_MOD_QUEST_COUNTING )
{
bCounting[i] = true;
bComplete[i] = true;
// <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(m_pQuest->Quest[i].nQuestID);
if( pQuest )
{
#if defined(_VILLAGESERVER)
pQuest->OnCompleteCounting(GetUserObjID(), pCount[j] );
#elif defined(_GAMESERVER)
pQuest->OnCompleteCounting(m_pSession->GetGameRoom(), GetUserObjID(), pCount[j] );
#endif // _VILLAGESERVER
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COMPLETECOUNTING, m_pQuest->Quest[i].nQuestID);
}
}
}
}
}
}
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
if( bComplete[i] && bCounting[i] &&
IsAllCompleteCounting(m_pQuest->Quest[i].nQuestID) > 0 )
{
// <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(m_pQuest->Quest[i].nQuestID);
if( pQuest )
{
#if defined(_VILLAGESERVER)
pQuest->OnAllCompleteCounting(GetUserObjID());
#elif defined(_GAMESERVER)
pQuest->OnAllCompleteCounting(m_pSession->GetGameRoom(), GetUserObjID());
#endif // _VILLAGESERVER
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_ALLCOMPLETECOUNTING, m_pQuest->Quest[i].nQuestID);
}
}
}
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ ) {
if(bModifyQuestExtra[i]) {
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, i, m_pQuest->Quest[i], DBDNWorldDef::QuestStatusCode::Progress); // db<64><62><EFBFBD><EFBFBD> 100128
}
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD><EFBFBD>.
void CDNUserQuest::OnKillMonster(int nMonsterID)
{
OnCounting(CountingType_MyMonsterKill, nMonsterID);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD>.
void CDNUserQuest::OnDieMonster(int nMonsterID)
{
OnCounting(CountingType_AllMonsterKill, nMonsterID);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void CDNUserQuest::OnAddItem(int nItemID, short wCount)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return ;
}
#endif
#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
OnCounting(CountingType_Item, nItemID, wCount);
#else
for( short i = 0 ; i < wCount ; i++ )
{
OnCounting(CountingType_Item, nItemID);
}
#endif // #if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void CDNUserQuest::OnAddSymbolItem(int nItemID)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return ;
}
#endif
OnCounting(CountingType_SymbolItem, nItemID);
}
void CDNUserQuest::OnAddQuestItem(int nItemID)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return ;
}
#endif
OnCounting(CountingType_Item, nItemID);
}
void CDNUserQuest::OnStageClear(int nRank)
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return ;
}
#endif
OnCounting(CountingType_StageClear, nRank);
}
UINT CDNUserQuest::GetUserObjID()
{
#if defined(_VILLAGESERVER)
return m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
return m_pSession->GetSessionID();
#endif
}
bool CDNUserQuest::IsClearQuest(int nQuestID)
{
if( nQuestID < 0 || nQuestID >= MAX_QUEST_INDEX )
return false;
int nIndex = nQuestID / 8;
int nMaskType = nQuestID % 8;
char Result = 0;
switch(nMaskType)
{
case 1: Result = m_pQuest->CompleteQuest[nIndex] & 0x80; break;
case 2: Result = m_pQuest->CompleteQuest[nIndex] & 0x40; break;
case 3: Result = m_pQuest->CompleteQuest[nIndex] & 0x20; break;
case 4: Result = m_pQuest->CompleteQuest[nIndex] & 0x10; break;
case 5: Result = m_pQuest->CompleteQuest[nIndex] & 0x08; break;
case 6: Result = m_pQuest->CompleteQuest[nIndex] & 0x04; break;
case 7: Result = m_pQuest->CompleteQuest[nIndex] & 0x02; break;
case 0: Result = m_pQuest->CompleteQuest[nIndex] & 0x01; break;
}
if(Result == 0x00) return false;
return true;
}
void CDNUserQuest::SetCompleteQuestFlag(int nQuestID, bool bFlag)
{
int nIndex = nQuestID / 8;
int nMaskType = nQuestID % 8;
if(nIndex >= COMPLETEQUEST_BITSIZE) return;
if( bFlag )
{
switch(nMaskType)
{
case 1: m_pQuest->CompleteQuest[nIndex] |= 0x80; break;
case 2: m_pQuest->CompleteQuest[nIndex] |= 0x40; break;
case 3: m_pQuest->CompleteQuest[nIndex] |= 0x20; break;
case 4: m_pQuest->CompleteQuest[nIndex] |= 0x10; break;
case 5: m_pQuest->CompleteQuest[nIndex] |= 0x08; break;
case 6: m_pQuest->CompleteQuest[nIndex] |= 0x04; break;
case 7: m_pQuest->CompleteQuest[nIndex] |= 0x02; break;
case 0: m_pQuest->CompleteQuest[nIndex] |= 0x01; break;
}
}
else
{
switch(nMaskType)
{
case 1: m_pQuest->CompleteQuest[nIndex] &= ~0x80; break;
case 2: m_pQuest->CompleteQuest[nIndex] &= ~0x40; break;
case 3: m_pQuest->CompleteQuest[nIndex] &= ~0x20; break;
case 4: m_pQuest->CompleteQuest[nIndex] &= ~0x10; break;
case 5: m_pQuest->CompleteQuest[nIndex] &= ~0x08; break;
case 6: m_pQuest->CompleteQuest[nIndex] &= ~0x04; break;
case 7: m_pQuest->CompleteQuest[nIndex] &= ~0x02; break;
case 0: m_pQuest->CompleteQuest[nIndex] &= ~0x01; break;
}
}
}
// <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int CDNUserQuest::SendQuestRefresh(int nRefreshType, int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 || nSlot > MAX_PLAY_QUEST )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
return -2;
}
m_pSession->SendQuestRefresh((char)nSlot, nRefreshType, nQuestID, m_pQuest->Quest[nSlot] );
return 1;
}
void CDNUserQuest::SendAllQuestRefresh()
{
m_pSession->SendQuestInfo(m_pSession->GetQuestData());
m_pSession->SendQuestCompleteInfo(*m_pQuest);
}
void CDNUserQuest::ClearAllQuestInfo()
{
DN_ASSERT(NULL != m_pQuest, "Invalid!");
::memset(m_pQuest->Quest, 0, sizeof(m_pQuest->Quest));
::memset(m_pQuest->CompleteQuest, 0, sizeof(m_pQuest->CompleteQuest));
m_pSession->GetDBConnection()->QueryClearQuest(m_pSession);
}
void CDNUserQuest::DumpQuest(std::vector<TQuest>& output)
{
for (int i = 0; i < MAX_PLAY_QUEST; i++)
{
if(m_pQuest->Quest[i].nQuestID > 0 )
{
output.push_back(m_pQuest->Quest[i]);
}
}
}
int CDNUserQuest::FindPlayingQuest(int nQuestID)
{
DN_ASSERT(0 != nQuestID, "Invalid!");
return _FindPlayingQuest(nQuestID);
}
#if defined(PRE_ADD_REMOTE_QUEST)
int CDNUserQuest::FindRecompenseQuestIndex(int nQuestID)
{
DN_ASSERT(0 != nQuestID, "Invalid!");
return _FindRecompenseQuestIndex(nQuestID);
}
bool CDNUserQuest::SetQuestToRecompenseState(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 ) return false;
if( m_pQuest->Quest[nSlot].nQuestID != nQuestID ) return false;
m_pQuest->Quest[nSlot].cQuestState = QuestState_Recompense;
//SendQuestRefresh(RefreshType::REFRESH_STEPANDJOURNAL, nQuestID);
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress);
return true;
}
#endif
void CDNUserQuest::OnSetActiveQuest(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
m_pSession->SendQuestResult(ERROR_QUEST_SETACTIVEFAIL);
return;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>. return QuestID; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1
TQuest CDNUserQuest::_FindHighestQStepSubQuest()
{
TQuest FoundQuest;
ZeroMemory(&FoundQuest, sizeof(TQuest));
int nQuest = -1;
int nMaxQuestStep = -1;
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>̰<EFBFBD>,
if( m_pQuest->Quest[i].nQuestID > 0
&& g_pQuestManager->GetQuestType(m_pQuest->Quest[i].nQuestID) == QuestType_SubQuest
&& m_pQuest->Quest[i].nQuestStep > 0
== false )
{
if( nMaxQuestStep <= m_pQuest->Quest[i].nQuestStep )
{
nQuest = m_pQuest->Quest[i].nQuestID;
nMaxQuestStep = m_pQuest->Quest[i].nQuestStep;
FoundQuest = m_pQuest->Quest[i];
}
}
}
return FoundQuest;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void CDNUserQuest::SetReward(TQuestReward& Reward, int nQuestID, int nRewardCheck)
{
m_QuestReward = Reward;
m_RewardQuestID = nQuestID;
m_RewardCheck = nRewardCheck;
#if defined(PRE_ADD_REMOTE_QUEST)
if( g_pQuestManager->GetQuestType(nQuestID) != QuestType_RemoteQuest ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> m_PacketReward <20><> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ӽõ<D3BD><C3B5><EFBFBD><EFBFBD>͸<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
// uIndex = 0 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
memset(&m_PacketReward, 0x00, sizeof(m_PacketReward));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6> <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void CDNUserQuest::SavePacketReward(CSSelectQuestReward* pPacket)
{
memcpy(&m_PacketReward, pPacket, sizeof(CSSelectQuestReward));
}
bool CDNUserQuest::PreparePacketReward(int nQuestID)
{
TQuestReward table;
memset(&table, 0, sizeof(TQuestReward));
bool bResult = g_pDataManager->GetQuestCommonRewardByQuestID(nQuestID, table); //Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!bResult)
{
#ifndef _FINAL_BUILD
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD> <20><>ȸ<EFBFBD><C8B8><EFBFBD><EFBFBD>UserObjID: %d <20><><EFBFBD><EFBFBD>ƮID:%d " , nUserID, nQuestID);
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
memset(&m_PacketReward, 0x00, sizeof(m_PacketReward));
m_PacketReward.nIndex = table.nIndex;
m_QuestReward = table;
m_RewardQuestID = nQuestID;
m_RewardCheck = m_PacketReward.nIndex;
return true;
}
int CDNUserQuest::_AddItemByQuestReward( const TQuestReward::_ITEMSET* pItemSet )
{
#if defined(_CH)
if( m_pSession->GetFCMState() != FCMSTATE_NONE )
{
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return -1;
}
#endif
CDNUserItem* pUserItem = m_pSession->GetItem();
if( !pUserItem )
return -2;
#if defined(_VILLAGESERVER)
UINT nUserObjectID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserObjectID = m_pSession->GetSessionID();
#endif
#if defined( _GAMESERVER )
int nResult = api_user_CheckInvenForAddItem( m_pSession->GetGameRoom(), nUserObjectID, pItemSet->nItemID, pItemSet->nItemCount );
#else
int nResult = api_user_CheckInvenForAddItem(nUserObjectID, pItemSet->nItemID, pItemSet->nItemCount );
#endif // #if defined( _GAMESERVER )
if( nResult < 0 )
return nResult;
bool bResult = pUserItem->AddInventoryByQuest( pItemSet, m_RewardQuestID, 0 );
#ifndef _FINAL_BUILD
if(bResult == false)
{
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> %s: id %d count : %d" , bResult ? L"" : L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", pItemSet->nItemID, pItemSet->nItemCount );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
}
#endif
return 1;
}
void CDNUserQuest::OnSelectRewardEx(bool bSelectedArray[], bool bSelectedCashArray[])
{
#if defined(_CH)
if(m_pSession->GetFCMState() != FCMSTATE_NONE){
m_pSession->SendQuestResult(ERROR_QUEST_FCM);
return ;
}
#endif
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
TMailTableData *pMailData = g_pDataManager->GetMailTableData(m_QuestReward.nMailID);
if (m_QuestReward.nFatigue > 0)
{
int nFatigue = m_QuestReward.nFatigue;
int nMaxFatigue = g_pDataManager->GetFatigue(m_pSession->GetUserJob(), m_pSession->GetLevel());
if (nMaxFatigue - m_pSession->GetFatigue() < nFatigue)
nFatigue = nMaxFatigue - m_pSession->GetFatigue();
if (nFatigue > 0)
m_pSession->IncreaseFatigue(nFatigue);
}
switch( m_QuestReward.cType)
{
//--------------------------------------------------------------------------------------------------------------------------
// <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>
case 1:
{
#if defined(_VILLAGESERVER)
if(m_QuestReward.nCoin != 0)
api_user_AddCoin(nUserID, m_QuestReward.nCoin, m_RewardQuestID);
if(m_QuestReward.nExp != 0)
api_user_AddExp(nUserID, m_RewardQuestID, m_QuestReward.nExp);
for( int i = 0 ; i < QUESTREWARD_INVENTORYITEMMAX ; i++ )
{
if( m_QuestReward.ItemArray[i].nItemID > 0 && m_QuestReward.ItemArray[i].nItemCount > 0 )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><C3B8>º<EFBFBD><C2BA><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD><EFBFBD>ٻӽ<D9BB><D3BD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵȴ<C8B5>.
if( NPC_FAVOR_QUEST_REWARD_FAVOR_UP_ITEM_ID == m_QuestReward.ItemArray[i].nItemID ||
NPC_FAVOR_QUEST_REWARD_BROMIDE_ITEM_ID == m_QuestReward.ItemArray[i].nItemID )
continue;
#endif // #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
_AddItemByQuestReward( &m_QuestReward.ItemArray[i] );
}
}
#elif defined(_GAMESERVER)
if(m_QuestReward.nCoin != 0)
api_user_AddCoin(m_pSession->GetGameRoom(), nUserID, m_QuestReward.nCoin, m_RewardQuestID);
if(m_QuestReward.nExp != 0)
api_user_AddExp(m_pSession->GetGameRoom(), nUserID, m_RewardQuestID, m_QuestReward.nExp);
for( int i = 0 ; i < QUESTREWARD_INVENTORYITEMMAX ; i++ )
{
if( m_QuestReward.ItemArray[i].nItemID > 0 && m_QuestReward.ItemArray[i].nItemCount > 0 )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
if( NPC_FAVOR_QUEST_REWARD_FAVOR_UP_ITEM_ID == m_QuestReward.ItemArray[i].nItemID ||
NPC_FAVOR_QUEST_REWARD_BROMIDE_ITEM_ID == m_QuestReward.ItemArray[i].nItemID )
continue;
#endif // #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
_AddItemByQuestReward( &m_QuestReward.ItemArray[i] );
}
}
#endif // _VILLAGESERVER
for (int i = 0; i < MAX_QUEST_LEVEL_CAP_REWARD; ++i)
{
if( m_QuestReward.LevelCapItemArray[i].nItemID > 0 && m_QuestReward.LevelCapItemArray[i].nItemCount > 0 )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
if( NPC_FAVOR_QUEST_REWARD_FAVOR_UP_ITEM_ID == m_QuestReward.LevelCapItemArray[i].nItemID ||
NPC_FAVOR_QUEST_REWARD_BROMIDE_ITEM_ID == m_QuestReward.LevelCapItemArray[i].nItemID )
continue;
#endif // #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
_AddItemByQuestReward( &m_QuestReward.LevelCapItemArray[i] );
}
}
if(IsRewardCashItem())
{
if(pMailData)
m_pSession->MakeGiftByQuest(m_RewardQuestID, pMailData->ItemSNArr);
else
return;
}
}
break;
//--------------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>
case 2:
{
int nRewardItem[MAILATTACHITEMMAX] = { 0, };
int nClientItemCnt = 0, nClientCashItemCnt = 0;
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD>Ȯ<EFBFBD><C8AE><EFBFBD>Ѵ<EFBFBD>.
for( int i = 0 ; i < MAILATTACHITEMMAX ; i++ )
{
if(bSelectedArray[i])
nClientItemCnt++;
if(bSelectedCashArray[i]){
if(pMailData)
nRewardItem[i] = pMailData->ItemSNArr[i];
else
return;
nClientCashItemCnt++;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ¾<D6B4><C2BE><EFBFBD><EFBFBD>۰<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( m_QuestReward.cSelectMax != (nClientItemCnt + nClientCashItemCnt) )
{
m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL);
return;
}
#if defined(_VILLAGESERVER)
if(m_QuestReward.nCoin != 0)
api_user_AddCoin(nUserID, m_QuestReward.nCoin, m_RewardQuestID);
if(m_QuestReward.nExp != 0)
api_user_AddExp(nUserID, m_RewardQuestID, m_QuestReward.nExp);
#elif defined(_GAMESERVER)
if(m_QuestReward.nCoin != 0)
api_user_AddCoin(m_pSession->GetGameRoom(), nUserID, m_QuestReward.nCoin, m_RewardQuestID);
if(m_QuestReward.nExp != 0)
api_user_AddExp(m_pSession->GetGameRoom(), nUserID, m_RewardQuestID, m_QuestReward.nExp);
#endif // _VILLAGESERVER
// <20>ƴ϶<C6B4><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(nClientItemCnt > 0){
for( int i = 0 ; i < QUESTREWARD_INVENTORYITEMMAX ; i++ )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
if( bSelectedArray[i] )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><C3B8>º<EFBFBD><C2BA><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD><EFBFBD>ٻӽ<D9BB><D3BD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵȴ<C8B5>.
if( NPC_FAVOR_QUEST_REWARD_FAVOR_UP_ITEM_ID == m_QuestReward.ItemArray[i].nItemID ||
NPC_FAVOR_QUEST_REWARD_BROMIDE_ITEM_ID == m_QuestReward.ItemArray[i].nItemID )
continue;
#endif // #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
_AddItemByQuestReward( &m_QuestReward.ItemArray[i] );
}
}
}
for (int i = 0; i < MAX_QUEST_LEVEL_CAP_REWARD; ++i)
{
if( m_QuestReward.LevelCapItemArray[i].nItemID > 0 && m_QuestReward.LevelCapItemArray[i].nItemCount > 0 )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
if( NPC_FAVOR_QUEST_REWARD_FAVOR_UP_ITEM_ID == m_QuestReward.LevelCapItemArray[i].nItemID ||
NPC_FAVOR_QUEST_REWARD_BROMIDE_ITEM_ID == m_QuestReward.LevelCapItemArray[i].nItemID )
continue;
#endif // #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
_AddItemByQuestReward( &m_QuestReward.LevelCapItemArray[i] );
}
}
if((nClientCashItemCnt > 0) && IsRewardCashItem())
{
// <20>ƴ϶<C6B4><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_pSession->MakeGiftByQuest(m_RewardQuestID, nRewardItem);
}
}
break;
}
}
bool CDNUserQuest::IsRewardItem()
{
for (int i = 0; i < QUESTREWARD_INVENTORYITEMMAX; i++){
if(m_QuestReward.ItemArray[i].nItemID > 0) return true;
}
return false;
}
bool CDNUserQuest::IsRewardCashItem()
{
return(m_QuestReward.nMailID > 0) ? true : false;
}
void CDNUserQuest::OnCancelQuest(int nQuestID)
{
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
m_pSession->SendRemoveQuest(0, nQuestID, ERROR_QUEST_CANCELFAIL);
return;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nSlotID = _RemoveQuest(nQuestID, false, false);
if(nSlotID == -2)
m_pSession->SendRemoveQuest(nSlotID, nQuestID, ERROR_QUEST_NOTFOUND);
else // <20><><EFBFBD>m<EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_pSession->SendRemoveQuest(nSlotID, nQuestID, ERROR_NONE);
#if defined(PRE_ADD_REMOTE_QUEST)
if( nSlotID >= 0 && g_pQuestManager->GetQuestType(nQuestID) == QuestType_RemoteQuest )
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ް<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
m_pSession->GetQuest()->AddRemoteQuestToAcceptWaitList(nQuestID);
}
#endif
}
void CDNUserQuest::OnPeriodEvent(int nQuestID, bool bFlag)
{
if(true == bFlag)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot > 0 )
_RemoveQuest(nQuestID, false, false);
}
SetCompleteQuestFlag(nQuestID, bFlag);
}
void CDNUserQuest::OnAddItemEx(int nItemID, short wCount)
{
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
if( m_pQuest->Quest[i].cQuestState == QuestState_Playing )
{
TCount* pCount = (TCount*)m_pQuest->Quest[i].Extra;
for (int j=0; j<QUEST_EXTRACOUNT_MAX ; j++)
{
if(pCount[j].cType == CountingType_Item &&
pCount[j].nIndex == nItemID &&
wCount >= pCount[j].nTargetCnt)
{
CDNQuest* pQuest = g_pQuestManager->GetQuest(m_pQuest->Quest[i].nQuestID);
if(pQuest)
{
#if defined(_VILLAGESERVER)
pQuest->OnItemCollecting(GetUserObjID(), nItemID, wCount);
#elif defined(_GAMESERVER)
pQuest->OnItemCollecting(m_pSession->GetGameRoom(), GetUserObjID(), nItemID, wCount);
#endif // _VILLAGESERVER
}
}
}
}
}
}
void CDNUserQuest::AddCompletedPeriodQuest(int questID)
{
m_CompletedPeriodQuests.insert(questID);
}
void CDNUserQuest::RemoveCompletedPeriodQuest(int questID)
{
std::set<int>::iterator it = m_CompletedPeriodQuests.find(questID);
if (it == m_CompletedPeriodQuests.end())
return;
m_CompletedPeriodQuests.erase(it);
#if defined(PRE_ADD_REMOTE_QUEST)
SetCompleteQuestFlag(questID, false); //<2F><><EFBFBD>µǴ<C2B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>
#endif
}
bool CDNUserQuest::IsCompletedPeriodQuest(int questID) const
{
return (m_CompletedPeriodQuests.find(questID) != m_CompletedPeriodQuests.end()) ? true : false;
}
#if defined(PRE_ADD_REMOTE_QUEST)
bool CDNUserQuest::OnEvent( EventSystem::EventTypeEnum Event )
{
CheckRemoteQuestGain(Event);
return true;
}
void CDNUserQuest::CheckRemoteQuestGain(EventSystem::EventTypeEnum Event)
{
bool bQuestGain = false;
int nArrayIndex;
for( DWORD i=0; i<m_nVecRemoteQuestGainList[Event].size(); i++ ) {
nArrayIndex = m_nVecRemoteQuestGainList[Event][i];
TRemoteQuestData *pData = g_pDataManager->GetRemoteQuestData(nArrayIndex);
if(!pData) continue;
bool bGain = false;
bGain = m_pSession->GetEventSystem()->CheckEventCondition( &pData->GainCondition );
if( bGain )
{
bGain = CheckRemotePreQuestCondition( pData );
}
if( bGain )
{
CDNQuest* pQuest = g_pQuestManager->GetQuest(pData->nQuestID);
if( pQuest && _CheckRemoteQuestGainValidation(pData->nQuestID, pQuest) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( !AddRemoteQuestToAcceptWaitList(pData->nQuestID) )
continue;
}
if(!pQuest || pQuest->GetQuestInfo().cRepeatable != 1)
{
m_nVecRemoteQuestGainList[Event].erase( m_nVecRemoteQuestGainList[Event].begin() + i );
i--;
}
}
}
}
bool CDNUserQuest::CheckRemotePreQuestCondition( TRemoteQuestData *pData )
{
if(!pData) return false;
if( 0 == pData->nVecPreQuestCondition.size() )
{
return true;
}
if( pData->bPreQuestCheckType == false )
{
for( int i = 0 ; i < pData->nVecPreQuestCondition.size() ; ++ i )
{
if( IsClearQuest( pData->nVecPreQuestCondition[i] ) == false )
return false;
}
return true;
}
else
{
for( int i = 0 ; i < pData->nVecPreQuestCondition.size() ; ++ i )
{
if( IsClearQuest( pData->nVecPreQuestCondition[i] ) == true )
return true;
}
return false;
}
return false;
}
void CDNUserQuest::CheckAcceptWaitRemoteQuestList()
{
for(int i = 0; i < m_nVecRemoteQuestAcceptWaitList.size(); i++)
{
CDNQuest* pQuest = g_pQuestManager->GetQuest(m_nVecRemoteQuestAcceptWaitList[i]);
if( !pQuest || (IsClearQuest(m_nVecRemoteQuestAcceptWaitList[i]) && pQuest->GetQuestInfo().cRepeatable != 1)
|| FindPlayingQuest(m_nVecRemoteQuestAcceptWaitList[i]) >= 0 )
{
m_pSession->SendRemoveRemoteQuest(m_nVecRemoteQuestAcceptWaitList[i]);
m_nVecRemoteQuestAcceptWaitList.erase(m_nVecRemoteQuestAcceptWaitList.begin() + i);
i--;
}
}
}
bool CDNUserQuest::_CheckRemoteQuestGainValidation(int nQuestID, CDNQuest* pQuest)
{
if(!pQuest) return false;
//<2F>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD> <20>ƴѴ<C6B4> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( IsClearQuest(nQuestID) && pQuest->GetQuestInfo().cRepeatable != 1 )
return false;
//<2F>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>
if( FindPlayingQuest(nQuestID) >= 0 )
return false;
//<2F>̹<EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(_FindAcceptWaitQuest(nQuestID) >= 0)
return false;
return true;
}
bool CDNUserQuest::AddRemoteQuestToAcceptWaitList(int nQuestID)
{
if( m_nVecRemoteQuestAcceptWaitList.size() >= MAX_PLAY_QUEST )
{
#ifndef _FINAL_BUILD
std::wstring wszMsg;
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return false;
}
m_nVecRemoteQuestAcceptWaitList.push_back(nQuestID);
m_pSession->SendGainRemoteQuest(nQuestID);
return true;
}
bool CDNUserQuest::RemoveRemoteQuestFromAcceptWaitList(int nQuestID)
{
int nIndex = _FindAcceptWaitQuest(nQuestID);
if(nIndex < 0) return false;
m_nVecRemoteQuestAcceptWaitList.erase(m_nVecRemoteQuestAcceptWaitList.begin() + nIndex);
m_pSession->SendRemoveRemoteQuest(nQuestID);
return true;
}
void CDNUserQuest::AcceptRemoteQuest(int nQuestID)
{
int nIndex = _FindAcceptWaitQuest(nQuestID);
if(nIndex < 0)
{
_DANGER_POINT(); //ȹ<><20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>ްڴٰ<DAB4> <20>ϴ³ѵ<C2B3>(<28><><EFBFBD><EFBFBD>¡ <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>)
return;
}
CDNQuest* pQuest = g_pQuestManager->GetQuest(nQuestID);
if(!pQuest)
return;
if( AddQuest(nQuestID, true) == 1 )
{
SetQuestStepAndJournalStep(nQuestID, 1, 1, false);
#if defined(_VILLAGESERVER)
pQuest->OnRemoteStart(m_pSession->GetObjectID());
#elif defined(_GAMESERVER)
pQuest->OnRemoteStart(m_pSession->GetGameRoom(), m_pSession->GetSessionID());
#endif
}
}
void CDNUserQuest::CancelRemoteQuest(int nQuestID)
{
if(!RemoveRemoteQuestFromAcceptWaitList(nQuestID))
{
_DANGER_POINT(); //ȹ<><20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴٰ<DAB4> <20>ϴ<EFBFBD> <20>ѵ<EFBFBD>
return;
}
//ȹ<><C8B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> -> GainList <20><> <20>ٽ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>(<28>ٽ<EFBFBD> ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ؾ<EFBFBD> <20>Ǵ°ǰ<C2B0>??)
TRemoteQuestData *pData = g_pDataManager->GetRemoteQuestDataByQuestID(nQuestID);
if(pData)
{
CDNQuest* pQuest = g_pQuestManager->GetQuest(pData->nQuestID);
if(!pQuest)
return;
if(pQuest->GetQuestInfo().cRepeatable != 1) //<2F>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_nVecRemoteQuestGainList[pData->GainCondition.cEvent].push_back(pData->nIndex);
}
}
void CDNUserQuest::CompleteRemoteQuest(int nQuestID, CSSelectQuestReward* pPacket)
{
if(FindRecompenseQuestIndex(nQuestID) < 0)
{
_DANGER_POINT(); //<2F>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ƴ<EFBFBD> -> <20><><EFBFBD><EFBFBD>¡ ó<><C3B3> <20>ϱ<EFBFBD>
ResetRewardFlag();
return;
}
CDNQuest* pQuest = g_pQuestManager->GetQuest(nQuestID);
if( pQuest )
{
SavePacketReward(pPacket);
#if defined(_VILLAGESERVER)
pQuest->OnRemoteComplete(m_pSession->GetObjectID());
#elif defined(_GAMESERVER)
pQuest->OnRemoteComplete(m_pSession->GetGameRoom(), m_pSession->GetSessionID());
#endif
}
}
void CDNUserQuest::RefreshRemoteQuest(int nAcceptWaitRemoteQuestCount, int *AcceptWaitRemoteQuestList)
{
_ResetRemoteQuest();
//ȹ<><C8B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( nAcceptWaitRemoteQuestCount > MAX_PLAY_QUEST) nAcceptWaitRemoteQuestCount = MAX_PLAY_QUEST;
for(int i = 0 ; i < nAcceptWaitRemoteQuestCount ; i++)
m_nVecRemoteQuestAcceptWaitList.push_back(AcceptWaitRemoteQuestList[i]);
_RefreshRemoteQuestList();
}
int CDNUserQuest::_FindRecompenseQuestIndex(int nQuestID)
{
for( int i = 0 ; i < MAX_PLAY_QUEST ; i++ )
{
if( m_pQuest->Quest[i].nQuestID == nQuestID && m_pQuest->Quest[i].cQuestState == QuestState_Recompense )
return i;
}
return -1;
}
int CDNUserQuest::_FindAcceptWaitQuest(int nQuestID)
{
for( int i = 0 ; i < m_nVecRemoteQuestAcceptWaitList.size() ; i++ )
{
if(m_nVecRemoteQuestAcceptWaitList[i] == nQuestID)
return i;
}
return -1;
}
void CDNUserQuest::_ResetRemoteQuest()
{
for( int i=0; i<EventSystem::EventTypeEnum_Amount; i++ )
SAFE_DELETE_VEC( m_nVecRemoteQuestGainList[i] );
SAFE_DELETE_VEC(m_nVecRemoteQuestAcceptWaitList);
}
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ModifyCompleteQuest() <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Complete <EFBFBD><EFBFBD>ŷ ó<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
<EFBFBD>Ʒ<EFBFBD> _RefreshRemoteQuestList() ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ModifyCompleteQuest() <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Gain <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Complete <EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD> <EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD> ȹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
*/
void CDNUserQuest::_RefreshRemoteQuestList()
{
TQuestGroup *pQuest = m_pSession->GetQuestData();
if(!pQuest) return;
int nSize = g_pDataManager->GetRemoteQuestDataSize();
for(int i = 0 ; i < nSize; i++)
{
TRemoteQuestData *pData = g_pDataManager->GetRemoteQuestData(i);
if(!pData || !pData->bActivate) continue;
CDNQuest* pQuest = g_pQuestManager->GetQuest(pData->nQuestID);
if( pQuest && _CheckRemoteQuestGainValidation(pData->nQuestID, pQuest) )
m_nVecRemoteQuestGainList[pData->GainCondition.cEvent].push_back(i);
}
}
void CDNUserQuest::GetAcceptWaitRemoteQuest(int *nAcceptWaitRemoteQuestCount, int *AcceptWaitRemoteQuestList)
{
for(int i = 0 ; i < m_nVecRemoteQuestAcceptWaitList.size() ; i++)
{
if( i >= MAX_PLAY_QUEST ) break;
AcceptWaitRemoteQuestList[i] = m_nVecRemoteQuestAcceptWaitList[i];
}
*nAcceptWaitRemoteQuestCount = (int)m_nVecRemoteQuestAcceptWaitList.size();
if(*nAcceptWaitRemoteQuestCount > MAX_PLAY_QUEST)
*nAcceptWaitRemoteQuestCount = MAX_PLAY_QUEST;
}
#endif //#if defined(PRE_ADD_REMOTE_QUEST)