From e250e63ef39fbcd9caf80ba18403ac27b0ea62cb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 28 Sep 2021 02:21:51 +0000 Subject: [PATCH] 1 --- server/gameserver/matchmgr.cc | 11 +++++-- server/gameserver/matchteam.cc | 52 ++++++++++++++++++++++++++-------- server/gameserver/matchteam.h | 17 ++++++++++- server/gameserver/room.cc | 22 ++++++++++++++ server/gameserver/room.h | 3 ++ server/gameserver/roommgr.cc | 11 +++++++ server/gameserver/roommgr.h | 3 ++ 7 files changed, 104 insertions(+), 15 deletions(-) diff --git a/server/gameserver/matchmgr.cc b/server/gameserver/matchmgr.cc index 92bd277..2f2bc62 100644 --- a/server/gameserver/matchmgr.cc +++ b/server/gameserver/matchmgr.cc @@ -112,10 +112,17 @@ std::tuple* MatchMgr::GetMatchInfo(int socket_handle) void MatchMgr::RemoveTeam(const std::string& team_uuid) { - + auto itr = team_hash_.find(team_uuid); + if (itr != team_hash_.end()) { + delete itr->second; + team_hash_.erase(itr); + } } void MatchMgr::RemoveSocket(int socket_handle) { - + auto itr = socket_hash_.find(socket_handle); + if (itr != socket_hash_.end()) { + socket_hash_.erase(itr); + } } diff --git a/server/gameserver/matchteam.cc b/server/gameserver/matchteam.cc index 333a720..642e13e 100644 --- a/server/gameserver/matchteam.cc +++ b/server/gameserver/matchteam.cc @@ -2,25 +2,35 @@ #include -#include "cs_proto.pb.h" #include "matchteam.h" #include "matchmgr.h" #include "GGListener.h" #include "metamgr.h" -struct RawTeamMember +void RawTeamMember::FillMFMatchTeamMember(cs::MFMatchTeamMember* msg) { - MatchTeam* team = nullptr; - long long add_tick = 0; - int socket_handle = 0; - cs::CMJoin msg; - void FillMFMatchTeamMember(cs::MFMatchTeamMember* msg) +} + +void RawTeamMember::InitRobot() +{ + static long long robot_idx = 1000; + + msg.set_account_id(a8::Format("6000_2005_%d", {++robot_idx})); { - + std::set refreshed_robot_set; + MetaData::Robot* robot_meta = MetaMgr::Instance()->RandRobot(refreshed_robot_set); + if (robot_meta) { + msg.set_hero_id(robot_meta->i->hero_id()); + msg.set_name(robot_meta->i->name()); + auto skin = msg.add_skins(); + if (!robot_meta->skin_id.empty()) { + skin->set_skin_id(robot_meta->skin_id[0]); + skin->set_skin_lv(1); + } + } } - -}; +} void MatchTeam::Init(f8::MsgHdr& hdr, const cs::CMJoin& msg) { @@ -149,8 +159,14 @@ void MatchTeam::UpdateMaster() switch (phase_) { case kMatchCombining: { - if (GetPredictMemberNum() < MAX_TEAM_NUM) { - TryCombineTeam(); + if (IsShuaRobotTime()) { + if (curr_member_hash_.size() < MAX_TEAM_NUM) { + ShuaRobot(); + } + } else { + if (GetPredictMemberNum() < MAX_TEAM_NUM) { + TryCombineTeam(); + } } if (phase_left_time_ <= 0) { phase_ = kMatchChoose; @@ -301,6 +317,18 @@ std::shared_ptr MatchTeam::GetMemberBySocket(int socket_handle) return std::shared_ptr(); } +void MatchTeam::ShuaRobot() +{ + for (int i = curr_member_hash_.size(); i < MAX_TEAM_NUM; ++i) { + std::shared_ptr member = std::make_shared(); + member->team = this; + member->add_tick = a8::XGetTickCount(); + member->is_robot = true; + member->InitRobot(); + curr_member_hash_.push_back(member); + } +} + void MatchTeam::StartGame() { for (auto& member : curr_member_hash_) { diff --git a/server/gameserver/matchteam.h b/server/gameserver/matchteam.h index 9d51935..69c4982 100644 --- a/server/gameserver/matchteam.h +++ b/server/gameserver/matchteam.h @@ -1,5 +1,7 @@ #pragma once +#include "cs_proto.pb.h" + enum MatchTeamPhase_e { kMatchCombining = 1, @@ -13,8 +15,19 @@ namespace cs class CMReconnect; } +struct RawTeamMember +{ + class MatchTeam* team = nullptr; + long long add_tick = 0; + int socket_handle = 0; + cs::CMJoin msg; + bool is_robot = false; + void FillMFMatchTeamMember(cs::MFMatchTeamMember* msg); + void InitRobot(); +}; + + struct timer_list; -struct RawTeamMember; class MatchTeam { public: @@ -31,6 +44,7 @@ class MatchTeam bool IsValidMember(const cs::CMJoin& msg); void TryCombineTeam(); std::string GetTeamUUid(); + std::list>& GetCurrMembers() { return curr_member_hash_; }; private: void Update(); @@ -47,6 +61,7 @@ class MatchTeam bool IsSlaveTeam() { return master_team_ != this; }; int GetPhaseLeftTime(); std::shared_ptr GetMemberBySocket(int socket_handle); + void ShuaRobot(); void StartGame(); private: diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index aea9878..2e8832d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -33,6 +33,7 @@ #include "mapmgr.h" #include "incubator.h" #include "team.h" +#include "matchteam.h" const int SHUA_RANGE = 580; @@ -3870,3 +3871,24 @@ void Room::OnBattleStart() } battle_starting_ = false; } + +void Room::AddTeam(class MatchTeam* team) +{ + if (team->GetCurrMembers().size() != MAX_TEAM_NUM) { + return; + } + for (auto& member : team->GetCurrMembers()) { + if (member->is_robot) { + + } else { + Player* hum = NewPlayer(); + hum->ProcPreSettlementInfo(member->msg.pre_settlement_info()); + PlayerMgr::Instance()-> + CreatePlayerByCMJoin(hum, + 0,//hdr.ip_saddr, + member->socket_handle, + member->msg + ); + } + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 90c31af..46a45bf 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -71,6 +71,7 @@ struct CarObject bool taken = false; }; +class MatchTeam; class Room { public: @@ -127,6 +128,8 @@ public: void AddPlayer(Player* hum); Human* FindEnemy(Human* hum); + void AddTeam(class MatchTeam* team); + void RemoveObjectLater(RoomEntity* entity); void RemoveObjectLater(RoomObstacle* entity); diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 20ce948..282cff3 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -315,6 +315,12 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg, msg.mapid()); } +Room* RoomMgr::GetJoinableRoom(MatchTeam* team) +{ + for (auto& pair : inactive_room_hash_) { + } +} + Room* RoomMgr::GetRoomByUuid(long long room_uuid) { auto itr = room_hash_.find(room_uuid); @@ -572,6 +578,11 @@ bool RoomMgr::IsGM(const std::string& account_id) return gm_hash_.find(account_id) != gm_hash_.end(); } +void RoomMgr::JoinTeam(MatchTeam* team) +{ + +} + std::string RoomMgr::GenTeamHashData(const std::string& team_uuid, std::map* team_hash) { std::string data; diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index b03c3d7..8680ca1 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -47,6 +47,7 @@ struct RoomInitInfo }; class Room; +class MatchTeam; class RoomMgr : public a8::Singleton { public: @@ -69,6 +70,7 @@ class RoomMgr : public a8::Singleton Room* GetRoomByUuid(long long uuid); void AddOverRoom(long long room_uuid); bool IsGM(const std::string& account_id); + void JoinTeam(MatchTeam* team); private: void InstallReportStateTimer(); @@ -79,6 +81,7 @@ class RoomMgr : public a8::Singleton int creator_register_time, int proto_version, int channel); + Room* GetJoinableRoom(MatchTeam* team); void ReportServerState(int instance_id, const std::string& host, int port); void FreeOverRoom(long long room_uuid); bool IsLimitJoin();