Show an icon if a quest is loaded from user directory

This commit is contained in:
Liza 2024-08-15 21:38:47 +02:00
parent b8dc5fa8e3
commit 7de9ed38df
Signed by: liza
GPG Key ID: 7199F8D727D55F67
3 changed files with 30 additions and 9 deletions

View File

@ -61,7 +61,8 @@ internal sealed class QuestRegistry
try 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) catch (Exception e)
{ {
@ -99,7 +100,7 @@ internal sealed class QuestRegistry
Id = questId, Id = questId,
Root = questRoot, Root = questRoot,
Info = questInfo, Info = questInfo,
ReadOnly = true, Source = Quest.ESource.Assembly,
}; };
_quests[quest.Id] = quest; _quests[quest.Id] = quest;
} }
@ -122,6 +123,7 @@ internal sealed class QuestRegistry
foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values) foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values)
LoadFromDirectory( LoadFromDirectory(
new DirectoryInfo(Path.Combine(pathProjectDirectory.FullName, expansionFolder)), new DirectoryInfo(Path.Combine(pathProjectDirectory.FullName, expansionFolder)),
Quest.ESource.ProjectDirectory,
LogLevel.Trace); LogLevel.Trace);
} }
catch (Exception e) catch (Exception e)
@ -135,10 +137,10 @@ internal sealed class QuestRegistry
private void ValidateQuests() 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); _logger.LogTrace("Loading quest from '{FileName}'", fileName);
ElementId? questId = ExtractQuestIdFromName(fileName); ElementId? questId = ExtractQuestIdFromName(fileName);
@ -157,12 +159,13 @@ internal sealed class QuestRegistry
Id = questId, Id = questId,
Root = questRoot, Root = questRoot,
Info = questInfo, Info = questInfo,
ReadOnly = false, Source = source,
}; };
_quests[quest.Id] = quest; _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) if (!directory.Exists)
{ {
@ -176,7 +179,7 @@ internal sealed class QuestRegistry
try try
{ {
using FileStream stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read); using FileStream stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read);
LoadQuestFromStream(fileInfo.Name, stream); LoadQuestFromStream(fileInfo.Name, stream, source);
} }
catch (Exception e) catch (Exception e)
{ {
@ -185,7 +188,7 @@ internal sealed class QuestRegistry
} }
foreach (DirectoryInfo childDirectory in directory.GetDirectories()) foreach (DirectoryInfo childDirectory in directory.GetDirectories())
LoadFromDirectory(childDirectory, logLevel); LoadFromDirectory(childDirectory, source, logLevel);
} }
private static ElementId? ExtractQuestIdFromName(string resourceName) private static ElementId? ExtractQuestIdFromName(string resourceName)

View File

@ -9,7 +9,7 @@ internal sealed class Quest
public required ElementId Id { get; init; } public required ElementId Id { get; init; }
public required QuestRoot Root { get; init; } public required QuestRoot Root { get; init; }
public required IQuestInfo Info { 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) public QuestSequence? FindSequence(byte currentSequence)
=> Root.QuestSequence.SingleOrDefault(seq => seq.Sequence == currentSequence); => Root.QuestSequence.SingleOrDefault(seq => seq.Sequence == currentSequence);
@ -27,4 +27,11 @@ internal sealed class Quest
} }
} }
} }
public enum ESource
{
Assembly,
ProjectDirectory,
UserDirectory,
}
} }

View File

@ -134,6 +134,17 @@ internal sealed partial class ActiveQuestComponent
var startedQuest = _questController.StartedQuest; var startedQuest = _questController.StartedQuest;
if (startedQuest != null) 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( ImGui.TextUnformatted(
$"Quest: {Shorten(startedQuest.Quest.Info.Name)} / {startedQuest.Sequence} / {startedQuest.Step}"); $"Quest: {Shorten(startedQuest.Quest.Info.Name)} / {startedQuest.Sequence} / {startedQuest.Step}");