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

418 lines
16 KiB
C++

#include "StdAfx.h"
#include "Handler_AG_PARTY.h"
#include <PacketStruct_AG.h>
#include "Player.h"
#include <ServerSession.h>
#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<ePHASE_SHIFT>(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<MSG_AG_PARTY_DESTROY_CMD*>(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<MSG_AG_PARTY_JOIN_CMD*>(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<MSG_AG_PARTY_LEAVE_CMD*>(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<MSG_AG_PARTY_CAN_JOIN_ROOM_SYN*>(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<MSG_AG_PARTY_RESET_READY_STATE_CMD*>(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<MSG_AG_PARTY_PARTYROOM_ITEM_DELETE_CMD*>(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<MSG_AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD*>(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<const NewGameParty*>(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<MSG_AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD*>(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<const NewGameParty*>(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<MSG_AG_PARTY_READY_STATE_SYN*>(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<MSG_AG_PARTY_CAN_CHANGE_OPTION_SYN *>(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<MSG_AG_PARTY_CAN_CREATE_ROOM_SYN *>(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 <World/ChaosZoneSystem/GameChaosZoneManaager.h>
Handler_AG_PARTY_IMPL( AG_CHAOS_ZONE_PACKET )
{
__TOUCHED((pServerSession, pMsg, wSize));
GameChaosZoneManager::Instance()->ParseAGPacket(pServerSession, pMsg, wSize);
}