#include "stdafx.h" #include "Handler_FromClient.h" // #include #include // #include #include #include #include #include //_NA_20110630_BATTLE_ZONE_RENEWAL #include #include #include "..\Party\PartyRoom.h" #include "BattlezoneMissionTreeParser.h" // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include "../ChaosZoneSystem/AgentChaosZoneManager.h" #include //ÆÄƼ°¡ÀÔ ¿äû HANDLER_CG_IMPL( CG_PARTY_JOIN_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_JOIN_SYN* recv_msg = (MSG_CG_PARTY_JOIN_SYN*)pMsg; //ÆÄƼ¿äûÀÚ User* request_user = pUser; //ÆÄƼ¿äû ´ë»ó TCHAR target_user_name[MAX_CLIENT_CHARNAME_LENGTH]={0,}; _tcsncpy(target_user_name, recv_msg->m_TargetCharName, _countof(target_user_name)); target_user_name[_countof(target_user_name) - 1] = '\0'; User* target_user = UserManager::Instance()->FindUserForCharName(target_user_name); DWORD party_member_count = AgentPartyManager::Instance()->GetMemberNum(request_user->GetPartyState().GetPartyKey()); //ÆÄƼ À¯¹« »ó°ü¾øÀÌ ÃÖ¼ÒÄ¡ 0, ÃÖ´ëÄ¡ 10 À¯Áö...ÇÒ °Í. BOOLEAN is_acceptable_count = party_member_count < MAX_PARTYMEMBER_NUM; if (target_user && is_acceptable_count) { //_NA_0_20110210_INVITE_PARTY_BUG RC::ePARTY_RESULT result = AgentPartyManager::Instance()->RequestInviteParty(request_user, target_user); if (result != RC::RC_PARTY_SUCCESS) { MSG_CG_PARTY_JOIN_NAK nak_msg; nak_msg.m_byErrorCode = result; request_user->SendPacket(&nak_msg, sizeof(nak_msg)); return; } MSG_AG_PARTY_JOIN_SYN send_msg; { //_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG send_msg.m_dwFlag = MSG_AG_PARTY_JOIN_SYN::ENABLE_REQUEST; send_msg.m_dwReqMemberKey = request_user->GetPlayerKey(); send_msg.m_dwRecvMemberKey = target_user->GetPlayerKey(); } request_user->SendToLinkedServer(&send_msg, sizeof(send_msg)); } else { MSG_CG_PARTY_JOIN_NAK nak_msg; { nak_msg.m_byErrorCode = is_acceptable_count ? RC::RC_PARTY_PLAYER_NOTEXIST : RC::RC_PARTY_PARTYMEMBER_NUM_FULL; } request_user->SendPacket(&nak_msg, sizeof(nak_msg)); return; } } // ÆÄƼ°¡ÀÔ ¼ö¶ô HANDLER_CG_IMPL( CG_PARTY_JOIN_RESPONSE_ACK ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_JOIN_RESPONSE_ACK* recv_msg = static_cast(pMsg); // ÆÄƼ¿äû ´ë»ó User* response_user = pUser; //_NA_0_20110210_INVITE_PARTY_BUG RC::ePARTY_RESULT result = AgentPartyManager::Instance()->ResponseInviteParty(response_user); if (result != RC::RC_PARTY_SUCCESS) { MSG_CG_PARTY_JOIN_NAK nak_message; nak_message.m_byErrorCode = result; response_user->SendPacket(&nak_message, sizeof(nak_message)); return; } // ÆÄƼ¿äûÀÚ UserManager* user_manager = UserManager::Instance(); User* request_user = user_manager->GetUserByObjKey(response_user->GetPartyState().GetOtherMemberKey()); if (request_user == NULL) { return; } //_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG MSG_AG_PARTY_JOIN_SYN msg; msg.m_dwFlag = MSG_AG_PARTY_JOIN_SYN::ENABLE_RESPONSE; msg.m_dwReqMemberKey = request_user->GetPlayerKey(); msg.m_dwRecvMemberKey = response_user->GetPlayerKey(); request_user->SendToLinkedServer(&msg, sizeof(msg)); } // ÆÄƼ°¡ÀÔ °ÅÀý HANDLER_CG_IMPL( CG_PARTY_JOIN_RESPONSE_NAK ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_JOIN_RESPONSE_NAK* recv_msg = (MSG_CG_PARTY_JOIN_RESPONSE_NAK*)pMsg; // ÆÄƼ¿äû ´ë»ó User* pResponseUser = (User*)pUser; //_NA_0_20110210_INVITE_PARTY_BUG RC::ePARTY_RESULT result = AgentPartyManager::Instance()->ResponseInviteParty(pResponseUser); if (result != RC::RC_PARTY_SUCCESS) { MSG_CG_PARTY_JOIN_NAK nak_message; nak_message.m_byErrorCode = result; pResponseUser->SendPacket(&nak_message, sizeof(nak_message)); return; } // ÆÄƼ¿äûÀÚ User* pRequestUser = UserManager::Instance()->GetUserByObjKey( pResponseUser->GetPartyState().GetOtherMemberKey() ); if( !pRequestUser ) { return; } // »ó´ë¹æ UserKey¸¦ ÃʱâÈ­ÇÑ´Ù. AgentPartyManager::Instance()->ResetOtherMemberKey( pRequestUser, pResponseUser ); // »ó´ë¹æÀÌ ÆÄƼ¿äû¿¡ °ÅÀýÇßÀ½À» ¾Ë¸°´Ù. MSG_CG_PARTY_JOIN_NAK msgNAK; msgNAK.m_byErrorCode = RC::RC_PARTY_REJECT_INVITEMENT; pRequestUser->SendPacket( &msgNAK, sizeof(msgNAK) ); } // ÆÄƼŻÅð ¿äû HANDLER_CG_IMPL( CG_PARTY_LEAVE_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_LEAVE_SYN* pRecvMsg = (MSG_CG_PARTY_LEAVE_SYN*)pMsg; User* pLeaveUser = (User*)pUser; // (WAVERIX) Àӽà ÄÚµå - Áß±¹¿¡¼­ ¹ß»ýÇÑ ·Îºñ¿¡¼­ÀÇ ÆÄƼ Å»Åð¹®Á¦ ¹æÁö ¸ñÀû if( pLeaveUser->GetZoneType() == eZONETYPE_LOBBY || (ePRS_AT_ZONE != (ePRS_AT_ZONE & pLeaveUser->GetZoneState())) ) { MSG_CG_PARTY_LEAVE_NAK msgNAK; msgNAK.m_byErrorCode = RC::RC_PARTY_INVALID_ZONESTATE; pLeaveUser->SendPacket( &msgNAK, sizeof(msgNAK) ); return; } // ÆÄƼŻÅð Á¶°ÇÀÌ µÇ´ÂÁö üũÇÑ ÈÄ Ã³¸®ÇÑ´Ù. RC::ePARTY_RESULT rcResult = AgentPartyManager::Instance()->LeaveParty( pLeaveUser, eREASON_LEAVE_PARTY_INTEND ); if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_LEAVE_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pLeaveUser->SendPacket( &msgNAK, sizeof(msgNAK) ); } } // °­Á¦Ãß¹æ ¿äû HANDLER_CG_IMPL( CG_PARTY_FORCED_EXPULSION_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_FORCED_EXPULSION_SYN* pRecvMsg = (MSG_CG_PARTY_FORCED_EXPULSION_SYN*)pMsg; User* pMaster = (User*)pUser; User* pLeaveUser = UserManager::Instance()->GetUserByObjKey( pRecvMsg->m_dwObjKey ); if( !pLeaveUser ) return; // ÆÄƼŻÅð Á¶°ÇÀÌ µÇ´ÂÁö üũÇÑ ÈÄ Ã³¸®ÇÑ´Ù. RC::ePARTY_RESULT rcResult = AgentPartyManager::Instance()->ForcedExpulsion( pMaster, pLeaveUser ); if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_LEAVE_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pMaster->SendPacket( &msgNAK, sizeof(msgNAK) ); } } // ÆÄƼÀå º¯°æ ¿äû HANDLER_CG_IMPL( CG_PARTY_CHANGE_MASTER_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_CHANGE_MASTER_SYN* pRecvMsg = (MSG_CG_PARTY_CHANGE_MASTER_SYN*)pMsg; User* pMaster = (User*)pUser; RC::ePARTY_RESULT rcResult = RC::RC_PARTY_SUCCESS; User* pNextMaster = UserManager::Instance()->GetUserByObjKey( pRecvMsg->m_dwObjKey ); if( !pNextMaster ) { rcResult = RC::RC_PARTY_NEXTMASTER_NOTEXIST; goto ERROR_RESULT; } if( !AgentPartyManager::Instance()->IsMaster( pMaster ) ) { rcResult = RC::RC_PARTY_ISNOT_MASTEROFPARTY; goto ERROR_RESULT; } KEYTYPE zoneKey = pMaster->GetZoneKey(); ZoneInterface* pZone = g_ZoneManager.FindZone(zoneKey); if(pZone == 0) { rcResult = RC::RC_PARTY_CANNOT_CHANGE_MASTER; goto ERROR_RESULT; } rcResult = AgentPartyManager::Instance()->ChangeMaster( pMaster->GetPartyState().GetPartyKey(), pNextMaster->GetPlayerKey() ); if(rcResult == RC::RC_PARTY_SUCCESS) static_cast(pZone)->ChangeSpecialType(true, pNextMaster); ERROR_RESULT: if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_CHANGE_MASTER_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pMaster->SendPacket( &msgNAK, sizeof(msgNAK) ); } } // ÆÄÆ¼ÇØÃ¼ ¿äû HANDLER_CG_IMPL( CG_PARTY_DESTROY_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_DESTROY_SYN* pRecvMsg = (MSG_CG_PARTY_DESTROY_SYN*)pMsg; User* pMaster = (User*)pUser; RC::ePARTY_RESULT rcResult = RC::RC_PARTY_SUCCESS; if( !AgentPartyManager::Instance()->IsMaster( pMaster ) ) { rcResult = RC::RC_PARTY_ISNOT_MASTEROFPARTY; goto ERROR_RESULT; } rcResult = AgentPartyManager::Instance()->DestroyParty( pMaster->GetPartyState().GetPartyKey() ); ERROR_RESULT: if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_DESTROY_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pMaster->SendPacket( &msgNAK, sizeof(msgNAK) ); } } // ÆÄƼŸ°ÙÁöÁ¤ ¿äû HANDLER_CG_IMPL( CG_PARTY_SELECT_TARGET_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_SELECT_TARGET_SYN* pRecvMsg = (MSG_CG_PARTY_SELECT_TARGET_SYN*)pMsg; User* pMaster = (User*)pUser; // ÆÄƼŸ°ÙÁöÁ¤ Á¶°ÇÀÌ µÇ´ÂÁö üũÇÑ ÈÄ Ã³¸®ÇÑ´Ù. RC::ePARTY_RESULT rcResult = AgentPartyManager::Instance()->SelectTarget( pMaster, pRecvMsg->m_dwObjectKey ); if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_SELECT_TARGET_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pMaster->SendPacket( &msgNAK, sizeof(msgNAK) ); } } // ¹Ì´Ï¸ÊÆ÷ÀÎÆÃ HANDLER_CG_IMPL( CG_PARTY_MINIMAP_POINTING_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_MINIMAP_POINTING_SYN* pRecvMsg = (MSG_CG_PARTY_MINIMAP_POINTING_SYN*)pMsg; RC::ePARTY_RESULT rcResult = AgentPartyManager::Instance()->SelectMinimap( pUser, pRecvMsg->m_fx, pRecvMsg->m_fy ); if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_MINIMAP_POINTING_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pUser->SendPacket( &msgNAK, sizeof(msgNAK) ); } } HANDLER_CG_IMPL( CG_PARTY_ITEM_DISTRIBUTION_CHANGE_SYN ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_ITEM_DISTRIBUTION_CHANGE_SYN* pRecvMsg = (MSG_CG_PARTY_ITEM_DISTRIBUTION_CHANGE_SYN*)pMsg; AgentPartyManager* const party_manager = AgentPartyManager::Instance(); RC::ePARTY_RESULT rcResult = party_manager->ChangeDistributionType( pUser, (eITEM_DISTRIBUTION_TYPE)pRecvMsg->m_byItemDistributionType ); //_NA_20110630_BATTLE_ZONE_RENEWAL WORD party_key = pUser->GetPartyState().GetPartyKey(); const PartyRoom* party_room = party_manager->FindPartyRoom(party_key); if (party_room) { if (party_room->GetIsMissionStart() == false) { party_manager->ResetPartyRoomReadyState(pUser, party_key); } } if( rcResult != RC::RC_PARTY_SUCCESS ) { MSG_CG_PARTY_ITEM_DISTRIBUTION_CHANGE_NAK msgNAK; msgNAK.m_byErrorCode = rcResult; pUser->SendPacket( &msgNAK, sizeof(msgNAK) ); } } //_NA_20110630_BATTLE_ZONE_RENEWAL HANDLER_CG_IMPL(CG_PARTY_REQUEST_RENDER_INFO_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_REQUEST_RENDER_INFO_SYN* recv_msg = static_cast(pMsg); if (pUser->GetPartyState().IsPartyMember() == false) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Is not party member : %s", pUser->GetSelectedCharName()); return; } MSG_AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD cmd_msg; cmd_msg.request_party_key_ = recv_msg->request_party_key_; cmd_msg.request_user_key_ = pUser->GetPlayerKey(); cmd_msg.target_user_key_ = recv_msg->request_member_key_; pUser->SendToLinkedServer(&cmd_msg, sizeof(cmd_msg)); } HANDLER_CG_IMPL(CG_PARTY_STANDBY_PAUSE_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_STANDBY_PAUSE_SYN* recv_msg = static_cast(pMsg); pUser->SetIsRecvInvitePartyRoom(recv_msg->set_value_); MSG_CG_PARTY_FIND_ROOM_BY_CHARID_ACK ack_msg; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); } HANDLER_CG_IMPL(CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* const party_room_list = party_manager->GetPartyRoomList(); const PartyRoom* party_room = party_room_list->FindPartyRoomByRoomKey(recv_msg->find_room_key_); if (party_room == NULL) { MSG_CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_FOUND_PARTYROOM; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } MSG_CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_ACK ack_msg; ack_msg.result_code_ = RC::RC_PARTY_SUCCESS; ack_msg.party_room_info_ = *(party_room->GetPartyRoomInfo()); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } HANDLER_CG_IMPL(CG_PARTY_FIND_ROOM_BY_CHARID_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_FIND_ROOM_BY_CHARID_SYN* recv_msg = static_cast(pMsg); TCHAR find_char_name[MAX_CHARNAME_LENGTH+1]; _tcsncpy(find_char_name, recv_msg->find_char_name_, _countof(find_char_name)); find_char_name[_countof(find_char_name)+1] = '\0'; User* find_user = UserManager::Instance()->FindUserForCharName(find_char_name); if (find_user == NULL) { MSG_CG_PARTY_FIND_ROOM_BY_CHARID_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_FOUND_USER; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } WORD party_key = find_user->GetPartyState().GetPartyKey(); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const PartyRoom* party_room = party_manager->FindPartyRoom(party_key); if (party_room == NULL) { MSG_CG_PARTY_FIND_ROOM_BY_CHARID_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_FOUND_PARTYROOM; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } MSG_CG_PARTY_FIND_ROOM_BY_CHARID_ACK ack_msg; ack_msg.result_code_ = RC::RC_PARTY_SUCCESS; ack_msg.party_room_info_ = *(party_room->GetPartyRoomInfo()); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } HANDLER_CG_IMPL(CG_PARTY_REQUEST_MEMBER_INFO_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_REQUEST_MEMBER_INFO_SYN* recv_msg = static_cast(pMsg); //AgentPartyManager* const party_manager = AgentPartyManager::Instance(); WORD party_key = pUser->GetPartyState().GetPartyKey(); if (party_key == 0) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : User is not with a party"); return; } MSG_AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD cmd_msg; cmd_msg.party_key_ = party_key; cmd_msg.member_key_ = pUser->GetPlayerKey(); pUser->SendToLinkedServer(&cmd_msg, sizeof(cmd_msg)); } HANDLER_CG_IMPL(CG_PARTY_SELECT_TEAM_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_SELECT_TEAM_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); WORD party_key = pUser->GetPartyState().GetPartyKey(); pUser->SetTeam(recv_msg->select_team_); party_manager->SetMemberTeam(pUser, recv_msg->select_team_); //gamelulu's note : ÇöÀç »óÅ¿¡¼­´Â ½ÇÆÐÇÒ ¼ö ÀÖ´Â ·ÎÁ÷ÀÌ Á¸Àç ÇÏÁö ¾Ê´Â´Ù.(2011.09.22) //ÇÏÁö¸¸ ¾ÕÀ¸·Î ¿©·¯ Á¦ÇÑ »çÇ×ÀÌ ¹ß»ýÇÒ ¿©Áö°¡ Á¸Àç Çϱ⠶§¹®¿¡ ¿äû ÀÀ´ä ÆÐŶÀ» ±¸¼ºÇÑ´Ù. MSG_CG_PARTY_SELECT_TEAM_ACK ack_msg; ack_msg.result_code_ = RC::RC_PARTY_SUCCESS; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); MSG_CG_PARTY_SELECT_TEAM_BRD brd_msg; brd_msg.member_key_ = pUser->GetPlayerKey(); brd_msg.select_team_ = recv_msg->select_team_; party_manager->SendPacketAllMember(party_key, &brd_msg, sizeof(brd_msg)); } HANDLER_CG_IMPL(CG_PARTY_ROOM_START_SYN) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_ROOM_START_SYN* recv_msg = static_cast(pMsg); WORD party_key = pUser->GetPartyState().GetPartyKey(); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const PartyRoom* party_room = party_manager->FindPartyRoom(party_key); if (party_room == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party room : %d", party_key); return; } party_manager->SetMemberReadyState(pUser, true); RC::ePARTY_RESULT result_code = party_manager->CanStartRoom(pUser); if (result_code != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Fail start mission : %d", result_code); return; } MSG_AG_ZONE_CAN_CREATE_ROOM_OF_PARTY_SYN syn_msg; syn_msg.map_code_ = party_room->GetMapCode(); syn_msg.party_key_ = party_key; syn_msg.party_room_type_ = party_room->GetPartyRoomType(); syn_msg.require_item_ = recv_msg->require_item_; pUser->SendToLinkedServer(&syn_msg, sizeof(syn_msg)); } HANDLER_CG_IMPL( CG_PARTY_ROOM_FORCE_LEAVE_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_ROOM_FORCE_LEAVE_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); User* leave_member = UserManager::Instance()->GetUserByObjKey(recv_msg->member_key_); if (leave_member == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found user : %d", recv_msg->member_key_); return; } RC::ePARTY_RESULT result_value = party_manager->FoceLeavePartyRoom(pUser, leave_member); if (result_value != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Party force leave fail : %d", result_value); return; } } HANDLER_CG_IMPL( CG_PARTY_READY_STATE_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_READY_STATE_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); party_manager->SetMemberReadyState(pUser, recv_msg->ready_state_); } HANDLER_CG_IMPL( CG_PARTY_STANDBY_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_STANDBY_ROOM_SYN* recv_msg = static_cast(pMsg); // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND BattleGroundManager* const battle_ground_manager = BattleGroundManager::Instance(); if (battle_ground_manager) { // ÀüÀåÀ» ¿¹¾àÇÏ°í ¸ÅĪ ´ë±â¿­¿¡ ÀÖ´Â »óŶó¸é ¹èƲÁ¸ ¾Ë¸² ¿¹¾à ºÒ°¡ if (battle_ground_manager->IsValidStandbyGroupMember(pUser->GetUserKey())) { MSG_CG_PARTY_STANDBY_ROOM_ACK ack_msg; ack_msg.result_value_ = false; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); return; } } AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomFinder* room_finder = party_manager->GetPartyRoomFinder(); bool result_value = room_finder->InsertCharGuidToMissionList(pUser->GetSelectedCharGuid(), recv_msg->map_code_, recv_msg->number_of_mission_); if (result_value == false) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Fail user standby : %d", pUser->GetSelectedCharGuid()); } pUser->SetIsRecvInvitePartyRoom(TRUE); MSG_CG_PARTY_STANDBY_ROOM_ACK ack_msg; ack_msg.result_value_ = result_value; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); } HANDLER_CG_IMPL( CG_PARTY_JOIN_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_JOIN_ROOM_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const PartyRoom* party_room = party_manager->FindPartyRoom(recv_msg->join_party_key_); if (party_room == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party room : %d", recv_msg->join_party_key_); return; } if (party_room->CheckPassword(recv_msg->password_) == false) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOTEQUAL_PASSWORD; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } if (party_room->GetMapCode() != 0 && party_room->CheckLevel(pUser->GetCharLV()) == false) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_MATCHING_USER_LEVEL; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } if (party_room->CanJoinPartyRoomByMemberCount() == false) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_FAIL_MAX_MEMBER_COUNT; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } #ifdef _NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION if ( party_room->_GetPartyRoomState() != PartyRoom::PartyRoomStateNormal) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_FAIL_JOIN_PARTY_ROOM; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } #endif //_NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION MSG_AG_PARTY_CAN_JOIN_ROOM_SYN syn_msg; syn_msg.map_code_ = party_room->GetMapCode(); syn_msg.party_room_type_ = party_room->GetZoneType(); syn_msg.join_party_key_ = recv_msg->join_party_key_; pUser->SendToLinkedServer(&syn_msg, sizeof(syn_msg)); } HANDLER_CG_IMPL( CG_PARTY_CHANGE_MAX_PLAYER_COUNT_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_CHANGE_MAX_PLAYER_COUNT_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* loom_list = party_manager->GetPartyRoomList(); WORD party_key = pUser->GetPartyState().GetPartyKey(); if (loom_list->SetMaxPlayerCount(party_key, recv_msg->max_count_) == false) { MSG_CG_PARTY_CHANGE_MAX_PLAYER_COUNT_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_UNKNOWN_REASON; pUser->SendPacket(&nak_msg, sizeof(nak_msg)); SUNLOG(eCRITICAL_LOG, __FUNCTION__ " : Fail change max count : %d", recv_msg->max_count_); return; } MSG_CG_PARTY_CHANGE_MAX_PLAYER_COUNT_ACK ack_msg; ack_msg.result_code_ = RC::RC_PARTY_SUCCESS; pUser->SendPacket((&ack_msg), sizeof(ack_msg)); MSG_CG_PARTY_CHANGE_MAX_PLAYER_COUNT_BRD brd_msg; brd_msg.max_count_ = recv_msg->max_count_; party_manager->SendPacketAllMember(party_key, &brd_msg, sizeof(brd_msg)); } HANDLER_CG_IMPL( CG_PARTY_CHANGE_ROOM_OPTION_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_CHANGE_ROOM_OPTION_SYN* recv_msg = static_cast(pMsg); WORD party_key = pUser->GetPartyState().GetPartyKey(); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const PartyRoom* party_room = party_manager->FindPartyRoom(party_key); if (party_room == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party room : %d", party_key); return; } if (party_room->GetIsMissionStart() == true) { MSG_CG_PARTY_CHANGE_ROOM_OPTION_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_CAHNGE_OPTION_PLAYING; pUser->SendPacket(&nak_msg, sizeof(nak_msg)); return; } //¸ÊÄڵ尡 0 ÀÏ °æ¿ì¿¡´Â Á¶°Ç °Ë»ç°¡ ÇÊ¿ä ÇÏÁö ¾Ê´Ù. if (recv_msg->change_party_room_info_.map_code_ == 0) { const BasePartyRoomInfo& room_info = recv_msg->change_party_room_info_; MAPCODE delete_map_code = party_room->GetMapCode(); PartyRoomFinder* room_finder = party_manager->GetPartyRoomFinder(); room_finder->DeletePartyKeyFromMissionList(delete_map_code, party_key); PartyRoomList* room_list = party_manager->GetPartyRoomList(); room_list->SetMissionCode(party_key, room_info.map_code_); MSG_CG_PARTY_CHANGE_ROOM_OPTION_ACK ack_msg; ack_msg.result_code_ = RC::RC_PARTY_SUCCESS; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); MSG_CG_PARTY_CHANGE_ROOM_OPTION_BRD brd_msg; brd_msg.change_party_room_info_ = recv_msg->change_party_room_info_; party_manager->SendPacketAllMember(party_key, &brd_msg, sizeof(brd_msg)); return; } //BattlezoneMissionTreeParser* const parser = BattlezoneMissionTreeParser::Instance(); MSG_AG_PARTY_CAN_CHANGE_OPTION_SYN send_msg; send_msg.party_room_info_ = recv_msg->change_party_room_info_; send_msg.party_room_info_.special_type_ = eROOM_SPECIAL_NORMAL; send_msg.party_key_ = party_key; send_msg.require_item_ = recv_msg->require_item_; if (pUser->CanApplyPCBangBenefit(TRUE)) { send_msg.party_room_info_.special_type_ = eROOM_SPECIAL_PCBANG_SUPER_ROOM; } else if (pUser->GetItemOwnFlag().FindItemInfo(eITEMTYPE_SUPERMASTER)) { send_msg.party_room_info_.special_type_ = eROOM_SPECIAL_ITEM1_SUPER_ROOM; } AgentPartyManager::FixStringOfPartyRoomInfo(&send_msg.party_room_info_); send_msg.master_key_ = pUser->GetPlayerKey(); pUser->SendToLinkedServer(&send_msg, sizeof(send_msg)); } HANDLER_CG_IMPL( CG_PARTY_ROOM_LIST_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_ROOM_LIST_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* room_list = party_manager->GetPartyRoomList(); MSG_CG_PARTY_ROOM_LIST_ACK ack_msg; ack_msg.all_page_num_ = room_list->CalcAllPageOfRoomList(); ack_msg.number_of_list_ = room_list->ArchiveRoomList(ack_msg.party_room_info_, _countof(ack_msg.party_room_info_), recv_msg->request_page_); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } HANDLER_CG_IMPL( CG_PARTY_FIND_WAITING_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_FIND_WAITING_ROOM_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* room_list = party_manager->GetPartyRoomList(); MSG_CG_PARTY_FIND_WAITING_ROOM_ACK ack_msg; ack_msg.number_of_list_ = room_list->SearchRoomByWaiting(ack_msg.party_room_info_, _countof(ack_msg.party_room_info_)); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } HANDLER_CG_IMPL( CG_PARTY_INVITE_PARTY_ROOM_ANS ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_INVITE_PARTY_ROOM_ANS* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); if (pUser->GetPartyState().IsPartyMember() == true) { party_manager->LeaveParty(pUser, eREASON_LEAVE_PARTY_INTEND); } WORD join_party_key = recv_msg->join_party_key_; const PartyRoom* party_room = party_manager->FindPartyRoom(join_party_key); if (party_room == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party room : %d", join_party_key); return; } if (party_room->GetMapCode() != 0 && party_room->CheckLevel(pUser->GetCharLV()) == false) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_NOT_MATCHING_USER_LEVEL; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } if (party_room->CanJoinPartyRoomByMemberCount() == false) { MSG_CG_PARTY_JOIN_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_FAIL_MAX_MEMBER_COUNT; pUser->SendPacket(&nak_msg, nak_msg.GetSize()); return; } MSG_AG_PARTY_CAN_JOIN_ROOM_SYN syn_msg; syn_msg.map_code_ = party_room->GetMapCode(); syn_msg.party_room_type_ = party_room->GetZoneType(); syn_msg.join_party_key_ = join_party_key; pUser->SendToLinkedServer(&syn_msg, sizeof(syn_msg)); return; } HANDLER_CG_IMPL( CG_PARTY_FIND_ROOM_BY_MISSION_NAME_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_FIND_ROOM_BY_MISSION_NAME_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* room_list = party_manager->GetPartyRoomList(); MSG_CG_PARTY_FIND_ROOM_BY_MISSION_NAME_ACK ack_msg; ack_msg.number_of_list_ = room_list->SearchRoomByMapCode(ack_msg.party_room_info_, recv_msg->request_map_code_, recv_msg->party_room_type_, _countof(ack_msg.party_room_info_)); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } HANDLER_CG_IMPL( CG_PARTY_LEAVE_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_LEAVE_ROOM_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); RC::ePARTY_RESULT result_value = party_manager->LeaveParty(pUser, eREASON_LEAVE_PARTY_INTEND); if (result_value != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Party leave fail : %d", result_value); } MSG_CG_PARTY_LEAVE_ROOM_ACK ack_msg; ack_msg.result_value_ = result_value; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); } HANDLER_CG_IMPL( CG_PARTY_CREATE_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_CREATE_ROOM_SYN* recv_msg = static_cast(pMsg); if (pUser->IsBeginTransaction()) { MSG_CG_PARTY_CREATE_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_ALREADY_DOING_TRANSACTION; pUser->SendPacket(&nak_msg, sizeof(nak_msg)); return; } if (pUser->GetBehaveState() != PLAYER_BEHAVE_IDLE_STATE) { MSG_CG_PARTY_CREATE_ROOM_ACK nak_msg; nak_msg.result_code_ = RC::RC_PARTY_INVALID_PLAYER_STATE; pUser->SendPacket(&nak_msg, sizeof(nak_msg)); return; } MAPCODE map_code = recv_msg->party_room_info_.map_code_; if (map_code == 0) { AgentPartyManager::Instance()->CreateNoneTypePartyRoom(pUser, recv_msg->party_room_info_); return; } MSG_AG_PARTY_CAN_CREATE_ROOM_SYN send_msg; send_msg.master_key_ = pUser->GetPlayerKey(); send_msg.party_room_info_ = recv_msg->party_room_info_; send_msg.require_item_ = recv_msg->require_item_; AgentPartyManager::FixStringOfPartyRoomInfo(&send_msg.party_room_info_); pUser->SendToLinkedServer(&send_msg, sizeof(send_msg)); } HANDLER_CG_IMPL( CG_PARTY_CHECK_ROOM_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_CHECK_ROOM_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const PartyRoomFinder* party_room_finder = party_manager->GetPartyRoomFinder(); WORD find_party_key = party_room_finder->GetPartyKeyInMissionList(pUser, recv_msg->map_code_, recv_msg->select_mission_num_); MAPCODE map_code = 0; if (find_party_key) { const PartyRoom* party_room = party_manager->FindPartyRoom(find_party_key); if (party_room == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party room : Party key : %d", find_party_key); } else { map_code = party_room->GetMapCode(); } } MSG_CG_PARTY_CHECK_ROOM_ACK ack_msg; ack_msg.find_party_key_ = find_party_key; ack_msg.check_type_ = static_cast(recv_msg->check_type_); ack_msg.map_code_ = map_code; pUser->SendPacket(&ack_msg, sizeof(ack_msg)); } HANDLER_CG_IMPL( CG_PARTY_BATTLE_ZONE_INFO_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_BATTLE_ZONE_INFO_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); PartyRoomList* room_list = party_manager->GetPartyRoomList(); MSG_CG_PARTY_BATTLE_ZONE_INFO_ACK ack_msg; ack_msg.all_page_num_ = room_list->CalcAllPageOfRoomList(); ack_msg.number_of_list_ = room_list->ArchiveRoomList(ack_msg.party_room_info_, _countof(ack_msg.party_room_info_), 1); pUser->SendPacket(&ack_msg, ack_msg.GetSize()); } #ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS HANDLER_CG_IMPL( CG_PARTY_RETURN_G2C_MEMBER_REMOVE_SYN ) { __TOUCHED((pMsg, wSize)); const MSG_CG_PARTY_RETURN_G2C_MEMBER_REMOVE_SYN* recv_msg = static_cast(pMsg); AgentPartyManager* const party_manager = AgentPartyManager::Instance(); const AgentParty* party = static_cast(party_manager->FindParty(recv_msg->request_party_key_)); if (party == NULL) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Not found party : user name : %s, party key : %d", pUser->GetSelectedCharName(), recv_msg->request_party_key_ ); return; } party_manager->RemoveClosingUser(party->GetPartyKey(), recv_msg->leave_member_name_); MSG_CG_PARTY_RETURN_G2C_MEMBER_REMOVE_CMD cmd_msg; cmd_msg.CopyFrom(recv_msg->leave_member_name_); party->SendPacketAll(&cmd_msg, cmd_msg.GetSize()); } #endif//_NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS // ºñÁ¤»ó Á¾·á À¯Àú°¡ ÀçÁ¢¼Ó ½Ã CG_PARTY_RETURN_C2G_MEMBER_QUERY_CMD °¡ µé¾î¿Â´Ù. (NO ARG) // (1) : CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK::ACCEPT_JOIN (ÆÄƼÂü°¡ Èñ¸Á) // (2) : CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK::REJECT_JOIN (ÆÄƼÂü°¡ Æ÷±â) // (3) : CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK::REJECT_JOIN (ÆÄƼÂü°¡ 2nd Æ÷±â) --> ¿ÏÀü Æ÷±â HANDLER_CG_IMPL( CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK ) { __TOUCHED((pMsg, wSize)); MSG_CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK* recv_msg = static_cast(pMsg); if (sizeof(*recv_msg) != wSize) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Invalid packet : user guid : %u", pUser->GetUserGUID() ); return; } AgentPartyManager* const party_manager = AgentPartyManager::Instance(); if (party_manager->CanJoinReturnParty(recv_msg->PARTY_KEY(), pUser) == false) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Can't join closing user : user name : %s, party key : %u", pUser->GetSelectedCharName(), recv_msg->PARTY_KEY() ); return; } RC::ePARTY_RESULT result_code = RC::RC_PARTY_SUCCESS; if (recv_msg->ANSWER() == MSG_CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK::ACCEPT_JOIN ) { result_code = party_manager->AcceptReturnParty(recv_msg->PARTY_KEY(), pUser); if (result_code != RC::RC_PARTY_SUCCESS) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Fail accept return party :user name : %s, fail code : %d", pUser->GetSelectedCharName(), result_code ); party_manager->RemoveClosingUser(recv_msg->PARTY_KEY(), pUser->GetSelectedCharGuid()); } } else { result_code = party_manager->RejectReturnParty(recv_msg->PARTY_KEY(), pUser); if (result_code != RC::RC_PARTY_SUCCESS) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Fail reject return party : user name : %s ,fail code : %d, ", pUser->GetSelectedCharName(), result_code ); } } } // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND HANDLER_CG_IMPL( CG_CHAOS_ZONE_PACKET ) { __TOUCHED((pMsg, wSize)); AgentChaosZoneManager::Instance()->ParseCGPacket(pUser, pMsg, wSize); }