#include "stdafx.h" #include "./GFriendInvitationController.h" // implemented by _KR_0_20091021_FIRENDINVITATION_EXTEND #include "./GameParty/GamePartyOperator.h" #include "./GameParty/NewGamePartyManager.h" #include "ItemManager.h" #include "PacketStruct_DG.h" #include "SolarDateTime.h" GFriendInvitationController::GFriendInvitationController(void) { } GFriendInvitationController::~GFriendInvitationController(void) { } VOID GFriendInvitationController::OnInvitatedFriendListSelectCMD(LPVOID , MSG_BASE * pMsg, WORD) { MSG_AG_EVENT_FRIENDINVITATE_INVITATELIST_CMD* pRecvMsg = (MSG_AG_EVENT_FRIENDINVITATE_INVITATELIST_CMD*)pMsg; Player *pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); SUNLOG( eDEV_LOG, "Rev SendInvitateFriendList Info - GameServer Count[%u] GUID[%u]", pRecvMsg->m_InvitateFriendListInfo.m_byListCount , pRecvMsg->m_dwKey ); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "Not Found User: %u", pRecvMsg->m_InvitateFriendListInfo.m_dwCharGuid ); return; } InvitateFriendInfo::FRIEND_TYPE type = (InvitateFriendInfo::FRIEND_TYPE)(BYTE)pRecvMsg->m_InvitateFriendListInfo.m_FriendSts; switch(pRecvMsg->m_InvitateFriendListInfo.m_FreindAction) { case INVITATEFRIENDLIST_INFO::FRIENDLIST_INIT: { pPlayer->GetInvitateFriend().ClearFriendList(type); pPlayer->GetInvitateFriend().AddFriend(type, pRecvMsg->m_InvitateFriendListInfo.m_GuidList, pRecvMsg->m_InvitateFriendListInfo.m_byListCount); //¸®ÄÝŸÀÓ ¾ò±â RecallProc.SendRecallTimeSelect(pRecvMsg->m_InvitateFriendListInfo.m_dwCharGuid, pPlayer); } break; case INVITATEFRIENDLIST_INFO::FRIENDLIST_DEL: { for(int i = 0 ; i < pRecvMsg->m_InvitateFriendListInfo.m_byListCount; i++) { pPlayer->GetInvitateFriend().RemoveFriend(type, pRecvMsg->m_InvitateFriendListInfo.m_GuidList[i]); //ÆÄƼ³»¿¡ Ä£±¸Ãßõ °ü°è°¡ ÀÖ³ª ? if(pPlayer->GetInvitateFriend().IsInvitateFriendParty()) { pPlayer->GetInvitateFriend().RemoveFriend( InvitateFriendInfo::FRIEND_INVIATEINPARTY, pRecvMsg->m_InvitateFriendListInfo.m_GuidList[i]); } } } break; case INVITATEFRIENDLIST_INFO::FRIENDLIST_ADD: { pPlayer->GetInvitateFriend().AddFriend(type, pRecvMsg->m_InvitateFriendListInfo.m_GuidList, pRecvMsg->m_InvitateFriendListInfo.m_byListCount); } break; } MessageOut( eDEV_LOG, "FRIEND_INVIATEINPARTY Count[%u]", pPlayer->GetInvitateFriend().GetSize(InvitateFriendInfo::FRIEND_INVIATEINPARTY) ); MessageOut( eDEV_LOG, "FRIEND_INVIATE Count[%u]", pPlayer->GetInvitateFriend().GetSize(InvitateFriendInfo::FRIEND_INVIATE) ); MessageOut( eDEV_LOG, "FRIEND_BEINVIATED Count[%u]", pPlayer->GetInvitateFriend().GetSize(InvitateFriendInfo::FRIEND_BEINVIATED) ); } VOID GFriendInvitationController::OnRecallQuestionACK(LPVOID , MSG_BASE * pMsg, WORD) { const MSG_CG_EVENT_INVITATEFRIEND_RECALL_SYN* pRecvMsg = (MSG_CG_EVENT_INVITATEFRIEND_RECALL_SYN*)pMsg; Player* pRecallPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pRecallPlayer ); if( !pRecallPlayer ) { MessageOut( eCRITICAL_LOG, "CG_EVENT_INVITATEFRIEND_RECALL_SYN Not Found Recall User: %u", pRecvMsg->m_dwKey ); return; } Player* pPlayer = PlayerManager::Instance()->FindPlayerByCharKey( pRecvMsg->FriendGUID ); ASSERT( pPlayer ); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "CG_EVENT_INVITATEFRIEND_RECALL_SYN Not Found User: %u", pRecvMsg->FriendGUID ); return; } RecallProc.ReCallUser(pPlayer, pRecallPlayer); } VOID GFriendInvitationController::OnRecallQuestionNAK(LPVOID , MSG_BASE * pMsg, WORD) { SUNLOG( eCRITICAL_LOG, "CMD_CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_NAK" ); const MSG_CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_NAK* pRecvMsg = (MSG_CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_NAK*)pMsg; Player* pPlayer = PlayerManager::Instance()->FindPlayerByCharKey( pRecvMsg->FriendGUID ); ASSERT( pPlayer ); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "OnCG_EVENT_INVITATEFRIEND_RECALL_QUESTION_NAK Not Found User: %u", pMsg->m_dwKey ); return; } RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::FRIEND_REJECT); } VOID GFriendInvitationController::OnRecallSYN(LPVOID , MSG_BASE * pMsg, WORD) { SUNLOG( eDEV_LOG, "CMD_CG_EVENT_INVITATEFRIEND_RECALL_SYN" ); const MSG_CG_EVENT_INVITATEFRIEND_RECALL_SYN* pRecvMsg = (MSG_CG_EVENT_INVITATEFRIEND_RECALL_SYN*)pMsg; Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "CG_EVENT_INVITATEFRIEND_RECALL_SYN Not Found User: %u", pMsg->m_dwKey ); return; } //¹ö±×¼öÁ¤:5847 ¹®»óÇö ÇÊµå ¼­¹ö À̿ܿ¡¼­´Â ¼ÒȯÀ» ±ÝÁöÇÑ´Ù. if (g_pGameServer->GetServerType() != FIELD_SERVER) { RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::OTHERZONE_ME); return; } //¼ÒȯÀ» ¿äûÇÑ Ä£±¸°¡ ³ª¿Í Ä£±¸ÃÊ´ë °ü°èÀÎÁö È®ÀÎÇÑ´Ù. if(!pPlayer->GetInvitateFriend().IsInvitateFriend(pRecvMsg->FriendGUID)) { RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::NOTFOUND_USER); return; } Player* pRecallPlayer = PlayerManager::Instance()->FindPlayerByCharKey( pRecvMsg->FriendGUID ); ASSERT( pRecallPlayer ); if( !pRecallPlayer ) { RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::NOTFOUND_USER); return; } if(!GFriendInvitationController::Instance()->CheckFriendInvitationEvent()) { RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::TERMINATE_EVENT); return; } //¼ÒȯÇÑÁö 1½Ã°£ µÆ´ÂÁö È®ÀÎ if(!RecallProc.IsRecalltimeExpired(pPlayer, pRecallPlayer->GetCharGuid())) { return; } //°°Àº ¼Òȯ ¿äûÀÌ ÀÖ¾ú´ÂÁö È®ÀÎ //¹ö±×¼öÁ¤:5890 ¹®»óÇö 2010-02-05 [¸ðµç±¹°¡°øÅë] Ä£±¸ ¼Òȯ ¿äû ¸Þ½ÃÁö°¡ //È­¸é¿¡ Ãâ·ÂµÈ »óÅ¿¡¼­´Â ´õÀÌ»ó ¼Òȯ ¿äûÀ» º¸³»Áö ¾Ê´Â´Ù. if(RecallProc.IsRequestRecall(pPlayer, pRecallPlayer->GetCharGuid())) { RecallProc.SendRecallFailMsg(pPlayer, MSG_CG_EVENT_INVITATEFRIEND_RECALL_NAK::OTHERREQUESTEXIST); } else { RecallProc.SendRecallQuestionMsg(pPlayer, pRecallPlayer); } } VOID GFriendInvitationController::OnRecallInfoSelectACK(LPVOID , MSG_BASE * pMsg, WORD) { MSG_DG_EVENT_INVITATEFRIEND_RECALLSELECT_ACK* pRecvMsg = (MSG_DG_EVENT_INVITATEFRIEND_RECALLSELECT_ACK*)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if(!pPlayer) { MessageOut( eCRITICAL_LOG, "CMD_DG_EVENT_INVITATEFRIEND_RECALLSELECT_ACK Not Found User Count[%u]", pRecvMsg->m_dwKey ); } else { pPlayer->GetInvitateFriend().InitReCallTime(pRecvMsg); } } VOID GFriendInvitationController::OnRecallInfoSelectNAK(LPVOID , MSG_BASE * pMsg, WORD) { SUNLOG( eCRITICAL_LOG, "[CMD_DG_EVENT_INVITATEFRIEND_RECALLSELECT_NAK" ); } VOID GFriendInvitationController::OnRewardItemUpdateACK(LPVOID , MSG_BASE * pMsg, WORD) { MSG_DG_EVENT_INVITATEFRIEND_REWARDUPDATE_ACK* pRecvMsg = (MSG_DG_EVENT_INVITATEFRIEND_REWARDUPDATE_ACK*)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if(!pPlayer) { MessageOut( eCRITICAL_LOG, "DG_EVENT_INVITATEFRIEND_REWARDUPDATE_ACK Not Found User: %u", pRecvMsg->m_dwKey ); return; } if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, " Not Exist GameField (OnRewardItemUpdateACK)"); return; } ReWardProc.ReceiveRewardItem(pPlayer, pRecvMsg->ReWardType); } VOID GFriendInvitationController::OnRewardItemUpdateNAK(LPVOID , MSG_BASE * pMsg, WORD) { MSG_DG_EVENT_INVITATEFRIEND_REWARDUPDATE_NAK* pRecvMsg = (MSG_DG_EVENT_INVITATEFRIEND_REWARDUPDATE_NAK*)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if(!pPlayer) { MessageOut( eCRITICAL_LOG, "DG_EVENT_INVITATEFRIEND_REWARDUPDATE_NAK Not Found User: %u", pRecvMsg->m_dwKey ); return; } ReWardProc.SendRewardFailMsg(pPlayer, pRecvMsg->m_dwErrorCode); } VOID GFriendInvitationController::OnRewardSYN(LPVOID , MSG_BASE * pMsg, WORD) { SUNLOG( eDEV_LOG, "OnCG_EVENT_INVITATEFRIEND_REWARD_SYN" ); MSG_CG_EVENT_INVITATEFRIEND_REWARD_SYN * pRecvMsg = (MSG_CG_EVENT_INVITATEFRIEND_REWARD_SYN *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey ); ASSERT( pPlayer ); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "OnRewardSYN Not Found User: %u", pRecvMsg->m_dwKey ); return ; } if( !pPlayer->GetField() ) { SUNLOG( eCRITICAL_LOG, " Not Exist GameField (OnRewardSYN)" ); return; } ReWardProc.ReQuestReWardItem(pPlayer, pRecvMsg->FriendGUID, pRecvMsg->ReWardType); } VOID GFriendInvitationController::OnParty_Join(WORD PartyKey, DWORD MemberKey) { CHECK_FRIENDINVITATION_EVENT_RETRUN; Player* pPlayer = PlayerManager::Instance()->FindPlayerByObjKey(MemberKey); ASSERT(pPlayer); if( !pPlayer ) { MessageOut( eCRITICAL_LOG, "OnRewardSYN Not Found User: %u", MemberKey ); return; } static CheckJoinInvitateFriendInParty Opr; Opr.Init(pPlayer); NewGamePartyManager::Instance()->For_eachMembers(PartyKey, Opr); } VOID GFriendInvitationController::OnParty_Leave(WORD PartyKey, DWORD MemberKey) { CHECK_FRIENDINVITATION_EVENT_RETRUN; Player* pPlayer = PlayerManager::Instance()->FindPlayerByObjKey(MemberKey); // ÆÄƼ¿øÀÌ ºñÁ¤»óÀûÀÎ Á¢¼Ó Á¾·á·Î ²÷±â´Â °æ¿ì pPlayer°¡ NULLÀÏ ¼ö ÀÖÀ½ if( !pPlayer ) { return; } static CheckLeaveInvitateFriendInParty Opr; Opr.Init(pPlayer); NewGamePartyManager::Instance()->For_eachMembers(PartyKey, Opr); } VOID GFriendInvitationController::OnAGRecallAck(LPVOID , MSG_BASE * pMsg, WORD ) { const MSG_AG_EVENT_RECALL_ACK* pRecvMsg = (const MSG_AG_EVENT_RECALL_ACK*)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if(!pPlayer) { MessageOut( eCRITICAL_LOG, "AG_EVENT_RECALL_ACK Not Found User [%u]", pRecvMsg->m_dwKey ); } else { RecallProc.ReCallACK(pPlayer, pRecvMsg->CalleeGUID); } } VOID GFriendInvitationController::OnAGRecallNak(LPVOID , MSG_BASE * pMsg, WORD ) { const MSG_AG_EVENT_RECALL_NAK* pRecvMsg = (const MSG_AG_EVENT_RECALL_NAK*)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); ASSERT( pPlayer ); if(!pPlayer) { MessageOut( eCRITICAL_LOG, "AG_EVENT_RECALL_NAK Not Found User [%u]", pRecvMsg->m_dwKey ); } else { RecallProc.ReCallNAK(pPlayer, pRecvMsg->ErrorCode); } } VOID GFriendInvitationController::GetInvitatedFrindInfo(const Player* player, MSG_BASE * pMsg, const eSERIALIZE eType) { MSG_DG_CHARINFO_INVITATEDFRIEND_CMD* InvitatedFriend_Info = (MSG_DG_CHARINFO_INVITATEDFRIEND_CMD*)pMsg; if( eType == SERIALIZE_LOAD ) { DWORD friend_guid[MAX_FRIEND_STAT_NUM]; InvitatedFriend_Info->friend_list_.friend_count_ = 0; const BYTE friend_type_count = 2; InvitateFriendInfo::FRIEND_TYPE friend_type[friend_type_count] = {InvitateFriendInfo::FRIEND_BEINVIATED, InvitateFriendInfo::FRIEND_INVIATE}; for (int type_index = 0 ; type_index < friend_type_count ; type_index++) { UINT friendlist_count; // (CHANGES) (f100515.2L) change the interface usage specification friendlist_count = player->GetInvitateFriend().GetFriendList( friend_type[type_index], friend_guid, _countof(friend_guid)); for(int i = 0 ; i < friendlist_count ; i++) { InvitatedFriend_Info->friend_list_.friend_[InvitatedFriend_Info->friend_list_.friend_count_].friend_state_ = friend_type[type_index]; InvitatedFriend_Info->friend_list_.friend_[InvitatedFriend_Info->friend_list_.friend_count_++].character_guid_ = friend_guid[i]; } } } else if( eType == SERIALIZE_STORE ) { player->GetInvitateFriend().ClearAllFriendList(); for(int i = 0 ; i < InvitatedFriend_Info->friend_list_.friend_count_ ; i++) { player->GetInvitateFriend().AddFriend(static_cast( InvitatedFriend_Info->friend_list_.friend_[i].friend_state_), InvitatedFriend_Info->friend_list_.friend_[i].character_guid_); } } else { ASSERT("·Îµùµµ ¾Æ´Ï°í ÀúÀåµµ ¾Æ´Ï°í~ ÀÖÀ»¼ö ¾ø´ÂÀÏ..."); } }