Core/Achievement: fix bad lookup of ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM item

Port From (https://github.com/TrinityCore/TrinityCore/commit/c3811b26bc39e4e98da5d8542575400a0287cb9c)
This commit is contained in:
hondacrx
2020-05-19 15:11:44 -04:00
parent 6b67079dd1
commit 8028b3bbb6
+14 -11
View File
@@ -87,7 +87,7 @@ namespace Game.Achievements
// requirements not found in the dbc // requirements not found in the dbc
CriteriaDataSet data = Global.CriteriaMgr.GetCriteriaDataSet(criteria); CriteriaDataSet data = Global.CriteriaMgr.GetCriteriaDataSet(criteria);
if (data != null) if (data != null)
if (!data.Meets(referencePlayer, unit, (uint)miscValue1)) if (!data.Meets(referencePlayer, unit, (uint)miscValue1, (uint)miscValue2))
continue; continue;
switch (type) 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) switch (DataType)
{ {
@@ -3274,26 +3274,29 @@ namespace Game.Achievements
if (!map.IsDungeon()) if (!map.IsDungeon())
{ {
Log.outError(LogFilter.Achievement, "Achievement system call AchievementCriteriaDataType.InstanceScript ({0}) for achievement criteria {1} for non-dungeon/non-raid map {2}", 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; return false;
} }
InstanceScript instance = ((InstanceMap)map).GetInstanceScript(); InstanceScript instance = ((InstanceMap)map).GetInstanceScript();
if (instance == null) 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", 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 false;
} }
return instance.CheckAchievementCriteriaMeet(criteria_id, source, target, miscValue1); return instance.CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue1);
} }
case CriteriaDataType.SEquippedItem: case CriteriaDataType.SEquippedItem:
{ {
ItemTemplate pProto = Global.ObjectMgr.GetItemTemplate(miscValue1); Criteria entry = Global.CriteriaMgr.GetCriteria(criteriaId);
if (pProto == null)
uint itemId = entry.Entry.Type == CriteriaTypes.EquipEpicItem ? miscValue2 : miscValue1;
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemId);
if (itemTemplate == null)
return false; 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; return source.GetMapId() == MapId.Id;
case CriteriaDataType.SKnownTitle: case CriteriaDataType.SKnownTitle:
{ {
@@ -3485,10 +3488,10 @@ namespace Game.Achievements
{ {
public void Add(CriteriaData data) { storage.Add(data); } 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) 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 false;
return true; return true;