diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index 3ccd3ee37..f1af00501 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -61,7 +61,8 @@ internal sealed class QuestRegistry try { - LoadFromDirectory(new DirectoryInfo(Path.Combine(_pluginInterface.ConfigDirectory.FullName, "Quests"))); + LoadFromDirectory(new DirectoryInfo(Path.Combine(_pluginInterface.ConfigDirectory.FullName, "Quests")), + Quest.ESource.UserDirectory); } catch (Exception e) { @@ -99,7 +100,7 @@ internal sealed class QuestRegistry Id = questId, Root = questRoot, Info = questInfo, - ReadOnly = true, + Source = Quest.ESource.Assembly, }; _quests[quest.Id] = quest; } @@ -122,6 +123,7 @@ internal sealed class QuestRegistry foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values) LoadFromDirectory( new DirectoryInfo(Path.Combine(pathProjectDirectory.FullName, expansionFolder)), + Quest.ESource.ProjectDirectory, LogLevel.Trace); } catch (Exception e) @@ -135,10 +137,10 @@ internal sealed class QuestRegistry private void ValidateQuests() { - _questValidator.Validate(_quests.Values.Where(x => !x.ReadOnly)); + _questValidator.Validate(_quests.Values.Where(x => x.Source != Quest.ESource.Assembly)); } - private void LoadQuestFromStream(string fileName, Stream stream) + private void LoadQuestFromStream(string fileName, Stream stream, Quest.ESource source) { _logger.LogTrace("Loading quest from '{FileName}'", fileName); ElementId? questId = ExtractQuestIdFromName(fileName); @@ -157,12 +159,13 @@ internal sealed class QuestRegistry Id = questId, Root = questRoot, Info = questInfo, - ReadOnly = false, + Source = source, }; _quests[quest.Id] = quest; } - private void LoadFromDirectory(DirectoryInfo directory, LogLevel logLevel = LogLevel.Information) + private void LoadFromDirectory(DirectoryInfo directory, Quest.ESource source, + LogLevel logLevel = LogLevel.Information) { if (!directory.Exists) { @@ -176,7 +179,7 @@ internal sealed class QuestRegistry try { using FileStream stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read); - LoadQuestFromStream(fileInfo.Name, stream); + LoadQuestFromStream(fileInfo.Name, stream, source); } catch (Exception e) { @@ -185,7 +188,7 @@ internal sealed class QuestRegistry } foreach (DirectoryInfo childDirectory in directory.GetDirectories()) - LoadFromDirectory(childDirectory, logLevel); + LoadFromDirectory(childDirectory, source, logLevel); } private static ElementId? ExtractQuestIdFromName(string resourceName) diff --git a/Questionable/Model/Quest.cs b/Questionable/Model/Quest.cs index 3befbc698..5f9380e92 100644 --- a/Questionable/Model/Quest.cs +++ b/Questionable/Model/Quest.cs @@ -9,7 +9,7 @@ internal sealed class Quest public required ElementId Id { get; init; } public required QuestRoot Root { get; init; } public required IQuestInfo Info { get; init; } - public required bool ReadOnly { get; init; } + public required ESource Source { get; init; } public QuestSequence? FindSequence(byte currentSequence) => Root.QuestSequence.SingleOrDefault(seq => seq.Sequence == currentSequence); @@ -27,4 +27,11 @@ internal sealed class Quest } } } + + public enum ESource + { + Assembly, + ProjectDirectory, + UserDirectory, + } } diff --git a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs index aeceab45f..66c4e4013 100644 --- a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs +++ b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs @@ -134,6 +134,17 @@ internal sealed partial class ActiveQuestComponent var startedQuest = _questController.StartedQuest; if (startedQuest != null) { + if (startedQuest.Quest.Source == Quest.ESource.UserDirectory) + { + ImGui.PushFont(UiBuilder.IconFont); + ImGui.TextColored(ImGuiColors.DalamudOrange, FontAwesomeIcon.FilePen.ToIconString()); + ImGui.PopFont(); + ImGui.SameLine(0); + + if (ImGui.IsItemHovered()) + ImGui.SetTooltip("This quest is loaded from your 'pluginConfigs\\Questionable\\Quests' directory.\nThis gets loaded even if Questionable ships with a newer/different version of the quest."); + } + ImGui.TextUnformatted( $"Quest: {Shorten(startedQuest.Quest.Info.Name)} / {startedQuest.Sequence} / {startedQuest.Step}");