diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index b0ebaf06..041e1eec 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -1756,7 +1756,7 @@ void Human::SendGameOver() sent_personal_report_ = true; } if (GetTeam()->team_rank && GetTeam()->HasPlayer() && !GetTeam()->IsViewTeam() && - stats->abandon_battle != 1) { + stats->abandon_battle != 1 && !room->IsMobaModeRoom()) { GetTeam()->TrySendTeamBattleReport(this); } else { cs::SMGameOver msg; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index d4c31bfe..546df6ca 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2207,6 +2207,69 @@ void Room::AddObjectLater(RoomEntity* entity) &entity->xtimer_attacher); } +void Room::TryMobaReport(int try_count) +{ + if (!IsMobaModeRoom()) { + return; + } + if (sending_moba_report_battle_) { + return; + } + if (already_moba_report_battle_) { + return;; + } + sending_moba_report_battle_ = true; + Player* player = nullptr; + TraversePlayerList + ( + [&player] (Player* hum) -> bool + { + player = hum; + return true; + }); + if (!player) { + return; + } + std::string url; + JsonDataMgr::Instance()->GetApiUrl(url); + if (url.find('?') != std::string::npos) { + url += "c=Battle&a=mobaTeamReport"; + } else { + url += "?c=Battle&a=mobaTeamReport"; + } + std::shared_ptr params = a8::MutableXObject::CreateObject(); + std::shared_ptr post_data = a8::MutableXObject::CreateObject(); + params->SetVal("account_id", player->account_id); + params->SetVal("session_id", player->session_id); + GenBattleMobaReportData(post_data.get()); + std::string content = post_data->ToJsonStr(); + HttpProxy::Instance()->HttpPost + ( + [room_uuid = GetRoomUuid()] + (bool ok, a8::XObject* rsp_obj, f8::HttpContext* ctx) + { + auto room = RoomMgr::Instance()->GetRoomByUuid(room_uuid); + if (room) { + room->already_moba_report_battle_ = true; + room->sending_moba_report_battle_ = false; + room->TraverseHumanList + ( + [] (Human* ele_hum) -> bool + { + ele_hum->SendGameOver(); + return true; + }); + } + }, + url.c_str(), + *params.get(), + content + ); +#ifdef MYDEBUG + a8::XPrintf("MobaReportReportLen:%d\n", {params->ToJsonStr().size()}); +#endif +} + void Room::OnGameOver() { if (IsAlreadyRoomReportBattle() || @@ -2228,6 +2291,9 @@ void Room::OnGameOver() ele_hum->SendGameOver(); return true; }); + if (IsMobaModeRoom()) { + TryMobaReport(0); + } xtimer.SetIntervalEx (SERVER_FRAME_RATE / 0.5, [this, frameno = GetFrameNo()] (int event, const a8::Args* args) @@ -3961,6 +4027,27 @@ void Room::GenBattleRoomReportData(a8::MutableXObject* params) params->SetVal("team_list", *teams_pb); } +void Room::GenBattleMobaReportData(a8::MutableXObject* params) +{ + params->SetVal("version", 2023030201); + params->SetVal("room_uuid", a8::XValue(GetRoomUuid())); + params->SetVal("room_mode", GetReportRoomMode()); + params->SetVal("map_mode", GetReportMapMode()); + params->SetVal("map_id", GetMapMeta()->map_id()); + auto teams_pb = a8::MutableXObject::CreateArray(); + TraverseTeams + ( + [&teams_pb] (Team* team) -> bool + { + auto team_pb = a8::MutableXObject::CreateObject(); + team->GenBattleReportData(team_pb.get()); + teams_pb->Push(*team_pb); + return true; + } + ); + params->SetVal("team_list", *teams_pb); +} + void Room::StartOverTimer() { int param1 = 1; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 0980117e..6d7d4b6d 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -375,7 +375,9 @@ private: void IncAliveCount(); void DecAliveCount(); void GenBattleRoomReportData(a8::MutableXObject* params); + void GenBattleMobaReportData(a8::MutableXObject* params); void TryRoomReport(int try_count); + void TryMobaReport(int try_count); private: bool destorying_ = false; @@ -389,6 +391,10 @@ private: RoomType_e room_type_ = RoomType_NewBrid; bool already_room_report_battle_ = false; bool sending_room_report_battle_ = false; + + bool already_moba_report_battle_ = false; + bool sending_moba_report_battle_ = false; + long long moba_overtime_race_frameno_ = 0; GasData gas_data_; diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 89565297..78cf3e5f 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -205,7 +205,7 @@ void Team::SendTeamBattleReport(Human* sender) return; } std::shared_ptr post_data = a8::MutableXObject::CreateObject(); - GenBattleReportData(player, post_data.get()); + GenBattleReportData(post_data.get()); #ifdef MYDEBUG a8::XPrintf("SendTeamBattleReport:%s\n", {post_data->ToJsonStr()}); #endif @@ -273,7 +273,7 @@ void Team::SendTeamBattleReport(Human* sender) ); } -void Team::GenBattleReportData(Human* player, a8::MutableXObject* params) +void Team::GenBattleReportData(a8::MutableXObject* params) { params->SetVal("version", 2023030201); params->SetVal("battle_uuid", a8::XValue(battle_uuid_)); @@ -620,8 +620,11 @@ bool Team::AllIsDead() void Team::TrySendTeamBattleReport(Human* sender) { if (!sending_battlereport_ && !already_report_battle_) { - sending_battlereport_ = true; - SendTeamBattleReport(sender); + if (room->IsMobaModeRoom()) { + } else { + sending_battlereport_ = true; + SendTeamBattleReport(sender); + } } } diff --git a/server/gameserver/team.h b/server/gameserver/team.h index b0268fd4..ac553f72 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -49,7 +49,7 @@ class Team : public std::enable_shared_from_this bool HasPlayer(); int GetPlayerNum(); void FillSMGameOver(cs::SMGameOver& msg); - void GenBattleReportData(Human* player, a8::MutableXObject* params); + void GenBattleReportData(a8::MutableXObject* params); void GenRoomReportData(a8::MutableXObject* params); void RunAway(Human* hum); bool AllIsRunAway();