#include "stdafx.h" #include #include #include #include #include "ClosingUserList.h" ClosingUserList::ClosingUserList() : party_key_(0) , closing_user_list_(NULL) { } ClosingUserList::~ClosingUserList() { } void ClosingUserList::Init(WORD party_key) { party_key_ = party_key; } bool ClosingUserList::UpdateChar(ClosingUserInfo& closing_user_info) { if (closing_user_list_.empty()) { return false; } ClosingUserInfo* find_user = _FindEditableClosingUser(closing_user_info.char_guid_); if (find_user == NULL) { return false; } #ifdef _NA_000000_20131112_RECONNECT_CLOSINGUSER_IN_MISSION find_user->return_pos_ = closing_user_info.return_pos_; find_user->return_field_code_ = closing_user_info.return_field_code_; find_user->return_zone_type_ = closing_user_info.return_zone_type_; find_user->return_zone_key_ = closing_user_info.return_zone_key_; #else *(find_user) = closing_user_info; #endif //_NA_000000_20131112_RECONNECT_CLOSINGUSER_IN_MISSION return true; } void ClosingUserList::AddClosingUser(const DWORD char_guid, const TCHAR* char_name, PartyReturnInfo& return_info, const _PARTY_MEMBER_INFO& member_info) { if (FindClosingUser(char_guid) != NULL) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Aleady exist closing user : exist char name : %s", char_name ); return; } ClosingUserInfo closing_user(char_guid); closing_user.SetCharName(char_name); closing_user.return_pos_ = return_info.ReturnPos; closing_user.return_field_code_ = return_info.ReturnFieldCode; closing_user.return_zone_type_ = return_info.ReturnZoneType; closing_user.return_zone_key_ = return_info.ReturnZoneKey; return_info.Init(); closing_user.member_info_ = member_info; closing_user.member_info_.m_isReady = false; closing_user_list_.push_back(closing_user); } void ClosingUserList::RemoveClosingUser(const DWORD char_guid) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); while (begin_iterator != end_iterator) { ClosingUserInfo& user_info = *(begin_iterator); if (char_guid == user_info.char_guid_) { begin_iterator = closing_user_list_.erase(begin_iterator); return; } ++begin_iterator; } } void ClosingUserList::RemoveClosingUser(const TCHAR* char_name) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); while (begin_iterator != end_iterator) { ClosingUserInfo& user_info = *(begin_iterator); if (_tcsncmp(char_name, user_info.GetCharName(), MAX_CHARNAME_LENGTH + 1) == 0) { begin_iterator = closing_user_list_.erase(begin_iterator); return; } ++begin_iterator; } } const ClosingUserInfo* ClosingUserList::FindClosingUser(const DWORD char_guid) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); for (;begin_iterator != end_iterator; ++begin_iterator) { ClosingUserInfo& user_info = *(begin_iterator); if (char_guid == user_info.char_guid_) { return &(user_info); } } return NULL; } const ClosingUserInfo* ClosingUserList::FindClosingUser(const TCHAR* char_name) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); for (;begin_iterator != end_iterator; ++begin_iterator) { ClosingUserInfo& user_info = *(begin_iterator); if (_tcsncmp(user_info.GetCharName(), char_name, MAX_CHARNAME_LENGTH + 1) == 0) { return &(user_info); } } return NULL; } ClosingUserInfo* ClosingUserList::_FindEditableClosingUser(const DWORD char_guid) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); for (;begin_iterator != end_iterator; ++begin_iterator) { ClosingUserInfo& user_info = *(begin_iterator); if (char_guid == user_info.char_guid_) { return &(user_info); } } return NULL; } BYTE ClosingUserList::GetClosingUserCount() const { return static_cast(closing_user_list_.size()); } void ClosingUserList::AddClosingUserInfoToMemberList(PARTY_MEMBER_TOTAL_INFO& all_member_list) { UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { if (all_member_list.m_Count >= MAX_PARTYMEMBER_NUM) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Member count is over : count : %d", all_member_list.m_Count); break; } const ClosingUserInfo& closing_user_info = *(begin_iterator); _PARTY_MEMBER_INFO member_info = closing_user_info.member_info_; #ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS member_info.m_isConnected = false; #endif all_member_list.m_Slot[all_member_list.m_Count] = member_info; ++all_member_list.m_Count; } } void ClosingUserList::Update(AgentParty* const party) { UserManager* const user_manager = UserManager::Instance(); UserList::iterator begin_iterator = closing_user_list_.begin(), end_iterator = closing_user_list_.end(); while(begin_iterator != end_iterator) { ClosingUserInfo& closing_user_info = *(begin_iterator); User* closing_user = user_manager->GetUserByCharGuid(closing_user_info.char_guid_); if(closing_user_info.time_out_.IsExpired()) { //ºñÁ¤»ó Á¢¼Ó Á¾·á À¯Àú°¡ ÀÏÁ¤ ½Ã°£ÀÌ Áö³ªµµ Á¢¼Ó ¾ÊÀ» °æ¿ì¿¡ ´ëÇÑ Ã³¸® if (closing_user) { closing_user->SetBehaveState(PLAYER_BEHAVE_IDLE_STATE); } //ºñÁ¤»ó Á¾·áµÈ À¯Àú ¸ñ·Ï »èÁ¦ ¿äû(ÆÄƼ ¸É¹ö Àü¿ø ¿¡°Ô) MSG_CG_PARTY_RETURN_G2C_MEMBER_REMOVE_CMD cmd_msg; cmd_msg.CopyFrom(closing_user_info.GetCharName()); party->SendPacketAll(&cmd_msg, cmd_msg.GetSize()); //ºñÁ¤»ó Á¾·á À¯Àú Á¤º¸ »èÁ¦·Î ÀÎÇÑ ¸ó½ºÅÍ¹× ·ëÀÇ ¼³Á¤ º¯°æ const _PARTY_MEMBER_INFO* member_info = party->GetHeadUser(); if (member_info == NULL) { begin_iterator = closing_user_list_.erase(begin_iterator); continue; } User* current_zone_user = user_manager->GetUserByObjKey(member_info->m_dwMemberKey); KEYTYPE zone_key = 0; if (current_zone_user && (zone_key = current_zone_user->GetZoneKey()) && (zone_key == closing_user_info.return_zone_key_)) { ZoneInterface* current_zone = g_ZoneManager.FindZone(zone_key); if (current_zone != NULL&& (PolicymentForRoom::MonsterAbilityChangableRoomsBit & (1 << current_zone->GetType()))) { RoomInterface* current_room = static_cast(current_zone); BYTE number_of_players = current_room->GetNumberOfExpectedPlayers(); if (number_of_players) { current_room->SetNumberOfExpectedPlayers(--number_of_players); g_ZoneManager.ChangeBattlePlayersCount(current_room, number_of_players); } } } begin_iterator = closing_user_list_.erase(begin_iterator); } else { if (closing_user && closing_user_info.CanSendRequestReturnParty()) { //ºñÁ¤»ó Á¢¼Ó Á¾·áÈÄ ÀÏÁ¤ ½Ã°£ À̳»¿¡ ÀçÁ¢¼ÓÀ» ÇÑ À¯Àú¿¡ ´ëÇÑ Ã³¸® User* master_user = user_manager->GetUserByObjKey(party->GetMasterKey()); if (master_user) { if (closing_user->GetPartyState().GetPartyKey() == 0) { //ÀçÁ¢¼Ó ÇÑ À¯Àú°¡ ´Ù¸¥ ÆÄƼ¿¡ °¡ÀÔÇØÀÖÁö ¾ÊÀº °æ¿ì¿¡ Àç °¡ÀÔ ¿äûÀ» ÇÑ´Ù. closing_user->SetBehaveState(PLAYER_BEHAVE_UNEXPECTED_WAITING); MSG_CG_PARTY_RETURN_G2C_MEMBER_QUERY_CMD cmd_msg; cmd_msg.PARTY_KEY() = master_user->GetPartyState().GetPartyKey(); closing_user->SendPacket(&cmd_msg, sizeof(cmd_msg)); } else { closing_user_info.time_out_.Instance(); } } } ++begin_iterator; } } }