From 4aa14483790c8e8eba63e6da342e0cba067c7f17 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 29 Oct 2022 00:00:02 +0800 Subject: [PATCH] 1 --- server/gameserver/room.cc | 25 ++++++++++++++++++++++++- server/gameserver/room.h | 4 +++- server/gameserver/roommgr.cc | 4 +++- server/gameserver/roommgr.h | 1 + 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index b573e760..a9059ecc 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -62,6 +62,7 @@ void Room::InitData(RoomInitInfo& init_info) creator_proto_version_ = init_info.creator_proto_version; creator_channel_ = init_info.creator_channel; force_entry_newbie_room_ = init_info.force_entry_newbie_room; + pve_human_num = init_info.pve_human_num; map_tpl_name_ = init_info.map_tpl_name; grid_service = init_info.grid_service; @@ -975,7 +976,8 @@ bool Room::CanJoin(const std::string& accountid, RoomMode_e self_room_mode, int self_proto_version, int self_channel, - int init_map_id) + int init_map_id, + const cs::CMJoin& msg) { if (self_room_mode < kChiJiMode) { self_room_mode = kChiJiMode; @@ -989,6 +991,14 @@ bool Room::CanJoin(const std::string& accountid, if (GetGasData().GetGasMode() != GasInactive) { return false; } + if (msg.pve_instance_id() && !pve_instance){ + return false; + } + if (pve_instance) { + if (pve_instance->pb->gemini_id() != msg.pve_instance_id()) { + return false; + } + } if (init_map_id != 0) { MapInstance* map_instance = MapMgr::Instance()->GetMapInstance(init_map_id); if (map_instance && map_instance->GetMapMeta()->i->map_mode() == room_mode_ && @@ -1020,9 +1030,19 @@ bool Room::CanJoin(class MatchTeam* team) if (map_instance->map_id != team->GetMapId()) { return false; } + if (team->GetOwner()->msg->pve_instance_id() && !pve_instance){ + return false; + } + if (pve_instance) { + if (pve_instance->pb->gemini_id() != team->GetOwner()->msg->pve_instance_id()) { + return false; + } + } +#if 0 if (team->GetCurrMembers().size() != MAX_TEAM_NUM) { return false; } +#endif if (GetPlayerNum() < (int)GetRoomMaxPlayerNum()) { return false; } @@ -3631,6 +3651,9 @@ int Room::GetOnlinePlayerNum() size_t Room::GetRoomMaxPlayerNum() { + if (pve_instance) { + return pve_human_num; + } return map_meta_->i->player(); } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 5d367f6d..03710058 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -94,6 +94,7 @@ public: std::map mine_objects; MetaData::PveGeminiMode* pve_mode_meta = nullptr; MetaData::PveGemini* pve_instance = nullptr; + int pve_human_num = 0; PveData pve_data; ~Room(); @@ -200,7 +201,8 @@ public: RoomMode_e self_room_mode, int self_proto_version, int self_channel, - int init_map_id); + int init_map_id, + const cs::CMJoin& msg); bool CanJoin(class MatchTeam* team); void OnPlayerOffline(Player* hum); void FindLocationWithAabb(ColliderComponent* target_collider, diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 0c74f26a..4090784a 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -298,7 +298,8 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg, (RoomMode_e)msg.room_mode(), proto_version, channel, - msg.mapid())) { + msg.mapid(), + msg)) { if (!msg.team_uuid().empty() && room->HaveMyTeam(msg.team_uuid())) { return room; } @@ -562,6 +563,7 @@ Room* RoomMgr::CreateRoom(const cs::CMJoin& msg, init_info.creator_proto_version = creator_proto_version; init_info.creator_channel = creator_channel; init_info.pve_instance_id = msg.pve_instance_id(); + init_info.pve_human_num = std::max(1, msg.team_members_size()); #if 0 init_info.force_entry_newbie_room = msg.force_entry_newbie_room(); #endif diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index 116f4ab1..51a53941 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -32,6 +32,7 @@ struct RoomInitInfo bool force_entry_newbie_room = false; int init_map_id = 0; int pve_instance_id = 0; + int pve_human_num = 0; const MetaData::Map* map_meta = nullptr; std::string map_tpl_name;