Files
2022-10-26 12:25:11 +08:00

604 lines
20 KiB
C++

#include "StdAfx.h"
#include ".\handler_cg_quest.h"
#include ".\QuestManager_Concrete.h"
#include <PacketStruct_CG.h>
#include ".\Quest.h"
#include "RewardManager.h"
#include "Player.h"
#include <FatigueOptionParser.h>
#include "FatigueManager.h"
#include "ChaoState.h"
#include <ItemManager.h>
#include <SCItemSlotContainer.h>
//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<ePHASE_SHIFT>(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) );
}
}