This commit is contained in:
aozhiwei 2022-10-29 00:00:02 +08:00
parent fabc72dffa
commit 4aa1448379
4 changed files with 31 additions and 3 deletions

View File

@ -62,6 +62,7 @@ void Room::InitData(RoomInitInfo& init_info)
creator_proto_version_ = init_info.creator_proto_version; creator_proto_version_ = init_info.creator_proto_version;
creator_channel_ = init_info.creator_channel; creator_channel_ = init_info.creator_channel;
force_entry_newbie_room_ = init_info.force_entry_newbie_room; 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; map_tpl_name_ = init_info.map_tpl_name;
grid_service = init_info.grid_service; grid_service = init_info.grid_service;
@ -975,7 +976,8 @@ bool Room::CanJoin(const std::string& accountid,
RoomMode_e self_room_mode, RoomMode_e self_room_mode,
int self_proto_version, int self_proto_version,
int self_channel, int self_channel,
int init_map_id) int init_map_id,
const cs::CMJoin& msg)
{ {
if (self_room_mode < kChiJiMode) { if (self_room_mode < kChiJiMode) {
self_room_mode = kChiJiMode; self_room_mode = kChiJiMode;
@ -989,6 +991,14 @@ bool Room::CanJoin(const std::string& accountid,
if (GetGasData().GetGasMode() != GasInactive) { if (GetGasData().GetGasMode() != GasInactive) {
return false; 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) { if (init_map_id != 0) {
MapInstance* map_instance = MapMgr::Instance()->GetMapInstance(init_map_id); MapInstance* map_instance = MapMgr::Instance()->GetMapInstance(init_map_id);
if (map_instance && map_instance->GetMapMeta()->i->map_mode() == room_mode_ && 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()) { if (map_instance->map_id != team->GetMapId()) {
return false; 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) { if (team->GetCurrMembers().size() != MAX_TEAM_NUM) {
return false; return false;
} }
#endif
if (GetPlayerNum() < (int)GetRoomMaxPlayerNum()) { if (GetPlayerNum() < (int)GetRoomMaxPlayerNum()) {
return false; return false;
} }
@ -3631,6 +3651,9 @@ int Room::GetOnlinePlayerNum()
size_t Room::GetRoomMaxPlayerNum() size_t Room::GetRoomMaxPlayerNum()
{ {
if (pve_instance) {
return pve_human_num;
}
return map_meta_->i->player(); return map_meta_->i->player();
} }

View File

@ -94,6 +94,7 @@ public:
std::map<int, RoomObstacleWeakPtr> mine_objects; std::map<int, RoomObstacleWeakPtr> mine_objects;
MetaData::PveGeminiMode* pve_mode_meta = nullptr; MetaData::PveGeminiMode* pve_mode_meta = nullptr;
MetaData::PveGemini* pve_instance = nullptr; MetaData::PveGemini* pve_instance = nullptr;
int pve_human_num = 0;
PveData pve_data; PveData pve_data;
~Room(); ~Room();
@ -200,7 +201,8 @@ public:
RoomMode_e self_room_mode, RoomMode_e self_room_mode,
int self_proto_version, int self_proto_version,
int self_channel, int self_channel,
int init_map_id); int init_map_id,
const cs::CMJoin& msg);
bool CanJoin(class MatchTeam* team); bool CanJoin(class MatchTeam* team);
void OnPlayerOffline(Player* hum); void OnPlayerOffline(Player* hum);
void FindLocationWithAabb(ColliderComponent* target_collider, void FindLocationWithAabb(ColliderComponent* target_collider,

View File

@ -298,7 +298,8 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg,
(RoomMode_e)msg.room_mode(), (RoomMode_e)msg.room_mode(),
proto_version, proto_version,
channel, channel,
msg.mapid())) { msg.mapid(),
msg)) {
if (!msg.team_uuid().empty() && room->HaveMyTeam(msg.team_uuid())) { if (!msg.team_uuid().empty() && room->HaveMyTeam(msg.team_uuid())) {
return room; return room;
} }
@ -562,6 +563,7 @@ Room* RoomMgr::CreateRoom(const cs::CMJoin& msg,
init_info.creator_proto_version = creator_proto_version; init_info.creator_proto_version = creator_proto_version;
init_info.creator_channel = creator_channel; init_info.creator_channel = creator_channel;
init_info.pve_instance_id = msg.pve_instance_id(); init_info.pve_instance_id = msg.pve_instance_id();
init_info.pve_human_num = std::max(1, msg.team_members_size());
#if 0 #if 0
init_info.force_entry_newbie_room = msg.force_entry_newbie_room(); init_info.force_entry_newbie_room = msg.force_entry_newbie_room();
#endif #endif

View File

@ -32,6 +32,7 @@ struct RoomInitInfo
bool force_entry_newbie_room = false; bool force_entry_newbie_room = false;
int init_map_id = 0; int init_map_id = 0;
int pve_instance_id = 0; int pve_instance_id = 0;
int pve_human_num = 0;
const MetaData::Map* map_meta = nullptr; const MetaData::Map* map_meta = nullptr;
std::string map_tpl_name; std::string map_tpl_name;