// TODO: Improve private async Task SearchForNewAchievementsAsync <T>(MissionTaskType type, Lot lot, Func <T, Task> progress = null) where T : MissionTaskBase { await using var cdClient = new CdClientContext(); // // Collect tasks which fits the requirements of this action. // var otherTasks = new List <MissionTasks>(); // ReSharper disable once LoopCanBeConvertedToQuery foreach (var missionTask in cdClient.MissionTasksTable) { if (MissionParser.GetTargets(missionTask).Contains(lot)) { otherTasks.Add(missionTask); } } foreach (var task in otherTasks) { var mission = await cdClient.MissionsTable.FirstOrDefaultAsync(m => m.Id == task.Id); if (mission == default) { continue; } // // Check if mission is an achievement and has a task of the correct type. // if (mission.OfferobjectID != -1 || mission.TargetobjectID != -1 || (mission.IsMission ?? true) || task.TaskType != (int)type) { continue; } // // Get the mission on the character. If present. // var characterMission = MissionInstances.FirstOrDefault(m => m.MissionId == mission.Id); // // Check if the player could passably start this achievement. // if (characterMission != default) { continue; } // // Check if player has the Prerequisites to start this achievement. // var hasPrerequisites = MissionParser.CheckPrerequiredMissions( mission.PrereqMissionID, GetCompletedMissions() ); if (!hasPrerequisites) { continue; } // // Player can start achievement. // // Get Mission Id of new achievement. if (mission.Id == default) { continue; } var missionId = mission.Id.Value; // // Setup new achievement. // var instance = new MissionInstance(GameObject as Player, missionId); MissionInstances.Add(instance); await instance.LoadAsync(); // TODO: Silent? await instance.StartAsync(); var activeTask = instance.Tasks.First(t => t.TaskId == task.Uid); if (progress != null) { Detach(async() => { await progress(activeTask as T); }); } } }
private async Task <bool> RequiredForNewAchievementsAsync(MissionTaskType type, Lot lot) { await using var cdClient = new CdClientContext(); // // Collect tasks which fits the requirements of this action. // var otherTasks = new List <MissionTasks>(); // ReSharper disable once LoopCanBeConvertedToQuery foreach (var missionTask in ClientCache.Tasks) { if (MissionParser.GetTargets(missionTask).Contains(lot)) { otherTasks.Add(missionTask); } } foreach (var task in otherTasks) { var mission = await cdClient.MissionsTable.FirstOrDefaultAsync(m => m.Id == task.Id); if (mission == default) { continue; } // // Check if mission is an achievement and has a task of the correct type. // if (mission.OfferobjectID != -1 || mission.TargetobjectID != -1 || (mission.IsMission ?? true) || task.TaskType != (int)type) { continue; } // // Get the mission on the character. If present. // MissionInstance characterMission; await Lock.WaitAsync(); try { characterMission = MissionInstances.FirstOrDefault(m => m.MissionId == mission.Id); } finally { Lock.Release(); } // // Check if the player could passably start this achievement. // if (characterMission != default) { continue; } // // Check if player has the Prerequisites to start this achievement. // var hasPrerequisites = MissionParser.CheckPrerequiredMissions( mission.PrereqMissionID, GetCompletedMissions() ); if (hasPrerequisites) { return(true); } } return(false); }