diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index a3dc1432e4..2f8b0e54e5 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -246,9 +246,13 @@ void Arena::EndBattleground(TeamId winnerTeamId) trans->Append(stmt2); uint8 memberId = 0; - for (auto const& [playerGuid, arenaLogEntryData] : ArenaLogEntries) + for (auto& [playerGuid, arenaLogEntryData] : ArenaLogEntries) { auto const& score = PlayerScores.find(playerGuid.GetCounter()); + // Update stats from PlayerScores if player is still in arena + if (score != PlayerScores.end()) + arenaLogEntryData.SaveStats(score->second->GetDamageDone(), score->second->GetHealingDone(), score->second->GetKillingBlows()); + stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_INS_ARENA_LOG_MEMBERSTATS); stmt2->SetData(0, fightId); stmt2->SetData(1, ++memberId); @@ -257,18 +261,9 @@ void Arena::EndBattleground(TeamId winnerTeamId) stmt2->SetData(4, arenaLogEntryData.ArenaTeamId); stmt2->SetData(5, arenaLogEntryData.Acc); stmt2->SetData(6, arenaLogEntryData.IP); - if (score != PlayerScores.end()) - { - stmt2->SetData(7, score->second->GetDamageDone()); - stmt2->SetData(8, score->second->GetHealingDone()); - stmt2->SetData(9, score->second->GetKillingBlows()); - } - else - { - stmt2->SetData(7, 0); - stmt2->SetData(8, 0); - stmt2->SetData(9, 0); - } + stmt2->SetData(7, arenaLogEntryData.DamageDone); + stmt2->SetData(8, arenaLogEntryData.HealingDone); + stmt2->SetData(9, arenaLogEntryData.KillingBlows); trans->Append(stmt2); } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 572f7dfe3b..b10feb7b84 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1061,6 +1061,11 @@ void Battleground::RemovePlayerAtLeave(Player* player) auto const& itr2 = PlayerScores.find(player->GetGUID().GetCounter()); if (itr2 != PlayerScores.end()) { + // Save stats to ArenaLogEntries before deleting score (for arena logging) + auto itr3 = ArenaLogEntries.find(player->GetGUID()); + if (itr3 != ArenaLogEntries.end()) + itr3->second.SaveStats(itr2->second->GetDamageDone(), itr2->second->GetHealingDone(), itr2->second->GetKillingBlows()); + delete itr2->second; PlayerScores.erase(itr2); } diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index b22cdc143a..6f9d79e070 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -258,11 +258,21 @@ public: IP = ip; } + void SaveStats(uint32 damageDone, uint32 healingDone, uint32 killingBlows) + { + DamageDone = damageDone; + HealingDone = healingDone; + KillingBlows = killingBlows; + } + std::string Name{}; ObjectGuid::LowType Guid{0}; uint32 Acc{0}; uint32 ArenaTeamId{0}; std::string IP{}; + uint32 DamageDone{0}; + uint32 HealingDone{0}; + uint32 KillingBlows{0}; }; enum BGHonorMode