aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-12-31 11:53:12 +0100
committerShauren <shauren.trinity@gmail.com>2022-12-31 11:53:12 +0100
commit55091ff4bcf4500d0ebe9701e6dc121f5e6a3bb2 (patch)
tree54212430a73c70418f854cb1a7a4fb4eff5e02cb
parent23cb9592fc83957ce1a5cfb0b5bef0ce13c19edb (diff)
Core/Players: Fixed crashes when accessing ActivePlayerData::PvpInfo
Closes #28638
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp24
-rw-r--r--src/server/game/Entities/Player/Player.cpp20
-rw-r--r--src/server/game/Entities/Player/Player.h5
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; }