From 4ecfc624388fc53e4adc4ce1783e91095d77888b Mon Sep 17 00:00:00 2001 From: ariel- Date: Sat, 8 Apr 2017 16:18:53 -0300 Subject: [PATCH] Core/Achievement: fix bad lookup of ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM item Closes #19064 (cherry picked from commit 70c4a37544ade558fb79383d2668f5f0322d47b8) --- .../game/Achievements/AchievementMgr.cpp | 18 +++++++++++------- src/server/game/Achievements/AchievementMgr.h | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 6e71f60bfc..6a5c3ca025 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -275,7 +275,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) } } -bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 /*= 0*/) const +bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /* = 0*/) const { switch (dataType) { @@ -364,10 +364,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1); - if (!pProto) + AchievementCriteriaEntry const* entry = ASSERT_NOTNULL(sAchievementMgr->GetAchievementCriteria(criteria_id)); + + uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); + if (!itemTemplate) return false; - return pProto->GetBaseItemLevel() >= equipped_item.item_level && pProto->GetQuality() >= equipped_item.item_quality; + + return itemTemplate->GetBaseItemLevel() >= equipped_item.item_level && itemTemplate->GetQuality() >= equipped_item.item_quality; } case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: return source->GetMapId() == map_id.mapId; @@ -391,10 +395,10 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; } -bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, uint32 miscValue /*= 0*/) const +bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/) const { for (Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr) - if (!itr->Meets(criteria_id, source, target, miscValue)) + if (!itr->Meets(criteria_id, source, target, miscValue1, miscValue2)) return false; return true; @@ -1178,7 +1182,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, break; default: if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria)) - if (!data->Meets(referencePlayer, unit, miscValue1)) + if (!data->Meets(referencePlayer, unit, miscValue1, miscValue2)) continue; break; } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index d99d7e2cf3..390a427885 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -201,7 +201,7 @@ struct AchievementCriteriaData } bool IsValid(AchievementCriteriaEntry const* criteria); - bool Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 = 0) const; + bool Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const; }; struct TC_GAME_API AchievementCriteriaDataSet @@ -209,7 +209,7 @@ struct TC_GAME_API AchievementCriteriaDataSet AchievementCriteriaDataSet() : criteria_id(0) { } typedef std::vector Storage; void Add(AchievementCriteriaData const& data) { storage.push_back(data); } - bool Meets(Player const* source, Unit const* target, uint32 miscValue = 0) const; + bool Meets(Player const* source, Unit const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const; void SetCriteriaId(uint32 id) {criteria_id = id;} private: uint32 criteria_id;