diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index f34c5173..bbf5349a 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -135,6 +135,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&ggmsghandler, &Player::_CMReportSpecShotHitPos); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMWatchTarget); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMTeamCommand); + RegisterNetMsgHandler(&ggmsghandler, &Player::_CMMobaBattleData); } void HandlerMgr::ProcGMMsg(unsigned long saddr, int sockhandle, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index d864cfd5..ad21529b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -432,6 +432,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string killer_name, in } } GetTrigger()->HpChg(); + room->OnTeamPartChg(this); } void Human::AddToNewObjects(Entity* entity) @@ -3553,6 +3554,7 @@ void Human::InternalBeKill(int killer_id, const std::string& killer_name, int we } } SendViewerUiMemberUpdate({GetUniId(), killer_id, real_killer_id}); + room->NotifyUiUpdate(); } int Human::GetTeamMode() @@ -3576,6 +3578,7 @@ void Human::CalcAssists(Human* target) if (hum->room->GetFrameNo() - itr->second < SERVER_FRAME_RATE * assist_time) { ++hum->stats->assist; + room->NotifyUiUpdate(); } } return true; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e7be2733..e8f8d492 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -17,6 +17,9 @@ namespace cs class MFThrow; class MFSandTableFullMsg; class MFSandTablePartMsg; + class MFMobaBattleDataMember; + class MFTeamPart; + class MFTeamMemberNew; class SMGameOver; class SMUpdate; } @@ -162,6 +165,9 @@ class Human : public Creature virtual void OnExplosionHit(Explosion* explosion) override; long long GetRealDeadFrameNo(Room* room); void FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_over); + void FillMFMobaBattleDataMember(cs::MFMobaBattleDataMember* p); + void FillMFTeamPart(cs::MFTeamPart* p); + void FillMFTeamMemberNew(cs::MFTeamMemberNew* p); void CarShot(const glm::vec3& target_dir); void BeKill(int killer_id, const std::string& killer_name, int weapon_id, int real_killer_id, const std::string& real_killer_name); diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index 2fa7c218..b429056e 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -1014,6 +1014,63 @@ void Human::FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_o } } +void Human::FillMFMobaBattleDataMember(cs::MFMobaBattleDataMember* p) +{ + p->set_team_id(GetTeam()->GetTeamId()); + p->set_member_uniid(GetUniId()); + p->set_name(name); + p->set_avatar_url(avatar_url); + p->set_hero_id(GetNetData()->GetHeroId()); + p->set_head_frame(head_frame); + + for (auto& inv : GetInventoryData()) { + p->add_inventory(inv.num); + } + p->set_kill_count(stats->kills); + p->set_dead_count(stats->dead_times); + p->set_assist_count(stats->assist); + + p->set_main_skill_id(GetMainSkill()->GetSkillId()); + p->set_main_skill_cd(GetMainSkill()->GetLeftTime()); + p->set_main_skill_max_cd(GetMainSkill()->GetCd()); +} + +void Human::FillMFTeamPart(cs::MFTeamPart* p) +{ + p->set_team_id(GetTeam()->GetTeamId()); + p->set_obj_uniid(GetUniId()); + TypeConvert::ToPb(GetPos(), p->mutable_pos()); + TypeConvert::ToPb(GetAttackDir(), p->mutable_dir()); + + p->set_health(GetHP()); + p->set_max_health(GetMaxHP()); + p->set_disconnected(disconnected); + p->set_dead(dead); + p->set_downed(downed); +} + +void Human::FillMFTeamMemberNew(cs::MFTeamMemberNew* p) +{ + p->set_team_id(GetTeam()->GetTeamId()); + p->set_obj_uniid(GetUniId()); + TypeConvert::ToPb(GetPos(), p->mutable_pos()); + TypeConvert::ToPb(GetAttackDir(), p->mutable_dir()); + + p->set_health(GetHP()); + p->set_disconnected(disconnected); + p->set_dead(dead); + p->set_downed(downed); + p->set_name(name); + p->set_max_health(GetMaxHP()); + p->set_hero_id(GetNetData()->GetHeroId()); + p->set_level(GetNetData()->GetLevel()); + p->set_hero_level(GetHeroLevel()); + p->set_hero_exp(GetHeroExp()); + p->set_hero_max_exp(GetHeroMaxExp()); + p->set_main_skill_cd(GetMainSkill()->GetLeftTime()); + p->set_main_skill_max_cd(GetMainSkill()->GetCd()); +} + void Human::FillSMGameOver(cs::SMGameOver& msg) { if (room->GetVictoryTeam()) { @@ -1724,6 +1781,8 @@ void Human::SendUIUpdate() cs::SMUiUpdate notifymsg; notifymsg.set_alive_count(room->AliveCount()); notifymsg.set_kill_count(stats->kills); + notifymsg.set_dead_count(stats->dead_times); + notifymsg.set_assist_count(stats->assist); room->FillSMUiUpdate(notifymsg); if (room->IsPveRoom()) { notifymsg.set_score(stats->pve_rank_score); @@ -2471,6 +2530,30 @@ void Team::FillSMGameOver(cs::SMGameOver& msg) } } +void Team::FillMFMobaBattleDataTeam(cs::MFMobaBattleDataTeam* p) +{ + p->set_team_id(GetTeamId()); + TraverseMembers + ( + [p] (Human* hum) -> bool + { + hum->FillMFMobaBattleDataMember(p->add_members()); + return true; + }); +} + +void Team::FillMFTeamFull(cs::MFTeamFull* p) +{ + p->set_team_id(GetTeamId()); + TraverseMembers + ( + [p] (Human* hum) -> bool + { + hum->FillMFTeamMemberNew(p->add_members()); + return true; + }); +} + bool PBUtils::SupportSandTable(int proto_version) { return true; @@ -2557,6 +2640,63 @@ void Room::NotifyKillList(const std::vector& uniid_list) }); } +void Room::SendSMTeamFull(Human* hum) +{ + if (!IsMobaModeRoom()) { + return; + } + cs::SMTeamFullNotify notify_msg; + std::vector team_list = {GetMobaTeamA(), GetMobaTeamB()}; + for (Team* team : team_list) { + team->FillMFTeamFull(notify_msg.add_team_list()); + } + TraversePlayerList + ( + [¬ify_msg] (Player* hum) -> bool + { +#ifdef MYDEBUG1 + a8::XPrintf("SMTeamFull:%s\n", {f8::PbToJson(¬ify_msg)}); +#endif + hum->SendNotifyMsg(notify_msg); + return true; + }); +} + +void Room::OnTeamPartChg(Human* hum) +{ + if (!IsMobaModeRoom()) { + return; + } + if (team_part_chg_human_hash_.empty()) { + team_part_chg_human_hash_[hum->GetUniId()] = hum; + xtimer.SetTimeoutWpEx + (SERVER_FRAME_RATE * 0.5, + [this] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + cs::SMTeamPartNotify notify_msg; + for (auto& pair : team_part_chg_human_hash_) { + pair.second->FillMFTeamPart(notify_msg.add_members()); + } + TraversePlayerList + ( + [¬ify_msg] (Player* hum) -> bool + { +#ifdef MYDEBUG1 + a8::XPrintf("SMTeamPart:%s\n", {f8::PbToJson(¬ify_msg)}); +#endif + hum->SendNotifyMsg(notify_msg); + return true; + }); + team_part_chg_human_hash_.clear(); + } + }, + &xtimer_attacher_); + } else { + team_part_chg_human_hash_[hum->GetUniId()] = hum; + } +} + int Room::InitWithCustomBattle(long ip_saddr, int socket_handle, std::shared_ptr msg, std::shared_ptr p) { diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index b9a467e5..647d12c6 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1876,6 +1876,18 @@ void Player::_CMTeamCommand(f8::MsgHdr* hdr, const cs::CMTeamCommand& msg) } } +void Player::_CMMobaBattleData(f8::MsgHdr* hdr, const cs::CMMobaBattleData& msg) +{ + if (room->IsMobaModeRoom()) { + cs::SMMobaBattleData rsp_msg; + std::vector team_list = {room->GetMobaTeamA(), room->GetMobaTeamB()}; + for (Team* team : team_list) { + team->FillMFMobaBattleDataTeam(rsp_msg.add_team_list()); + } + SendNotifyMsg(rsp_msg); + } +} + void Player::SetShotHold(bool hold) { if (!hold && shot_hold) { diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 3adc9376..19dbf60a 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -30,6 +30,7 @@ namespace cs class CMReportSpecShotHitPos; class CMWatchTarget; class CMTeamCommand; + class CMMobaBattleData; } class Room; @@ -147,6 +148,7 @@ class Player : public Human void _CMReportSpecShotHitPos(f8::MsgHdr* hdr, const cs::CMReportSpecShotHitPos& msg); void _CMWatchTarget(f8::MsgHdr* hdr, const cs::CMWatchTarget& msg); void _CMTeamCommand(f8::MsgHdr* hdr, const cs::CMTeamCommand& msg); + void _CMMobaBattleData(f8::MsgHdr* hdr, const cs::CMMobaBattleData& msg); virtual void SetAttackDir(const glm::vec3& attack_dir) override; void AsyncRequestWatchWar(bool send_rsp_msg); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index d9f57990..5518aa4b 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2997,6 +2997,7 @@ void Room::OnBattleStart() return true; }); battle_starting_ = false; + SendSMTeamFull(nullptr); } bool Room::CanAddObstacle(const glm::vec3& pos, int obstacle_id) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 4359aa7c..d20fb637 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -288,6 +288,8 @@ public: void CreateAndroid(int android_num, std::shared_ptr team = nullptr); int GetFullLevelIdx() { return ++curr_full_level_idx_;} std::shared_ptr GetRoomOb(); + void SendSMTeamFull(Human* hum); + void OnTeamPartChg(Human* hum); private: void ShuaAndroid(); @@ -400,6 +402,7 @@ private: std::map alive_human_hash_; std::map alive_player_hash_; std::map last_human_hash_; + std::map team_part_chg_human_hash_; std::map> born_point_hash_; std::map> task_hash_; diff --git a/server/gameserver/team.h b/server/gameserver/team.h index 3cf04c3c..1968341d 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -2,6 +2,8 @@ namespace cs { + class MFMobaBattleDataTeam; + class MFTeamFull; class SMGameOver; } @@ -61,6 +63,8 @@ class Team : public std::enable_shared_from_this int GetKillCount(); long long GetLastKillFrameNo() { return last_kill_frameno_; } bool MemberHasOb(); + void FillMFMobaBattleDataTeam(cs::MFMobaBattleDataTeam* p); + void FillMFTeamFull(cs::MFTeamFull* p); private: int team_id_ = 0; diff --git a/server/tools/protobuild/cs_msgid.proto b/server/tools/protobuild/cs_msgid.proto index 4ea23ac3..3e1262cd 100644 --- a/server/tools/protobuild/cs_msgid.proto +++ b/server/tools/protobuild/cs_msgid.proto @@ -34,6 +34,7 @@ enum CMMessageId_e _CMReportSpecShotHitPos = 240; _CMWatchTarget = 241; _CMTeamCommand = 242; + _CMMobaBattleData = 243; } enum SMMessageId_e @@ -49,6 +50,7 @@ enum SMMessageId_e _SMGetSettlementTeamList = 238; _SMWatchTarget = 241; _SMTeamComamnd = 242; + _SMMobaBattleData = 243; _SMJoinedNotify = 103; _SMMapInfo = 1002; @@ -78,4 +80,6 @@ enum SMMessageId_e _SMViewerUiNotify = 1029; _SMViewerUiMemberUpdate = 1030; _SMTeamCommandNotify = 1031; + _SMTeamFullNotify = 1032; + _SMTeamPartNotify = 1033; } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 373289e1..c901c86e 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -739,6 +739,49 @@ message MFTeamData repeated MFSkin skin = 39; //皮肤id } +//队伍数据-全量 +message MFTeamMemberNew +{ + optional int32 team_id = 1; //队伍Id + optional int32 obj_uniid = 2; //玩家id + optional MFVec3 pos = 3; //位置 + optional MFVec3 dir = 4; //方向 + optional float health = 5; //血量 + optional bool disconnected = 6 [default = false]; //是否短线 + optional bool dead = 7 [default = false]; //是否死亡 + optional bool downed = 8 [default = false]; //是否倒下 + optional string name = 9; //名字 + optional float max_health = 10; //最大血量 + optional int32 hero_id = 20 [default = 0]; //英雄id + optional int32 level = 21 [default = 0]; //等级 + optional int32 hero_level = 22; //hero等级 + optional int32 hero_exp = 23; //hero经验 + optional int32 hero_max_exp = 24; //hero max经验 + optional int32 main_skill_cd = 25 [default = 0]; //技能cd时间 + optional int32 main_skill_max_cd = 26 [default = 0]; //技能cd上限时间 +} + +//队伍数据-全量 +message MFTeamFull +{ + optional int32 team_id = 1; //队伍Id + repeated MFTeamMemberNew members = 2; //队伍成员 +} + +//队伍数据-部分 +message MFTeamPart +{ + optional int32 team_id = 1; //队伍Id + optional int32 obj_uniid = 2; //玩家id + optional MFVec3 pos = 3; //位置 + optional MFVec3 dir = 4; //方向 + optional float health = 5; //血量 + optional float max_health = 6; //最大血量 + optional bool disconnected = 7 [default = false]; //是否短线 + optional bool dead = 8 [default = false]; //是否死亡 + optional bool downed = 9 [default = false]; //是否倒下 +} + //队伍数据 message MFTeamDataNew { @@ -1403,7 +1446,6 @@ message MFMobaTeamMember optional int32 head_frame = 10; //头像框 optional int32 obj_uniid = 11; //对象唯一id } - //moba队伍 message MFMobaTeam { @@ -1432,6 +1474,33 @@ message MFViewerTeam repeated MFViewTeamMember members = 2; //成员列表 } +//moba战斗数据-队伍 +message MFMobaBattleDataMember +{ + optional int32 team_id = 1; //队伍id + optional int32 member_uniid = 2; //uniid + optional string name = 3; //名字 + optional string avatar_url = 4; //头像 + optional int32 hero_id = 5; //英雄id + optional int32 head_frame = 6; //头像框 + + repeated int32 inventory = 11; //库存(相当于其他游戏里的背包) + optional int32 kill_count = 12; //击杀数 + optional int32 dead_count = 13; //死亡次数(被杀数) + optional int32 assist_count = 14; //助攻次数 + + optional int32 main_skill_id = 30; //主技能id + optional int32 main_skill_cd = 31; //主技能cd(单位毫秒) + optional int32 main_skill_max_cd = 32 [default = 0]; //技能cd上限时间 +} + +//moba战斗数据-队伍 +message MFMobaBattleDataTeam +{ + optional int32 team_id = 1; //队伍id + repeated MFMobaBattleDataMember members = 2; //成员列表 +} + //end mfmsg //加入 @@ -1736,6 +1805,16 @@ message CMTeamCommand optional string custom_command = 2; //指令(json格式,客户端自定义) } +//请求moba战斗数据 +message CMMobaBattleData +{ +} + +message SMMobaBattleData +{ + repeated MFMobaBattleDataTeam team_list = 1; //队伍列表(客户端通过判断team_id是否等于自己队伍) +} + //加入成功 message SMJoinedNotify { @@ -1928,6 +2007,8 @@ message SMUiUpdate optional int32 alive_count = 1; //存活数量 optional int32 kill_count = 2; //击杀数 repeated MFMapCarInfo car_list = 3; //载具列表 + optional int32 dead_count = 4; //死亡次数(被杀数) + optional int32 assist_count = 5; //助攻次数 //一下只有pve模式有意义 optional int32 score = 10; //积分 @@ -2034,3 +2115,19 @@ message SMTeamCommandNotify optional int32 sender_id = 1; //指令发起者 optional string custom_command = 2; //指令(json格式客户端自定义) } + +//队伍信息通知-全量 +/* + 该消息在进入战斗开始后发(注意战前准备阶段不发因为那时可能会发生队伍合并)后续如果断线重连也会补发客户端需要处理多次的问题 + 不同于SMUpdate.team_data该队伍关系不会在发生改变(由于战前准备阶段会有合并队伍的情况所欲SMUpdate.team_data是会发生队伍的变更) + */ +message SMTeamFullNotify +{ + repeated MFTeamFull team_list = 1; //队伍列表 +} + +//队伍信息通知-部分 +message SMTeamPartNotify +{ + repeated MFTeamPart members = 1; //待更新成员列表 +}