fix(Core/Arena): Fix lag caused by arena distribution (#15444)

* cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/3f3dee804904042486741320519553a49c3149bb)

Co-authored-by: ibakula <10998369+ibakula@users.noreply.github.com>
Co-authored-by: Gildor <521036+Jildor@users.noreply.github.com>
This commit is contained in:
Kitzunu
2023-03-18 09:50:45 +01:00
committed by GitHub
parent 7f7ec62a0a
commit 465c5b12e4
3 changed files with 17 additions and 6 deletions
+12 -2
View File
@@ -927,7 +927,7 @@ void ArenaTeam::UpdateArenaPointsHelper(std::map<ObjectGuid, uint32>& playerPoin
} }
} }
void ArenaTeam::SaveToDB() void ArenaTeam::SaveToDB(bool forceMemberSave)
{ {
if (!sScriptMgr->CanSaveToDB(this)) if (!sScriptMgr->CanSaveToDB(this))
return; return;
@@ -949,6 +949,10 @@ void ArenaTeam::SaveToDB()
for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr)
{ {
// Save the effort and go
if (itr->WeekGames == 0 && !forceMemberSave)
continue;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ARENA_TEAM_MEMBER); stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ARENA_TEAM_MEMBER);
stmt->SetData(0, itr->PersonalRating); stmt->SetData(0, itr->PersonalRating);
stmt->SetData(1, itr->WeekGames); stmt->SetData(1, itr->WeekGames);
@@ -970,8 +974,12 @@ void ArenaTeam::SaveToDB()
CharacterDatabase.CommitTransaction(trans); CharacterDatabase.CommitTransaction(trans);
} }
void ArenaTeam::FinishWeek() bool ArenaTeam::FinishWeek()
{ {
// No need to go further than this
if (Stats.WeekGames == 0)
return false;
// Reset team stats // Reset team stats
Stats.WeekGames = 0; Stats.WeekGames = 0;
Stats.WeekWins = 0; Stats.WeekWins = 0;
@@ -982,6 +990,8 @@ void ArenaTeam::FinishWeek()
itr->WeekGames = 0; itr->WeekGames = 0;
itr->WeekWins = 0; itr->WeekWins = 0;
} }
return true;
} }
bool ArenaTeam::IsFighting() const bool ArenaTeam::IsFighting() const
+2 -2
View File
@@ -182,7 +182,7 @@ public:
bool LoadArenaTeamFromDB(QueryResult arenaTeamDataResult); bool LoadArenaTeamFromDB(QueryResult arenaTeamDataResult);
bool LoadMembersFromDB(QueryResult arenaTeamMembersResult); bool LoadMembersFromDB(QueryResult arenaTeamMembersResult);
void LoadStatsFromDB(uint32 ArenaTeamId); void LoadStatsFromDB(uint32 ArenaTeamId);
void SaveToDB(); void SaveToDB(bool forceMemberSave = false);
void BroadcastPacket(WorldPacket* packet); void BroadcastPacket(WorldPacket* packet);
void BroadcastEvent(ArenaTeamEvents event, ObjectGuid guid, uint8 strCount, std::string const& str1, std::string const& str2, std::string const& str3); void BroadcastEvent(ArenaTeamEvents event, ObjectGuid guid, uint8 strCount, std::string const& str1, std::string const& str2, std::string const& str3);
@@ -206,7 +206,7 @@ public:
void UpdateArenaPointsHelper(std::map<ObjectGuid, uint32>& PlayerPoints); void UpdateArenaPointsHelper(std::map<ObjectGuid, uint32>& PlayerPoints);
void FinishWeek(); bool FinishWeek(); // returns true if arena team played this week
void FinishGame(int32 mod, const Map* bgMap); void FinishGame(int32 mod, const Map* bgMap);
void SetPreviousOpponents(uint32 arenaTeamId) { PreviousOpponents = arenaTeamId; } void SetPreviousOpponents(uint32 arenaTeamId) { PreviousOpponents = arenaTeamId; }
@@ -239,8 +239,9 @@ void ArenaTeamMgr::DistributeArenaPoints()
{ {
if (ArenaTeam* at = titr->second) if (ArenaTeam* at = titr->second)
{ {
at->FinishWeek(); if (at->FinishWeek())
at->SaveToDB(); at->SaveToDB(true);
at->NotifyStatsChanged(); at->NotifyStatsChanged();
} }
} }