This commit is contained in:
pot0to 2024-12-16 14:39:20 -08:00
commit aad5019356
8 changed files with 480 additions and 35 deletions

View File

@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>4.6</Version>
<Version>4.8</Version>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,67 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"Position": {
"X": 809.655,
"Y": 17.004526,
"Z": -257.89868
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"Fly": true,
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
},
{
"DataId": 1051710,
"Position": {
"X": 822.629,
"Y": 17.102613,
"Z": -263.20288
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051746,
"Position": {
"X": 824.6128,
"Y": 13.979889,
"Z": -227.16113
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051710,
"Position": {
"X": 822.629,
"Y": 17.102613,
"Z": -263.20288
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,153 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051801,
"Position": {
"X": -49.485046,
"Y": 6.499997,
"Z": -90.348694
},
"TerritoryId": 133,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Gridania",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Mih Khetto's Amphitheatre"
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051808,
"Position": {
"X": -53.60504,
"Y": 5.772882,
"Z": -99.931335
},
"TerritoryId": 133,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_FESXMX001_05227_SYSTEM_000_025",
"Yes": true
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051803,
"Position": {
"X": 33.951294,
"Y": -0.36796698,
"Z": 24.185547
},
"TerritoryId": 1247,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051816,
"Position": {
"X": 18.142944,
"Y": 0.0028544795,
"Z": -0.289917
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1052469,
"Position": {
"X": -15.640564,
"Y": 0.0026466753,
"Z": 18.142944
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1051813,
"Position": {
"X": -5.1118164,
"Y": 1.21852545E-05,
"Z": -31.99823
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051804,
"Position": {
"X": -3.4943848,
"Y": 0.0028544795,
"Z": -18.417664
},
"TerritoryId": 1247,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051819,
"Position": {
"X": -1.6937866,
"Y": 0.0028544795,
"Z": -21.042236
},
"TerritoryId": 1247,
"InteractionType": "CompleteQuest",
"NextQuestId": 5228
}
]
}
]
}

View File

@ -0,0 +1,206 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051819,
"Position": {
"X": -1.6937866,
"Y": 0.0028544795,
"Z": -21.042236
},
"TerritoryId": 1247,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051822,
"Position": {
"X": 61.478516,
"Y": -7.7123985,
"Z": 98.98523
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051807,
"Position": {
"X": -53.635498,
"Y": 5.793307,
"Z": -99.931335
},
"TerritoryId": 133,
"InteractionType": "Interact",
"TargetTerritoryId": 1247,
"AetheryteShortcut": "Gridania",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Mih Khetto's Amphitheatre"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true,
"InTerritory": [
132
]
}
}
},
{
"DataId": 1051823,
"Position": {
"X": 34.164917,
"Y": -0.37309912,
"Z": 23.605652
},
"TerritoryId": 1247,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051833,
"Position": {
"X": 35.568726,
"Y": -0.24490167,
"Z": 21.560913
},
"TerritoryId": 1247,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051816,
"Position": {
"X": 18.142944,
"Y": 0.0028544795,
"Z": -0.289917
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1051809,
"Position": {
"X": -15.823608,
"Y": 0.0028544795,
"Z": 9.84198
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1051813,
"Position": {
"X": -5.1118164,
"Y": 1.21852545E-05,
"Z": -31.99823
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1051825,
"Position": {
"X": -1.7853394,
"Y": 2.0028546,
"Z": -86.38135
},
"TerritoryId": 1247,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 6,
"Steps": [
{
"DataId": 2014535,
"Position": {
"X": 67.88733,
"Y": -0.77819824,
"Z": 51.224487
},
"TerritoryId": 1247,
"InteractionType": "Interact",
"TargetTerritoryId": 133
},
{
"DataId": 1051802,
"Position": {
"X": -50.06488,
"Y": 6.499999,
"Z": -89.58569
},
"TerritoryId": 133,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051805,
"Position": {
"X": 33.401978,
"Y": -0.31104973,
"Z": 22.079773
},
"TerritoryId": 1253,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -15,11 +15,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Questionable.Model", "Quest
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuestPathGenerator.Tests", "QuestPathGenerator.Tests\QuestPathGenerator.Tests.csproj", "{4FD6F346-8961-4BD5-BDA2-E5F426DE4FC7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatheringPaths", "GatheringPaths\GatheringPaths.csproj", "{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GatheringPaths", "GatheringPaths\GatheringPaths.csproj", "{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GatheringPathRenderer", "GatheringPathRenderer\GatheringPathRenderer.csproj", "{F514DA95-9867-4F3F-8062-ACE0C62E8740}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GatheringPathRenderer", "GatheringPathRenderer\GatheringPathRenderer.csproj", "{F514DA95-9867-4F3F-8062-ACE0C62E8740}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECommons", "vendor\ECommons\ECommons\ECommons.csproj", "{A12D7B4B-8E6E-4DCF-A41A-12F62E9FF94B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ECommons", "vendor\ECommons\ECommons\ECommons.csproj", "{A12D7B4B-8E6E-4DCF-A41A-12F62E9FF94B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BBFFC6EA-15B1-48FC-B4D3-D9491278C27F}"
ProjectSection(SolutionItems) = preProject
@ -28,7 +28,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vendor", "vendor", "{8F5EC9D5-4CE7-433B-BB3A-782500E84DDB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationMasterAPI", "vendor\NotificationMasterAPI\NotificationMasterAPI\NotificationMasterAPI.csproj", "{9BD494ED-22F2-487B-BCE1-435399A8720E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationMasterAPI", "vendor\NotificationMasterAPI\NotificationMasterAPI\NotificationMasterAPI.csproj", "{9BD494ED-22F2-487B-BCE1-435399A8720E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -36,6 +36,14 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.ActiveCfg = Debug|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.Build.0 = Debug|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.ActiveCfg = Release|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.Build.0 = Release|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.ActiveCfg = Debug|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.Build.0 = Debug|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|x64.ActiveCfg = Release|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|x64.Build.0 = Release|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
@ -52,22 +60,14 @@ Global
{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
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.ActiveCfg = Debug|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Debug|x64.Build.0 = Debug|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|x64.ActiveCfg = Release|x64
{EEDE3BBE-E260-445E-8FB3-1264E0CBBE91}.Release|x64.Build.0 = Release|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.ActiveCfg = Debug|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Debug|x64.Build.0 = Debug|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.ActiveCfg = Release|x64
{C91EEF13-A1AC-4A40-B695-DD4E378E5989}.Release|x64.Build.0 = Release|x64
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.ActiveCfg = Debug|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.Build.0 = Debug|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.ActiveCfg = Release|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.Build.0 = Release|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.ActiveCfg = Debug|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.Build.0 = Debug|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.ActiveCfg = Release|Any CPU
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.Build.0 = Release|Any CPU
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.ActiveCfg = Debug|x64
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Debug|x64.Build.0 = Debug|x64
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.ActiveCfg = Release|x64
{8BF98BEF-6F00-4197-91ED-75F8F1C35FFB}.Release|x64.Build.0 = Release|x64
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.ActiveCfg = Debug|x64
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Debug|x64.Build.0 = Debug|x64
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.ActiveCfg = Release|x64
{F514DA95-9867-4F3F-8062-ACE0C62E8740}.Release|x64.Build.0 = Release|x64
{A12D7B4B-8E6E-4DCF-A41A-12F62E9FF94B}.Debug|x64.ActiveCfg = Debug|x64
{A12D7B4B-8E6E-4DCF-A41A-12F62E9FF94B}.Debug|x64.Build.0 = Debug|x64
{A12D7B4B-8E6E-4DCF-A41A-12F62E9FF94B}.Release|x64.ActiveCfg = Release|x64

View File

@ -57,16 +57,28 @@ internal sealed class AlliedSocietyJournalComponent
if (quests.Count == 0)
continue;
bool containsNewQuests = quests.Any(x => !_questFunctions.IsQuestComplete(x.QuestId));
if (containsNewQuests)
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudYellow);
string label = $"{alliedSociety}###AlliedSociety{(int)alliedSociety}";
#if DEBUG
bool isOpen;
if (quests.Any(x => !_questRegistry.IsKnownQuest(x.QuestId)))
{
using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudOrange))
isOpen = ImGui.CollapsingHeader(label);
}
else if (quests.Any(x => !_questFunctions.IsQuestComplete(x.QuestId)))
{
using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudYellow))
isOpen = ImGui.CollapsingHeader(label);
}
else
isOpen = ImGui.CollapsingHeader(label);
#else
bool isOpen = ImGui.CollapsingHeader(label);
#endif
if (!ImGui.CollapsingHeader($"{alliedSociety}###AlliedSociety{(int)alliedSociety}"))
if (!isOpen)
continue;
if (containsNewQuests)
ImGui.PopStyleColor();
if (alliedSociety <= EAlliedSociety.Ixal)
{
for (byte i = 1; i <= 8; ++i)

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
@ -19,6 +20,7 @@ internal sealed class OneTimeSetupWindow : LWindow
private static readonly IReadOnlyList<PluginInfo> RequiredPlugins =
[
new("vnavmesh",
"vnavmesh",
"""
vnavmesh handles the navigation within a zone, moving
your character to the next quest-related objective.
@ -26,12 +28,14 @@ internal sealed class OneTimeSetupWindow : LWindow
new Uri("https://github.com/awgil/ffxiv_navmesh/"),
new Uri("https://puni.sh/api/repository/veyn")),
new("Lifestream",
"Lifestream",
"""
Used to travel to aethernet shards in cities.
""",
new Uri("https://github.com/NightmareXIV/Lifestream"),
new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")),
new("TextAdvance",
"TextAdvance",
"""
Automatically accepts and turns in quests, skips cutscenes
and dialogue.
@ -45,23 +49,22 @@ internal sealed class OneTimeSetupWindow : LWindow
private readonly Configuration _configuration;
private readonly IDalamudPluginInterface _pluginInterface;
private readonly UiUtils _uiUtils;
private readonly DalamudReflector _dalamudReflector;
private readonly ILogger<OneTimeSetupWindow> _logger;
public OneTimeSetupWindow(Configuration configuration, IDalamudPluginInterface pluginInterface, UiUtils uiUtils,
DalamudReflector dalamudReflector, ILogger<OneTimeSetupWindow> logger, AutomatonIpc automatonIpc)
ILogger<OneTimeSetupWindow> logger, AutomatonIpc automatonIpc)
: base("Questionable Setup###QuestionableOneTimeSetup",
ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings, true)
{
_configuration = configuration;
_pluginInterface = pluginInterface;
_uiUtils = uiUtils;
_dalamudReflector = dalamudReflector;
_logger = logger;
_recommendedPlugins =
[
new("Rotation Solver Reborn",
"RotationSolver",
"""
Automatically handles most combat interactions you encounter
during quests, including being interrupted by mobs.
@ -69,7 +72,8 @@ internal sealed class OneTimeSetupWindow : LWindow
new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn"),
new Uri(
"https://raw.githubusercontent.com/FFXIV-CombatReborn/CombatRebornRepo/main/pluginmaster.json")),
new PluginInfo("Automaton",
new PluginInfo("CBT (formerly known as Automaton)",
"Automaton",
"""
Automaton is a collection of automation-related tweaks.
The 'Sniper no sniping' tweak can complete snipe tasks automatically.
@ -78,6 +82,7 @@ internal sealed class OneTimeSetupWindow : LWindow
new Uri("https://puni.sh/api/repository/croizat"),
[new PluginDetailInfo("'Sniper no sniping' enabled", () => automatonIpc.IsAutoSnipeEnabled)]),
new("NotificationMaster",
"NotificationMaster",
"""
Sends a configurable out-of-game notification if a quest
requires manual actions.
@ -159,7 +164,7 @@ internal sealed class OneTimeSetupWindow : LWindow
private bool DrawPlugin(PluginInfo plugin, float checklistPadding)
{
bool isInstalled = IsPluginInstalled(plugin.DisplayName);
bool isInstalled = IsPluginInstalled(plugin);
using (ImRaii.PushId("plugin_" + plugin.DisplayName))
{
_uiUtils.ChecklistItem(plugin.DisplayName, isInstalled);
@ -194,13 +199,14 @@ internal sealed class OneTimeSetupWindow : LWindow
return isInstalled;
}
private bool IsPluginInstalled(string internalName)
private bool IsPluginInstalled(PluginInfo pluginInfo)
{
return _dalamudReflector.TryGetDalamudPlugin(internalName, out _, suppressErrors: true, ignoreCache: true);
return _pluginInterface.InstalledPlugins.Any(x => x.InternalName == pluginInfo.InternalName && x.IsLoaded);
}
private sealed record PluginInfo(
string DisplayName,
string InternalName,
string Details,
Uri WebsiteUri,
Uri? DalamudRepositoryUri,

View File

@ -22,6 +22,7 @@ internal sealed class EventInfoComponent
[SuppressMessage("ReSharper", "CollectionNeverUpdated.Local")]
private readonly List<EventQuest> _eventQuests =
[
new("Starlight Celebration", [new(5227), new(5228)], AtDailyReset(new(2024, 12, 31))),
];
private readonly QuestData _questData;