game2006/server/gameserver/matchteam.h
2021-11-26 15:36:40 +08:00

113 lines
3.1 KiB
C++

#pragma once
#include "cs_proto.pb.h"
enum MatchTeamPhase_e
{
kMatchCombining = 1,
kMatchChoose = 2,
kMatchLock = 3,
kMatchStartGame = 4
};
enum MatchTeamMember_e
{
kMatchReadying = 0,
kMatchPrepare = 1,
};
namespace cs
{
class CMJoin;
class CMReconnect;
}
namespace MetaData
{
struct Robot;
}
struct RawTeamMember
{
class MatchTeam* team = nullptr;
long long add_tick = 0;
int socket_handle = 0;
cs::CMJoin msg;
bool is_robot = false;
bool is_leader = false;
int state = kMatchReadying;
int choose_hero_times = 0;
MetaData::Robot* robot_meta = nullptr;
void FillMFMatchTeamMember(cs::MFMatchTeamMember* msg);
void InitRobot();
};
class MatchTeam
{
public:
a8::TimerAttacher timer_attacher;
~MatchTeam();
void Init(f8::MsgHdr& hdr, const cs::CMJoin& msg);
void _CMMatchCancel(f8::MsgHdr& hdr, const cs::CMMatchCancel& msg);
void _CMMatchChoose(f8::MsgHdr& hdr, const cs::CMMatchChoose& msg);
void _CMMatchStartGame(f8::MsgHdr& hdr, const cs::CMMatchStartGame& msg);
void _CMMatchCancelStartGame(f8::MsgHdr& hdr, const cs::CMMatchCancelStartGame& msg);
void _CMMatchSendMsg(f8::MsgHdr& hdr, const cs::CMMatchSendMsg& msg);
void _CMMatchBroadcastMsg(f8::MsgHdr& hdr, const cs::CMMatchBroadcastMsg& msg);
void AddRawMember(f8::MsgHdr& hdr, const cs::CMJoin& msg);
bool IsRawMember(const std::string& account_id);
bool IsValidMember(const cs::CMJoin& msg);
void TryCombineTeam();
std::string GetTeamUUid();
int GetMapId();
std::list<std::shared_ptr<RawTeamMember>>& GetCurrMembers() { return curr_member_hash_; };
std::shared_ptr<RawTeamMember> GetOwner() { return first_member_; };
private:
void Update();
void UpdateMaster();
void UpdateSlave();
void SyncMatchInfo();
int GetPredictMemberNum();
int GetRawMemberNum() { return raw_member_hash_.size(); };
bool HasSameCurrMember(MatchTeam* b);
bool CanCombine(MatchTeam* b);
bool IsShuaRobotTime();
void Combine(MatchTeam* b);
bool IsMasterTeam() { return master_team_ == this; };
bool IsSlaveTeam() { return master_team_ != this; };
int GetPhaseLeftTime();
std::shared_ptr<RawTeamMember> GetMemberBySocket(int socket_handle);
void ShuaRobot();
void StartGame();
void ChooseLeader();
void AutoChoose(bool force = false);
void AutoPrepare();
bool IsAllPrepare();
void UpdateTeamState();
void CheckChoose();
void CheckPrepare();
int GetValidSocketNum();
private:
long long phase_start_tick_ = 0;
int phase_= kMatchCombining;
int countdown_ = 0;
int phase_left_time_ = 0;
long long create_tick_ = 0;
std::map<std::string, std::shared_ptr<RawTeamMember>> raw_member_hash_;
std::shared_ptr<RawTeamMember> first_member_;
long long last_auto_choose_tick_ = 0;
long long last_auto_prepare_tick_ = 0;
int all_player_choose_times_ = 0;
int all_player_prepare_times_ = 0;
std::map<std::string, MatchTeam*> combined_team_hash_;
MatchTeam* master_team_ = nullptr;
std::list<std::shared_ptr<RawTeamMember>> curr_member_hash_;
};