using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using Dalamud.Plugin.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Questionable.Controller.Steps.Interactions; using Questionable.Controller.Steps.Shared; using Questionable.Data; using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Controller.Steps; internal sealed class TaskCreator { private readonly IServiceProvider _serviceProvider; private readonly TerritoryData _territoryData; private readonly IClientState _clientState; private readonly IChatGui _chatGui; private readonly ILogger _logger; public TaskCreator(IServiceProvider serviceProvider, TerritoryData territoryData, IClientState clientState, IChatGui chatGui, ILogger logger) { _serviceProvider = serviceProvider; _territoryData = territoryData; _clientState = clientState; _chatGui = chatGui; _logger = logger; } public IReadOnlyList CreateTasks(Quest quest, byte sequenceNumber, QuestSequence? sequence, QuestStep? step) { List list2; if (sequence == null) { _chatGui.PrintError($"Path for quest '{quest.Info.Name}' ({quest.Id}) does not contain sequence {sequenceNumber}, please report this.", "Questionable", 576); int num = 1; List list = new List(num); CollectionsMarshal.SetCount(list, num); Span span = CollectionsMarshal.AsSpan(list); int index = 0; span[index] = new WaitAtEnd.WaitNextStepOrSequence(); list2 = list; } else if (step == null) { int index = 1; List list3 = new List(index); CollectionsMarshal.SetCount(list3, index); Span span = CollectionsMarshal.AsSpan(list3); int num = 0; span[num] = new WaitAtEnd.WaitNextStepOrSequence(); list2 = list3; } else { using IServiceScope serviceScope = _serviceProvider.CreateScope(); list2 = serviceScope.ServiceProvider.GetRequiredService>().SelectMany(delegate(ITaskFactory x) { List list4 = x.CreateAllTasks(quest, sequence, step).ToList(); if (list4.Count > 0 && _logger.IsEnabled(LogLevel.Trace)) { string text = x.GetType().FullName ?? x.GetType().Name; if (text.Contains('.', StringComparison.Ordinal)) { string text2 = text; int num3 = text.LastIndexOf('.') + 1; text = text2.Substring(num3, text2.Length - num3); } _logger.LogTrace("Factory {FactoryName} created Task {TaskNames}", text, string.Join(", ", list4.Select((ITask y) => y.ToString()))); } return list4; }).ToList(); SinglePlayerDuty.StartSinglePlayerDuty startSinglePlayerDuty = list2.Where((ITask y) => y is SinglePlayerDuty.StartSinglePlayerDuty).Cast().FirstOrDefault(); if (startSinglePlayerDuty != null && _territoryData.TryGetContentFinderCondition(startSinglePlayerDuty.ContentFinderConditionId, out TerritoryData.ContentFinderConditionData contentFinderConditionData) && _clientState.TerritoryType == contentFinderConditionData.TerritoryId) { int num2 = list2.IndexOf(startSinglePlayerDuty); _logger.LogWarning("Skipping {SkippedTaskCount} out of {TotalCount} tasks, questionable was started while in single player duty", num2 + 1, list2.Count); list2.RemoveRange(0, num2 + 1); _logger.LogInformation("Next actual task: {NextTask}, total tasks left: {RemainingTaskCount}", list2.FirstOrDefault(), list2.Count); } } if (list2.Count == 0) { _logger.LogInformation("Nothing to execute for step?"); } else { _logger.LogInformation("Tasks for {QuestId}, {Sequence}, {Step}: {Tasks}", quest.Id, sequenceNumber, (step == null) ? ((int?)null) : sequence?.Steps.IndexOf(step), string.Join(", ", list2.Select((ITask x) => x.ToString()))); } return list2; } }