#include "StdAfx.h" #include "Handler_AG_PARTY.h" #include #include "Player.h" #include #include "GameParty/NewGamePartyManager.h" #include "GameGuildManager.h" #include "GameGuildExtension.h" //_NA_20110630_BATTLE_ZONE_RENEWAL #include "BattlezoneMissionTreeParser.h" #include "GameParty/NewGameParty.h" #include "ItemInfoParser.h" #include "MapInfoParser.h" Handler_AG_PARTY::Handler_AG_PARTY(void) { } Handler_AG_PARTY::~Handler_AG_PARTY(void) { } //-------------------------------------------------------------------------------------------------- // changes, f100819.1L const nsPacket::PacketHandlerInfo Handler_AG_PARTY::GetPacketHandlerNodes() { #define HANDLER_NODE_INFO(c, p, phase) { MAKEWORD(c, p), phase, Handler_AG_PARTY::On##p } #define HANDLER_NODE_INFO_EOR() { 0, static_cast(0), NULL } static const nsPacket::PacketHandlerNode handlers_static_[] = { HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_CREATE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_DESTROY_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_JOIN_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_LEAVE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_CHANGE_MASTER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_ITEM_DISTRIBUTION_CHANGE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_JOIN_SYN, PHASE_SERVICE), //_NA_20110630_BATTLE_ZONE_RENEWAL HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_CAN_CHANGE_OPTION_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_CAN_CREATE_ROOM_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_READY_STATE_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_PARTYROOM_ITEM_DELETE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_RESET_READY_STATE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_CAN_JOIN_ROOM_SYN, PHASE_SERVICE), HANDLER_NODE_INFO(AG_PARTY, AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD, PHASE_SERVICE), //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND HANDLER_NODE_INFO(AG_PARTY, AG_CHAOS_ZONE_PACKET, 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_AG_PARTY_IMPL( AG_PARTY_JOIN_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); PACKET_PTR_CONVERT(MSG_AG_PARTY_JOIN_SYN, recv_msg, pMsg); RC::ePARTY_RESULT party_result = NewGamePartyManager::Instance()->CanRequestParty(recv_msg->m_dwReqMemberKey, recv_msg->m_dwRecvMemberKey); if (party_result != RC::RC_PARTY_SUCCESS) { MSG_AG_PARTY_JOIN_NAK nak_msg; { //_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG nak_msg.m_dwFlag = recv_msg->m_dwFlag; nak_msg.m_dwRecvMemberKey = recv_msg->m_dwRecvMemberKey; nak_msg.m_dwErrorCode = party_result; nak_msg.m_dwReqMemberKey = recv_msg->m_dwReqMemberKey; } pServerSession->SendPacket(&nak_msg, sizeof(nak_msg)); return; } MSG_AG_PARTY_JOIN_ACK ack_msg; { //_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG ack_msg.m_dwFlag = recv_msg->m_dwFlag; ack_msg.m_dwReqMemberKey = recv_msg->m_dwReqMemberKey; ack_msg.m_dwRecvMemberKey = recv_msg->m_dwRecvMemberKey; } pServerSession->SendPacket(&ack_msg, sizeof(ack_msg)); } // ÆÄƼ »ý¼º Handler_AG_PARTY_IMPL( AG_PARTY_CREATE_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_CREATE_CMD* pRecvMsg = (MSG_AG_PARTY_CREATE_CMD*)pMsg; NewGamePartyManager* const party_manager = NewGamePartyManager::Instance(); //_NA_20110630_BATTLE_ZONE_RENEWAL party_manager->CreateGameParty(pRecvMsg->m_wPartykey, pRecvMsg->m_MasterKey, (eITEM_DISTRIBUTION_TYPE)pRecvMsg->m_byItemDistributionType, pRecvMsg->m_PartyType); } // ÆÄƼ ¼Ò¸ê Handler_AG_PARTY_IMPL( AG_PARTY_DESTROY_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_DESTROY_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager::Instance()->DestroyGameParty(recv_msg->m_wPartykey); } // ÆÄƼ °¡ÀÔ // (lst1024)(090715) ÆÄƼ °¡ÀԽà °ÔÀÓ¼­¹ö¿¡ ±æµå °ü°è Àû´ë°¡ ÀÖ´ÂÁö ¾Ë¾Æº¸¾Æ¾ßÇÔ. // ÆÐŶ È帧 º¯°æ ÇÊ¿ä. (AG_PARTY_JOIN_SYN¿¡¼­ÀÇ Ã¼Å©»çÇ× ÇÊ¿ä) Handler_AG_PARTY_IMPL( AG_PARTY_JOIN_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_JOIN_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager::Instance()->JoinGameParty(recv_msg->m_wPartykey, recv_msg->m_MemberInfo, recv_msg->m_bMaster ); } // ÆÄƼ Å»Åð Handler_AG_PARTY_IMPL( AG_PARTY_LEAVE_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_LEAVE_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager::Instance()->LeaveGameParty(recv_msg->m_wPartykey, recv_msg->m_dwMemberKey); } // ÆÄƼÀå º¯°æ Handler_AG_PARTY_IMPL( AG_PARTY_CHANGE_MASTER_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_CHANGE_MASTER_CMD* pRecvMsg = (MSG_AG_PARTY_CHANGE_MASTER_CMD*)pMsg; DWORD MemberKey = pRecvMsg->m_dwMemberKey; NewGamePartyManager::Instance()->ChangeGameMaster( pRecvMsg->m_wPartykey, MemberKey ); } Handler_AG_PARTY_IMPL( AG_PARTY_ITEM_DISTRIBUTION_CHANGE_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_PARTY_ITEM_DISTRIBUTION_CHANGE_CMD* pRecvMsg = (MSG_AG_PARTY_ITEM_DISTRIBUTION_CHANGE_CMD*)pMsg; NewGamePartyManager::Instance()->ChangeItemDistributionType( pRecvMsg->m_wPartykey, (eITEM_DISTRIBUTION_TYPE)pRecvMsg->m_byItemDistributionType ); } //_NA_20110630_BATTLE_ZONE_RENEWAL Handler_AG_PARTY_IMPL( AG_PARTY_CAN_JOIN_ROOM_SYN ) { const MSG_AG_PARTY_CAN_JOIN_ROOM_SYN* recv_msg = static_cast(pMsg); NewGamePartyManager* const party_manager = NewGamePartyManager::Instance(); Player* player = PlayerManager::Instance()->FindPlayerByUserKey(recv_msg->m_dwKey); if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } MSG_AG_PARTY_CAN_JOIN_ROOM_ACK ack_msg; ack_msg.result_code_ = party_manager->CheckJoinRoomTerms(player, 0, 0, recv_msg->party_room_type_, recv_msg->map_code_); ack_msg.join_party_key_ = recv_msg->join_party_key_; ack_msg.request_user_key_ = player->GetObjectKey(); pServerSession->SendPacket(&ack_msg, sizeof(ack_msg)); } Handler_AG_PARTY_IMPL( AG_PARTY_RESET_READY_STATE_CMD ) { const MSG_AG_PARTY_RESET_READY_STATE_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager* party_manager = NewGamePartyManager::Instance(); Player* player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->master_key_); if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } party_manager->ResetMemberReadyState(recv_msg->party_key_); } Handler_AG_PARTY_IMPL( AG_PARTY_PARTYROOM_ITEM_DELETE_CMD ) { const MSG_AG_PARTY_PARTYROOM_ITEM_DELETE_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager* party_manager = NewGamePartyManager::Instance(); Player* player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->member_key_); if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } #ifdef _NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION PartyState& party_state = player->GetPartyState(); const BaseParty* const party = party_manager->FindParty(party_state.GetPartyKey()); if (party != NULL && recv_msg->party_zone_type_ == PartyOfSpecialMission) { PlayerManager* player_manager = PlayerManager::Instance(); const BaseParty::MEMBER_MAP& member_map = party->GetMemberList(); BaseParty::MEMBER_MAP::const_iterator itr = member_map.begin(); for( ; itr != member_map.end(); ++itr) { Player* party_member = player_manager->FindPlayerByObjKey(itr->first); if (party_member != NULL) { party_manager->RemoveMissionItem(party_member, recv_msg->require_item_, 1); } } } else { party_manager->RemoveMissionItem(player, recv_msg->require_item_, 1); } #else party_manager->RemoveMissionItem(player, recv_msg->require_item_, 1); #endif //_NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION } Handler_AG_PARTY_IMPL( AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD ) { const MSG_AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager* party_manager = NewGamePartyManager::Instance(); Player* request_player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->request_user_key_); if (request_player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found request player"); return; } Player* target_player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->target_user_key_); if (target_player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found target player"); return; } WORD party_key = recv_msg->request_party_key_; const NewGameParty* party = static_cast(party_manager->FindParty(party_key)); if (party == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", party_key); return; } party->SendPlayerRenderInfo(request_player, target_player); } Handler_AG_PARTY_IMPL( AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD ) { const MSG_AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD* recv_msg = static_cast(pMsg); NewGamePartyManager* party_manager = NewGamePartyManager::Instance(); Player* player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->member_key_); if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } WORD party_key = recv_msg->party_key_; const NewGameParty* party = static_cast(party_manager->FindParty(party_key)); if (party == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", party_key); return; } party->NotifyMembersInfoToPlayer(player); } Handler_AG_PARTY_IMPL( AG_PARTY_READY_STATE_SYN ) { const MSG_AG_PARTY_READY_STATE_SYN* recv_msg = static_cast(pMsg); NewGamePartyManager* party_manager = NewGamePartyManager::Instance(); Player* player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->member_key_); if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } RC::ePARTY_RESULT result_code = party_manager->SetMemberReadyState(player, recv_msg->party_key_, recv_msg->ready_state_); MSG_AG_PARTY_READY_STATE_ACK ack_msg; ack_msg.result_code_ = result_code; ack_msg.member_key_ = recv_msg->member_key_; ack_msg.ready_state_ = recv_msg->ready_state_; pServerSession->SendPacket(&ack_msg, sizeof(ack_msg)); } Handler_AG_PARTY_IMPL( AG_PARTY_CAN_CHANGE_OPTION_SYN ) { const MSG_AG_PARTY_CAN_CHANGE_OPTION_SYN* recv_msg = static_cast(pMsg); NewGamePartyManager* const party_manager = NewGamePartyManager::Instance(); Player* master_player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->master_key_); if (master_player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player"); return; } const WORD party_key = recv_msg->party_key_; const MAPCODE map_code = recv_msg->party_room_info_.map_code_; const PartyZoneType party_room_type = recv_msg->party_room_info_.party_room_type_; const SLOTCODE item_code = recv_msg->require_item_; MSG_AG_PARTY_CAN_CHANGE_OPTION_ACK ack_msg; ack_msg.Clear(); RC::ePARTY_RESULT result_code = party_manager->CheckRoomTerms(master_player, item_code, 1, party_room_type, map_code); if (result_code == RC::RC_PARTY_SUCCESS) { MapInfoParser* const map_info_parser = MapInfoParser::Instance(); nsPartyRoomMission::EnterSynArg arg = { 0, }; arg.map_info_ = map_info_parser->FindMapInfo(map_code); if (arg.map_info_ == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found map parser info : %d", map_code); return; } static CheckMemberConditionToChangeOptionOperator oper; oper.Init(eGAMEPARTY_OPERATOR_CHANGE_OPTION_CONDITION_PARTYMEMBER_INFO, 0, &ack_msg, &arg); ack_msg.number_of_partymember_ = party_manager->GetMemberConditionForChangeOption(oper, party_key); if (ack_msg.number_of_partymember_ == 0 || ack_msg.number_of_partymember_ > _countof(ack_msg.member_state_)) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : An exception data of member count : %d", ack_msg.number_of_partymember_); return; } } ack_msg.result_code_ = result_code; ack_msg.master_key_ = recv_msg->master_key_; ack_msg.party_room_info_ = recv_msg->party_room_info_; pServerSession->SendPacket(&ack_msg, sizeof(ack_msg)); } Handler_AG_PARTY_IMPL( AG_PARTY_CAN_CREATE_ROOM_SYN ) { const MSG_AG_PARTY_CAN_CREATE_ROOM_SYN* recv_msg = static_cast(pMsg); NewGamePartyManager* const party_manager = NewGamePartyManager::Instance(); Player* master_player = PlayerManager::Instance()->FindPlayerByObjKey(recv_msg->master_key_); if (master_player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found player : Key : %d", recv_msg->master_key_); return; } const RC::ePARTY_RESULT result_code = party_manager->CheckRoomTerms(master_player, recv_msg->require_item_, 1, recv_msg->party_room_info_.party_room_type_, recv_msg->party_room_info_.map_code_); MSG_AG_PARTY_CAN_CREATE_ROOM_ACK ack_msg; ack_msg.result_code_ = result_code; ack_msg.master_key_ = recv_msg->master_key_; ack_msg.party_room_info_ = recv_msg->party_room_info_; pServerSession->SendPacket(&ack_msg, sizeof(ack_msg)); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include <../ProgramCommon/ChaosZoneSystem/PacketStruct_ChaosZoneSystem.h> #include Handler_AG_PARTY_IMPL( AG_CHAOS_ZONE_PACKET ) { __TOUCHED((pServerSession, pMsg, wSize)); GameChaosZoneManager::Instance()->ParseAGPacket(pServerSession, pMsg, wSize); }