Core/Achievements: Fixed achievement criteria StartEvent and FailEvent

* Criteria using StartEvent cannot be updated without that event triggering first (not only for timed achievements)
* Implemented most StartEvent and FailEvent types
* Fixed saving criteria removed by RemoveCriteriaProgress
Port From (https://github.com/TrinityCore/TrinityCore/commit/41a20b1e4008d450d075847ef1fe367f0e3a240f)
This commit is contained in:
hondacrx
2024-01-30 10:22:01 -05:00
parent 902b217d88
commit a1cb1d95ee
16 changed files with 148 additions and 211 deletions
@@ -63,13 +63,6 @@ namespace Game.Achievements
return false;
}
if (achievement.InstanceID != -1 && referencePlayer.GetMapId() != achievement.InstanceID)
{
Log.outTrace(LogFilter.Achievement, "CanUpdateCriteriaTree: (Id: {0} Type {1} Achievement {2}) Wrong map",
criteria.Id, criteria.Entry.Type, achievement.Id);
return false;
}
if ((achievement.Faction == AchievementFaction.Horde && referencePlayer.GetTeam() != Team.Horde) ||
(achievement.Faction == AchievementFaction.Alliance && referencePlayer.GetTeam() != Team.Alliance))
{
@@ -360,40 +353,6 @@ namespace Game.Achievements
}
}
public void ResetCriteria(CriteriaFailEvent failEvent, uint failAsset, bool evenIfCriteriaComplete)
{
Log.outDebug(LogFilter.Achievement, $"ResetAchievementCriteria({failEvent}, {failAsset}, {evenIfCriteriaComplete})");
// Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission
if (_owner.IsGameMaster() || _owner.GetSession().HasPermission(RBACPermissions.CannotEarnAchievements))
return;
var achievementCriteriaList = Global.CriteriaMgr.GetCriteriaByFailEvent(failEvent, (int)failAsset);
if (!achievementCriteriaList.Empty())
{
foreach (Criteria achievementCriteria in achievementCriteriaList)
{
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(achievementCriteria.Id);
bool allComplete = true;
foreach (CriteriaTree tree in trees)
{
// 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);
}
}
}
public override void SendAllData(Player receiver)
{
AllAccountCriteria allAccountCriteria = new();