<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
+ <Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="coverlet.collector" Version="6.0.0"/>
- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
- <PackageReference Include="xunit" Version="2.5.3"/>
- <PackageReference Include="xunit.runner.visualstudio" Version="2.5.3"/>
+ <PackageReference Include="coverlet.collector" Version="6.0.0" />
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
+ <PackageReference Include="xunit" Version="2.5.3" />
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IsPackable>false</IsPackable>
<PackageId>QuestPathGenerator</PackageId>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
+ <Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2"/>
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.9.2"/>
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.9.2" />
<PackageReference Include="System.Text.Json" Version="8.0.4" PrivateAssets="all" />
</ItemGroup>
if (quests.Count == 0)
return;
- quests = quests.OrderBy(x => x.Item1).ToList();
+ var partitionedQuests = quests
+ .OrderBy(x => x.Item1)
+ .GroupBy(x => $"LoadQuests{x.Item1 / 50}")
+ .ToList();
+
+ List<MethodDeclarationSyntax> methods =
+ [
+ MethodDeclaration(
+ PredefinedType(
+ Token(SyntaxKind.VoidKeyword)),
+ Identifier("LoadQuests"))
+ .WithModifiers(
+ TokenList(
+ Token(SyntaxKind.PrivateKeyword),
+ Token(SyntaxKind.StaticKeyword)))
+ .WithBody(
+ Block(
+ partitionedQuests
+ .Select(x =>
+ ExpressionStatement(
+ InvocationExpression(
+ IdentifierName(x.Key))))))
+ ];
+
+ foreach (var partition in partitionedQuests)
+ {
+ methods.Add(MethodDeclaration(
+ PredefinedType(
+ Token(SyntaxKind.VoidKeyword)),
+ Identifier(partition.Key))
+ .WithModifiers(
+ TokenList(
+ Token(SyntaxKind.PrivateKeyword),
+ Token(SyntaxKind.StaticKeyword)))
+ .WithBody(
+ Block(CreateInitializer(partition.ToList()))));
+ }
var code =
CompilationUnit()
SingletonList<MemberDeclarationSyntax>(
ClassDeclaration("AssemblyQuestLoader")
.WithModifiers(
- TokenList(
- [
- Token(SyntaxKind.PartialKeyword)
- ]))
- .WithMembers(
- SingletonList<MemberDeclarationSyntax>(
- FieldDeclaration(
- VariableDeclaration(
- GenericName(
- Identifier("IReadOnlyDictionary"))
- .WithTypeArgumentList(
- TypeArgumentList(
- SeparatedList<TypeSyntax>(
- new SyntaxNodeOrToken[]
- {
- PredefinedType(
- Token(SyntaxKind
- .UShortKeyword)),
- Token(SyntaxKind.CommaToken),
- IdentifierName("QuestRoot")
- }))))
- .WithVariables(
- SingletonSeparatedList(
- VariableDeclarator(
- Identifier("Quests"))
- .WithInitializer(
- EqualsValueClause(
- ObjectCreationExpression(
- GenericName(
- Identifier(
- "Dictionary"))
- .WithTypeArgumentList(
- TypeArgumentList(
- SeparatedList<
- TypeSyntax>(
- new
- SyntaxNodeOrToken
- []
- {
- PredefinedType(
- Token(
- SyntaxKind
- .UShortKeyword)),
- Token(
- SyntaxKind
- .CommaToken),
- IdentifierName(
- "QuestRoot")
- }))))
- .WithArgumentList(
- ArgumentList())
- .WithInitializer(
- InitializerExpression(
- SyntaxKind
- .CollectionInitializerExpression,
- SeparatedList<
- ExpressionSyntax>(
- quests.SelectMany(x =>
- CreateQuestInitializer(
- x.Item1,
- x.Item2)
- .ToArray())))))))))
- .WithModifiers(
- TokenList(
- [
- Token(SyntaxKind.InternalKeyword),
- Token(SyntaxKind.StaticKeyword)
- ]))))))))
+ TokenList(Token(SyntaxKind.PartialKeyword)))
+ .WithMembers(List<MemberDeclarationSyntax>(methods))))))
.NormalizeWhitespace();
// Add the source code to the compilation.
context.AddSource("AssemblyQuestLoader.g.cs", code.ToFullString());
}
- private static IEnumerable<SyntaxNodeOrToken> CreateQuestInitializer(ushort questId, QuestRoot quest)
+ private static StatementSyntax[] CreateInitializer(List<(ushort QuestId, QuestRoot Root)> quests)
+ {
+ List<StatementSyntax> statements = [];
+
+ foreach (var quest in quests)
+ {
+ statements.Add(
+ ExpressionStatement(
+ InvocationExpression(
+ IdentifierName("AddQuest"))
+ .WithArgumentList(
+ ArgumentList(
+ SeparatedList<ArgumentSyntax>(
+ new SyntaxNodeOrToken[]
+ {
+ Argument(
+ LiteralExpression(SyntaxKind.NumericLiteralExpression,
+ Literal(quest.QuestId))),
+ Token(SyntaxKind.CommaToken),
+ Argument(CreateQuestRootExpression(quest.QuestId, quest.Root))
+ })))));
+ }
+
+ return statements.ToArray();
+ }
+
+ private static ObjectCreationExpressionSyntax CreateQuestRootExpression(ushort questId, QuestRoot quest)
{
try
{
- return new SyntaxNodeOrToken[]
- {
- InitializerExpression(
- SyntaxKind.ComplexElementInitializerExpression,
- SeparatedList<ExpressionSyntax>(
- new SyntaxNodeOrToken[]
- {
- LiteralExpression(
- SyntaxKind.NumericLiteralExpression,
- Literal(questId)),
- Token(SyntaxKind.CommaToken),
- ObjectCreationExpression(
- IdentifierName(nameof(QuestRoot)))
- .WithInitializer(
- InitializerExpression(
- SyntaxKind.ObjectInitializerExpression,
- SeparatedList<ExpressionSyntax>(
- SyntaxNodeList(
- AssignmentList(nameof(QuestRoot.Author), quest.Author)
- .AsSyntaxNodeOrToken(),
- Assignment(nameof(QuestRoot.Comment), quest.Comment, null)
- .AsSyntaxNodeOrToken(),
- AssignmentList(nameof(QuestRoot.TerritoryBlacklist),
- quest.TerritoryBlacklist).AsSyntaxNodeOrToken(),
- AssignmentExpression(
- SyntaxKind.SimpleAssignmentExpression,
- IdentifierName(nameof(QuestRoot.QuestSequence)),
- CreateQuestSequence(quest.QuestSequence))
- ))))
- })),
- Token(SyntaxKind.CommaToken)
- };
+ return ObjectCreationExpression(
+ IdentifierName(nameof(QuestRoot)))
+ .WithInitializer(
+ InitializerExpression(
+ SyntaxKind.ObjectInitializerExpression,
+ SeparatedList<ExpressionSyntax>(
+ SyntaxNodeList(
+ AssignmentList(nameof(QuestRoot.Author), quest.Author)
+ .AsSyntaxNodeOrToken(),
+ Assignment(nameof(QuestRoot.Comment), quest.Comment, null)
+ .AsSyntaxNodeOrToken(),
+ AssignmentList(nameof(QuestRoot.TerritoryBlacklist),
+ quest.TerritoryBlacklist).AsSyntaxNodeOrToken(),
+ AssignmentExpression(
+ SyntaxKind.SimpleAssignmentExpression,
+ IdentifierName(nameof(QuestRoot.QuestSequence)),
+ CreateQuestSequence(quest.QuestSequence))))));
}
catch (Exception e)
{
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection;
[SuppressMessage("ReSharper", "PartialTypeWithSinglePart", Justification = "Required for RELEASE")]
public static partial class AssemblyQuestLoader
{
- public static IReadOnlyDictionary<ushort, QuestRoot> GetQuests() =>
+ private static Dictionary<ushort, QuestRoot>? _quests;
+
+ public static IReadOnlyDictionary<ushort, QuestRoot> GetQuests()
+ {
+ if (_quests == null)
+ {
+ _quests = [];
#if RELEASE
- Quests;
-#else
- new Dictionary<ushort, QuestRoot>();
+ LoadQuests();
#endif
+ }
+
+ return _quests ?? throw new InvalidOperationException("quest data is not initialized");
+ }
public static Stream QuestSchema =>
typeof(AssemblyQuestLoader).Assembly.GetManifestResourceStream("Questionable.QuestPaths.QuestSchema")!;
+
+ private static void AddQuest(ushort questId, QuestRoot root) => _quests![questId] = root;
}
<DebugType>none</DebugType>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
+ <Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
- <ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/>
- <ProjectReference Include="..\QuestPathGenerator\QuestPathGenerator.csproj"
- OutputItemType="Analyzer"
- ReferenceOutputAssembly="false"/>
+ <ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj" />
+ <ProjectReference Include="..\QuestPathGenerator\QuestPathGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
<ItemGroup>
- <None Remove="quest-v1.json"/>
+ <None Remove="quest-v1.json" />
<EmbeddedResource Include="quest-v1.json">
<LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName>
</EmbeddedResource>
- <AdditionalFiles Include="quest-v1.json"/>
+ <AdditionalFiles Include="quest-v1.json" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'">
- <None Remove="2.x - A Realm Reborn"/>
- <None Remove="3.x - Heavensward"/>
- <None Remove="4.x - Stormblood"/>
- <None Remove="5.x - Shadowbringers"/>
- <None Remove="6.x - Endwalker"/>
- <None Remove="7.x - Dawntrail"/>
- <AdditionalFiles Include="2.x - A Realm Reborn\**\*.json"/>
- <AdditionalFiles Include="3.x - Heavensward\**\*.json"/>
- <AdditionalFiles Include="4.x - Stormblood\**\*.json"/>
- <AdditionalFiles Include="5.x - Shadowbringers\**\*.json"/>
+ <None Remove="2.x - A Realm Reborn" />
+ <None Remove="3.x - Heavensward" />
+ <None Remove="4.x - Stormblood" />
+ <None Remove="5.x - Shadowbringers" />
+ <None Remove="6.x - Endwalker" />
+ <None Remove="7.x - Dawntrail" />
+ <AdditionalFiles Include="2.x - A Realm Reborn\**\*.json" />
+ <AdditionalFiles Include="3.x - Heavensward\**\*.json" />
+ <AdditionalFiles Include="4.x - Stormblood\**\*.json" />
+ <AdditionalFiles Include="5.x - Shadowbringers\**\*.json" />
<AdditionalFiles Include="6.x - Endwalker\**\*.json" />
- <AdditionalFiles Include="7.x - Dawntrail\**\*.json"/>
+ <AdditionalFiles Include="7.x - Dawntrail\**\*.json" />
</ItemGroup>
</Project>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<DebugType>portable</DebugType>
+ <Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
Microsoft Visual Studio Solution File, Format Version 12.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Questionable", "Questionable\Questionable.csproj", "{C91EEF13-A1AC-4A40-B695-DD4E378E5989}"
+# Visual Studio Version 17
+VisualStudioVersion = 17.10.35013.160
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Questionable", "Questionable\Questionable.csproj", "{C91EEF13-A1AC-4A40-B695-DD4E378E5989}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LLib", "LLib\LLib.csproj", "{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLib", "LLib\LLib.csproj", "{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuestPaths", "QuestPaths\QuestPaths.csproj", "{7A136F28-8D5C-478D-B993-0F39F1451A47}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPaths", "QuestPaths\QuestPaths.csproj", "{7A136F28-8D5C-478D-B993-0F39F1451A47}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuestPaths", "QuestPathGenerator\QuestPathGenerator.csproj", "{DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator", "QuestPathGenerator\QuestPathGenerator.csproj", "{DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Questionable.Model", "Questionable.Model\Questionable.Model.csproj", "{E15144A5-AFF5-4D86-9561-AFF7DF7F505D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Questionable.Model", "Questionable.Model\Questionable.Model.csproj", "{E15144A5-AFF5-4D86-9561-AFF7DF7F505D}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|Any CPU.Build.0 = Release|Any CPU
- {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|Any CPU.Build.0 = Release|Any CPU
- {7A136F28-8D5C-478D-B993-0F39F1451A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7A136F28-8D5C-478D-B993-0F39F1451A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7A136F28-8D5C-478D-B993-0F39F1451A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7A136F28-8D5C-478D-B993-0F39F1451A47}.Release|Any CPU.Build.0 = Release|Any CPU
- {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Release|Any CPU.Build.0 = Release|Any CPU
- {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Release|Any CPU.Build.0 = Release|Any CPU
- {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.ActiveCfg = ExportRelease|x64
+ {C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.Build.0 = ExportRelease|x64
+ {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.ActiveCfg = ExportRelease|x64
+ {EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.Build.0 = ExportRelease|x64
+ {7A136F28-8D5C-478D-B993-0F39F1451A47}.Debug|x64.ActiveCfg = Debug|x64
+ {7A136F28-8D5C-478D-B993-0F39F1451A47}.Debug|x64.Build.0 = Debug|x64
+ {7A136F28-8D5C-478D-B993-0F39F1451A47}.Release|x64.ActiveCfg = Release|x64
+ {7A136F28-8D5C-478D-B993-0F39F1451A47}.Release|x64.Build.0 = Release|x64
+ {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Debug|x64.ActiveCfg = Debug|x64
+ {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Debug|x64.Build.0 = Debug|x64
+ {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Release|x64.ActiveCfg = Release|x64
+ {DFFD56A8-FA89-4585-A47B-C6AB27B65F0F}.Release|x64.Build.0 = Release|x64
+ {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Debug|x64.ActiveCfg = Debug|x64
+ {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Debug|x64.Build.0 = Debug|x64
+ {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Release|x64.ActiveCfg = Release|x64
+ {E15144A5-AFF5-4D86-9561-AFF7DF7F505D}.Release|x64.Build.0 = Release|x64
+ {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Debug|x64.ActiveCfg = Debug|x64
+ {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Debug|x64.Build.0 = Debug|x64
+ {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Release|x64.ActiveCfg = Release|x64
+ {4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
_logger.LogError(e, "Failed to update task {TaskName}", _currentTask.ToString());
_chatGui.PrintError(
$"[Questionable] Failed to update task '{_currentTask}', please check /xllog for details.");
- Stop("Task failed to start");
Stop("Task failed to update");
return;
}
}
ValidateQuests();
- _logger.LogInformation("Loaded {Count} quests", _quests.Count);
+ _logger.LogInformation("Loaded {Count} quests in total", _quests.Count);
}
[Conditional("RELEASE")]
};
_quests[questId] = quest;
}
+
+ _logger.LogInformation("Loaded {Count} quests from assembly", _quests.Count);
}
[Conditional("DEBUG")]
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
{
Task.Factory.StartNew(() =>
{
- foreach (var quest in quests)
+ try
{
- foreach (var validator in _validators)
+ foreach (var quest in quests)
{
- foreach (var issue in validator.Validate(quest))
+ foreach (var validator in _validators)
{
- var level = issue.Severity == EIssueSeverity.Error ? LogLevel.Warning : LogLevel.Information;
- _logger.Log(level,
- "Validation failed: {QuestId} ({QuestName}) / {QuestSequence} / {QuestStep} - {Description}",
- issue.QuestId, quest.Info.Name, issue.Sequence, issue.Step, issue.Description);
- _validationIssues.Add(issue);
+ foreach (var issue in validator.Validate(quest))
+ {
+ var level = issue.Severity == EIssueSeverity.Error
+ ? LogLevel.Warning
+ : LogLevel.Information;
+ _logger.Log(level,
+ "Validation failed: {QuestId} ({QuestName}) / {QuestSequence} / {QuestStep} - {Description}",
+ issue.QuestId, quest.Info.Name, issue.Sequence, issue.Step, issue.Description);
+ _validationIssues.Add(issue);
+ }
}
}
- }
- _validationIssues = _validationIssues.OrderBy(x => x.QuestId)
- .ThenBy(x => x.Sequence)
- .ThenBy(x => x.Step)
- .ThenBy(x => x.Description)
- .ToList();
+ _validationIssues = _validationIssues.OrderBy(x => x.QuestId)
+ .ThenBy(x => x.Sequence)
+ .ThenBy(x => x.Step)
+ .ThenBy(x => x.Description)
+ .ToList();
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Unable to validate quests");
+ }
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
}
ImGui.SameLine();
if (knownQuest != null &&
- knownQuest.FindSequence(0)?.LastStep()?.InteractionType == EInteractionType.AcceptQuest /* &&
+ knownQuest.FindSequence(0)?.LastStep()?.InteractionType == EInteractionType.AcceptQuest &&
!_gameFunctions.IsQuestAccepted(quest.QuestId) &&
!_gameFunctions.IsQuestLocked(quest.QuestId) &&
- (quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId))*/)
+ (quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)))
{
ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null);