#include "StdAfx.h" #include ".\handler_cg_quest.h" #include ".\QuestManager_Concrete.h" #include #include ".\Quest.h" #include "RewardManager.h" #include "Player.h" #include #include "FatigueManager.h" #include "ChaoState.h" #include #include //C_NA_0_20100520_ACSYSTEM_CHANGED #include "AchievementManager.h" #include "ExtraNPCManager.h" //-------------------------------------------------------------------------------------------------- // changes, f100819.1L const nsPacket::PacketHandlerInfo Handler_CG_QUEST::GetPacketHandlerNodes() { #define HANDLER_NODE_INFO(c, p, phase) { MAKEWORD(c, p), phase, Handler_CG_QUEST::On##p } #define HANDLER_NODE_INFO_EOR() { 0, static_cast(0), NULL } static const nsPacket::PacketHandlerNode handlers_static_[] = { HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_ACCEPT_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_COMPLETE_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_REWARD_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_FAILED_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_ABANDON_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_EVENT_AREA_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(CG_QUEST, CG_QUEST_INCOMPLETE_SYN, PHASE_SERVICE), HANDLER_NODE_INFO_EOR() // end of records }; // BOOST_STATIC_ASSERT(_countof(handlers_static_) >= 1); nsPacket::PacketHandlerInfo return_value = { handlers_static_, _countof(handlers_static_) - 1 }; // return return_value; }; //-------------------------------------------------------------------------------------------------- Handler_CG_QUEST_IMPL( CG_QUEST_ACCEPT_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_ACCEPT_SYN * pRecvMsg = (MSG_CG_QUEST_ACCEPT_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_ACCEPT_SYN)] Not Exist GameField" ); return; } if( !pPlayer->GetChaoState().CanUseFuction( CHAO_USE_QUEST ) ) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_UNABLE_FUNCTION_FOR_CHAOSTATE; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pPlayer->GetBehave() == PLAYER_BEHAVE_UNEXPECTED_WAITING ) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_PLAYER_BEHAVE_UNEXPECTED_WAITING; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pPlayer->GetQuestManager()->IsQuestMax() ) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_CANNOTQUEST_MAXCOUNT; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return ; } QuestManager_Concrete* const questManager = pPlayer->GetQuestManager(); const DWORD curQuestNum = questManager->QuestNum(); const DWORD childQuestNum = questManager->GetChildQuestNum(pRecvMsg->m_QuestCode); const DWORD preQuestNum = curQuestNum + childQuestNum + 1; if( preQuestNum > QUESTPART_PROGR::MAX_QUEST_PROGR_NUM ) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_CANNOTQUEST_MAXCOUNT; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return ; } //{__NA001282_20090206_MODIFY_QUEST_TIME // (lst1024)(090306)ŸÀÓÄù½ºÆ®´Â Çѹø¿¡ Çϳª¸¸ ¹ÞÀ»¼ö ÀÖ´Ù. if( pPlayer->GetQuestManager()->GetProgressTimeQuest() && pPlayer->GetQuestManager()->IsTimeQuest(pRecvMsg->m_QuestCode) ) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_ALREADY_PROGRESS_TIME_QUEST; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } //} #ifdef _NA_20100307_BETAKEY_SYSTEM if(!pPlayer->GetBetaKeyInfo()->CanAbilityContent(questManager->GetBetakey(pRecvMsg->m_QuestCode))) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_CANNOT_BETAKEY; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } #endif //¹ö±× ¼öÁ¤: 5010 (ÀÌ¹Ì Á¸ÀçÇÏ´Â Äù½ºÆ®¸¦ ¶Ç »ý¼ºÇÏ·Á ÇÒ¶§) youngmoon 2009-12-17 Quest * pQuest = pPlayer->GetQuestManager()->CreateQuest( pRecvMsg->m_QuestCode ); if(!pQuest) { MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_EXIST; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); SUNLOG( eCRITICAL_LOG, "[CG_QUEST_ACCEPT_SYN] ÀÌ¹Ì Á¸ÀçÇÏ´Â Äù½ºÆ® Char[%s] QCode[%d]", pPlayer->GetCharName(), pRecvMsg->m_QuestCode ); return; } if( pQuest->GetQuestInfo()->IsChildQuest() ) { pPlayer->GetQuestManager()->DestroyQuest( pRecvMsg->m_QuestCode ); MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_CHILD; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); SUNLOG( eCRITICAL_LOG, "[CG_QUEST_ACCEPT_SYN] Äù½ºÆ® ¼ö¶ô ½ÇÆÐ Char[%s] QCode[%d]", pPlayer->GetCharName(), pRecvMsg->m_QuestCode ); return; } RC::eQUEST_RESULT rt = pPlayer->GetQuestManager()->CanDoAccept( pRecvMsg->m_QuestCode, pPlayer ); if( rt == RC::RC_QUEST_SUCCESS ) { MSG_CG_QUEST_ACCEPT_ACK msg; pPlayer->SendPacket( &msg, sizeof(msg) ); pPlayer->SendAllFieldCollectionInfo(); //__NA001277_090205_NAVI_SYSTEM_SUPPORT__ MSG_CG_QUEST_OBJECT_NAVI_POS_CMD msgNavi; if(pPlayer->GetQuestManager()->MakeInfoQuestNpcNaviStream(&msgNavi, pRecvMsg->m_QuestCode)) pPlayer->SendPacket(&msgNavi, msgNavi.GetSize()); // GAMELOG->LogAction( ACT_QUEST_ACCEPT, pPlayer, NULL, pRecvMsg->m_QuestCode ); } else { pPlayer->GetQuestManager()->DestroyQuest( pRecvMsg->m_QuestCode ); MSG_CG_QUEST_ACCEPT_NAK msg; msg.m_byErrorCode = rt; msg.m_byIsItemResult = 0; pPlayer->SendPacket( &msg, sizeof(msg) ); } } Handler_CG_QUEST_IMPL( CG_QUEST_COMPLETE_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_COMPLETE_SYN * pRecvMsg = (MSG_CG_QUEST_COMPLETE_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_COMPLETE_SYN)] Not Exist GameField" ); return; } RC::eQUEST_RESULT rt = pPlayer->GetQuestManager()->CanDoComplete( pRecvMsg->m_QuestCode, pPlayer ); if( rt == RC::RC_QUEST_SUCCESS ) { MSG_CG_QUEST_COMPLETE_ACK msg; msg.m_QuestCode = pRecvMsg->m_QuestCode; pPlayer->SendPacket( &msg, sizeof(msg) ); } else { // Äù½ºÆ®°ü·Ã ¹ö±×¸¦ À§ÇÑ ·Î±× SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"][CriticalBug] Cannot Complete Quest! Not Exist Or Failed[Player(AID:%d/CID:%d):%s][Quest:%d][ResultCode:%d]", pPlayer->GetUserGuid(), pPlayer->GetCharGuid(), pPlayer->GetCharName(), pRecvMsg->m_QuestCode, rt ); MSG_CG_QUEST_COMPLETE_NAK msg; msg.m_byErrorCode = rt; pPlayer->SendPacket( &msg, sizeof(msg) ); } } Handler_CG_QUEST_IMPL( CG_QUEST_REWARD_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_REWARD_SYN * pRecvMsg = (MSG_CG_QUEST_REWARD_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_REWARD_SYN)] Not Exist GameField" ); return; } if( !pPlayer->GetChaoState().CanUseFuction( CHAO_USE_QUEST ) ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_UNABLE_FUNCTION_FOR_CHAOSTATE; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pPlayer->GetBehave() == PLAYER_BEHAVE_UNEXPECTED_WAITING ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_PLAYER_BEHAVE_UNEXPECTED_WAITING; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } Quest * pQuest = pPlayer->GetQuestManager()->FindQuest( pRecvMsg->m_QuestCode ); if( !pQuest ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_EMPTY; pPlayer->SendPacket( &msg, sizeof(msg) ); // Äù½ºÆ®°ü·Ã ¹ö±×¸¦ À§ÇÑ ·Î±× SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"][CriticalBug] Not Exist Quest[Player(AID:%d/CID:%d):%s][Quest:%d]", pPlayer->GetUserGuid(), pPlayer->GetCharGuid(), pPlayer->GetCharName(), pRecvMsg->m_QuestCode ); //_NA_007909_20141218_SUNLOG_QUESTLIST pPlayer->GetQuestManager()->PrintLogProgressQuestList(); return; } if( pQuest->GetQState() != QS_COMPLETED ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_NOT_COMPLETED_STATE; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pQuest->GetQuestInfo()->IsChildQuest() ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_CANNOTREWARD_CHILDQ; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } DWORD dwNpcCode = pQuest->GetQuestInfo()->GetNPCCode_Reward(); if (0 != dwNpcCode && FALSE == g_ExtraNPCManager.IsLengthCanUseNPC(dwNpcCode, pPlayer)) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_DISTANCE_DIFF_TOO_LONG; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pQuest->CanComplete(pPlayer) != RC::RC_QUEST_SUCCESS ) { pQuest->SetQState( QS_NORMAL ); MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_TOCOMPLETED; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } MONEY PreMoney = pPlayer->GetMoney(); EXPTYPE OldExp = pPlayer->GetExp(); MSG_CG_QUEST_REWARD_ACK msg; const eCHAR_TYPE charType = pPlayer->GetCharType(); const DWORD rewardCode = pQuest->GetRewardCode( charType ); #ifdef __NA_0_STAT_INIT_WHEN_100LEVEL_CHANGEUP //100·¹º§ üÀÎÁö ¾÷ º¸»ó ½Ã¿¡´Â ¿ÊÀ» ¹þ¾î¾ß ÇÑ´Ù. switch( (eSPECIAL_QUEST_REWARD)rewardCode ) { case SPECIAL_REWARD_TYPE_CHANGEUP_100LEVEL_BERSERKER: case SPECIAL_REWARD_TYPE_CHANGEUP_100LEVEL_DRAGON_KNIGHT: case SPECIAL_REWARD_TYPE_CHANGEUP_100LEVEL_SHADOW: case SPECIAL_REWARD_TYPE_CHANGEUP_100LEVEL_VALKYRIE: case SPECIAL_REWARD_TYPE_CHANGEUP_100LEVEL_ELEMENTALIST: { if( !pPlayer->GetItemManager()->IsUnEquipAll() ) { MSG_CG_QUEST_REWARD_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_MUST_UNEQUIP_ALL_ITEM; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } } break; }; #endif RC::eREWARD_RESULT rt; if( pPlayer->GetFatigueManager()->GetItemReward() == TRUE ) rt = g_RewardManager.RewardItem( RewardManager::eREWARD_QUEST, rewardCode, pRecvMsg->m_SelectedItem, pPlayer, msg.m_ItemInfo ); else { msg.m_ItemInfo.m_InvenCount = 0; msg.m_ItemInfo.m_TmpInvenCount = 0; rt = RC::RC_REWARD_SUCCESS; // ÇǷεµ ¶§¹®¿¡ Äù½ºÆ® ¾ÆÀÌÅÛ º¸»óÀ» ¹ÞÁö ¸øÇÏ´Â °æ¿ì¶ó¸é ¿ì¼± ¾ÆÀÌÅÛ ¼º°øÀ¸·Î ó¸®ÇÑ´Ù. } if( rt == RC::RC_REWARD_SUCCESS ) { WORD byExpRatio = pPlayer->GetFatigueManager()->GetExpRatio(); //_KR_0_20091021_FIRENDINVITATION_EXTEND //Äù½ºÆ® º¸»ó °æÇèÄ¡ ºñÀ²À» Áõ°¡ ½ÃŲ´Ù. #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION WORD addExpRatio = pPlayer->GetInvitateFriend().GetAddQuestExpRate(pPlayer->GetField()->GetFieldCode()); //¾îÆ®¸®ºäÆ®¿¡ ÀÇÇÑ Äù½ºÆ® º¸»ó °æÇèÄ¡ ºñÀ² Áõ°¨ Àû¿ë addExpRatio += pPlayer->GetAttr().GetQuestRewardExpRatio(); msg.m_BunusExpRatio = addExpRatio; byExpRatio += addExpRatio; #else // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION byExpRatio += pPlayer->GetInvitateFriend().GetAddQuestExpRate(pPlayer->GetField()->GetFieldCode()); #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION rt = g_RewardManager.RewardExp( rewardCode, pPlayer, msg.m_i64Exp, byExpRatio ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); BYTE byHeimRatio = pPlayer->GetFatigueManager()->GetHeimRewardRatio(); rt = g_RewardManager.RewardHime( rewardCode, pPlayer, msg.m_Money, byHeimRatio ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); #ifdef _NA_1419_20100121_ACCUMULATE_POINT rt = g_RewardManager.RewardAccumulatePoint( rewardCode, pPlayer, msg.m_wAccumulatePoint ); if (rt == RC::RC_REWARD_SUCCESS) { GAMELOG->LogAccumulatePoint(ACCUM_ACQUISITION_QUEST, pPlayer, msg.m_wAccumulatePoint, 0); } #endif rt = g_RewardManager.RewardSkill( rewardCode, pPlayer, msg.m_SkillCode ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); rt = g_RewardManager.RewardChaoTime( rewardCode, pPlayer); ASSERT( rt == RC::RC_REWARD_SUCCESS ); #ifdef _NA_003027_20111013_HONOR_SYSTEM rt = g_RewardManager.RewardReputePoint(rewardCode, pPlayer); ASSERT( rt == RC::RC_REWARD_SUCCESS ); #endif //_NA_003027_20111013_HONOR_SYSTEM //ÇǷεµ ±â´ÉÀ» ²¨¹ö¸®¸é ÇöÀç ÇǷεµ ±¸°£ÀÌ 0Àϼö ÀÖ´Ù. _FATIGUE_TYPE* pFatigue = pPlayer->GetFatigueManager()->GetCurFatigueType(); if( pFatigue ) msg.m_byFatigueType = pFatigue->m_byType; else msg.m_byFatigueType = 0; msg.m_wQuestCode = pQuest->GetQuestCode(); // Send 'MSG_CG_QUEST_REWARD_ACK' Packet pPlayer->SendPacket( &msg, msg.GetSize() ); // º¸»óÀ» ¹Þ´Â ¼ø°£ ¿Ï·á ÇൿÀÌ ÀϾ´Ù. pPlayer->GetQuestManager()->DoReward( pRecvMsg->m_QuestCode, pPlayer ); QUESTPART_COMPL* pCompNum = pPlayer->GetQuestManager()->FindComplQuest(pRecvMsg->m_QuestCode); if( pCompNum && (0xFF == pCompNum->m_Num) ) { //(lst1024)(090611) ¹«ÇÑ ¹Ýº¹Äù¸¦ 255ȸ ÀÌ»óÇÏ´Â À¯Àú°¡ ¸¹¾ÆÁ³´Ù. // Ȥ½Ã ´Ù¸¥ ÀÌÀ¯Àϼö ÀÖÀ¸´Ï ·Î±× ³²±ä´Ù. SUNLOG( eDEV_LOG, "[CG_QUEST_REWARD_SYN] char(%s), guid(%d), Quest(%d), num(%d)", pPlayer->GetCharName(), pPlayer->GetCharGuid(), pRecvMsg->m_QuestCode, pCompNum->m_Num ); } GAMELOG->LogAction( ACT_QUEST_REWARD, pPlayer, NULL, pRecvMsg->m_QuestCode ); if( (msg.m_Money-PreMoney) != 0 ) GAMELOG->LogMoney( MONEY_REWARD_QUEST, pPlayer, (msg.m_Money-PreMoney) ); if( (msg.m_i64Exp-OldExp) != 0 ) GAMELOG->LogExp( EXP_QUEST, pPlayer, msg.m_i64Exp, OldExp ); //C_NA_0_20100520_ACSYSTEM_CHANGED //_NA_001990_ACSYSTEM_ADD pPlayer->GetACManager()->ProcessQuest( pQuest->GetQuestInfo()->GetQuestCode(), pQuest->GetQuestInfo()->GetACCode(), pQuest->GetQuestInfo()->GetACType()); #ifdef _NA_003027_20111013_HONOR_SYSTEM if(pPlayer->GetQuestManager()->IncCompleteQuestCount(pRecvMsg->m_QuestCode)) { WORD normalQ_count, dailyQ_count; pPlayer->GetQuestManager()->GetCompleteQuestCount(normalQ_count, dailyQ_count); pPlayer->GetACManager()->ProcessQuestCount(normalQ_count, dailyQ_count); } #endif //_NA_003027_20111013_HONOR_SYSTEM } else { MSG_CG_QUEST_REWARD_NAK nmsg; nmsg.m_byErrorCode = RC::RC_QUEST_INSUFFICIENT_SPACE; pPlayer->SendPacket( &nmsg, sizeof(nmsg) ); return; } } Handler_CG_QUEST_IMPL( CG_QUEST_FAILED_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_FAILED_SYN * pRecvMsg = (MSG_CG_QUEST_FAILED_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_FAILED_SYN)] Not Exist GameField" ); return; } Quest * pQuest = pPlayer->GetQuestManager()->FindQuest( pRecvMsg->m_QuestCode ); //{__NA001282_20090206_MODIFY_QUEST_TIME // ÇöÀç Äù½ºÆ®ÀÇ failÀº ½Ã°£ ¸¸·á½Ã µé¾î¿Â´Ù. // Update()´Â ¼­¹öÃø¿¡¼­´Â ÁÖ±âÀûÀ¸·Î ÇÏÁö¾Ê´Â´Ù. // ¼­¹öÃø Update()´Â ¿Ï·á °¡´É üũ¿Í failüũ¿¡¼­ ÇÑ´Ù. if( pQuest ) { pQuest->Update(); if( pQuest->GetQState() == QS_FAILED ) { pPlayer->GetQuestManager()->DoFailed(pRecvMsg->m_QuestCode); MSG_CG_QUEST_FAILED_ACK msg; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } } MSG_CG_QUEST_FAILED_NAK msg; msg.m_byErrorCode = 1; pPlayer->SendPacket( &msg, sizeof(msg) ); //} } Handler_CG_QUEST_IMPL( CG_QUEST_ABANDON_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_ABANDON_SYN * pRecvMsg = (MSG_CG_QUEST_ABANDON_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_ABANDON_SYN)] Not Exist GameField" ); return; } Quest * pQuest = pPlayer->GetQuestManager()->FindQuest( pRecvMsg->m_QuestCode ); if( !pQuest || pQuest->GetQuestInfo()->IsChildQuest() ) { MSG_CG_QUEST_ABANDON_NAK msg; msg.m_byErrorCode = 1; pPlayer->SendPacket( &msg, sizeof(msg) ); } else { pQuest->DoAbandon(pPlayer); pPlayer->GetQuestManager()->DestroyQuest( pRecvMsg->m_QuestCode ); MSG_CG_QUEST_ABANDON_ACK msg; msg.m_Force = pRecvMsg->m_Force; pPlayer->SendPacket( &msg, sizeof(msg) ); GAMELOG->LogAction( ACT_QUEST_ABANDON, pPlayer, NULL, pRecvMsg->m_QuestCode ); } } Handler_CG_QUEST_IMPL( CG_QUEST_EVENT_AREA_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_EVENT_AREA_SYN * pRecvMsg = (MSG_CG_QUEST_EVENT_AREA_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; GameField* pField = pPlayer->GetField(); if( !pField ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_EVENT_AREA_SYN)] Not Exist GameField" ); return; } FieldInfo* pFieldInfo = pField->GetFieldInfo(); if( !pFieldInfo ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_EVENT_AREA_SYN)] Not Exist FieldInfo" ); return; } WzSpecialArea* pAreaInfo = pFieldInfo->GetAreaInfo( pRecvMsg->m_AreaID ); if( !pAreaInfo ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_EVENT_AREA_SYN)] Not Exist WzSpecialArea[%d]", pRecvMsg->m_AreaID ); return; } if( FALSE == pPlayer->CorrectPosition(pRecvMsg->m_wvCurPos, WzVector()) ) { MSG_CG_QUEST_EVENT_AREA_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_INCORRECT_POSITION; pPlayer->SendPacket( &msg, sizeof(msg) ); const WzVector& pos = pRecvMsg->m_wvCurPos; SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_EVENT_AREA_SYN)] " "INCORRECT_POSITION X[%d] Y[%d] Z[%d]", pos.x, pos.y, pos.z ); return; } //.// QUEST_AREA_MSG msg; msg.m_AreaID = pAreaInfo->m_wiIdentity; if( !pPlayer->GetQuestManager()->Event(pRecvMsg->m_QuestCode,QUEST_EVENT_AREA,&msg) ) { MSG_CG_QUEST_EVENT_AREA_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_NOT_AREAID; pPlayer->SendPacket( &msg, sizeof(msg) ); SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_EVENT_AREA_SYN)] Not Exist WzSpecialArea" ); return; } //ACK¸Þ½ÃÁö´Â Event¼º°ø ó¸® ·çƾ¿¡¼­. } Handler_CG_QUEST_IMPL( CG_QUEST_INCOMPLETE_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_CG_QUEST_INCOMPLETE_SYN * pRecvMsg = (MSG_CG_QUEST_INCOMPLETE_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) return ; if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, "[Handler_CG_QUEST_IMPL(CG_QUEST_INCOMPLETE_SYN)] Not Exist GameField" ); return; } RC::eQUEST_RESULT rt = RC::RC_QUEST_SUCCESS; Quest *pQuest = pPlayer->GetQuestManager()->FindQuest( pRecvMsg->m_QuestCode ); if ( !pQuest ) { MSG_CG_QUEST_INCOMPLETE_NAK msg; msg.m_byErrorCode = RC::RC_QUEST_EMPTY; pPlayer->SendPacket( &msg, sizeof(msg) ); return; } if( pQuest->GetQState() != QS_COMPLETED ) rt = RC::RC_QUEST_NOT_COMPLETED_STATE; if( rt == RC::RC_QUEST_SUCCESS ) { rt = pPlayer->GetQuestManager()->CanComplete( pRecvMsg->m_QuestCode, pPlayer ); } if( rt == RC::RC_QUEST_SUCCESS ) { MSG_CG_QUEST_INCOMPLETE_ACK msg; msg.m_QuestCode = pRecvMsg->m_QuestCode; pPlayer->SendPacket( &msg, sizeof(msg) ); } else { MSG_CG_QUEST_INCOMPLETE_NAK msg; msg.m_byErrorCode = rt; pPlayer->SendPacket( &msg, sizeof(msg) ); } }