#pragma once //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include #include #include #include #include #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH #include "ChaosZoneSystem/Handler_CG_GOLDRUSH.h" #include "ChaosZoneSystem/Handler_AG_GOLDRUSH.h" #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND #include "BattleGroundTimeInfoParser.h" struct MSG_CG_BATTLE_GROUND_GET_OPEN_TIME_ACK; #endif //_NA_008679_20160202_REWORK_BATTLEGROUND //_NA_007065_20140217_BATTLEGROUND_REFACTORYING class BattleGroundMatchingSystem; enum BattleGroundMemberState { kStandby = 0, // ´ë±â¿­ »óÅ kStandbyPriority, // ´ë±â¿­ ¿ì¼±¼øÀ§ »óÅ }; struct BattleGroundMemberInfo { USERGUID user_guid; //À¯Àú ¾ÆÀ̵ð MAPCODE map_code; //¸ÊÄÚµå KEYTYPE reservation_key; //¿¹¾à Ű KEYTYPE group_key; //±×·ì Ű CTime reservation_time; //¿¹¾à ½Ã°£ BattleGroundMemberState member_state; //´ë±â¿­ »óÅ ChaosZoneTeam team_division; //ÆÀ ±¸ºÐ int equip_item_score; //ÀåºñÆòÁ¡ eCHAR_TYPE class_code; //Ŭ·¡½º ÄÚµå bool is_healer; //Èú·¯¿©ºÎ #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND BYTE team_index_; // ÆÀ ³» À妽º°ª (1ºÎÅÍ ½ÃÀÛ) #endif //_NA_008679_20160202_REWORK_BATTLEGROUND BattleGroundMemberInfo() : user_guid(0), map_code(0), reservation_key(0), group_key(0), reservation_time(0), member_state(kStandby), team_division(kChaosZoneTeamNone), equip_item_score(0), class_code(eCHAR_NONE), is_healer(false) #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND , team_index_(0) #endif //_NA_008679_20160202_REWORK_BATTLEGROUND { } }; typedef STLX_VECTOR BattleGroundMemberList; #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND class BattleGroundOpenTimeManager; #endif //_NA_008679_20160202_REWORK_BATTLEGROUND class BattleGroundManager : public util::Singleton { public: #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH enum eBATTLEGROUND_TYPE { eBATTLEGROUND_STRONGPOINT, // °ÅÁ¡ ÀïÅ»Àü(ex:ÀÚÇǸ£/¼­¸® °ÝÀüÁö) eBATTLEGROUND_GOLDRUSH, // °ñµå·¯½Ã eBATTLEGROUND_MAX }; #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH BattleGroundManager(); ~BattleGroundManager(); void Init(); void Release(); #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND void Update(const util::TimeInfoPerFrame& time_info); #else void Update(); #endif //_NA_008679_20160202_REWORK_BATTLEGROUND bool LeaveRoom(User* const user, const ZONEKEY zone_key, const eREASON_LEAVE_PARTY& reason = eREASON_LEAVE_PARTY_INTEND); bool InsertReservationMember(const USERGUID guid, MAPCODE map_code, int equip_item_score, eCHAR_TYPE class_code, bool is_healer, OUT BattleGroundMemberInfo*& member_info, BOOL insert_standby_group = TRUE); BOOL RemoveReservationMember(const USERGUID guid); RC::eBATTLE_GROUND_RESULT CanReservation(const User* user, const MAPCODE map_code); bool IsValidReservationMember(const USERGUID guid); bool IsValidStandbyGroupMember(const USERGUID guid); bool ReturnUserInsertStandbyGroupList(const BattleGroundMemberInfo* battle_ground_member); BattleGroundMemberList* FindStandbyGroupMemberList(const MAPCODE map_code); BattleGroundMemberInfo* FindBattleGroundMember(const USERGUID guid); bool RemoveMemberStandbyGroup(const BattleGroundMemberInfo* battle_ground_member); void SendPacketAllMember(const BattleGroundMemberList* member_list, MSG_BASE* msg, WORD size); RC::eBATTLE_GROUND_RESULT CancelReservation(User* user); #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH void ProcessPacket_CG(const ChaosZoneCategory& category_type, User* user, MSG_BASE* packet, WORD size); void ProcessPacket_AG(const ChaosZoneCategory& category_type, GameServerSession* server_session, MSG_BASE* packet, WORD size); #else inline Handler_CG_BATTLE_GROUND& GetCGPacketHandler() { return handler_cg_battle_ground_; } inline Handler_AG_BATTLE_GROUND& GetAGPacketHandler() { return handler_ag_battle_ground_; } #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND BOOL StartBattleGround(); void ChangeTimeMode(const ns_func::eBATTLEGROUND_TIMEMODE& time_mode); BOOL GetMemberFalseName(User* user, TCHAR* OUT false_name); bool SetupMessage(const util::TimeInfoPerFrame& time_info, MSG_CG_BATTLE_GROUND_GET_OPEN_TIME_ACK* const msg_ack); VOID ReInsertAbnormalExitMemberToTotalList(User* user, const WORD& party_key); #else //_NA_007065_20140217_BATTLEGROUND_REFACTORYING bool CheckMatching(const MAPCODE map_code); #endif //_NA_008679_20160202_REWORK_BATTLEGROUND VOID SendReservationMemberCountToClient(USERGUID user_guid, MAPCODE map_code); VOID ProcessDisconnectUser(User* user, const KEYTYPE& zone_key, const eREASON_LEAVE_PARTY& reason); private: void _InsertMemberStandbyGroup(const BattleGroundMemberInfo* battle_ground_member); private: typedef STLX_HASH_MAP BattleGroundMemberMap; typedef STLX_HASH_MAP StandbyGroupMap; typedef util::CMemoryPoolFactory BattleGroundMemberPool; typedef util::CMemoryPoolFactory BattleGroundMemberListPool; private: //_NA_007065_20140217_BATTLEGROUND_REFACTORYING BattleGroundMatchingSystem* battleground_matching_system_; util::CObjKeyGenerator key_generater_; // ¿¹¾àÁ¢¼ö ¹øÈ£ ¹ß±Þ // ´ë±âÇ® BattleGroundMemberPool* battle_ground_member_pool_; BattleGroundMemberListPool* battle_ground_member_list_pool_; // ¿¹¾àÀÚ ¸®½ºÆ® StandbyGroupMap standby_groups_; // MapCodeŰ ¿¹¾àÀÚ¸®½ºÆ® // µî·Ï: ¿¹¾à ½Ã // Á¦°Å: ¿¹¾àÃë¼Ò, ij¸¯Åͼ±ÅÃâ, ¸Åα׷ìÁ¦°Å ½Ã, ÀüÀå Á¾·á½Ã // ´Ü¼ø '¿¹¾à'»Ó¸¸ ¾Æ´Ï¶ó ÀüÀåÀÌ ³¡³¯¶§±îÁö À¯ÀúÁ¤º¸ º¸°ü BattleGroundMemberMap reservation_total_members_; // GuidŰ ¿¹¾àÀÚ¸®½ºÆ® Handler_CG_BATTLE_GROUND handler_cg_battle_ground_; Handler_AG_BATTLE_GROUND handler_ag_battle_ground_; #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH Handler_CG_GOLDRUSH handler_cg_goldrush_; Handler_AG_GOLDRUSH handler_ag_goldrush_; #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND ns_func::eBATTLEGROUND_TIMEMODE cur_time_mode_; BattleGroundOpenTimeManager* open_time_mgr_; #endif //_NA_008679_20160202_REWORK_BATTLEGROUND };