Core/Players: Fixed crashes when accessing ActivePlayerData::PvpInfo

Closes #28638
This commit is contained in:
Shauren
2022-12-31 11:53:12 +01:00
parent 23cb9592fc
commit 55091ff4bc
3 changed files with 35 additions and 14 deletions

View File

@@ -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))

View File

@@ -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)

View File

@@ -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; }