/// <summary> /// Checks if the player can ever complete the given achievement. /// </summary> /// <param name="achievementCriteriaEntry"></param> /// <returns></returns> private bool IsAchieveable(AchievementCriteriaEntry achievementCriteriaEntry) { // Skip achievements we have completed if (HasCompleted(achievementCriteriaEntry.AchievementEntryId)) return false; // Skip achievements that have different faction requirement then the player faction. if (achievementCriteriaEntry.AchievementEntry.FactionFlag == (int)AchievementFactionGroup.Alliance && Owner.FactionGroup != FactionGroup.Alliance) return false; if (achievementCriteriaEntry.AchievementEntry.FactionFlag == (int)AchievementFactionGroup.Horde && Owner.FactionGroup != FactionGroup.Horde) return false; // Skip achievements that require to be groupfree and if (achievementCriteriaEntry.GroupFlag.HasFlag(AchievementCriteriaGroupFlags.AchievementCriteriaGroupNotInGroup) && Owner.IsInGroup) return false; return true; }
/// <summary> /// Sets the progress with a given Criteria entry. /// </summary> /// <param name="entry"></param> /// <param name="newValue"></param> /// <param name="progressType"></param> internal void SetCriteriaProgress(AchievementCriteriaEntry entry, uint newValue, ProgressType progressType = ProgressType.ProgressSet) { // not create record for 0 counter if (newValue == 0) return; var achievementProgressRecord = GetOrCreateProgressRecord(entry.AchievementCriteriaId); uint updateValue; switch (progressType) { case ProgressType.ProgressAccumulate: updateValue = newValue + achievementProgressRecord.Counter; break; case ProgressType.ProgressHighest: updateValue = achievementProgressRecord.Counter < newValue ? newValue : achievementProgressRecord.Counter; break; default: updateValue = newValue; break; } if (updateValue == achievementProgressRecord.Counter) return; achievementProgressRecord.Counter = updateValue; if (entry.TimeLimit > 0) { DateTime now = DateTime.Now; if (achievementProgressRecord.StartOrUpdateTime.AddSeconds(entry.TimeLimit) < now) { achievementProgressRecord.Counter = 1; } achievementProgressRecord.StartOrUpdateTime = now; } AchievementHandler.SendAchievmentStatus(achievementProgressRecord, Owner); if (IsAchievementCompletable(entry.AchievementEntry)) { EarnAchievement(entry.AchievementEntry); } }
/// <summary> /// Checks if the given criteria is completable /// </summary> /// <param name="achievementCriteriaEntry"></param> /// <returns></returns> public bool IsCriteriaCompletable(AchievementCriteriaEntry achievementCriteriaEntry) { AchievementEntry achievementEntry = achievementCriteriaEntry.AchievementEntry; // Counter achievement were never meant to be completed. if (achievementEntry.Flags.HasFlag(AchievementFlags.Counter)) return false; //TODO: Add support for realm first. // We never completed the criteria befoer. AchievementProgressRecord achievementProgressRecord = m_owner.Achievements.GetAchievementCriteriaProgress(achievementCriteriaEntry.AchievementCriteriaId); if (achievementProgressRecord == null) return false; return achievementCriteriaEntry.IsAchieved(achievementProgressRecord); }