#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 // ÀÌ¹Ì ÁøÇàÁßÀÌ´Ù. std::wstring wszMsg; wszMsg = FormatW( L"ÀÌ¹Ì ÁøÇàÁßÀÎ Äù½ºÆ® ÀÔ´Ï´Ù. : %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 // ´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ»¼ö ¾ø´Ù. std::wstring wszMsg; wszMsg = FormatW( L"´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ» ¼ö ¾ø½À´Ï´Ù. ÁøÇà ÁßÀÎ Äù½ºÆ®¸¦ ¿Ï·áÇϼ¼¿ä. : %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 // ´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ»¼ö ¾ø´Ù. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ŸÀÔ ¿À·ù : %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD return -1; } // Äù½ºÆ®Á¶°ÇÀ» °Ë»çÇÕ´Ï´Ù. 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"Äù½ºÆ®Á¶°ÇÀÌ ¸ÂÁö¾Ê½À´Ï´Ù"); 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"Äù½ºÆ®Á¶°ÇÀÌ ¸ÂÁö¾Ê½À´Ï´Ù"); 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; // °¢°¢ÀÇ º¯¼öÀÇ ¹üÀ§ Ãʰú üũ if( nCountingType < 1 || nCountingType >= CountingType_Max || nTargetCnt < 1 || nTargetCnt > 31000 || nCountingIndex < 0 ) return -4; // Äù½ºÆ® Ãß°¡ 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(); // ¾ÆÀÌÅÛ Ä«¿îÆÃÀ» ¼¼¾î¾ß ÇÏ´Â °æ¿ì¿¡ if( nCountingType == CountingType_Item && pItem ) { // ÀÌ¹Ì Àκ¥Å丮¿¡ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛÀ̶ó¸é int nIdx = pItem->GetInventoryItemCount( nCountingIndex ); if( nIdx > 0 ) OnAddItem(nCountingIndex, nIdx); // ȤÀº ÀÌ¹Ì Äù½ºÆ®Àκ¥Å丮¿¡ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛÀÏ °æ¿ì¶ó¸é nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex ); if( nIdx > 0 ) OnAddItem(nCountingIndex,nIdx ); } #ifndef _FINAL_BUILD std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® Ãß°¡ : %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID); m_pSession->GetDBConnection()->QueryAddQuest( m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // µðºñÀúÀå 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 // ÀÌ¹Ì ÁøÇàÁßÀÌ´Ù. std::wstring wszMsg; wszMsg = FormatW( L"ÀÌ¹Ì ÁøÇàÁßÀÎ Äù½ºÆ® ÀÔ´Ï´Ù. : %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 // ´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ»¼ö ¾ø´Ù. std::wstring wszMsg; wszMsg = FormatW( L"´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ» ¼ö ¾ø½À´Ï´Ù. ÁøÇà ÁßÀÎ Äù½ºÆ®¸¦ ¿Ï·áÇϼ¼¿ä. : %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 // ´õÀÌ»ó Äù½ºÆ®¸¦ ¹ÞÀ»¼ö ¾ø´Ù. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ŸÀÔ ¿À·ù : %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD return -1; } // Äù½ºÆ®Á¶°ÇÀ»°Ë»çÇÕ´Ï´Ù. 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"Äù½ºÆ®Á¶°ÇÀÌ ¸ÂÁö¾Ê½À´Ï´Ù"); 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"Äù½ºÆ®Á¶°ÇÀÌ ¸ÂÁö¾Ê½À´Ï´Ù"); 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 } } // Äù½ºÆ® Ãß°¡ 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"Äù½ºÆ® Ãß°¡ : %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û SendQuestRefresh(RefreshType::ADD_QUEST, nQuestID); m_pSession->GetDBConnection()->QueryAddQuest(m_pSession, nEmptyIdx, m_pQuest->Quest[nEmptyIdx]); // µðºñÀúÀå m_pSession->GetEventSystem()->OnEvent( EventSystem::OnQuestGain, 1, EventSystem::QuestID, nQuestID ); return 1; } // ÀÌ ÇÔ¼ö¿¡¼­ ¸ðµç Äù½ºÆ® ³¡ÀåÀ» º»´Ù!(ÀϺΠÄù´Â ForceCompleteQuest·Î ó¸®ÇÑ´Ù.) // ÀÏ´Ü ÀýÂ÷½ÄÀ¸·Î ¸¸µé¾î¾ß ÇÒ°Í °°¾Æ¼­ ´ÙÀ½¿¡ ¼Ò½º º¸½Ã´Â ºÐ¿¡°Ô´Â Á˼Û! // 0. º¸»ó¾ø´Â Äù½ºÆ® ó¸® // 1. º¸»ó°Ë»ç // 2. Äù½ºÆ® °Ë»ç // 3. Äù½ºÆ® Á¾·á ¸¶Å· // 4. Äù½ºÆ® »èÁ¦ // 5. º¸»óó¸® 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 // ¹Ýº¹Äù½ºÆ® ¿©ºÎ¿¡ ´ëÇØ¼­ LUA½ºÅ©¸³Æ®°ªÀ» ½Å·ÚÇÏÁö ¸»°í QuestTable Á¤º¸¸¸À» ½Å·ÚÇÑ´Ù. 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. º¸»óÀÌ ¾ø´Â Äù½ºÆ®Ã³¸®(¸¶Å·->¿Ï·á) if(m_RewardQuestID == 0 && m_PacketReward.nIndex == 0 ) { // ¹Ýº¹Äù½ºÆ®´Â ¸¶Å·ÇÏÁö ¾Ê´Â´Ù. if(bRepeat == false) MarkingCompleteQuest(nQuestID); return CompleteQuest(nQuestID, bDelPlayList, bRepeat); } //-------------------------------------------------------------------------------------------------------------------------- // 1. º¸»ó°Ë»ç // ¼±ÅÃÀ妽º°Ë»ç(º¸»ó°ü·ÃAPI¿¡¼­ ¼¼ÆÃÇϴº¯¼ö¿Í Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¿À´ÂÆÐŶ°ªÀ» ºñ±³ÇÏ¿© ¿¹¿Üó¸®ÇÑ´Ù) #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 // ÃÖ´ë ÄÚÀÎ È®ÀÎ 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. Äù½ºÆ® °Ë»ç 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) // Äù½ºÆ® ¿Ï·á ½ºÅÜ °ËÁõ if( GetQuestStep(nQuestID) != m_QuestReward.nQuestStep ) { m_pSession->SendQuestResult(ERROR_QUEST_REWARD_FAIL); return -1; } #endif //-------------------------------------------------------------------------------------------------------------------------- // 3. Äù½ºÆ® ¿Ï·á ¸¶Å· std::wstring wszMsg; // ¹Ýº¹Äù½ºÆ®ÀÏ °æ¿ì ¸¶Å·ÇÏÁö ¾Ê´Â´Ù. if(bRepeat == false) MarkingCompleteQuest(nQuestID); //-------------------------------------------------------------------------------------------------------------------------- // 4. Äù½ºÆ® »èÁ¦ CompleteQuest(nQuestID, bDelPlayList, bRepeat); //-------------------------------------------------------------------------------------------------------------------------- // 5. º¸»óó¸® 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 ) { // ÁøÇàÁßÀÎ Äù½ºÆ®°¡ ¾Æ´Ô return -2; } #ifndef _FINAL_BUILD // Äù½ºÆ® ¿Ï·á ½ÃŲÈÄ std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¿Ï·á : %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // ÇöÀç Ç÷¹ÀÌ Äù½ºÆ® ¸ñ·Ï¿¡¼­ Á¦°Å if( bDelPlayList ) { _RemoveQuest(nQuestID, true, bRepeat); // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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) { ///////////////////////////////////////////////////////////////// //¹æ¾î ÄÚµå ÀÔ´Ï´Ù. ½ºÅ©¸³Æ® ´Ü¿¡¼­ È£ÃâÀÌ µÇ±â ¶§¹®ÀÔ´Ï´Ù. 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 ) { // ÁøÇàÁßÀÎ Äù½ºÆ®°¡ ¾Æ´Ô return -2; } #ifndef _FINAL_BUILD // Äù½ºÆ® ¿Ï·á ½ÃŲÈÄ std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¿Ï·á ¸¶Å·!: %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // ¿©±â¼­ ¿Ï·áµÈ ¸ñ·Ï¿¡ Ãß°¡ ÇØÁØ´Ù. SetCompleteQuestFlag(nQuestID, true); if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID)) AddCompletedPeriodQuest(nQuestID); // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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) { // ÇöÀç ÁøÇà ÁßÀÎ Äù½ºÆ®ÀÎÁö ¿©ºÎ´Â »ó°ü ¾øÀ½ if(bDoMark) { #ifndef _FINAL_BUILD // Äù½ºÆ® ¿Ï·á ½ÃŲÈÄ std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¿Ï·á ¸¶Å·!: %d" , nQuestID ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // ¿©±â¼­ ¿Ï·áµÈ ¸ñ·Ï¿¡ Ãß°¡ ÇØÁØ´Ù. SetCompleteQuestFlag(nQuestID, true); if (g_pPeriodQuestSystem->IsPeriodQuest(nQuestID)) AddCompletedPeriodQuest(nQuestID); // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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"Äù½ºÆ® ¿Ï·á¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.\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); // ¾îÂ÷ÇÇ ¼ÒÀ¯ÇÏÁö ¾ÊÀº Äù½ºÆ® À̹ǷΠŬ¶óÀÌ¾ðÆ®¿¡ Äù½ºÆ® ¿Ï·á Á¤º¸´Â ¾Êº¸³»µµ µÊ ??? } 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 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } return m_pQuest->Quest[nSlot].nQuestStep; } int CDNUserQuest::_RemoveQuest(int nQuestID, bool bComplete, bool bRepeat) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } #if defined(_VILLAGESERVER) UINT nUserID = m_pSession->GetObjectID(); #elif defined(_GAMESERVER) UINT nUserID = m_pSession->GetSessionID(); #endif //--------------------------------------------------------------------------------------------- { // ¿©±â´Â Äù½ºÆ®¾ÆÀÌÅÛ Áö¿ì´Â°Å std::set questItemSet; g_pDataManager->GetQuestItemSet(nQuestID, questItemSet); // Ãë¼ÒÇÏ´Â Äù½ºÆ®¿Í °ü·ÃµÈ ½Éº¼Àº ¸ðµÎ Áö¿ò std::set::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 º¸´Ù ÀÛ´Ù¸é ¿¡·¯. //else return nCount; } } // Äù½ºÆ® Áö¿ò 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"Äù½ºÆ® Á¦°Å : %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 ) // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -1; // Äù½ºÆ® ½ºÅÜ °»½ÅÇϰí.. m_pQuest->Quest[nSlot].nQuestStep = nQuestStep; m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® Àú³Î ½ºÅÜ º¯°æ : %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 // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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ÀúÀå 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 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -1; } // Äù½ºÆ® ½ºÅÜ °»½ÅÇϰí.. m_pQuest->Quest[nSlot].nQuestStep = nQuestStep; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ½ºÅÜ º¯°æ : %d step: %d" , nQuestID, (int)nQuestStep ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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ÀúÀå 100128 return 1; } short CDNUserQuest::GetQuestStep(int nQuestID) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } // Äù½ºÆ® ½ºÅÜ °»½ÅÇϰí.. 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 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -1; } // Äù½ºÆ® ½ºÅÜ °»½ÅÇϰí.. m_pQuest->Quest[nSlot].cQuestJournal = nJournalStep; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® Àú³Î ½ºÅÜ º¯°æ : %d step: %d" , nQuestID, (int)nJournalStep ); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif // _FINAL_BUILD // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û SendQuestRefresh(RefreshType::REFRESH_JOURNAL, nQuestID); m_pSession->GetDBConnection()->QueryModQuest(m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // dbÀúÀå 100128 return 1; } int CDNUserQuest::GetJournalStep(int nQuestID) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } // Äù½ºÆ® ½ºÅÜ °»½ÅÇϰí.. 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)) { // Äù½ºÆ® ¸Þ¸ð À妽º ¹üÀ§¸¦ ¹þ¾î³² DN_RETURN(-3); } int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. DN_RETURN(-2); } // Äù½ºÆ® ¸Þ¸ð °»½Å m_pQuest->Quest[nSlot].nMemo[nMemoIndex] = nVal; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¸Þ¸ð º¯°æ : %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ÀúÀå 20100128 return 1; } TP_QUESTMEMO CDNUserQuest::GetQuestMemo(int nQuestID, char nMemoIndex) { if(!CHECK_LIMIT(nMemoIndex, QUESTMEMOMAX)) { // Äù½ºÆ® ¸Þ¸ð À妽º ¹üÀ§¸¦ ¹þ¾î³² DN_RETURN(-3); } int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. 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)) { // Äù½ºÆ® ¸Þ¸ð À妽º ¹üÀ§¸¦ ¹þ¾î³² DN_RETURN(LONG_MIN); } int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. DN_RETURN(LONG_MIN); } // Äù½ºÆ® ¸Þ¸ð Áõ°¡ TP_QUESTMEMO nRetVal = ++m_pQuest->Quest[nSlot].nMemo[nMemoIndex]; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¸Þ¸ð Áõ°¡ : %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ÀúÀå 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)) { // Äù½ºÆ® ¸Þ¸ð À妽º ¹üÀ§¸¦ ¹þ¾î³² DN_RETURN(LONG_MAX); } int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. DN_RETURN(LONG_MAX); } // Äù½ºÆ® ¸Þ¸ð °¨¼Ò TP_QUESTMEMO nRetVal = --m_pQuest->Quest[nSlot].nMemo[nMemoIndex]; #ifndef _FINAL_BUILD // À̰ŠŬ¶óÀÌ¾ðÆ® ÇÑÅ×µµ ¾Ë·ÁÁà¾ß °»½ÅµÉÅÙµ¥. std::wstring wszMsg; wszMsg = FormatW( L"Äù½ºÆ® ¸Þ¸ð °¨¼Ò : %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ÀúÀå 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 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } if( nCountingSlot < 0 || nCountingSlot >= QUEST_EXTRACOUNT_MAX) { return -3; } // °¢°¢ÀÇ º¯¼öÀÇ ¹üÀ§ Ãʰú üũ 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ÀúÀå 20100128 pItem = m_pSession->GetItem(); // ¾ÆÀÌÅÛ Ä«¿îÆÃÀ» ¼¼¾î¾ß ÇÏ´Â °æ¿ì¿¡ if( nCountingType == CountingType_Item && pItem ) { // ÀÌ¹Ì Àκ¥Å丮¿¡ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛÀ̶ó¸é int nIdx = pItem->GetInventoryItemCount( nCountingIndex ); if( nIdx > 0 ) { OnAddItem(nCountingIndex, nIdx); } // ȤÀº ÀÌ¹Ì Äù½ºÆ®Àκ¥Å丮¿¡ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛÀÏ °æ¿ì¶ó¸é nIdx = pItem->GetQuestInventoryItemCount( nCountingIndex ); if( nIdx > 0 ) { OnAddItem(nCountingIndex,nIdx ); } } // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID); return 1; } int CDNUserQuest::ClearCountingInfo(int nQuestID) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. return -2; } ZeroMemory( &(m_pQuest->Quest[nSlot].Extra), ExtraSize); m_pSession->GetDBConnection()->QueryModQuest( m_pSession, nSlot, m_pQuest->Quest[nSlot], DBDNWorldDef::QuestStatusCode::Progress); // dbÀúÀå 20100128 // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û SendQuestRefresh(RefreshType::REFRESH_COUNTING, nQuestID); return 1; } int CDNUserQuest::IsAllCompleteCounting(int nQuestID) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. 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 ) { // Çϳª¶óµµ ¸ñÇ¥¸¦ ´Ù ¸øÃ¤¿î°Ô ÀÖÀ» °æ¿ì if( pCount[j].nCnt < pCount[j].nTargetCnt ) { return -3; } else if( pCount[j].nCnt == pCount[j].nTargetCnt ) { CompleteAllCounting = true; } } } // ÇöÀç Äù½ºÆ®ÀÇ Ä«¿îÆÃ Á¶°ÇÀÌ ÀüºÎ ¸ÂÀ»¶§ 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.> º» ¸Þ¼­µåÀÇ ·çƾ ¸Ç ¾Æ·¡ºÎºÐ¿¡ TQuest::Extra ¿¡ °»½ÅÀÌ ÇÊ¿äÇÑ °æ¿ì DB ¿¡ Àϰý ±â·ÏÇÏ´Â ºÎºÐÀÌ ÀÖÀ¸¹Ç·Î ·çƾ Áß°£¿¡ return ÇÏÁö ¾Êµµ·Ï ÁÖÀÇ ¿ä¸Á bool bCounting[MAX_PLAY_QUEST] = {0,}; bool bComplete[MAX_PLAY_QUEST] = {0,}; bool bModifyQuestExtra[MAX_PLAY_QUEST] = { false, }; // ¸ó½ºÅ͸¦ Á׿´À»¶© ¸ó½ºÅÍ Ä«¿îÆÃÀ» Áõ°¡ ½ÃŲ´Ù. 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++ ) { // Ä«¿îÆÃ ÇÒ Å¸ÀÔÀÌ ¸ó½ºÅÍ À̰í bool bNeedContinue = false; bool bNeedCount = true; // Ä«¿îÆÃ ŸÀÔÀÌ ³»°¡ Á×ÀÎ ³à¼®¸¸ Ä«¿îÆÃ ÇÒ¶§ ³»°¡ ¸ó½ºÅ͸¦ Á׿´À»¶§. if( pCount[j].cType == CountingType_MyMonsterKill && nCountingType == CountingType_MyMonsterKill ) { bNeedContinue = false; } // Àüü Ä«¿îÆÃÀ» ÇÏ°Ô ¼¼ÆÃ µÇ¾îÀÖ°í ¸ó½ºÅͰ¡ ´©±º°¡¿¡ ÀÇÇØ Á×¾úÀ»¶§( ³ª¸¦ Æ÷ÇÔÇÑ ) else if( pCount[j].cType == CountingType_AllMonsterKill && nCountingType == CountingType_AllMonsterKill ) { bNeedContinue = false; } // ¾ÆÀÌÅÛ else if( pCount[j].cType == CountingType_Item && nCountingType == CountingType_Item ) { bNeedContinue = false; } /* // ½Éº¼ ¾ÆÀÌÅÛ 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; } // ±×¿Ü °æ¿ì¶ó¸é Ä«¿îÆÃ ÇÏÁö ¾Ê´Â´Ù. else { bNeedContinue = true; } if( bNeedContinue ) continue; //±× À妽º À϶§. Áõ°¡ ½ÃŲ´Ù. if( pCount[j].nIndex == nCountItemID ) { #if defined( PRE_MOD_QUEST_COUNTING ) if( pCount[j].nCnt < pCount[j].nTargetCnt ) // Ä«¿îÆ® ´ë»óÀÌ ¿©·¯°³ À̰í, ÁöÁ¤ÇÑ Ä«¿îÆ® ÀÌ»ó ±â·Ï ÇÒ °æ¿ì ÁøÇà·üÀÌ À߸ø Ç¥±âµÈ´Ù. #else // #if defined( PRE_MOD_QUEST_COUNTING ) // OnCounting¿¡ µû¶ó ´ÙÀ½ ÁøÇà¿¡ ¹®Á¦°¡ µÉ °æ¿ì¸¦ °í·ÁÇÏ¿© Á¶°ÇÀ» Á¦°ÅÇÑ´Ù. #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) // Ȥ½Ã ¸ð¸£´Ï ¾ÆÀÌÅÛ Ä«¿îÆ®¸¸ üũÇÕ´Ï´Ù. pCount[j].nCnt += nItemCount; else #endif //#if defined(PRE_FIX_QUEST_ITEM_ONCOUNT) ++pCount[j].nCnt; bModifyQuestExtra[i] = true; } // ½ºÅ©¸³Æ®¸¦ È£ÃâÇØÁØ´Ù. 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 // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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À» È£ÃâÇÏÁö ¾Ê¾Ò´Ù¸é È£ÃâÇÏÁö ¾Ê´Â´Ù. #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; // ½ºÅ©¸³Æ®¸¦ È£ÃâÇØÁØ´Ù. 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 // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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 ) { // ½ºÅ©¸³Æ®¸¦ È£ÃâÇØÁØ´Ù. 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 // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½ÅÇ϶ó°í Äù½ºÆ® ±¸Á¶Ã¼ Àü¼Û 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ÀúÀå 100128 } } } // ³»°¡ ¸ó½ºÅ͸¦ Á׿´À»¶§. void CDNUserQuest::OnKillMonster(int nMonsterID) { OnCounting(CountingType_MyMonsterKill, nMonsterID); } // ¸ó½ºÅͰ¡ Á×¾úÀ»‹š. void CDNUserQuest::OnDieMonster(int nMonsterID) { OnCounting(CountingType_AllMonsterKill, nMonsterID); } // ¾ÆÀÌÅÛÀ» ±¸ÇßÀ»¶§. 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) } // ¾ÆÀÌÅÛÀ» ±¸ÇßÀ»¶§. 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; } } } // »óŰ¡ º¯°æµÈ Äù½ºÆ®Á¤º¸¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °»½Å ½ÃÄÑÁØ´Ù. int CDNUserQuest::SendQuestRefresh(int nRefreshType, int nQuestID) { int nSlot = _FindPlayingQuest(nQuestID); if( nSlot < 0 || nSlot > MAX_PLAY_QUEST ) { // Äù½ºÆ®¸¦ ãÀ»¼ö ¾ø´Ù. 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& 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; } } // ÁøÇàÁßÀÎ ¼­ºê Äù½ºÆ®Áß¿¡ °¡Àå ³ôÀº Äù½ºÆ® ½ºÅÇÀ» ã´Â´Ù. return QuestID; ¾øÀ¸¸é -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++ ) { // ¼­ºêÄù½ºÆ® À̰í, 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; } // Äù½ºÆ® º¸»óÀ» ¼¼ÆÃÇÑ´Ù. 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 ) //¿ø°ÝÄùÀÎ °æ¿ì m_PacketReward °¡ ÀÌ¹Ì ¼³Á¤µÇ¾î ÀÖÀ½. #endif // º¸»óÆÐŶÀ» ÀúÀåÇÒ Àӽõ¥ÀÌÅ͸¦ ÃʱâÈ­ÇÑ´Ù. // uIndex = 0 : º¸»ó ¾øÀ½À¸·Î ±ÔÁ¤ÇÑ´Ù. memset(&m_PacketReward, 0x00, sizeof(m_PacketReward)); } // º¸»óÆÐŶÀ» Àӽ÷ΠÀúÀåÇÑ´Ù. 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); //Ŭ·¡½º °øÅë ¸®¿öµå Á¤º¸¸¸ ó¸®Çϵµ·Ï ¼öÁ¤ 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"Äù½ºÆ® º¸»óÅ×À̺í Á¶È¸½ÇÆÐUserObjID: %d Äù½ºÆ®ID:%d " , nUserID, nQuestID); m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif return false; } // º¸»ó¹ÞÀ» ¼ö ÀÖµµ·Ï µ¥ÀÌÅ͸¦ ¼¼ÆÃÇØÁØ´Ù. 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"¾ÆÀÌÅÛ Áö±Þ ½ÇÆÐ %s: id %d count : %d" , bResult ? L"" : L"½ÇÆÐ", 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) { //-------------------------------------------------------------------------------------------------------------------------- // Àüüº¸»óÀϰæ¿ì 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) // ¸¸¾àÈ£°¨µµ¿Ã¸®´Âº¸»óÀÌ¸é¾ÆÀÌÅÛ¸¸Ç¥½ÃÇØÁÙ»Ó½ÇÁ¦Àκ¥¿¡³ÖÀ¸¸é¾ÈµÈ´Ù. 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) // ¸¸¾à È£°¨µµ ¿Ã¸®´Â º¸»óÀÌ¸é ¾ÆÀÌÅÛ¸¸ Ç¥½ÃÇØÁÙ»Ó ½ÇÁ¦ Àκ¥¿¡ ³ÖÀ¸¸é ¾ÈµÈ´Ù. 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) // ¸¸¾à È£°¨µµ ¿Ã¸®´Â º¸»óÀÌ¸é ¾ÆÀÌÅÛ¸¸ Ç¥½ÃÇØÁÙ»Ó ½ÇÁ¦ Àκ¥¿¡ ³ÖÀ¸¸é ¾ÈµÈ´Ù. 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; //-------------------------------------------------------------------------------------------------------------------------- // ¼±Åú¸»óÀϰæ¿ì case 2: { int nRewardItem[MAILATTACHITEMMAX] = { 0, }; int nClientItemCnt = 0, nClientCashItemCnt = 0; // Ŭ¶óÀÌ¾ðÆ®°¡¸î°³ÀǾÆÀÌÅÛÀ»¼±ÅÃÇØ¼­º¸³Â´ÂÁöÈ®ÀÎÇÑ´Ù. for( int i = 0 ; i < MAILATTACHITEMMAX ; i++ ) { if(bSelectedArray[i]) nClientItemCnt++; if(bSelectedCashArray[i]){ if(pMailData) nRewardItem[i] = pMailData->ItemSNArr[i]; else return; nClientCashItemCnt++; } } // ¿ø·¡¹ÞÀ»¼öÀִ¾ÆÀÌÅÛ°úŬ¶óÀÌ¾ðÆ®°¡¼±ÅÃÇѾÆÀÌÅÛÀǰ¹¼ö°¡´Ù¸£¸é½ÇÆÐ 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 // ¾Æ´Ï¶ó¸éÀÌÁ¦ÁõÁ¤ÇÏÀÚ. if(nClientItemCnt > 0){ for( int i = 0 ; i < QUESTREWARD_INVENTORYITEMMAX ; i++ ) { // ¼±ÅÃÇѾÆÀÌÅÛÀ̸é if( bSelectedArray[i] ) { #if defined(PRE_ADD_NPC_REPUTATION_SYSTEM) // ¸¸¾àÈ£°¨µµ¿Ã¸®´Âº¸»óÀÌ¸é¾ÆÀÌÅÛ¸¸Ç¥½ÃÇØÁÙ»Ó½ÇÁ¦Àκ¥¿¡³ÖÀ¸¸é¾ÈµÈ´Ù. 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) // ¸¸¾à È£°¨µµ ¿Ã¸®´Â º¸»óÀÌ¸é ¾ÆÀÌÅÛ¸¸ Ç¥½ÃÇØÁÙ»Ó ½ÇÁ¦ Àκ¥¿¡ ³ÖÀ¸¸é ¾ÈµÈ´Ù. 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()) { // ¾Æ´Ï¶ó¸éÀÌÁ¦ÁõÁ¤ÇÏÀÚ. 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; } // Äù½ºÆ® Áö¿ì°í int nSlotID = _RemoveQuest(nQuestID, false, false); if(nSlotID == -2) m_pSession->SendRemoveQuest(nSlotID, nQuestID, ERROR_QUEST_NOTFOUND); else // ÁöŸm´Ù°í º¸³»ÀÚ. m_pSession->SendRemoveQuest(nSlotID, nQuestID, ERROR_NONE); #if defined(PRE_ADD_REMOTE_QUEST) if( nSlotID >= 0 && g_pQuestManager->GetQuestType(nQuestID) == QuestType_RemoteQuest ) { //¿ø°ÝÄù¸¦ ¼ö¶ô¹Þ°í Æ÷±âÇÑ °æ¿ì ´Ù½Ã ¼ö¶ô´ë±â ¸®½ºÆ®·Î 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= 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::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); //¸®¼ÂµÇ´Â ÀÏÀÏÄù ¿Ï·á Ç÷¡±× Á¦°Å #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; iGetRemoteQuestData(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) ) { // ¿ø°ÝÄù¸¦ ȹµæÇÒ ¼ö ¾ø´Â °æ¿ì 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; //¹Ýº¹Äù°¡ ¾Æ´Ñ´ë ±ü °æ¿ì ¹ö¸°´Ù. if( IsClearQuest(nQuestID) && pQuest->GetQuestInfo().cRepeatable != 1 ) return false; //ÀÌ¹Ì ÁøÇàÁßÀÎ Äù¸é ¾È´ï if( FindPlayingQuest(nQuestID) >= 0 ) return false; //ÀÌ¹Ì È¹µæÇÑ ¿ø°ÝÄù 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"´õÀÌ»ó ¿ø°ÝÄù½ºÆ®¸¦ ȹµæÇÒ ¼ö ¾ø½À´Ï´Ù. : %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(); //ȹµæµµ ¾ÈÇØ³õ°í Äù½ºÆ® ¹Þ°Ú´Ù°í Çϴ³ѵé(¾îºä¡ ÀǽÉÀ¯Àú) 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(); //ȹµæµµ ¾ÈÇØ³õ°í Äù½ºÆ® Æ÷±âÇϰڴٰí ÇÏ´Â ³Ñµé return; } //ȹµæÇÑ ¿ø°Ý Äù½ºÆ®¸¦ Æ÷±âÇÏ´Â °æ¿ì -> GainList ¿¡ ´Ù½Ã ³Ö¾îÁà¾ß µÈ´Ù(´Ù½Ã ȹµæ °¡´ÉÇÏ°Ô ÇØ¾ß µÇ´Â°Ç°¡??) TRemoteQuestData *pData = g_pDataManager->GetRemoteQuestDataByQuestID(nQuestID); if(pData) { CDNQuest* pQuest = g_pQuestManager->GetQuest(pData->nQuestID); if(!pQuest) return; if(pQuest->GetQuestInfo().cRepeatable != 1) //¹Ýº¹Äù¸é ¾ÈÁö¿ì°í ÀÌ¹Ì µé¾îÀÖÀ½ m_nVecRemoteQuestGainList[pData->GainCondition.cEvent].push_back(pData->nIndex); } } void CDNUserQuest::CompleteRemoteQuest(int nQuestID, CSSelectQuestReward* pPacket) { if(FindRecompenseQuestIndex(nQuestID) < 0) { _DANGER_POINT(); //¿Ï·áµÈ Äù½ºÆ®°¡ ¾Æ´Ô -> ¾îºä¡ ó¸® Çϱâ 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(); //ȹµæÇÑ ¿ø°ÝÄù ¸®½ºÆ® Á¤º¸ ¼ÂÆÃ 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; iGetQuestData(); 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)