public ViewModelQuestRequirement( IQuestRequirement requirement, // can be null when the quest is completed [CanBeNull] QuestRequirementState requirementState) { this.requirement = requirement; this.requirementState = requirementState; this.requirementState?.ClientSubscribe( _ => _.IsSatisfied, isSatisfiedNow => { this.NotifyPropertyChanged(nameof(this.IsSatisfied)); if (isSatisfiedNow) { Api.Client.Audio.PlayOneShot(new SoundResource("UI/Quests/QuestRequirementSatisfied.ogg")); } }, this); if (requirement is IQuestRequirementWithCount questRequirementWithCount) { this.CountRequired = questRequirementWithCount.RequiredCount; if (requirementState != null) { // requirement state can be null if the quest is already completed this.requirementStateWithCount = (QuestRequirementStateWithCount)requirementState; this.requirementStateWithCount.ClientSubscribe( _ => _.CountCurrent, _ => this.NotifyPropertyChanged(nameof(this.CountCurrent)), this); } } }
public bool SharedHasCompletedRequirement(IQuestRequirement requirement) { var quest = requirement.Quest; Api.Assert(quest != null, "Requirement must have an associated quest"); var questEntry = this.SharedFindQuestEntry(quest, out var isUnlocked); if (questEntry == null || !isUnlocked) { // no such entry return(false); } if (questEntry.IsCompleted || questEntry.AreAllRequirementsSatisfied) { // all requirements are/were satisfied return(true); } // find a state for this requirement and check whether it's satisfied var indexOfRequirement = -1; var requirements = quest.Requirements; if (requirements == null) { return(false); } for (var index = 0; index < requirements.Count; index++) { var r = requirements[index]; if (r != requirement) { continue; } indexOfRequirement = index; break; } Api.Assert(indexOfRequirement >= 0, "Requirement not exist in quest"); var requirementState = questEntry.RequirementStates[indexOfRequirement]; return(requirementState.IsSatisfied); }
public ViewModelQuestRequirement( IQuestRequirement requirement, // can be null when the quest is completed [CanBeNull] QuestRequirementState requirementState) { this.requirement = requirement; this.requirementState = requirementState; this.requirementState?.ClientSubscribe( _ => _.IsSatisfied, isSatisfiedNow => { this.NotifyPropertyChanged(nameof(this.IsSatisfied)); if (!isSatisfiedNow) { return; } // play requirement satisfied sound (not more often than once per frame) if (lastRequirementSatisfiedFrame != Client.CurrentGame.ServerFrameNumber) { lastRequirementSatisfiedFrame = Client.CurrentGame.ServerFrameNumber; Api.Client.Audio.PlayOneShot(SoundResourceQuestRequirementSatisfied, volume: 0.5f); } }, this); if (requirement is IQuestRequirementWithCount questRequirementWithCount) { this.CountRequired = questRequirementWithCount.RequiredCount; if (requirementState != null) { // requirement state can be null if the quest is already completed this.requirementStateWithCount = (QuestRequirementStateWithCount)requirementState; this.requirementStateWithCount.ClientSubscribe( _ => _.CountCurrent, _ => this.NotifyPropertyChanged(nameof(this.CountCurrent)), this); } } }