/// <summary> /// Update achievement criteria counter related to type. /// </summary> public void UpdateCriteriaCounter(CriteriaCounterType type, uint value) { if (!GameTableManager.AchievementXCriteriaCounterType.TryGetValue((byte)type, out ReadOnlyCollection <SaintCoinach.Xiv.Achievement> achievementEntries)) { throw new ArgumentException($"Invalid CriteriaCounterType: {type}!"); } if (!counterCriteria.ContainsKey(type)) { counterCriteria[type] = new Criteria(value); } else { counterCriteria[type].IncrementValue(value); } foreach (SaintCoinach.Xiv.Achievement entry in achievementEntries) { if (HasAchievement((uint)entry.Key)) { continue; } if (GetAchievementCriteriaCounter(entry) >= GetAchievementCriteriaCounterMax(entry)) { CompleteAchievement(entry); } } }
/// <summary> /// Get current amount of criteria progress for Achievement. /// </summary> private uint GetAchievementCriteriaCounter(SaintCoinach.Xiv.Achievement entry) { switch ((CriteriaType)entry.Type) { case CriteriaType.Counter: CriteriaCounterType type = (CriteriaCounterType)entry.GetCriteriaParameter(CriteriaParameter.CriteriaCounterTypeId); return(counterCriteria.ContainsKey(type) ? counterCriteria[type].Value : 0u); case CriteriaType.Level: return(owner.Character.GetClassInfo((uint)entry.GetCriteriaParameter(CriteriaParameter.JobClassId)).Level); /* TODO: handle these types when related systems are implemented * case CriteriaType.Achievement: * case CriteriaType.MateriaMelding: * case CriteriaType.HuntingLog: * case CriteriaType.Exploration: * case CriteriaType.QuestCompleteAny: * case CriteriaType.ChocoboRank: * case CriteriaType.PvPRank: * case CriteriaType.PvPMatch: * case CriteriaType.PvPMatchWin: * case CriteriaType.ReputationRank: * case CriteriaType.FrontlineCampaign: * case CriteriaType.FrontlineCampaignWin: * case CriteriaType.FrontlineCampaignWinAny: * case CriteriaType.AetherCurrent: * case CriteriaType.Minion: * case CriteriaType.VerminionChallenge: * case CriteriaType.AnimaWeapon:*/ default: { #if DEBUG Console.WriteLine($"Unhandled CriteriaType: {entry.Type}, unable to return valid criteria counter!"); #endif return(0); } } }