diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-12-31 11:53:12 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-12-31 11:53:12 +0100 |
commit | 55091ff4bcf4500d0ebe9701e6dc121f5e6a3bb2 (patch) | |
tree | 54212430a73c70418f854cb1a7a4fb4eff5e02cb | |
parent | 23cb9592fc83957ce1a5cfb0b5bef0ce13c19edb (diff) |
Core/Players: Fixed crashes when accessing ActivePlayerData::PvpInfo
Closes #28638
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 5 |
3 files changed, 35 insertions, 14 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 4cba6ab5b55..7345b40b0b1 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -3204,10 +3204,10 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(reqValue); if (!pvpTier) return false; - if (std::size_t(pvpTier->BracketID) >= referencePlayer->m_activePlayerData->PvpInfo.size()) + UF::PVPInfo const* pvpInfo = referencePlayer->GetPvpInfoForBracket(pvpTier->BracketID); + if (!pvpInfo) return false; - UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[pvpTier->BracketID]; - if (pvpTier->ID != pvpInfo.PvpTierID || *pvpInfo.Disqualified) + if (pvpTier->ID != pvpInfo->PvpTierID) return false; break; } @@ -3243,10 +3243,10 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerPvpTierInBracketEqualOrGreaterThan: // 239 { - if (secondaryAsset >= referencePlayer->m_activePlayerData->PvpInfo.size()) + UF::PVPInfo const* pvpInfo = referencePlayer->GetPvpInfoForBracket(secondaryAsset); + if (!pvpInfo) return false; - UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[secondaryAsset]; - PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(pvpInfo.PvpTierID); + PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(pvpInfo->PvpTierID); if (!pvpTier) return false; if (pvpTier->Rank < int32(reqValue)) @@ -3725,19 +3725,19 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(reqValue); if (!pvpTier) return false; - if (std::size_t(pvpTier->BracketID) >= referencePlayer->m_activePlayerData->PvpInfo.size()) + UF::PVPInfo const* pvpInfo = referencePlayer->GetPvpInfoForBracket(pvpTier->BracketID); + if (!pvpInfo) return false; - UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[pvpTier->BracketID]; - if (pvpTier->ID != pvpInfo.WeeklyBestWinPvpTierID || *pvpInfo.Disqualified) + if (pvpTier->ID != pvpInfo->WeeklyBestWinPvpTierID) return false; break; } case ModifierTreeType::PlayerBestWeeklyWinPvpTierInBracketEqualOrGreaterThan: // 325 { - if (secondaryAsset >= referencePlayer->m_activePlayerData->PvpInfo.size()) + UF::PVPInfo const* pvpInfo = referencePlayer->GetPvpInfoForBracket(secondaryAsset); + if (!pvpInfo) return false; - UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[secondaryAsset]; - PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(pvpInfo.WeeklyBestWinPvpTierID); + PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(pvpInfo->WeeklyBestWinPvpTierID); if (!pvpTier) return false; if (pvpTier->Rank < int32(reqValue)) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 544b66426bf..7f148e6b6bc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21808,6 +21808,26 @@ void Player::LeaveAllArenaTeams(ObjectGuid guid) } } +uint32 Player::GetArenaPersonalRating(uint8 slot) const +{ + if (UF::PVPInfo const* pvpInfo = GetPvpInfoForBracket(slot)) + return pvpInfo->Rating; + + return 0; +} + +UF::PVPInfo const* Player::GetPvpInfoForBracket(int8 bracket) const +{ + int32 index = m_activePlayerData->PvpInfo.FindIndexIf([bracket](UF::PVPInfo const& pvpInfo) + { + return pvpInfo.Bracket == bracket && !*pvpInfo.Disqualified; + }); + if (index >= 0) + return &m_activePlayerData->PvpInfo[index]; + + return nullptr; +} + bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc /*= nullptr*/, uint32 spellid /*= 0*/, uint32 preferredMountDisplay /*= 0*/) { if (nodes.size() < 2) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index acbbc17c552..f252e7d5a19 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2006,10 +2006,11 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value); static void LeaveAllArenaTeams(ObjectGuid guid); uint32 GetArenaTeamId(uint8 /*slot*/) const { return 0; } - uint32 GetArenaPersonalRating(uint8 slot) const { return m_activePlayerData->PvpInfo[slot].Rating; } + uint32 GetArenaPersonalRating(uint8 slot) const; void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; } uint32 GetArenaTeamIdInvited() const { return m_ArenaTeamIdInvited; } - uint32 GetRBGPersonalRating() const { return m_activePlayerData->PvpInfo[3].Rating; } + uint32 GetRBGPersonalRating() const { return GetArenaPersonalRating(3); } + UF::PVPInfo const* GetPvpInfoForBracket(int8 bracket) const; Difficulty GetDifficultyID(MapEntry const* mapEntry) const; Difficulty GetDungeonDifficultyID() const { return m_dungeonDifficulty; } |