Files
Sun1602/Server/AgentServer/ChaosZoneSystem/FreePVPManager.h
T
2022-10-26 12:25:11 +08:00

91 lines
2.8 KiB
C++

#pragma once
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
#include <Singleton.h>
#include <ChaosZoneSystem/Handler_CG_FREE_PVP.h>
#include <ChaosZoneSystem/Handler_AG_FREE_PVP.h>
#include <ChaosZoneSystem/FreePVPRoom.h>
struct FreePVPRoomInfo;
enum FreePVPUserState
{
kUserStateNone = 0,
kWait,
kJoin,
};
struct FreePVPUserInfo
{
USERGUID user_guid;
KEYTYPE room_key;
util::Timer join_time;
FreePVPUserState user_state;
FreePVPUserInfo() :
user_guid(0),
room_key(0),
user_state(kUserStateNone)
{
}
};
typedef STLX_HASH_MAP<KEYTYPE, FreePVPRoom> FreePVPRoomHash;
typedef STLX_HASH_MAP<USERGUID, FreePVPUserInfo*> FreePVPUserInfoHash;
class FreePVPManager : public util::Singleton<FreePVPManager>
{
public:
FreePVPManager() : is_free_pvp_active_(true)
{
}
~FreePVPManager()
{
}
void Update();
bool CreateRoom(const BaseFreePVPRoomInfo& base_free_pvp_room_info, KEYTYPE& OUT create_room_key);
void DestroyRoom(const KEYTYPE room_key);
FreePVPRoom* FindRoom(const KEYTYPE room_key);
bool JoinRoom(User* user, const KEYTYPE room_key);
bool LeaveRoom(User* user, const ZONEKEY zone_key);
BYTE ArchiveRoomList(FreePVPRoomInfo* OUT free_pvp_room_info, BYTE request_count)const;
void InsertFreePVPUser(const USERGUID guid, const KEYTYPE room_key);
void RemoveFreePVPUser(const USERGUID guid);
FreePVPUserInfo* FindUserInfo(const USERGUID guid);
bool IstMoveZoneWaitPlayer(const USERGUID guid);
inline void SetFreePVPActive(const bool is_free_pvp_active) { is_free_pvp_active_ = is_free_pvp_active; }
inline bool GetFreePVPActive() { return is_free_pvp_active_; }
inline DWORD GetRoomCount() { return free_pvp_room_hash_.size(); }
inline Handler_CG_FREE_PVP& GetCGPacketHandler() { return handler_cg_free_pvp_; }
inline Handler_AG_FREE_PVP& GetAGPacketHandler() { return handler_ag_free_pvp_; }
private:
void _MakingRoomInfo(FreePVPRoom& OUT create_free_pvp_room,
const BaseFreePVPRoomInfo& base_room_info,KEYTYPE room_key);
void _Insert(const KEYTYPE room_key, FreePVPRoom free_pvp_room);
void _Delete(const KEYTYPE room_key);
bool _SendFreePVPRoom(FreePVPUserInfo* user_info);
inline KEYTYPE _AllocKey()
{
return static_cast<KEYTYPE>(ObjKeyGender::Instance()->GetKey(OBJKEYTYPE_FREE_PVP_ROOM_KEY));
}
inline void _FreeKey(KEYTYPE Key)
{
ObjKeyGender::Instance()->RestoreKey(OBJKEYTYPE_FREE_PVP_ROOM_KEY, Key);
}
private:
FreePVPRoomHash free_pvp_room_hash_;
FreePVPUserInfoHash free_pvp_user_info_hash_;
bool is_free_pvp_active_;
Handler_CG_FREE_PVP handler_cg_free_pvp_;
Handler_AG_FREE_PVP handler_ag_free_pvp_;
};
#endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP