From ba91e05c2dae1aef41e53578da0c10c688b5adc9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 18 Mar 2024 19:10:37 +0800 Subject: [PATCH] 1 --- server/gameserver/pbutils.cc | 107 +++++++++++++++++++++++++++++++++++ server/gameserver/roommgr.cc | 2 +- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index db86551c..1f8c81bc 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -2672,6 +2672,113 @@ int Room::InitWithCustomBattle(long ip_saddr, int socket_handle, std::shared_ptr int Room::JoinWithCustomBattle(long ip_saddr, int socket_handle, std::shared_ptr msg, std::shared_ptr p) { + std::vector> room_teams; + std::vector> net_teams; + p->TraverseTeamList + ( + [this, &room_teams, &net_teams] (std::shared_ptr team) -> bool + { + auto new_team = NewTeam(); + new_team->SetInitTeamMemberNum(0); + new_team->SetAutoFill(true); + room_teams.push_back(new_team); + net_teams.push_back(team); + return true; + }); + if (room_teams.empty()) { + abort(); + } + if (IsMobaModeRoom() && + room_teams.size() > 2) { + abort(); + } + cs::CMJoin join_msg = *msg; + for (size_t i = 0; i < net_teams.size(); ++i) { + auto net_team = net_teams.at(i); + auto room_team = room_teams.at(i); + room_team->SetInitTeamMemberNum(net_team->GetMemberNum()); + net_team->TraverseMember + ( + [join_msg, p, room_team] (std::shared_ptr m) mutable -> bool + { + Player* hum = InternalCreatePlayer(p, m, room_team, join_msg); + return true; + } + ); + } + if (IsMobaModeRoom()) { + if (room_teams.size() < 2) { + auto new_team = NewTeam(); + new_team->SetInitTeamMemberNum(0); + new_team->SetAutoFill(true); + room_teams.push_back(new_team); + } + int side = a8::RandEx(1, 2); + for (size_t i = 0; i < 2; ++i) { + auto team = room_teams.at(i); + if (team->GetMemberNum() < MAX_TEAM_NUM) { + CreateAndroid(MAX_TEAM_NUM - team->GetMemberNum(), team); + } + if (i == 0) { + moba_team_a_ = team.get(); + } else { + moba_team_b_ = team.get(); + } + team->TraverseMembers + ( + [this, side] (Human* hum) -> bool + { + hum->side = side; + std::shared_ptr born_point = std::make_shared(); + born_point->wo_meta = std::get<0>(GetMapMeta()->moba_born_points.at(side - 1)); + hum->SetBornPoint(born_point); + hum->InitMobaRoad(); +#ifdef MYDEBUG + a8::XPrintf("moba init uniid:%d team_id:%d side:%d wo_meta:%d\n", + { + hum->GetUniId(), + hum->GetTeam()->GetTeamId(), + hum->side, + (long long)hum->GetBornPoint()->wo_meta.get() + }); +#endif + return true; + }); + if (side == 1) { + side = 2; + } else { + side = 1; + } + } + } + { + p->TraverseObList + ( + [this, join_msg, p] (std::shared_ptr m) mutable -> bool + { + auto new_team = NewViewTeam(); + new_team->SetInitTeamMemberNum(0); + new_team->SetAutoFill(true); + Player* hum = InternalCreatePlayer(p, m, new_team, join_msg, + [p] (Player* hum) + { + a8::SetBitFlag(hum->status, CS_IsOb); + p->GetRoom()->GetRoomOb()->AddOb(hum); + }); + return true; + }); + } + { + auto hum = GetPlayerByAccountId(msg->account_id()); + if (hum) { + hum->ReJoin(ip_saddr, socket_handle, msg); + } else { + auto hum = p->GetRoom()->GetRoomOb()->GetByAccountId(msg->account_id()); + if (hum) { + hum->ReJoin(ip_saddr, socket_handle, msg); + } + } + } return 0; } diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index e11bb411..74045951 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -1043,7 +1043,7 @@ void RoomMgr::_CMJoinCustomBattle(f8::MsgHdr* hdr, const cs::CMJoin& msg, int cu join_msg->proto_version(), channel, msg.mapid(), - p); + nullptr); } else { room = RoomMgr::Instance()->CreateRoom (*join_msg,