diff options
author | ariel- <ariel-@users.noreply.github.com> | 2017-04-08 16:18:53 -0300 |
---|---|---|
committer | ariel- <ariel-@users.noreply.github.com> | 2017-04-08 16:21:16 -0300 |
commit | 70c4a37544ade558fb79383d2668f5f0322d47b8 (patch) | |
tree | cb22bb59a0f5c727e645dcde4c4e108bfbbaefce /src | |
parent | 3c4c67160afbe15cc48e5390201157c416cb9a09 (diff) |
Core/Achievement: fix bad lookup of ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM item
Closes #19064
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 4 |
2 files changed, 12 insertions, 9 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 4908c7f6770..986badd2471 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -291,7 +291,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) { @@ -396,10 +396,13 @@ 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->ItemLevel >= equipped_item.item_level && pProto->Quality >= equipped_item.item_quality; + return itemTemplate->ItemLevel >= equipped_item.item_level && itemTemplate->Quality >= equipped_item.item_quality; } case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: return source->GetMapId() == map_id.mapId; @@ -435,10 +438,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; @@ -756,7 +759,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; default: if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria)) - if (!data->Meets(GetPlayer(), unit, miscValue1)) + if (!data->Meets(GetPlayer(), unit, miscValue1, miscValue2)) continue; break; } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 99ac4f90f87..5309b749aa2 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -218,7 +218,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 @@ -226,7 +226,7 @@ struct TC_GAME_API AchievementCriteriaDataSet AchievementCriteriaDataSet() : criteria_id(0) { } typedef std::vector<AchievementCriteriaData> 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; |