From 8424bd57a7dd6cd6bdff736c84005e68d9f8a034 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 19 Mar 2024 15:30:56 +0800 Subject: [PATCH] 1 --- server/gameserver/custom_battle.cc | 20 ++++++++++++++ server/gameserver/custom_battle.h | 6 ++++ server/gameserver/custom_team.cc | 22 +++++++++++++++ server/gameserver/custom_team.h | 1 + server/gameserver/room.cc | 44 +++++++++++++++++++++++++++++- server/gameserver/team.cc | 1 + 6 files changed, 93 insertions(+), 1 deletion(-) diff --git a/server/gameserver/custom_battle.cc b/server/gameserver/custom_battle.cc index 75f43061..3dce9f4f 100644 --- a/server/gameserver/custom_battle.cc +++ b/server/gameserver/custom_battle.cc @@ -67,6 +67,7 @@ void CustomBattle::ParseResult(a8::XObject& obj) team->team_uuid_ = team_uuid; team->is_view_ = false; uuid_hash_[team->team_uuid_] = team; + team_list_.push_back(team); } for (int ii = 0; ii < member_list->Size(); ++ii) { auto member_obj = member_list->At(ii); @@ -144,6 +145,7 @@ void CustomBattle::ParseResult(a8::XObject& obj) raw_data_ = std::make_shared(); obj.DeepCopy(*raw_data_); + CalcTeam1AverageHeroLv(); parse_ok_ = true; } @@ -229,6 +231,13 @@ RoomMode_e CustomBattle::GetRoomMode() } } +void CustomBattle::CalcTeam1AverageHeroLv() +{ + if (!team_list_.empty()) { + team1_average_hero_lv_ = team_list_.at(0)->GetAverageHeroLv(); + } +} + RoomType_e CustomBattle::GetRoomType() { if (IsMoba()) { @@ -253,3 +262,14 @@ RoomType_e CustomBattle::GetRoomType() return RoomType_OldBrid3; } } + +std::shared_ptr CustomBattle::GetTeamByIdx(int idx) +{ + if (GetTeamNum() <= 0) { + return nullptr; + } + if (idx < 0 || idx >= GetTeamNum()) { + return nullptr; + } + return team_list_.at(idx); +} diff --git a/server/gameserver/custom_battle.h b/server/gameserver/custom_battle.h index ba710613..fca744fb 100644 --- a/server/gameserver/custom_battle.h +++ b/server/gameserver/custom_battle.h @@ -28,6 +28,7 @@ class CustomBattle int GetStartTime() { return start_time_; } void ParseResult(a8::XObject& obj); std::shared_ptr GetTeamByAccountId(const std::string& account_id); + std::shared_ptr GetTeamByIdx(int idx); std::shared_ptr GetMemberByAccountId(const std::string& account_id); std::shared_ptr GetTeamByTeamUuid(const std::string& team_uuid); std::shared_ptr GetObByAccountId(const std::string& account_id); @@ -43,6 +44,10 @@ class CustomBattle bool IsPvp() { return !is_moba_; } bool IsMoba() { return is_moba_; } +private: + + void CalcTeam1AverageHeroLv(); + private: bool parse_ok_ = false; Room *room_ = nullptr; @@ -57,6 +62,7 @@ class CustomBattle int team1_average_hero_lv_ = 0; std::string sign_; std::shared_ptr raw_data_; + std::vector> team_list_; std::map> uuid_hash_; std::shared_ptr ob_team_; std::map> account_hash_; diff --git a/server/gameserver/custom_team.cc b/server/gameserver/custom_team.cc index a831a185..bf79927f 100644 --- a/server/gameserver/custom_team.cc +++ b/server/gameserver/custom_team.cc @@ -1,6 +1,8 @@ #include "precompile.h" #include "custom_team.h" +#include "custom_member.h" +#include "netdata.h" std::shared_ptr CustomTeam::GetMember(const std::string& account_id) { @@ -21,3 +23,23 @@ int CustomTeam::GetMemberNum() { return member_hash_.size(); } + +int CustomTeam::GetAverageHeroLv() +{ + if (GetMemberNum() <= 0) { + return 0; + } + int total_hero_lv = 0; + TraverseMember + ( + [&total_hero_lv] (std::shared_ptr m) -> bool + { + long long hero_uniid = 0; + int hero_lv = 0; + int quality = 0; + m->GetNetData()->GetHeroLvQuality(hero_uniid, hero_lv, quality); + total_hero_lv += hero_lv; + return true; + }); + return total_hero_lv / GetMemberNum(); +} diff --git a/server/gameserver/custom_team.h b/server/gameserver/custom_team.h index e3b26243..4393a02e 100644 --- a/server/gameserver/custom_team.h +++ b/server/gameserver/custom_team.h @@ -10,6 +10,7 @@ class CustomTeam bool IsView() { return is_view_; } void TraverseMember(std::function)> cb); int GetMemberNum(); + int GetAverageHeroLv(); private: std::string team_uuid_; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 4affffb8..d9f57990 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3603,5 +3603,47 @@ void Room::DecAliveCount() bool Room::CanJoin(std::shared_ptr p) { - return false; + if (p->IsMoba()) { + return false; + } + if (!p->IsNormalMode()) { + return false; + } + if (p->GetTeamNum() > 1) { + return false; + } + if (p->GetTeamNum() < 1) { + return false; + } + + if (lock_room_) { + return false; + } + if (IsCustomBattle()) { + return false; + } + if (IsMobaModeRoom()) { + return false; + } + if (room_mode_ != p->GetRoomMode()) { + return false; + } + if (GetGasData().GetGasMode() != GasInactive) { + return false; + } + if (map_meta_->map_id() != p->GetMapId()) { + return false; + } + + auto p_team = p->GetTeamByIdx(0); + if (GetPlayerNum() + p_team->GetMemberNum() > GetRoomMaxPlayerNum()) { + return false; + } + int try_count = 0; + while (GetHumanNum() + p_team->GetMemberNum() > GetRoomMaxPlayerNum() && + try_count < 100) { + ++try_count; + RandRemoveAndroid(); + } + return GetHumanNum() + p_team->GetMemberNum() <= GetRoomMaxPlayerNum(); } diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 134f6c17..8acfb96b 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -373,6 +373,7 @@ void Team::GenBattleReportData(Human* player, a8::MutableXObject* params) } member_pb->SetVal("move_distance", hum->stats->move_distance); member_pb->SetVal("full_level_idx", hum->stats->full_level_idx); + member_pb->SetVal("hero_level", hum->GetHeroLevel()); member_pb->SetVal("is_run_away", hum->stats->is_run_away); member_pb->SetVal("hero_id", hum->meta->id());