DragonNest/Server/ServerCommon/DNUserQuest.cpp

2153 lines
121 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#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
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɉ<EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"t<><74><EFBFBD> <00>ɉ<EFBFBD><11>x<EFBFBD> Ф¸<D0A4> <00><>Ȳ<EFBFBD><C8B2>. : %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
// T<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD>|<EFBFBD> <EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"T<>t<EFBFBD><74><EFBFBD> Ф¸<D0A4>|<7C> <1B>D<EFBFBD> <18> <00>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. <00>ɉ<EFBFBD> <11>x<EFBFBD> Ф¸<D0A4>|<7C> D<≯X<CCB8>8<EFBFBD><38><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
// T<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD>|<EFBFBD> <EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00>Ѕ<EFBFBD> $<24>X<EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -1;
}
// Ф¸<EFBFBD>p<EFBFBD>t<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>Ȳ<EFBFBD><EFBFBD>.
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"Ф¸<D0A4>p<EFBFBD>t<EFBFBD>t<EFBFBD> ޹<><DEB9><4A>Ȳ<EFBFBD><C8B2>");
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"Ф¸<D0A4>p<EFBFBD>t<EFBFBD>t<EFBFBD> ޹<><DEB9><4A>Ȳ<EFBFBD><C8B2>");
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;
// <EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD>
if( nCountingType < 1 || nCountingType >= CountingType_Max || nTargetCnt < 1 || nTargetCnt > 31000 || nCountingIndex < 0 ) return -4;
// Ф¸<EFBFBD> <EFBFBD><EFBFBD><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();
// D<EFBFBD>t<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( nCountingType == CountingType_Item && pItem )
{
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ѭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>t<EFBFBD>|<EFBFBD>t<EFBFBD>
int nIdx = pItem->GetInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
OnAddItem(nCountingIndex, nIdx);
// 9<EFBFBD>@<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD><EFBFBD><EFBFBD>Ѭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD>
nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
OnAddItem(nCountingIndex,nIdx );
}
#ifndef _FINAL_BUILD
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00><><00> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><EFBFBD> ȡ<EFBFBD>
SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID);
m_pSession->GetDBConnection()->QueryAddQuest( m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // <EFBFBD>D<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
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɉ<EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"t<><74><EFBFBD> <00>ɉ<EFBFBD><11>x<EFBFBD> Ф¸<D0A4> <00><>Ȳ<EFBFBD><C8B2>. : %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
// T<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD>|<EFBFBD> <EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"T<>t<EFBFBD><74><EFBFBD> Ф¸<D0A4>|<7C> <1B>D<EFBFBD> <18> <00>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. <00>ɉ<EFBFBD> <11>x<EFBFBD> Ф¸<D0A4>|<7C> D<≯X<CCB8>8<EFBFBD><38><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
// T<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD>|<EFBFBD> <EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00>Ѕ<EFBFBD> $<24>X<EFBFBD> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
return -1;
}
// Ф¸<EFBFBD>p<EFBFBD>t<EFBFBD>Dǀ<EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>Ȳ<EFBFBD><EFBFBD>.
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"Ф¸<D0A4>p<EFBFBD>t<EFBFBD>t<EFBFBD> ޹<><DEB9><4A>Ȳ<EFBFBD><C8B2>");
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"Ф¸<D0A4>p<EFBFBD>t<EFBFBD>t<EFBFBD> ޹<><DEB9><4A>Ȳ<EFBFBD><C8B2>");
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
}
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD><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"Ф¸<D0A4> <00><><00> : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><EFBFBD> ȡ<EFBFBD>
SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID);
m_pSession->GetDBConnection()->QueryAddQuest(m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // <EFBFBD>D<EFBFBD>ȥ<EFBFBD>
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestGain, 1, EventSystem::QuestID, nQuestID );
return 1;
}
// t<EFBFBD> h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>!(|ǀ<EFBFBD> Д<EFBFBD> ForceCompleteQuest\<EFBFBD> <EFBFBD>̬<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.)
// |<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> ̹<EFBFBD>|<EFBFBD> `Ճ<EFBFBD> <EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>”<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȡ<EFBFBD>!
// 0. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŕ<EFBFBD> Ф¸<EFBFBD> <EFBFBD>̬<EFBFBD>
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 3. Ф¸<EFBFBD> <EFBFBD><EFBFBD≯ ȹ<EFBFBD><EFBFBD>
// 4. Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>
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
// <EFBFBD><EFBFBD><EFBFBD>Ф¸<EFBFBD> <EFBFBD>ŀ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>t<EFBFBD><EFBFBD> LUA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>°<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> й<EFBFBD><EFBFBD> QuestTable <EFBFBD><EFBFBD><EFBFBD>̹D<EFBFBD> <EFBFBD>°<EFBFBD>\<EFBFBD><EFBFBD><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. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD>Ŕ<EFBFBD> Ф¸Ҙ̬<EFBFBD>(ȹ<EFBFBD><EFBFBD>->D<EFBFBD≯)
if(m_RewardQuestID == 0 && m_PacketReward.nIndex == 0 )
{
// <EFBFBD><EFBFBD><EFBFBD>Ф¸Ҕ<EFBFBD> ȹ<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
if(bRepeat == false)
MarkingCompleteQuest(nQuestID);
return CompleteQuest(nQuestID, bDelPlayList, bRepeat);
}
//--------------------------------------------------------------------------------------------------------------------------
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>q<EFBFBD><EFBFBD>€<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>API<EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> $Ɣ<EFBFBD>(ӷ<EFBFBD><EFBFBD>D<EFBFBD> D<EFBFBD>P<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>xƘ̬<EFBFBD>\<EFBFBD><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
// \<EFBFBD><EFBFBD> T<EFBFBD>x<EFBFBD> U<EFBFBD>x<EFBFBD>
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. Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><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)
// Ф¸<EFBFBD> D<EFBFBD≯ <EFBFBD><EFBFBD>]<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( GetQuestStep(nQuestID) != m_QuestReward.nQuestStep )
{
m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL);
return -1;
}
#endif
//--------------------------------------------------------------------------------------------------------------------------
// 3. Ф¸<EFBFBD> D<EFBFBD≯ ȹ<EFBFBD><EFBFBD>
std::wstring wszMsg;
// <EFBFBD><EFBFBD><EFBFBD>Ф¸<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȹ<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
if(bRepeat == false)
MarkingCompleteQuest(nQuestID);
//--------------------------------------------------------------------------------------------------------------------------
// 4. Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
CompleteQuest(nQuestID, bDelPlayList, bRepeat);
//--------------------------------------------------------------------------------------------------------------------------
// 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>
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 )
{
// <EFBFBD>ɉ<EFBFBD><EFBFBD>x<EFBFBD> Ф¸<EFBFBD><EFBFBD> D<EFBFBD>ز
return -2;
}
#ifndef _FINAL_BUILD
// Ф¸<EFBFBD> D<EFBFBD≯ <EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> D<≯ : %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// ֬<EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD> Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>p<EFBFBD>
if( bDelPlayList )
{
_RemoveQuest(nQuestID, true, bRepeat);
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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)
{
/////////////////////////////////////////////////////////////////
//)<EFBFBD><EFBFBD><EFBFBD> T<EFBFBD>ܴ <EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8֜<EFBFBD>t<EFBFBD> <EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD>.
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 )
{
// <EFBFBD>ɉ<EFBFBD><EFBFBD>x<EFBFBD> Ф¸<EFBFBD><EFBFBD> D<EFBFBD>ز
return -2;
}
#ifndef _FINAL_BUILD
// Ф¸<EFBFBD> D<EFBFBD≯ <EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> D<≯ ȹ<><C8B9>!: %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> D<EFBFBD≯<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SetCompleteQuestFlag(nQuestID, true);
if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID))
AddCompletedPeriodQuest(nQuestID);
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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)
{
// ֬<EFBFBD> <EFBFBD>ɉ<EFBFBD> <EFBFBD>x<EFBFBD> Ф¸<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ŀ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
if(bDoMark) {
#ifndef _FINAL_BUILD
// Ф¸<EFBFBD> D<EFBFBD≯ <EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> D<≯ ȹ<><C8B9>!: %d" , nQuestID );
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif // _FINAL_BUILD
// <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> D<EFBFBD≯<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SetCompleteQuestFlag(nQuestID, true);
if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID))
AddCompletedPeriodQuest(nQuestID);
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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"Ф¸<D0A4> D<≯<EFBFBD><CCB8> <00><>(<28>X<EFBFBD>Ƶ<>Ȳ<EFBFBD><C8B2>.\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); // <EFBFBD><EFBFBD>(<EFBFBD><<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>@<EFBFBD> Ф¸<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> D<EFBFBD≯ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij (<EFBFBD> ???
}
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 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -2;
}
#if defined(_VILLAGESERVER)
UINT nUserID = m_pSession->GetObjectID();
#elif defined(_GAMESERVER)
UINT nUserID = m_pSession->GetSessionID();
#endif
//---------------------------------------------------------------------------------------------
{
// <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD> <EFBFBD>ɰƔ<EFBFBD>p<EFBFBD>
std::set<int> questItemSet;
g_pDataManager->GetQuestItemSet(nQuestID, questItemSet);
// <EFBFBD>͌<EFBFBD><EFBFBD> Ф¸<EFBFBD>@<EFBFBD> <EFBFBD>(<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD>P<EFBFBD> <EFBFBD><EFBFBD><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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//else return nCount;
}
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD><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"Ф¸<D0A4> <1C>p<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 ) // Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -1;
// Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>..
m_pQuest->Quest[nSlot].nQuestStep = nQuestStep;
m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep;
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00><10> <00><>]<5D> <00><><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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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ȥ<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 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -1;
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>..
m_pQuest->Quest[nSlot].nQuestStep = nQuestStep;
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00><>]<5D> <00><><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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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ȥ<EFBFBD> 100128
return 1;
}
short CDNUserQuest::GetQuestStep(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -2;
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<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 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -1;
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>..
m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep;
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> <00><10> <00><>]<5D> <00><><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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><EFBFBD> ȡ<EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_JOURNAL, nQuestID);
m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // dbȥ<EFBFBD> 100128
return 1;
}
int CDNUserQuest::GetJournalStep(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -2;
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD>]<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<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)) {
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>
DN_RETURN(-3);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DN_RETURN(-2);
}
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>
m_pQuest->Quest[nSlot].nMemo[nMemoIndex] = nVal;
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> T<><54><EFBFBD> <00><><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ȥ<EFBFBD> 20100128
return 1;
}
TP_QUESTMEMO CDNUserQuest::GetQuestMemo(int nQuestID, char nMemoIndex)
{
if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) {
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>
DN_RETURN(-3);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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)) {
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>
DN_RETURN(LONG_MIN);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DN_RETURN(LONG_MIN);
}
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
TP_QUESTMEMO nRetVal = ++m_pQuest->Quest[nSlot].nMemo[nMemoIndex];
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> T<><54><EFBFBD> <00><><00> : %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ȥ<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)) {
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>
DN_RETURN(LONG_MAX);
}
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DN_RETURN(LONG_MAX);
}
// Ф¸<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
TP_QUESTMEMO nRetVal = --m_pQuest->Quest[nSlot].nMemo[nMemoIndex];
#ifndef _FINAL_BUILD
// t<EFBFBD>p<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> \<EFBFBD>L<EFBFBD>ij L<EFBFBD>$<EFBFBD><EFBFBD>|<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>P<EFBFBD>p<EFBFBD>.
std::wstring wszMsg;
wszMsg = FormatW( L"Ф¸<D0A4> T<><54><EFBFBD> <10><><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ȥ<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 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return -2;
}
if( nCountingSlot < 0 || nCountingSlot >= QUEST_EXTRACOUNT_MAX)
{
return -3;
}
// <EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<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ȥ<EFBFBD> 20100128
pItem = m_pSession->GetItem();
// D<EFBFBD>t<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( nCountingType == CountingType_Item && pItem )
{
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ѭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>t<EFBFBD>|<EFBFBD>t<EFBFBD>
int nIdx = pItem->GetInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
{
OnAddItem(nCountingIndex, nIdx);
}
// 9<EFBFBD>@<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD><EFBFBD><EFBFBD>Ѭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD>
nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex );
if( nIdx > 0 )
{
OnAddItem(nCountingIndex,nIdx );
}
}
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><EFBFBD> ȡ<EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID);
return 1;
}
int CDNUserQuest::ClearCountingInfo(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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ȥ<EFBFBD> 20100128
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><EFBFBD> ȡ<EFBFBD>
SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID);
return 1;
}
int CDNUserQuest::IsAllCompleteCounting(int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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 )
{
// X՘<EFBFBD>|<EFBFBD>ij <EFBFBD><EFBFBD>\<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>D̴ƌ<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( pCount[j].nCnt < pCount[j].nTargetCnt )
{
return -3;
}
else if( pCount[j].nCnt == pCount[j].nTargetCnt )
{
CompleteAllCounting = true;
}
}
}
// ֬<EFBFBD> Ф¸<EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD> p<EFBFBD>t<EFBFBD>t<EFBFBD> Ȁ<EFBFBD> ޹D<EFBFBD>L<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.> <EFBFBD><EFBFBD> T<EFBFBD><EFBFBD>ܴX<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TQuest::Extra <EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <EFBFBD><EFBFBD> |<EFBFBD><EFBFBD> 0<EFBFBD>]<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> return X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>ij]<EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD>ݹ
bool bCounting[MAX_PLAY_QUEST] = {0,};
bool bComplete[MAX_PLAY_QUEST] = {0,};
bool bModifyQuestExtra[MAX_PLAY_QUEST] = { false, };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>P<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>.
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++ )
{
// <EFBFBD><EFBFBD> `<EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD>
bool bNeedContinue = false;
bool bNeedCount = true;
// <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD> @<EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD> `<EFBFBD>L<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>L<EFBFBD>.
if( pCount[j].cType == CountingType_MyMonsterKill && nCountingType == CountingType_MyMonsterKill )
{
bNeedContinue = false;
}
// ȴ<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD> 8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ň<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD>p<EFBFBD><EFBFBD><EFBFBD><EFBFBD> X<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>L<EFBFBD>( <EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>h<EFBFBD>\<EFBFBD> )
else if( pCount[j].cType == CountingType_AllMonsterKill && nCountingType == CountingType_AllMonsterKill )
{
bNeedContinue = false;
}
// D<EFBFBD>t<EFBFBD>\<EFBFBD>
else if( pCount[j].cType == CountingType_Item && nCountingType == CountingType_Item )
{
bNeedContinue = false;
}
/*
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD>t<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;
}
// <EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD> X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
else
{
bNeedContinue = true;
}
if( bNeedContinue )
continue;
//<EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> |<EFBFBD>L<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>.
if( pCount[j].nIndex == nCountItemID )
{
#if defined( PRE_MOD_QUEST_COUNTING )
if( pCount[j].nCnt < pCount[j].nTargetCnt ) // tδƸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> tδƸ<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>]<EFBFBD> `<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɉ<EFBFBD>`<EFBFBD>t<EFBFBD> <EFBFBD>ǻ<EFBFBD> \<EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
#else // #if defined( PRE_MOD_QUEST_COUNTING )
// OnCounting<EFBFBD><EFBFBD> 0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD> <EFBFBD>ɉ<EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>$<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> p<EFBFBD>t<EFBFBD>D<EFBFBD> <EFBFBD>p<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) // 9<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD>Ȳ D<EFBFBD>t<EFBFBD>\<EFBFBD> tδƸ<EFBFBD>̹ <EFBFBD><EFBFBD>l<EFBFBD>i<EFBFBD>Ȳ<EFBFBD><EFBFBD>.
pCount[j].nCnt += nItemCount;
else
#endif //#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT)
++pCount[j].nCnt;
bModifyQuestExtra[i] = true;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> 8֜<EFBFBD>t<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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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] ) // OnCountingD<EFBFBD> 8֜<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> 8֜<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
#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;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> 8֜<EFBFBD>t<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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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 )
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> 8֜<EFBFBD>t<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
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> l<EFBFBD><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ȥ<EFBFBD> 100128
}
}
}
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>L<EFBFBD>.
void CDNUserQuest::OnKillMonster(int nMonsterID)
{
OnCounting(CountingType_MyMonsterKill, nMonsterID);
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void CDNUserQuest::OnDieMonster(int nMonsterID)
{
OnCounting(CountingType_AllMonsterKill, nMonsterID);
}
// D<EFBFBD>t<EFBFBD>\<EFBFBD>D<EFBFBD> l<EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>L<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)
}
// D<EFBFBD>t<EFBFBD>\<EFBFBD>D<EFBFBD> l<EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>L<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;
}
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int CDNUserQuest::SendQuestRefresh(int nRefreshType, int nQuestID)
{
int nSlot = _FindPlayingQuest(nQuestID);
if( nSlot < 0 || nSlot > MAX_PLAY_QUEST )
{
// Ф¸<EFBFBD>|<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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;
}
}
// <EFBFBD>ɉ<EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD> <EFBFBD> Ф¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>@<EFBFBD> Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> >̔<EFBFBD><EFBFBD><EFBFBD>. return QuestID; <EFBFBD><EFBFBD><<EFBFBD>t<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++ )
{
// <EFBFBD> <EFBFBD>Ф¸<EFBFBD> t<EFBFBD><EFBFBD><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;
}
// Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> 8<EFBFBD><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 ) //<EFBFBD>Ʃ<EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_PacketReward <EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> $<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>.
#endif
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ӷ<EFBFBD>D<EFBFBD> ȥ<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>t<EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD>0<EFBFBD>T<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
// uIndex = 0 : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD><<EFBFBD>\<EFBFBD> ܭ<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
memset(&m_PacketReward, 0x00, sizeof(m_PacketReward));
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ӷ<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> ȥ<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); //<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD>̬<EFBFBD>X<EFBFBD>ij]<EFBFBD> <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"Ф¸<D0A4> <00><><EFBFBD><EFBFBD>L<EFBFBD>t<EFBFBD><14> <70><C88C><EFBFBD>(<28>UserObjID: %d Ф¸<D0A4>ID:%d " , nUserID, nQuestID);
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
#endif
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ij]<EFBFBD> p<EFBFBD>t<EFBFBD>0<EFBFBD>|<EFBFBD> 8<EFBFBD><EFBFBD>t<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"D<>t<EFBFBD>\<EFBFBD> <00><> <09> <00><>(<28> %s: id %d count : %d" , bResult ? L"" : L"<00><>(<28>", 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)
{
//--------------------------------------------------------------------------------------------------------------------------
// ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|ǽ<EFBFBD><EFBFBD><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)
// ̹}<EFBFBD>8<EFBFBD><EFBFBD>ij,Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD>̹\<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>#<EFBFBD><<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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)
// ̹}<EFBFBD> 8<EFBFBD><EFBFBD>ij ,Ƭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>̹ \<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>п <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> #<EFBFBD><<EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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)
// ̹}<EFBFBD> 8<EFBFBD><EFBFBD>ij ,Ƭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>̹ \<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>п <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> #<EFBFBD><<EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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;
//--------------------------------------------------------------------------------------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|ǽ<EFBFBD><EFBFBD><EFBFBD>
case 2:
{
int nRewardItem[MAILATTACHITEMMAX] = { 0, };
int nClientItemCnt = 0, nClientCashItemCnt = 0;
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD>x<EFBFBD>\<EFBFBD><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++;
}
}
// <EFBFBD>Ƙ<EFBFBD><EFBFBD>D<EFBFBD>ˆǔ<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD>X<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<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
// D<EFBFBD>Ȳ|<EFBFBD>t<EFBFBD>t<EFBFBD>ȝ<EFBFBD><EFBFBD><EFBFBD>.
if(nClientItemCnt > 0){
for( int i = 0 ; i < QUESTREWARD_INVENTORYITEMMAX ; i++ )
{
// <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD>t<EFBFBD>t<EFBFBD>
if( bSelectedArray[i] )
{
#if defined(PRE_ADD_NPC_REPUTATION_SYSTEM)
// ̹}<EFBFBD>8<EFBFBD><EFBFBD>ij,Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<EFBFBD>D<EFBFBD>t<EFBFBD>\<EFBFBD>̹\<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>#<EFBFBD><<EFBFBD>t<EFBFBD>H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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)
// ̹}<EFBFBD> 8<EFBFBD><EFBFBD>ij ,Ƭ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>t<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD>̹ \<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>п <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> #<EFBFBD><<EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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())
{
// D<EFBFBD>Ȳ|<EFBFBD>t<EFBFBD>t<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;
}
// Ф¸<EFBFBD> <EFBFBD>ɰ<EFBFBD><EFBFBD><EFBFBD>
int nSlotID = _RemoveQuest(nQuestID, false, false);
if(nSlotID == -2)
m_pSession->SendRemoveQuest(nSlotID, nQuestID, ERROR_QUEST_NOTFOUND);
else // <EFBFBD>ɟm<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><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 )
{ //<EFBFBD>Ʃ<EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD>}<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>}<EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD>\<EFBFBD>
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); //<EFBFBD><EFBFBD>K<EFBFBD><EFBFBD><EFBFBD><EFBFBD> |<EFBFBD>|<EFBFBD><EFBFBD> D<EFBFBD≯ ՘<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>p<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) )
{
// <EFBFBD>Ʃ<EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>ݴ`<EFBFBD> <EFBFBD> <EFBFBD>Ŕ<EFBFBD> <EFBFBD><EFBFBD><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;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD>̲<EFBFBD> l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( IsClearQuest(nQuestID) && pQuest->GetQuestInfo().cRepeatable != 1 )
return false;
//t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɉ<EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD>
if( FindPlayingQuest(nQuestID) >= 0 )
return false;
//t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ݴ\<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"T<>t<EFBFBD><74><EFBFBD> <00>Ʃ<EFBFBD>Ф¸<D0A4>|<7C> <00><>ݴ`<60> <18> <00>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. : %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(); //<EFBFBD><EFBFBD>ݴij H<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> X<EFBFBD><EFBFBD><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(); //<EFBFBD><EFBFBD>ݴij H<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ф¸<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
return;
}
//<EFBFBD><EFBFBD>ݴ\<EFBFBD> <EFBFBD>Ʃ<EFBFBD> Ф¸<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> GainList <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> #<EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ݴ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>??)
TRemoteQuestData *pData = g_pDataManager->GetRemoteQuestDataByQuestID(nQuestID);
if(pData)
{
CDNQuest* pQuest = g_pQuestManager->GetQuest(pData->nQuestID);
if(!pQuest)
return;
if(pQuest->GetQuestInfo().cRepeatable != 1) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD>ɰ<EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> ň<EFBFBD>L<EFBFBD>
m_nVecRemoteQuestGainList[pData->GainCondition.cEvent].push_back(pData->nIndex);
}
}
void CDNUserQuest::CompleteRemoteQuest(int nQuestID, CSSelectQuestReward* pPacket)
{
if(FindRecompenseQuestIndex(nQuestID) < 0)
{
_DANGER_POINT(); //D<EFBFBD≯<EFBFBD> Ф¸<EFBFBD><EFBFBD> D<EFBFBD>ز -> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̬<EFBFBD> X<EFBFBD>0<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();
//<EFBFBD><EFBFBD>ݴ\<EFBFBD> <EFBFBD>Ʃ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> K<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>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ModifyCompleteQuest() <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>@<EFBFBD> |<EFBFBD>|<EFBFBD><EFBFBD>|<EFBFBD> Complete ȹ<EFBFBD><EFBFBD> <EFBFBD>̬<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD> _RefreshRemoteQuestList() 8֜<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> ModifyCompleteQuest() <EFBFBD><EFBFBD><EFBFBD><EFBFBD> T<EFBFBD> h<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> 8֜<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>@<EFBFBD> |<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> Complete ȹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>$<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> J<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)