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:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user