From 8028b3bbb6d7a8edb1993452a03d1f04e2a07077 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 19 May 2020 15:11:44 -0400 Subject: [PATCH] Core/Achievement: fix bad lookup of ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM item Port From (https://github.com/TrinityCore/TrinityCore/commit/c3811b26bc39e4e98da5d8542575400a0287cb9c) --- Source/Game/Achievements/CriteriaHandler.cs | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 55c6ebc2a..f224fd594 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -87,7 +87,7 @@ namespace Game.Achievements // requirements not found in the dbc CriteriaDataSet data = Global.CriteriaMgr.GetCriteriaDataSet(criteria); if (data != null) - if (!data.Meets(referencePlayer, unit, (uint)miscValue1)) + if (!data.Meets(referencePlayer, unit, (uint)miscValue1, (uint)miscValue2)) continue; switch (type) @@ -3199,7 +3199,7 @@ namespace Game.Achievements } } - public bool Meets(uint criteria_id, Player source, Unit target, uint miscValue1 = 0) + public bool Meets(uint criteriaId, Player source, Unit target, uint miscValue1 = 0, uint miscValue2 = 0) { switch (DataType) { @@ -3274,26 +3274,29 @@ namespace Game.Achievements if (!map.IsDungeon()) { Log.outError(LogFilter.Achievement, "Achievement system call AchievementCriteriaDataType.InstanceScript ({0}) for achievement criteria {1} for non-dungeon/non-raid map {2}", - CriteriaDataType.InstanceScript, criteria_id, map.GetId()); + CriteriaDataType.InstanceScript, criteriaId, map.GetId()); return false; } InstanceScript instance = ((InstanceMap)map).GetInstanceScript(); if (instance == null) { Log.outError(LogFilter.Achievement, "Achievement system call criteria_data_INSTANCE_SCRIPT ({0}) for achievement criteria {1} for map {2} but map does not have a instance script", - CriteriaDataType.InstanceScript, criteria_id, map.GetId()); + CriteriaDataType.InstanceScript, criteriaId, map.GetId()); return false; } - return instance.CheckAchievementCriteriaMeet(criteria_id, source, target, miscValue1); + return instance.CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue1); } case CriteriaDataType.SEquippedItem: { - ItemTemplate pProto = Global.ObjectMgr.GetItemTemplate(miscValue1); - if (pProto == null) + Criteria entry = Global.CriteriaMgr.GetCriteria(criteriaId); + + uint itemId = entry.Entry.Type == CriteriaTypes.EquipEpicItem ? miscValue2 : miscValue1; + ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemId); + if (itemTemplate == null) return false; - return pProto.GetBaseItemLevel() >= EquippedItem.ItemLevel && (int)pProto.GetQuality() >= EquippedItem.ItemQuality; + return itemTemplate.GetBaseItemLevel() >= EquippedItem.ItemLevel && (uint)itemTemplate.GetQuality() >= EquippedItem.ItemQuality; } - case CriteriaDataType.MapId: + case CriteriaDataType.MapId: return source.GetMapId() == MapId.Id; case CriteriaDataType.SKnownTitle: { @@ -3485,10 +3488,10 @@ namespace Game.Achievements { public void Add(CriteriaData data) { storage.Add(data); } - public bool Meets(Player source, Unit target, uint miscValue = 0) + public bool Meets(Player source, Unit target, uint miscValue = 0, uint miscValue2 = 0) { foreach (var data in storage) - if (!data.Meets(criteria_id, source, target, miscValue)) + if (!data.Meets(criteria_id, source, target, miscValue, miscValue2)) return false; return true;