#pragma once #include #include "BasePartyManager.h" #include #include "ClosingUserList.h" class AgentParty; class ZoneInterface; class User; class RoomInterface; class InstanceDungeon; struct MSG_AG_PARTY_NAVI_INFO_BRD; struct MSG_AG_STATUS_CHAR_STAT_CHANGE_CMD; //_NA_20110630_BATTLE_ZONE_RENEWAL class PartyRoomFinder; class PartyRoomList; class PartyRoom; struct MSG_AG_ZONE_CAN_CREATE_ROOM_OF_PARTY_ACK; struct MSG_AG_PARTY_CAN_CHANGE_OPTION_ACK; class AgentPartyManager : public util::Singleton, public BasePartyManager { public: AgentPartyManager(); ~AgentPartyManager(); virtual void Initialize(DWORD party_pool_size); void Update(); RC::ePARTY_RESULT DestroyParty( WORD party_key ); RC::ePARTY_RESULT ChangeMaster( WORD party_key, DWORD next_master_key ); RC::ePARTY_RESULT ChangeMaster_inInstanceDungeon( InstanceDungeon* dungeon, User* user); BaseParty* CreateParty( DWORD master_key, ePARTY_TYPE party_type ); RC::ePARTY_RESULT CanJoinParty( User* user ); RC::ePARTY_RESULT JoinParty( WORD party_key, User* user ); RC::ePARTY_RESULT LeaveParty( User* user, eREASON_LEAVE_PARTY leave_to_reason ); RC::ePARTY_RESULT CanRequestJoin( User* request_user, User* response_user ); RC::ePARTY_RESULT InviteParty( User* master_user, User* join_user ); RC::ePARTY_RESULT CanRequestLeave( User* request_user, User* leave_user ); RC::ePARTY_RESULT ForcedExpulsion( User* master_user, User* leave_user ); RC::ePARTY_RESULT SelectTarget( User* master_user, DWORD object_key ); RC::ePARTY_RESULT SelectMinimap( User* user, float PosX, float PosY ); RC::ePARTY_RESULT ChangeDistributionType( User* user, eITEM_DISTRIBUTION_TYPE distribution_type ); //ÆÄƼ º¹±Í °ü·Ã ÇÔ¼ö bool CanJoinReturnParty( WORD party_key, User* user ); RC::ePARTY_RESULT AcceptReturnParty( WORD party_key, User* user ); RC::ePARTY_RESULT RejectReturnParty( WORD party_key, User* user ); void UpdateReturnUser( WORD party_key, ClosingUserInfo& closing_user_info ); void RemoveClosingUser( WORD party_key, const DWORD char_guid ); void RemoveClosingUser( WORD party_key, const TCHAR* char_name ); void AddClosingUser( User* user, const _PARTY_MEMBER_INFO& member_info ); // ¸â¹ö ¼öÄ¡, »óź¯È­¸¦ ¾Ë¸°´Ù. void MemberLevelUp( User* user, FLOAT fHPRatio, FLOAT fMPRatio ); void MemberResurrection( User* user, FLOAT fHPRatio, FLOAT fMPRatio ); void MemberChangeChaoState( User* user ); void MemberDead( User* user ); void ChangedMembersInfo( WORD party_key, const MSG_AG_PARTY_NAVI_INFO_BRD* navi, const MSG_AG_STATUS_CHAR_STAT_CHANGE_CMD* hpmp ); // Á¸ ¿¬°ü ÆÄƼ °ü¸® void CreateZone( User* master_user, ZoneInterface* pCurZone, ZoneInterface* pCreateZone ); void EnterZoneByPortal( PORTALKEY portalKey, User* user, ZoneInterface* pCurZone, ZoneInterface* pToCreateZone ); void EnterZone( User* user, ZoneInterface* pEnterZone ); void LeaveZone( User* user, ZoneInterface* pLeaveZone ); void MigrateCHuntingRoom( User* master_user, ZoneInterface* pCurZone, ZoneInterface* pEnterZone ); // ±âŸ ±¸Çö¿¡ ÇÊ¿äÇÑ ±â´Éµé bool IsMaster( User* user ); void AddRelayUser( RoomInterface* pRoom ); DWORD GetMemberNum( WORD party_key ); void SetOtherMemberKey( User* pRequestUser, User* pResponseUser ); void ResetOtherMemberKey( User* pRequestUser, User* pResponseUser ); RC::eROOM_RESULT InstanceDungeonCheck( WORD party_key, const sMAPINFO* psMAPINFO ); RC::eROOM_RESULT TopOfTrialCheck( WORD party_key ); RC::eROOM_RESULT MigrateToInstanceDungeon( User* pRequestUser, InstanceDungeon* indun ); void SendPacketAllMember( WORD party_key, MSG_BASE* pMsg, WORD wSize, DWORD ExceptKey=0, KEYTYPE CheckZoneKey=0 ); void SendPacketAllLinkedServer( WORD party_key, MSG_BASE* pMsg, WORD wSize ); void Display(); RC::ePARTY_RESULT RequestInviteParty( User* request_user, User* response_user ); RC::ePARTY_RESULT ResponseInviteParty( User* response_user ); bool CheckReturnPartyInfo( User* pole_user, User* return_user); //_NA_20110630_BATTLE_ZONE_RENEWAL static void FixStringOfPartyRoomInfo( BasePartyRoomInfo* raw_msg ); PartyRoomFinder* GetPartyRoomFinder(); PartyRoomList* GetPartyRoomList(); RC::ePARTY_RESULT CanCreatePartyRoom( User* user, const BasePartyRoomInfo* party_room_info )const; RC::ePARTY_RESULT CanStartRoom( User* user ); RC::ePARTY_RESULT CreatePartyRoom( BasePartyRoomInfo& party_room_info, User* user ); void CreateNoneTypePartyRoom( User* master_user, const BasePartyRoomInfo& party_room_info ); void DestroyPartyRoom( WORD party_key ); #ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS RC::ePARTY_RESULT LeavePartyRoom( User* user, eREASON_LEAVE_PARTY reason_to_leave ); #else RC::ePARTY_RESULT LeavePartyRoom( User* user ); #endif RC::ePARTY_RESULT JoinPartyRoom( User* user, WORD party_key, PartyZoneType party_room_type); RC::ePARTY_RESULT ChangePartyRoomOption( User* user, WORD party_key, const MSG_AG_PARTY_CAN_CHANGE_OPTION_ACK* check_msg ); const PartyRoom* FindPartyRoom( WORD party_key )const; void SetMemberReadyState( User* user, bool ready_state ); bool GetMemberReadyState( User* user ); BYTE GetMemberTeam( User* user ); void SetMemberTeam( User* user, BYTE selected_team ); RC::ePARTY_RESULT FoceLeavePartyRoom( User* request_user, User* leave_user ); KEYTYPE GetPartyRoomKey( WORD party_key ); const PartyRoomInfo* GetPartyRoomInfoByMemberKey( DWORD member_key_ ); bool ExceptionProcessByPartyMember( const MSG_AG_ZONE_CAN_CREATE_ROOM_OF_PARTY_ACK* check_msg, User* request_user ); RC::ePARTY_RESULT CheckTermsByPartyRoomType( User* request_user, const BasePartyRoomInfo* party_room_info )const; void SetIsMissionStart( WORD party_key, bool is_start ); void ResetPartyRoomReadyState( User* master_user, WORD party_key ); void KickPartyMemberForChangeOption( const MSG_AG_PARTY_CAN_CHANGE_OPTION_ACK* check_msg, User* master_user ); void NotifyMemberMoveArea( User* user, MAPCODE map_code ); void DoStartToWaitingRoom(); void StartPartyRoom( User* request_user ); void SetPartyRoomStartState( WORD party_key ); void AddPartyRoomToWaitList( WORD add_party_key ); void ChangeMasterOfPartyRoom( User* next_party_master ); private: void AddMemberToSession( AgentParty* pAgentParty, DWORD ToLinkServerIndex, User* user ); void RemoveMemberToSession( AgentParty* pAgentParty, DWORD FromLinkServerIndex, DWORD ToLinkServerIndex, User* user ); bool MemberChangeState( User* user ); //_NA_20110630_BATTLE_ZONE_RENEWAL void ResetRoomMissionCode( WORD party_key ); void CheckLevelForMission( WORD party_key, MAPCODE map_code ); VOID _JoinProcess_SendPartyInfo(WORD partyKey, User* pUser, _PARTY_MEMBER_INFO& member_info); private: util::CObjKeyGenerator key_generater_; struct InvitePartyKey { enum { Response_Limit_Time = 8000, }; uint request_user_key; uint response_user_key; uint response_time; }; typedef STLX_HASH_MAP InvitePartyKeyHashmap; InvitePartyKeyHashmap invite_party_key_; //_NA_20110630_BATTLE_ZONE_RENEWAL PartyRoomFinder* party_room_finder_; PartyRoomList* party_room_list_; util::Timer check_waiting_room_timer_; };