Core/Achievements: Optimized resetting achievement criteria by condition and changed the functionality to properly reset all possible criteria with given condition

Port From (https://github.com/TrinityCore/TrinityCore/commit/6f7ff9a3efd10cd4f776a67540109e7bb774f1c5)
This commit is contained in:
hondacrx
2020-05-06 17:52:14 -04:00
parent 4f6447cc0b
commit 43fcc558e4
8 changed files with 53 additions and 46 deletions
+20 -19
View File
@@ -355,36 +355,37 @@ namespace Game.Achievements
}
}
public void ResetCriteria(CriteriaTypes type, ulong miscValue1, ulong miscValue2, bool evenIfCriteriaComplete)
public void ResetCriteria(CriteriaCondition condition, uint failAsset, bool evenIfCriteriaComplete)
{
Log.outDebug(LogFilter.Achievement, "ResetAchievementCriteria({0}, {1}, {2})", type, miscValue1, miscValue2);
Log.outDebug(LogFilter.Achievement, $"ResetAchievementCriteria({condition}, {failAsset}, {evenIfCriteriaComplete})");
// disable for gamemasters with GM-mode enabled
if (_owner.IsGameMaster())
return;
var achievementCriteriaList = GetCriteriaByType(type);
foreach (Criteria achievementCriteria in achievementCriteriaList)
var achievementCriteriaList = Global.CriteriaMgr.GetCriteriaByFailEvent(condition, (int)failAsset);
if (!achievementCriteriaList.Empty())
{
if (achievementCriteria.Entry.FailEvent != miscValue1 || (achievementCriteria.Entry.FailAsset != 0 && achievementCriteria.Entry.FailAsset != miscValue2))
continue;
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(achievementCriteria.Id);
bool allComplete = true;
foreach (CriteriaTree tree in trees)
foreach (Criteria achievementCriteria in achievementCriteriaList)
{
// don't update already completed criteria if not forced or achievement already complete
if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree.Achievement.Id))
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(achievementCriteria.Id);
bool allComplete = true;
foreach (CriteriaTree tree in trees)
{
allComplete = false;
break;
// don't update already completed criteria if not forced or achievement already complete
if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree.Achievement.Id))
{
allComplete = false;
break;
}
}
if (allComplete)
continue;
RemoveCriteriaProgress(achievementCriteria);
}
if (allComplete)
continue;
RemoveCriteriaProgress(achievementCriteria);
}
}
@@ -2620,6 +2620,8 @@ namespace Game.Achievements
{
Cypher.Assert(criteriaEntry.Type < CriteriaTypes.TotalTypes,
$"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaTypes.TotalTypes}");
Cypher.Assert(criteriaEntry.StartEvent < CriteriaTimedTypes.Max, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaTimedTypes.Max}");
Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaCondition.Max, $"CRITERIA_CONDITION_MAX must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaCondition.Max}");
var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id);
if (treeList.Empty())
@@ -2678,6 +2680,9 @@ namespace Game.Achievements
if (criteriaEntry.StartTimer != 0)
_criteriasByTimedType.Add(criteriaEntry.StartEvent, criteria);
if (criteriaEntry.FailEvent != 0)
_criteriasByFailEvent[criteriaEntry.FailEvent].Add((int)criteriaEntry.FailAsset, criteria);
}
foreach (var p in _criteriaTrees)
@@ -2789,6 +2794,11 @@ namespace Game.Achievements
return _criteriasByTimedType.LookupByKey(type);
}
public List<Criteria> GetCriteriaByFailEvent(CriteriaCondition condition, int asset)
{
return _criteriasByFailEvent[(int)condition].LookupByKey(asset);
}
public CriteriaDataSet GetCriteriaDataSet(Criteria criteria)
{
return _criteriaDataMap.LookupByKey(criteria.Id);
@@ -2835,6 +2845,7 @@ namespace Game.Achievements
MultiMap<CriteriaTypes, Criteria> _questObjectiveCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
MultiMap<CriteriaTimedTypes, Criteria> _criteriasByTimedType = new MultiMap<CriteriaTimedTypes, Criteria>();
MultiMap<int, Criteria>[] _criteriasByFailEvent = new MultiMap<int, Criteria>[(int)CriteriaCondition.Max];
}
public class ModifierTreeNode