From 8a7847ff37ca68cf9b9afdcf9a75cdc2f22f0a0c Mon Sep 17 00:00:00 2001 From: alydev Date: Sun, 7 Dec 2025 10:55:56 +1000 Subject: [PATCH] muffin v7.38.9 --- LLib/LLib.ImGui/LWindow.cs | 4 +- .../NotificationMasterAPI.csproj | 19 + .../NotificationMasterAPI/Data.cs | 6 + .../NotificationMasterAPI/NMAPINames.cs | 16 + .../NotificationMasterApi.cs | 146 +++ .../AssemblyQuestLoader.cs | 408 +++++--- .../Interact.cs | 5 + .../WaitAtEnd.cs | 27 +- .../TaskExecutor.cs | 1 + .../InterruptHandler.cs | 7 +- .../MovementController.cs | 163 +++- .../QuestController.cs | 104 +- .../Questionable.Data/ChangelogData.cs | 922 +++++++++--------- .../Questionable.External/NavmeshIpc.cs | 34 +- .../Questionable.Functions/ChatFunctions.cs | 8 +- .../Questionable.Functions/GameFunctions.cs | 8 +- .../Questionable.Functions/GameSignatures.cs | 5 + .../GeneralConfigComponent.cs | 64 +- .../PluginConfigComponent.cs | 25 +- .../GatheringJournalComponent.cs | 9 +- Questionable/Questionable/Configuration.cs | 4 +- 21 files changed, 1296 insertions(+), 689 deletions(-) create mode 100644 NotificationMasterAPI/NotificationMasterAPI.csproj create mode 100644 NotificationMasterAPI/NotificationMasterAPI/Data.cs create mode 100644 NotificationMasterAPI/NotificationMasterAPI/NMAPINames.cs create mode 100644 NotificationMasterAPI/NotificationMasterAPI/NotificationMasterApi.cs create mode 100644 Questionable/Questionable.Functions/GameSignatures.cs diff --git a/LLib/LLib.ImGui/LWindow.cs b/LLib/LLib.ImGui/LWindow.cs index 16df614..a355121 100644 --- a/LLib/LLib.ImGui/LWindow.cs +++ b/LLib/LLib.ImGui/LWindow.cs @@ -33,7 +33,7 @@ public abstract class LWindow : Window } } - protected bool IsPinned + protected new bool IsPinned { get { @@ -45,7 +45,7 @@ public abstract class LWindow : Window } } - protected bool IsClickthrough + protected new bool IsClickthrough { get { diff --git a/NotificationMasterAPI/NotificationMasterAPI.csproj b/NotificationMasterAPI/NotificationMasterAPI.csproj new file mode 100644 index 0000000..d516cfc --- /dev/null +++ b/NotificationMasterAPI/NotificationMasterAPI.csproj @@ -0,0 +1,19 @@ + + + + NotificationMasterAPI + False + netcoreapp9.0 + + + 12.0 + True + + + + + + ..\..\..\..\..\ffxiv\alyssile-xivl\addon\Hooks\dev\Dalamud.dll + + + \ No newline at end of file diff --git a/NotificationMasterAPI/NotificationMasterAPI/Data.cs b/NotificationMasterAPI/NotificationMasterAPI/Data.cs new file mode 100644 index 0000000..3623dde --- /dev/null +++ b/NotificationMasterAPI/NotificationMasterAPI/Data.cs @@ -0,0 +1,6 @@ +namespace NotificationMasterAPI; + +public static class Data +{ + public const string MFAudioFormats = "*.3g2;*.3gp;*.3gp2;*.3gpp;*.asf;*.wma;*.wmv;*.aac;*.adts;*.avi;*.mp3;*.m4a;*.m4v;*.mov;*.mp4;*.sami;*.smi;*.wav;*.aiff"; +} diff --git a/NotificationMasterAPI/NotificationMasterAPI/NMAPINames.cs b/NotificationMasterAPI/NotificationMasterAPI/NMAPINames.cs new file mode 100644 index 0000000..4ff0134 --- /dev/null +++ b/NotificationMasterAPI/NotificationMasterAPI/NMAPINames.cs @@ -0,0 +1,16 @@ +namespace NotificationMasterAPI; + +public static class NMAPINames +{ + public const string DisplayToastNotification = "NotificationMasterAPI.DisplayToastNotification"; + + public const string FlashTaskbarIcon = "NotificationMasterAPI.FlashTaskbarIcon"; + + public const string PlaySound = "NotificationMasterAPI.PlaySound"; + + public const string BringGameForeground = "NotificationMasterAPI.BringGameForeground"; + + public const string StopSound = "NotificationMasterAPI.StopSound"; + + public const string Active = "NotificationMasterAPI.Active"; +} diff --git a/NotificationMasterAPI/NotificationMasterAPI/NotificationMasterApi.cs b/NotificationMasterAPI/NotificationMasterAPI/NotificationMasterApi.cs new file mode 100644 index 0000000..6b9235c --- /dev/null +++ b/NotificationMasterAPI/NotificationMasterAPI/NotificationMasterApi.cs @@ -0,0 +1,146 @@ +using System; +using Dalamud.Plugin; +using Dalamud.Plugin.Ipc.Exceptions; + +namespace NotificationMasterAPI; + +public class NotificationMasterApi +{ + private IDalamudPluginInterface PluginInterface; + + /// + /// Creates an instance of NotificationMaster API. You do not need to check if NotificationMaster plugin is installed. + /// + /// Plugin interface reference + public NotificationMasterApi(IDalamudPluginInterface dalamudPluginInterface) + { + PluginInterface = dalamudPluginInterface; + } + + private void Validate() + { + if (PluginInterface == null) + { + throw new NullReferenceException("NotificationMaster API was called before it was initialized"); + } + } + + /// + /// Checks if IPC is ready. You DO NOT need to call this method before invoking any of API functions unless you specifically want to check if plugin is installed and ready to accept requests. + /// + /// + public bool IsIPCReady() + { + Validate(); + try + { + PluginInterface.GetIpcSubscriber("NotificationMasterAPI.Active").InvokeAction(); + return true; + } + catch (IpcNotReadyError) + { + } + return false; + } + + /// + /// Displays tray notification. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Text of tray notification + /// Whether operation succeed. + public bool DisplayTrayNotification(string text) + { + return DisplayTrayNotification(null, text); + } + + /// + /// Displays tray notification. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Title of tray notification + /// Text of tray notification + /// Whether operation succeed. + public bool DisplayTrayNotification(string? title, string text) + { + Validate(); + try + { + return PluginInterface.GetIpcSubscriber("NotificationMasterAPI.DisplayToastNotification").InvokeFunc(PluginInterface.InternalName, title, text); + } + catch (IpcNotReadyError) + { + } + return false; + } + + /// + /// Flashes game's taskbar icon. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Whether operation succeeded + public bool FlashTaskbarIcon() + { + Validate(); + try + { + return PluginInterface.GetIpcSubscriber("NotificationMasterAPI.FlashTaskbarIcon").InvokeFunc(PluginInterface.InternalName); + } + catch (IpcNotReadyError) + { + } + return false; + } + + /// + /// Attempts to bring game's window foreground. Due to Windows inconsistencies, it's not guaranteed to work. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Whether operation succeeded + public bool TryBringGameForeground() + { + Validate(); + try + { + return PluginInterface.GetIpcSubscriber("NotificationMasterAPI.BringGameForeground").InvokeFunc(PluginInterface.InternalName); + } + catch (IpcNotReadyError) + { + } + return false; + } + + /// + /// Begins to play a sound file. If another sound file is already playing, stops previous file and begins playing specified. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Path to local file. Can not be web URL. See for supported formats. + /// Volume between 0.0 and 1.0 + /// Whether to repeat sound file. + /// Whether to stop file once game is focused. + /// Whether operation succeeded + public bool PlaySound(string pathOnDisk, float volume = 1f, bool repeat = false, bool stopOnGameFocus = true) + { + Validate(); + try + { + return PluginInterface.GetIpcSubscriber("NotificationMasterAPI.PlaySound").InvokeFunc(PluginInterface.InternalName, pathOnDisk, volume, repeat, stopOnGameFocus); + } + catch (IpcNotReadyError) + { + } + return false; + } + + /// + /// Stops playing sound. This function does not throws an exception or displays an error if NotificationMaster is not installed. + /// + /// Whether operation succeeded + public bool StopSound() + { + Validate(); + try + { + return PluginInterface.GetIpcSubscriber("NotificationMasterAPI.StopSound").InvokeFunc(PluginInterface.InternalName); + } + catch (IpcNotReadyError) + { + } + return false; + } +} diff --git a/QuestPaths/Questionable.QuestPaths/AssemblyQuestLoader.cs b/QuestPaths/Questionable.QuestPaths/AssemblyQuestLoader.cs index e8d89ee..edc88ec 100644 --- a/QuestPaths/Questionable.QuestPaths/AssemblyQuestLoader.cs +++ b/QuestPaths/Questionable.QuestPaths/AssemblyQuestLoader.cs @@ -16330,7 +16330,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot29.Author = list253; - index = 3; + index = 4; List list254 = new List(index); CollectionsMarshal.SetCount(list254, index); span2 = CollectionsMarshal.AsSpan(list254); @@ -16382,6 +16382,11 @@ public static class AssemblyQuestLoader obj165.Steps = list256; reference191 = obj165; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference192 = ref span2[num]; QuestSequence obj166 = new QuestSequence { @@ -87745,7 +87750,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "plogon_enjoyer"; questRoot21.Author = list193; - index = 3; + index = 4; List list194 = new List(index); CollectionsMarshal.SetCount(list194, index); span2 = CollectionsMarshal.AsSpan(list194); @@ -87781,6 +87786,11 @@ public static class AssemblyQuestLoader obj143.Steps = list196; reference152 = obj143; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference153 = ref span2[num]; QuestSequence obj144 = new QuestSequence { @@ -106084,7 +106094,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot8.Author = list78; - index = 6; + index = 7; List list79 = new List(index); CollectionsMarshal.SetCount(list79, index); span2 = CollectionsMarshal.AsSpan(list79); @@ -106192,6 +106202,11 @@ public static class AssemblyQuestLoader obj57.Steps = list84; reference67 = obj57; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference68 = ref span2[num]; QuestSequence obj58 = new QuestSequence { @@ -121129,7 +121144,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot18.Author = list136; - index = 5; + index = 6; List list137 = new List(index); CollectionsMarshal.SetCount(list137, index); span2 = CollectionsMarshal.AsSpan(list137); @@ -121215,6 +121230,11 @@ public static class AssemblyQuestLoader obj96.Steps = list141; reference105 = obj96; num++; + span2[num] = new QuestSequence + { + Sequence = 4 + }; + num++; ref QuestSequence reference106 = ref span2[num]; QuestSequence obj97 = new QuestSequence { @@ -123973,7 +123993,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot44.Author = list325; - index = 4; + index = 5; List list326 = new List(index); CollectionsMarshal.SetCount(list326, index); span2 = CollectionsMarshal.AsSpan(list326); @@ -124040,6 +124060,11 @@ public static class AssemblyQuestLoader obj211.Steps = list329; reference239 = obj211; num++; + span2[num] = new QuestSequence + { + Sequence = 3 + }; + num++; ref QuestSequence reference241 = ref span2[num]; QuestSequence obj212 = new QuestSequence { @@ -125565,7 +125590,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot11.Author = list66; - index = 6; + index = 7; List list67 = new List(index); CollectionsMarshal.SetCount(list67, index); span2 = CollectionsMarshal.AsSpan(list67); @@ -125684,6 +125709,11 @@ public static class AssemblyQuestLoader obj51.Steps = list73; reference51 = obj51; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference52 = ref span2[num]; QuestSequence obj52 = new QuestSequence { @@ -165091,7 +165121,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot15.Author = list127; - index = 5; + index = 6; List list128 = new List(index); CollectionsMarshal.SetCount(list128, index); span2 = CollectionsMarshal.AsSpan(list128); @@ -165174,6 +165204,11 @@ public static class AssemblyQuestLoader obj91.Steps = list132; reference100 = obj91; num++; + span2[num] = new QuestSequence + { + Sequence = 4 + }; + num++; ref QuestSequence reference101 = ref span2[num]; QuestSequence obj92 = new QuestSequence { @@ -166531,7 +166566,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot27.Author = list219; - index = 7; + index = 8; List list220 = new List(index); CollectionsMarshal.SetCount(list220, index); span2 = CollectionsMarshal.AsSpan(list220); @@ -166662,6 +166697,11 @@ public static class AssemblyQuestLoader obj156.Steps = list226; reference168 = obj156; num++; + span2[num] = new QuestSequence + { + Sequence = 6 + }; + num++; ref QuestSequence reference170 = ref span2[num]; QuestSequence obj158 = new QuestSequence { @@ -179658,7 +179698,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot5.Author = list25; - index = 8; + index = 9; List list26 = new List(index); CollectionsMarshal.SetCount(list26, index); span2 = CollectionsMarshal.AsSpan(list26); @@ -179793,6 +179833,11 @@ public static class AssemblyQuestLoader obj23.Steps = list33; reference23 = obj23; num++; + span2[num] = new QuestSequence + { + Sequence = 7 + }; + num++; ref QuestSequence reference24 = ref span2[num]; QuestSequence obj24 = new QuestSequence { @@ -187760,7 +187805,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot20.Author = list123; - index = 6; + index = 7; List list124 = new List(index); CollectionsMarshal.SetCount(list124, index); span2 = CollectionsMarshal.AsSpan(list124); @@ -187876,6 +187921,11 @@ public static class AssemblyQuestLoader obj84.Steps = list130; reference90 = obj84; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference91 = ref span2[num]; QuestSequence obj85 = new QuestSequence { @@ -188384,7 +188434,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot25.Author = list160; - index = 6; + index = 7; List list161 = new List(index); CollectionsMarshal.SetCount(list161, index); span2 = CollectionsMarshal.AsSpan(list161); @@ -188495,6 +188545,11 @@ public static class AssemblyQuestLoader obj108.Steps = list166; reference116 = obj108; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference117 = ref span2[num]; QuestSequence obj109 = new QuestSequence { @@ -195213,7 +195268,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot25.Author = list216; - index = 6; + index = 7; List list217 = new List(index); CollectionsMarshal.SetCount(list217, index); span2 = CollectionsMarshal.AsSpan(list217); @@ -195338,6 +195393,11 @@ public static class AssemblyQuestLoader obj136.Steps = list222; reference166 = obj136; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference167 = ref span2[num]; QuestSequence obj137 = new QuestSequence { @@ -197491,7 +197551,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot45.Author = list369; - index = 8; + index = 9; List list370 = new List(index); CollectionsMarshal.SetCount(list370, index); span2 = CollectionsMarshal.AsSpan(list370); @@ -197656,6 +197716,11 @@ public static class AssemblyQuestLoader obj238.Steps = list380; reference280 = obj238; num++; + span2[num] = new QuestSequence + { + Sequence = 7 + }; + num++; ref QuestSequence reference282 = ref span2[num]; QuestSequence obj240 = new QuestSequence { @@ -198205,7 +198270,7 @@ public static class AssemblyQuestLoader int index = 0; span[index] = "JerryWester"; questRoot.Author = list; - index = 6; + index = 7; List list2 = new List(index); CollectionsMarshal.SetCount(list2, index); Span span2 = CollectionsMarshal.AsSpan(list2); @@ -198329,6 +198394,11 @@ public static class AssemblyQuestLoader obj5.Steps = list7; reference5 = obj5; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference7 = ref span2[num]; QuestSequence obj7 = new QuestSequence { @@ -200079,7 +200149,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot11.Author = list111; - index = 5; + index = 6; List list112 = new List(index); CollectionsMarshal.SetCount(list112, index); span2 = CollectionsMarshal.AsSpan(list112); @@ -200170,6 +200240,11 @@ public static class AssemblyQuestLoader obj81.Steps = list116; reference94 = obj81; num++; + span2[num] = new QuestSequence + { + Sequence = 4 + }; + num++; ref QuestSequence reference95 = ref span2[num]; QuestSequence obj82 = new QuestSequence { @@ -201909,7 +201984,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot21.Author = list221; - index = 3; + index = 4; List list222 = new List(index); CollectionsMarshal.SetCount(list222, index); span2 = CollectionsMarshal.AsSpan(list222); @@ -201966,6 +202041,11 @@ public static class AssemblyQuestLoader obj160.Steps = list225; reference181 = obj160; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference182 = ref span2[num]; QuestSequence obj161 = new QuestSequence { @@ -215089,7 +215169,7 @@ public static class AssemblyQuestLoader int index = 0; span[index] = "liza"; questRoot.Author = list; - index = 3; + index = 4; List list2 = new List(index); CollectionsMarshal.SetCount(list2, index); Span span2 = CollectionsMarshal.AsSpan(list2); @@ -215140,6 +215220,11 @@ public static class AssemblyQuestLoader obj2.Steps = list4; reference2 = obj2; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference3 = ref span2[num]; QuestSequence obj3 = new QuestSequence { @@ -222552,7 +222637,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot9.Author = list66; - index = 6; + index = 7; List list67 = new List(index); CollectionsMarshal.SetCount(list67, index); span2 = CollectionsMarshal.AsSpan(list67); @@ -222659,6 +222744,11 @@ public static class AssemblyQuestLoader obj52.Steps = list72; reference54 = obj52; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference55 = ref span2[num]; QuestSequence obj53 = new QuestSequence { @@ -249500,7 +249590,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot36.Author = list374; - index = 4; + index = 5; List list375 = new List(index); CollectionsMarshal.SetCount(list375, index); span2 = CollectionsMarshal.AsSpan(list375); @@ -249558,6 +249648,11 @@ public static class AssemblyQuestLoader obj187.Steps = list378; reference263 = obj187; num++; + span2[num] = new QuestSequence + { + Sequence = 3 + }; + num++; ref QuestSequence reference264 = ref span2[num]; QuestSequence obj188 = new QuestSequence { @@ -249835,7 +249930,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "JerryWester"; questRoot39.Author = list396; - index = 6; + index = 7; List list397 = new List(index); CollectionsMarshal.SetCount(list397, index); span2 = CollectionsMarshal.AsSpan(list397); @@ -249939,6 +250034,11 @@ public static class AssemblyQuestLoader obj204.Steps = list402; reference281 = obj204; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference283 = ref span2[num]; QuestSequence obj206 = new QuestSequence { @@ -267329,7 +267429,7 @@ public static class AssemblyQuestLoader int index = 0; span[index] = "liza"; questRoot.Author = list; - index = 6; + index = 7; List list2 = new List(index); CollectionsMarshal.SetCount(list2, index); Span span2 = CollectionsMarshal.AsSpan(list2); @@ -267442,6 +267542,11 @@ public static class AssemblyQuestLoader obj5.Steps = list7; reference5 = obj5; num++; + span2[num] = new QuestSequence + { + Sequence = 5 + }; + num++; ref QuestSequence reference6 = ref span2[num]; QuestSequence obj6 = new QuestSequence { @@ -269112,7 +269217,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot13.Author = list104; - index = 4; + index = 5; List list105 = new List(index); CollectionsMarshal.SetCount(list105, index); span2 = CollectionsMarshal.AsSpan(list105); @@ -269171,6 +269276,11 @@ public static class AssemblyQuestLoader obj75.Steps = list108; reference80 = obj75; num++; + span2[num] = new QuestSequence + { + Sequence = 3 + }; + num++; ref QuestSequence reference81 = ref span2[num]; QuestSequence obj76 = new QuestSequence { @@ -273186,7 +273296,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot41.Author = list355; - index = 4; + index = 5; List list356 = new List(index); CollectionsMarshal.SetCount(list356, index); span2 = CollectionsMarshal.AsSpan(list356); @@ -273253,6 +273363,11 @@ public static class AssemblyQuestLoader obj255.Steps = list359; reference275 = obj255; num++; + span2[num] = new QuestSequence + { + Sequence = 3 + }; + num++; ref QuestSequence reference276 = ref span2[num]; QuestSequence obj256 = new QuestSequence { @@ -284706,7 +284821,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot26.Author = list215; - index = 3; + index = 4; List list216 = new List(index); CollectionsMarshal.SetCount(list216, index); span2 = CollectionsMarshal.AsSpan(list216); @@ -284772,6 +284887,11 @@ public static class AssemblyQuestLoader obj143.Steps = list218; reference156 = obj143; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference158 = ref span2[num]; QuestSequence obj146 = new QuestSequence { @@ -357538,7 +357658,7 @@ public static class AssemblyQuestLoader span[index] = "liza"; questRoot66.Author = list226; QuestRoot questRoot67 = questRoot; - index = 4; + index = 5; list2 = new List(index); CollectionsMarshal.SetCount(list2, index); span2 = CollectionsMarshal.AsSpan(list2); @@ -357598,6 +357718,11 @@ public static class AssemblyQuestLoader questSequence81.Steps = list228; reference277 = questSequence; num++; + span2[num] = new QuestSequence + { + Sequence = 3 + }; + num++; ref QuestSequence reference278 = ref span2[num]; QuestSequence obj159 = new QuestSequence { @@ -358335,7 +358460,7 @@ public static class AssemblyQuestLoader span[index] = "liza"; questRoot80.Author = list265; QuestRoot questRoot81 = questRoot; - index = 3; + index = 4; list2 = new List(index); CollectionsMarshal.SetCount(list2, index); span2 = CollectionsMarshal.AsSpan(list2); @@ -358376,6 +358501,11 @@ public static class AssemblyQuestLoader questSequence91.Steps = list267; reference317 = questSequence; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference318 = ref span2[num]; QuestSequence obj186 = new QuestSequence { @@ -359087,10 +359217,11 @@ public static class AssemblyQuestLoader reference355 = obj208; num++; ref QuestSequence reference356 = ref span2[num]; - QuestSequence obj209 = new QuestSequence + questSequence = new QuestSequence { Sequence = 5 }; + QuestSequence questSequence102 = questSequence; num2 = 1; List list299 = new List(num2); CollectionsMarshal.SetCount(list299, num2); @@ -359100,14 +359231,15 @@ public static class AssemblyQuestLoader { StopDistance = 0.25f }; - obj209.Steps = list299; - reference356 = obj209; + questSequence102.Steps = list299; + reference356 = questSequence; num++; ref QuestSequence reference357 = ref span2[num]; - QuestSequence obj210 = new QuestSequence + questSequence = new QuestSequence { Sequence = 6 }; + QuestSequence questSequence103 = questSequence; index2 = 1; List list300 = new List(index2); CollectionsMarshal.SetCount(list300, index2); @@ -359117,11 +359249,11 @@ public static class AssemblyQuestLoader { StopDistance = 0.25f }; - obj210.Steps = list300; - reference357 = obj210; + questSequence103.Steps = list300; + reference357 = questSequence; num++; ref QuestSequence reference358 = ref span2[num]; - QuestSequence obj211 = new QuestSequence + QuestSequence obj209 = new QuestSequence { Sequence = 7 }; @@ -359131,15 +359263,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list301); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1037985u, new Vector3(481.8036f, 66.16195f, -108.537415f), 956); - obj211.Steps = list301; - reference358 = obj211; + obj209.Steps = list301; + reference358 = obj209; num++; ref QuestSequence reference359 = ref span2[num]; questSequence = new QuestSequence { Sequence = byte.MaxValue }; - QuestSequence questSequence102 = questSequence; + QuestSequence questSequence104 = questSequence; index2 = 1; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -359160,7 +359292,7 @@ public static class AssemblyQuestLoader }; questStep52.DialogueChoices = list302; reference360 = questStep52; - questSequence102.Steps = list4; + questSequence104.Steps = list4; reference359 = questSequence; questRoot91.QuestSequence = list2; AddQuest(questId45, questRoot); @@ -359181,7 +359313,7 @@ public static class AssemblyQuestLoader span2 = CollectionsMarshal.AsSpan(list2); num = 0; ref QuestSequence reference361 = ref span2[num]; - QuestSequence obj212 = new QuestSequence + QuestSequence obj210 = new QuestSequence { Sequence = 0 }; @@ -359191,15 +359323,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list304); index2 = 0; span3[index2] = new QuestStep(EInteractionType.AcceptQuest, 1040401u, new Vector3(374.83777f, 79.691376f, 298.08484f), 956); - obj212.Steps = list304; - reference361 = obj212; + obj210.Steps = list304; + reference361 = obj210; num++; ref QuestSequence reference362 = ref span2[num]; questSequence = new QuestSequence { Sequence = 1 }; - QuestSequence questSequence103 = questSequence; + QuestSequence questSequence105 = questSequence; index2 = 3; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -359218,11 +359350,11 @@ public static class AssemblyQuestLoader }; num2++; span3[num2] = new QuestStep(EInteractionType.Interact, 1039687u, new Vector3(-18.875488f, -31.53043f, -76.98181f), 956); - questSequence103.Steps = list4; + questSequence105.Steps = list4; reference362 = questSequence; num++; ref QuestSequence reference363 = ref span2[num]; - QuestSequence obj213 = new QuestSequence + QuestSequence obj211 = new QuestSequence { Sequence = 2 }; @@ -359232,15 +359364,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list305); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1040409u, new Vector3(-99.076904f, -28.516306f, -60.013794f), 956); - obj213.Steps = list305; - reference363 = obj213; + obj211.Steps = list305; + reference363 = obj211; num++; ref QuestSequence reference364 = ref span2[num]; questSequence = new QuestSequence { Sequence = 3 }; - QuestSequence questSequence104 = questSequence; + QuestSequence questSequence106 = questSequence; index2 = 8; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -359448,11 +359580,11 @@ public static class AssemblyQuestLoader span7[index3] = null; questStep60.CompletionQuestVariablesFlags = list75; reference372 = questStep; - questSequence104.Steps = list4; + questSequence106.Steps = list4; reference364 = questSequence; num++; ref QuestSequence reference373 = ref span2[num]; - QuestSequence obj214 = new QuestSequence + QuestSequence obj212 = new QuestSequence { Sequence = 4 }; @@ -359462,14 +359594,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list306); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1040436u, new Vector3(-78.26355f, -29.53f, -58.854065f), 956); - obj214.Steps = list306; - reference373 = obj214; + obj212.Steps = list306; + reference373 = obj212; num++; ref QuestSequence reference374 = ref span2[num]; - QuestSequence obj215 = new QuestSequence + questSequence = new QuestSequence { Sequence = 5 }; + QuestSequence questSequence107 = questSequence; index2 = 1; List list307 = new List(index2); CollectionsMarshal.SetCount(list307, index2); @@ -359479,14 +359612,15 @@ public static class AssemblyQuestLoader { StopDistance = 5f }; - obj215.Steps = list307; - reference374 = obj215; + questSequence107.Steps = list307; + reference374 = questSequence; num++; ref QuestSequence reference375 = ref span2[num]; - QuestSequence obj216 = new QuestSequence + questSequence = new QuestSequence { Sequence = byte.MaxValue }; + QuestSequence questSequence108 = questSequence; num2 = 1; List list308 = new List(num2); CollectionsMarshal.SetCount(list308, num2); @@ -359496,8 +359630,8 @@ public static class AssemblyQuestLoader { StopDistance = 5f }; - obj216.Steps = list308; - reference375 = obj216; + questSequence108.Steps = list308; + reference375 = questSequence; questRoot93.QuestSequence = list2; AddQuest(questId46, questRoot); QuestId questId47 = new QuestId(4446); @@ -359517,10 +359651,11 @@ public static class AssemblyQuestLoader span2 = CollectionsMarshal.AsSpan(list2); num = 0; ref QuestSequence reference376 = ref span2[num]; - QuestSequence obj217 = new QuestSequence + questSequence = new QuestSequence { Sequence = 0 }; + QuestSequence questSequence109 = questSequence; index2 = 1; List list310 = new List(index2); CollectionsMarshal.SetCount(list310, index2); @@ -359530,15 +359665,15 @@ public static class AssemblyQuestLoader { StopDistance = 5f }; - obj217.Steps = list310; - reference376 = obj217; + questSequence109.Steps = list310; + reference376 = questSequence; num++; ref QuestSequence reference377 = ref span2[num]; questSequence = new QuestSequence { Sequence = 1 }; - QuestSequence questSequence105 = questSequence; + QuestSequence questSequence110 = questSequence; num2 = 4; list4 = new List(num2); CollectionsMarshal.SetCount(list4, num2); @@ -359588,11 +359723,11 @@ public static class AssemblyQuestLoader reference379 = questStep; index2++; span3[index2] = new QuestStep(EInteractionType.Interact, 1040444u, new Vector3(-424.24664f, -31.831255f, -38.895264f), 956); - questSequence105.Steps = list4; + questSequence110.Steps = list4; reference377 = questSequence; num++; ref QuestSequence reference380 = ref span2[num]; - QuestSequence obj218 = new QuestSequence + QuestSequence obj213 = new QuestSequence { Sequence = 2 }; @@ -359602,11 +359737,11 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list313); num2 = 0; span3[num2] = new QuestStep(EInteractionType.Interact, 2012223u, new Vector3(-427.2984f, -31.418396f, -38.19336f), 956); - obj218.Steps = list313; - reference380 = obj218; + obj213.Steps = list313; + reference380 = obj213; num++; ref QuestSequence reference381 = ref span2[num]; - QuestSequence obj219 = new QuestSequence + QuestSequence obj214 = new QuestSequence { Sequence = 3 }; @@ -359616,15 +359751,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list314); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1040446u, new Vector3(-697.4136f, -31.621387f, 164.11072f), 956); - obj219.Steps = list314; - reference381 = obj219; + obj214.Steps = list314; + reference381 = obj214; num++; ref QuestSequence reference382 = ref span2[num]; questSequence = new QuestSequence { Sequence = 4 }; - QuestSequence questSequence106 = questSequence; + QuestSequence questSequence111 = questSequence; index2 = 2; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -359637,11 +359772,11 @@ public static class AssemblyQuestLoader }; num2++; span3[num2] = new QuestStep(EInteractionType.Interact, 1040447u, new Vector3(-710.0176f, -31.53043f, 322.59094f), 956); - questSequence106.Steps = list4; + questSequence111.Steps = list4; reference382 = questSequence; num++; ref QuestSequence reference383 = ref span2[num]; - QuestSequence obj220 = new QuestSequence + QuestSequence obj215 = new QuestSequence { Sequence = 5 }; @@ -359651,11 +359786,11 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list315); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1040450u, new Vector3(-754.4213f, -29.529999f, 389.70007f), 956); - obj220.Steps = list315; - reference383 = obj220; + obj215.Steps = list315; + reference383 = obj215; num++; ref QuestSequence reference384 = ref span2[num]; - QuestSequence obj221 = new QuestSequence + QuestSequence obj216 = new QuestSequence { Sequence = byte.MaxValue }; @@ -359665,8 +359800,8 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list316); num2 = 0; span3[num2] = new QuestStep(EInteractionType.CompleteQuest, 1040447u, new Vector3(-710.0176f, -31.53043f, 322.59094f), 956); - obj221.Steps = list316; - reference384 = obj221; + obj216.Steps = list316; + reference384 = obj216; questRoot95.QuestSequence = list2; AddQuest(questId47, questRoot); QuestId questId48 = new QuestId(4447); @@ -359686,10 +359821,11 @@ public static class AssemblyQuestLoader span2 = CollectionsMarshal.AsSpan(list2); num = 0; ref QuestSequence reference385 = ref span2[num]; - QuestSequence obj222 = new QuestSequence + questSequence = new QuestSequence { Sequence = 0 }; + QuestSequence questSequence112 = questSequence; num2 = 1; List list318 = new List(num2); CollectionsMarshal.SetCount(list318, num2); @@ -359699,11 +359835,11 @@ public static class AssemblyQuestLoader { StopDistance = 5f }; - obj222.Steps = list318; - reference385 = obj222; + questSequence112.Steps = list318; + reference385 = questSequence; num++; ref QuestSequence reference386 = ref span2[num]; - QuestSequence obj223 = new QuestSequence + QuestSequence obj217 = new QuestSequence { Sequence = 1 }; @@ -359713,15 +359849,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list319); num2 = 0; span3[num2] = new QuestStep(EInteractionType.Interact, 1040454u, new Vector3(-613.18384f, -19.786552f, 626.8557f), 956); - obj223.Steps = list319; - reference386 = obj223; + obj217.Steps = list319; + reference386 = obj217; num++; ref QuestSequence reference387 = ref span2[num]; questSequence = new QuestSequence { Sequence = 2 }; - QuestSequence questSequence107 = questSequence; + QuestSequence questSequence113 = questSequence; num2 = 1; list4 = new List(num2); CollectionsMarshal.SetCount(list4, num2); @@ -359745,11 +359881,11 @@ public static class AssemblyQuestLoader span6[num3] = 13980u; questStep63.KillEnemyDataIds = list320; reference388 = questStep; - questSequence107.Steps = list4; + questSequence113.Steps = list4; reference387 = questSequence; num++; ref QuestSequence reference389 = ref span2[num]; - QuestSequence obj224 = new QuestSequence + QuestSequence obj218 = new QuestSequence { Sequence = 3 }; @@ -359759,15 +359895,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list321); num2 = 0; span3[num2] = new QuestStep(EInteractionType.Interact, 2012442u, new Vector3(-594.5678f, -26.596497f, 609.09436f), 956); - obj224.Steps = list321; - reference389 = obj224; + obj218.Steps = list321; + reference389 = obj218; num++; ref QuestSequence reference390 = ref span2[num]; questSequence = new QuestSequence { Sequence = byte.MaxValue }; - QuestSequence questSequence108 = questSequence; + QuestSequence questSequence114 = questSequence; num2 = 8; list4 = new List(num2); CollectionsMarshal.SetCount(list4, num2); @@ -359815,7 +359951,7 @@ public static class AssemblyQuestLoader }; index2++; span3[index2] = new QuestStep(EInteractionType.CompleteQuest, 1040455u, new Vector3(10.147156f, -30.155546f, 619.62305f), 956); - questSequence108.Steps = list4; + questSequence114.Steps = list4; reference390 = questSequence; questRoot97.QuestSequence = list2; AddQuest(questId48, questRoot); @@ -359836,7 +359972,7 @@ public static class AssemblyQuestLoader span2 = CollectionsMarshal.AsSpan(list2); num = 0; ref QuestSequence reference391 = ref span2[num]; - QuestSequence obj225 = new QuestSequence + QuestSequence obj219 = new QuestSequence { Sequence = 0 }; @@ -359846,15 +359982,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list323); num2 = 0; span3[num2] = new QuestStep(EInteractionType.AcceptQuest, 1040455u, new Vector3(10.147156f, -30.155546f, 619.62305f), 956); - obj225.Steps = list323; - reference391 = obj225; + obj219.Steps = list323; + reference391 = obj219; num++; ref QuestSequence reference392 = ref span2[num]; questSequence = new QuestSequence { Sequence = 1 }; - QuestSequence questSequence109 = questSequence; + QuestSequence questSequence115 = questSequence; num2 = 2; list4 = new List(num2); CollectionsMarshal.SetCount(list4, num2); @@ -359880,11 +360016,11 @@ public static class AssemblyQuestLoader }; questStep64.DialogueChoices = list324; reference393 = questStep64; - questSequence109.Steps = list4; + questSequence115.Steps = list4; reference392 = questSequence; num++; ref QuestSequence reference394 = ref span2[num]; - QuestSequence obj226 = new QuestSequence + QuestSequence obj220 = new QuestSequence { Sequence = 2 }; @@ -359894,15 +360030,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list325); num2 = 0; span3[num2] = new QuestStep(EInteractionType.Interact, 1040457u, new Vector3(36.51477f, -16.246998f, 129.47266f), 962); - obj226.Steps = list325; - reference394 = obj226; + obj220.Steps = list325; + reference394 = obj220; num++; ref QuestSequence reference395 = ref span2[num]; questSequence = new QuestSequence { Sequence = 3 }; - QuestSequence questSequence110 = questSequence; + QuestSequence questSequence116 = questSequence; num2 = 1; List list326 = new List(num2); CollectionsMarshal.SetCount(list326, num2); @@ -359912,7 +360048,7 @@ public static class AssemblyQuestLoader { AetheryteShortcut = EAetheryteLocation.LabyrinthosAporia }; - questSequence110.Steps = list326; + questSequence116.Steps = list326; reference395 = questSequence; num++; ref QuestSequence reference396 = ref span2[num]; @@ -359920,7 +360056,7 @@ public static class AssemblyQuestLoader { Sequence = 4 }; - QuestSequence questSequence111 = questSequence; + QuestSequence questSequence117 = questSequence; index2 = 1; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -359940,7 +360076,7 @@ public static class AssemblyQuestLoader }; questStep65.DialogueChoices = list327; reference397 = questStep65; - questSequence111.Steps = list4; + questSequence117.Steps = list4; reference396 = questSequence; num++; ref QuestSequence reference398 = ref span2[num]; @@ -359948,7 +360084,7 @@ public static class AssemblyQuestLoader { Sequence = 5 }; - QuestSequence questSequence112 = questSequence; + QuestSequence questSequence118 = questSequence; num2 = 1; List list328 = new List(num2); CollectionsMarshal.SetCount(list328, num2); @@ -359958,11 +360094,11 @@ public static class AssemblyQuestLoader { StopDistance = 7f }; - questSequence112.Steps = list328; + questSequence118.Steps = list328; reference398 = questSequence; num++; ref QuestSequence reference399 = ref span2[num]; - QuestSequence obj227 = new QuestSequence + QuestSequence obj221 = new QuestSequence { Sequence = 6 }; @@ -359975,11 +360111,11 @@ public static class AssemblyQuestLoader { RestartNavigationIfCancelled = false }; - obj227.Steps = list329; - reference399 = obj227; + obj221.Steps = list329; + reference399 = obj221; num++; ref QuestSequence reference400 = ref span2[num]; - QuestSequence obj228 = new QuestSequence + QuestSequence obj222 = new QuestSequence { Sequence = byte.MaxValue }; @@ -359989,8 +360125,8 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list330); index2 = 0; span3[index2] = new QuestStep(EInteractionType.CompleteQuest, 1040478u, new Vector3(-406.9734f, -220.18355f, 304.1886f), 956); - obj228.Steps = list330; - reference400 = obj228; + obj222.Steps = list330; + reference400 = obj222; questRoot99.QuestSequence = list2; AddQuest(questId49, questRoot); QuestId questId50 = new QuestId(4449); @@ -360010,7 +360146,7 @@ public static class AssemblyQuestLoader span2 = CollectionsMarshal.AsSpan(list2); num = 0; ref QuestSequence reference401 = ref span2[num]; - QuestSequence obj229 = new QuestSequence + QuestSequence obj223 = new QuestSequence { Sequence = 0 }; @@ -360020,11 +360156,11 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list332); num2 = 0; span3[num2] = new QuestStep(EInteractionType.AcceptQuest, 1040478u, new Vector3(-406.9734f, -220.18355f, 304.1886f), 956); - obj229.Steps = list332; - reference401 = obj229; + obj223.Steps = list332; + reference401 = obj223; num++; ref QuestSequence reference402 = ref span2[num]; - QuestSequence obj230 = new QuestSequence + QuestSequence obj224 = new QuestSequence { Sequence = 1 }; @@ -360034,15 +360170,15 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list333); index2 = 0; span3[index2] = new QuestStep(EInteractionType.Interact, 1040487u, new Vector3(-234.6991f, -224.38274f, 349.01953f), 956); - obj230.Steps = list333; - reference402 = obj230; + obj224.Steps = list333; + reference402 = obj224; num++; ref QuestSequence reference403 = ref span2[num]; questSequence = new QuestSequence { Sequence = 2 }; - QuestSequence questSequence113 = questSequence; + QuestSequence questSequence119 = questSequence; index2 = 1; list4 = new List(index2); CollectionsMarshal.SetCount(list4, index2); @@ -360050,7 +360186,7 @@ public static class AssemblyQuestLoader num2 = 0; ref QuestStep reference404 = ref span3[num2]; QuestStep questStep66 = new QuestStep(EInteractionType.Duty, null, null, 956); - DutyOptions obj231 = new DutyOptions + DutyOptions obj225 = new DutyOptions { ContentFinderConditionId = 786u }; @@ -360060,10 +360196,10 @@ public static class AssemblyQuestLoader span = CollectionsMarshal.AsSpan(list334); index3 = 0; span[index3] = "No VBM module"; - obj231.Notes = list334; - questStep66.DutyOptions = obj231; + obj225.Notes = list334; + questStep66.DutyOptions = obj225; reference404 = questStep66; - questSequence113.Steps = list4; + questSequence119.Steps = list4; reference403 = questSequence; num++; span2[num] = new QuestSequence @@ -360076,7 +360212,7 @@ public static class AssemblyQuestLoader { Sequence = 4 }; - QuestSequence questSequence114 = questSequence; + QuestSequence questSequence120 = questSequence; num2 = 1; List list335 = new List(num2); CollectionsMarshal.SetCount(list335, num2); @@ -360090,7 +360226,7 @@ public static class AssemblyQuestLoader ContentFinderConditionId = 790u } }; - questSequence114.Steps = list335; + questSequence120.Steps = list335; reference405 = questSequence; num++; span2[num] = new QuestSequence @@ -360099,7 +360235,7 @@ public static class AssemblyQuestLoader }; num++; ref QuestSequence reference406 = ref span2[num]; - QuestSequence obj232 = new QuestSequence + QuestSequence obj226 = new QuestSequence { Sequence = 6 }; @@ -360109,22 +360245,22 @@ public static class AssemblyQuestLoader span3 = CollectionsMarshal.AsSpan(list336); num2 = 0; span3[num2] = new QuestStep(EInteractionType.Interact, 1040503u, new Vector3(-221.4237f, -224.3827f, 364.40063f), 956); - obj232.Steps = list336; - reference406 = obj232; + obj226.Steps = list336; + reference406 = obj226; num++; ref QuestSequence reference407 = ref span2[num]; questSequence = new QuestSequence { Sequence = byte.MaxValue }; - QuestSequence questSequence115 = questSequence; + QuestSequence questSequence121 = questSequence; num2 = 1; list4 = new List(num2); CollectionsMarshal.SetCount(list4, num2); span3 = CollectionsMarshal.AsSpan(list4); index2 = 0; ref QuestStep reference408 = ref span3[index2]; - QuestStep obj233 = new QuestStep(EInteractionType.CompleteQuest, 1038588u, new Vector3(-101.76245f, 4.357494f, 0.7476196f), 962) + QuestStep obj227 = new QuestStep(EInteractionType.CompleteQuest, 1038588u, new Vector3(-101.76245f, 4.357494f, 0.7476196f), 962) { StopDistance = 5f, AethernetShortcut = new AethernetShortcut @@ -360143,9 +360279,9 @@ public static class AssemblyQuestLoader Type = EDialogChoiceType.YesNo, Prompt = new ExcelRef("TEXT_AKTKMF111_04449_Q4_000_344") }; - obj233.DialogueChoices = list337; - reference408 = obj233; - questSequence115.Steps = list4; + obj227.DialogueChoices = list337; + reference408 = obj227; + questSequence121.Steps = list4; reference407 = questSequence; questRoot101.QuestSequence = list2; AddQuest(questId50, questRoot); @@ -411967,7 +412103,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot3.Author = list15; - index = 3; + index = 4; List list16 = new List(index); CollectionsMarshal.SetCount(list16, index); span2 = CollectionsMarshal.AsSpan(list16); @@ -412012,6 +412148,11 @@ public static class AssemblyQuestLoader obj12.Steps = list18; reference12 = obj12; num++; + span2[num] = new QuestSequence + { + Sequence = 2 + }; + num++; ref QuestSequence reference13 = ref span2[num]; QuestSequence obj13 = new QuestSequence { @@ -413006,7 +413147,7 @@ public static class AssemblyQuestLoader index = 0; span[index] = "liza"; questRoot9.Author = list79; - index = 5; + index = 6; List list80 = new List(index); CollectionsMarshal.SetCount(list80, index); span2 = CollectionsMarshal.AsSpan(list80); @@ -413079,6 +413220,11 @@ public static class AssemblyQuestLoader obj55.Steps = list84; reference66 = obj55; num++; + span2[num] = new QuestSequence + { + Sequence = 4 + }; + num++; ref QuestSequence reference67 = ref span2[num]; QuestSequence obj56 = new QuestSequence { diff --git a/Questionable/Questionable.Controller.Steps.Interactions/Interact.cs b/Questionable/Questionable.Controller.Steps.Interactions/Interact.cs index 40fa3db..defd9ac 100644 --- a/Questionable/Questionable.Controller.Steps.Interactions/Interact.cs +++ b/Questionable/Questionable.Controller.Steps.Interactions/Interact.cs @@ -173,6 +173,10 @@ internal static class Interact protected override bool Start() { InteractionType = base.Task.InteractionType; + _interactionState = EInteractionState.None; + _needsUnmount = false; + delayedFinalCheck = false; + _continueAt = DateTime.MinValue; IGameObject gameObject = gameFunctions.FindObjectByDataId(base.Task.DataId); if (gameObject == null) { @@ -259,6 +263,7 @@ internal static class Interact { if (base.ProgressContext.WasInterrupted()) { + logger.LogDebug("Interaction with {DataId} was interrupted", base.Task.DataId); return ETaskResult.StillRunning; } if (base.ProgressContext.WasSuccessful() || _interactionState == EInteractionState.InteractionConfirmed) diff --git a/Questionable/Questionable.Controller.Steps.Shared/WaitAtEnd.cs b/Questionable/Questionable.Controller.Steps.Shared/WaitAtEnd.cs index 3266500..bfbbae0 100644 --- a/Questionable/Questionable.Controller.Steps.Shared/WaitAtEnd.cs +++ b/Questionable/Questionable.Controller.Steps.Shared/WaitAtEnd.cs @@ -196,15 +196,40 @@ internal static class WaitAtEnd } } - internal sealed class WaitNextStepOrSequenceExecutor : TaskExecutor + internal sealed class WaitNextStepOrSequenceExecutor(QuestController questController) : TaskExecutor() { + private ElementId? _questId; + + private byte _initialSequence; + + private int _initialStep; + protected override bool Start() { + QuestController.QuestProgress currentQuest = questController.CurrentQuest; + if (currentQuest != null) + { + _questId = currentQuest.Quest.Id; + _initialSequence = currentQuest.Sequence; + _initialStep = currentQuest.Step; + } return true; } public override ETaskResult Update() { + if (_questId != null) + { + QuestController.QuestProgress currentQuest = questController.CurrentQuest; + if (currentQuest == null || currentQuest.Quest.Id != _questId) + { + return ETaskResult.TaskComplete; + } + if (currentQuest.Sequence != _initialSequence || currentQuest.Step != _initialStep) + { + return ETaskResult.TaskComplete; + } + } return ETaskResult.StillRunning; } diff --git a/Questionable/Questionable.Controller.Steps/TaskExecutor.cs b/Questionable/Questionable.Controller.Steps/TaskExecutor.cs index bc18729..ab27e90 100644 --- a/Questionable/Questionable.Controller.Steps/TaskExecutor.cs +++ b/Questionable/Questionable.Controller.Steps/TaskExecutor.cs @@ -33,6 +33,7 @@ internal abstract class TaskExecutor : ITaskExecutor where T : class, ITask if (task is T task2) { Task = task2; + ProgressContext = null; return Start(); } throw new TaskException($"Unable to cast {task.GetType()} to {typeof(T)}"); diff --git a/Questionable/Questionable.Controller/InterruptHandler.cs b/Questionable/Questionable.Controller/InterruptHandler.cs index 800c811..f336ec8 100644 --- a/Questionable/Questionable.Controller/InterruptHandler.cs +++ b/Questionable/Questionable.Controller/InterruptHandler.cs @@ -15,11 +15,6 @@ internal sealed class InterruptHandler : IDisposable { private unsafe delegate void ProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos, EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail); - private static class Signatures - { - internal const string ActionEffect = "40 ?? 56 57 41 ?? 41 ?? 41 ?? 48 ?? ?? ?? ?? ?? ?? ?? 48"; - } - [StructLayout(LayoutKind.Explicit)] private struct EffectEntry { @@ -150,7 +145,7 @@ internal sealed class InterruptHandler : IDisposable _objectTable = objectTable; _territoryData = territoryData; _logger = logger; - _processActionEffectHook = gameInteropProvider.HookFromSignature("40 ?? 56 57 41 ?? 41 ?? 41 ?? 48 ?? ?? ?? ?? ?? ?? ?? 48", HandleProcessActionEffect); + _processActionEffectHook = gameInteropProvider.HookFromAddress(ActionEffectHandler.Addresses.Receive.Value, HandleProcessActionEffect); _processActionEffectHook.Enable(); } diff --git a/Questionable/Questionable.Controller/MovementController.cs b/Questionable/Questionable.Controller/MovementController.cs index 4371bec..5e68569 100644 --- a/Questionable/Questionable.Controller/MovementController.cs +++ b/Questionable/Questionable.Controller/MovementController.cs @@ -85,6 +85,8 @@ internal sealed class MovementController : IDisposable private readonly AetheryteData _aetheryteData; + private readonly Configuration _configuration; + private readonly ILogger _logger; private CancellationTokenSource? _cancellationTokenSource; @@ -93,6 +95,14 @@ internal sealed class MovementController : IDisposable private long _pathfindStartTime; + private Vector3? _lastKnownPosition; + + private long _lastPositionUpdateTime; + + private Vector3? _expectedPosition; + + private bool _isTrackingPlayerInput; + public bool IsNavmeshReady { get @@ -146,7 +156,9 @@ internal sealed class MovementController : IDisposable public int NumQueuedPathfindRequests => _navmeshIpc.NumQueuedPathfindRequests; - public MovementController(NavmeshIpc navmeshIpc, IClientState clientState, IObjectTable objectTable, GameFunctions gameFunctions, ChatFunctions chatFunctions, ICondition condition, MovementOverrideController movementOverrideController, AetheryteData aetheryteData, ILogger logger) + public event EventHandler? PlayerInputDetected; + + public MovementController(NavmeshIpc navmeshIpc, IClientState clientState, IObjectTable objectTable, GameFunctions gameFunctions, ChatFunctions chatFunctions, ICondition condition, MovementOverrideController movementOverrideController, AetheryteData aetheryteData, Configuration configuration, ILogger logger) { _navmeshIpc = navmeshIpc; _clientState = clientState; @@ -156,11 +168,19 @@ internal sealed class MovementController : IDisposable _condition = condition; _movementOverrideController = movementOverrideController; _aetheryteData = aetheryteData; + _configuration = configuration; _logger = logger; } public unsafe void Update() { + if (IsPathRunning && _isTrackingPlayerInput && DetectPlayerInputInterference()) + { + _logger.LogInformation("Player input detected during automatic movement, raising event to stop automation"); + this.PlayerInputDetected?.Invoke(this, EventArgs.Empty); + Stop(); + return; + } if (_pathfindTask != null && Destination != null) { if (!_pathfindTask.IsCompleted && Environment.TickCount64 - _pathfindStartTime > 30000 && _navmeshIpc.NumQueuedPathfindRequests > 5) @@ -188,6 +208,11 @@ internal sealed class MovementController : IDisposable if (Destination.IsFlying && Destination.Land) { _logger.LogWarning("Adjusted destination failed, trying tolerance-based pathfinding"); + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready for tolerance-based pathfinding"); + return; + } _cancellationTokenSource = new CancellationTokenSource(); _cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(30L)); Vector3 vector2 = _objectTable[0]?.Position ?? Vector3.Zero; @@ -218,6 +243,11 @@ internal sealed class MovementController : IDisposable (list, _) = tuple; if (tuple.Item2 && Destination.ShouldRecalculateNavmesh()) { + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready for recalculation"); + return; + } Destination.NavmeshCalculations++; Destination.PartialRoute.AddRange(list); _logger.LogInformation("Running navmesh recalculation with fudged point ({From} to {To})", list.Last(), Destination.Position); @@ -232,6 +262,7 @@ internal sealed class MovementController : IDisposable _logger.LogInformation("Navigating via route: [{Route}]", string.Join(" → ", _pathfindTask.Result.Select((Vector3 x) => x.ToString("G", CultureInfo.InvariantCulture)))); _navmeshIpc.MoveTo(list, Destination.IsFlying); MovementStartedAt = DateTime.Now; + StartPlayerInputTracking(); ResetPathfinding(); } else if (_pathfindTask.IsCompleted) @@ -321,6 +352,72 @@ internal sealed class MovementController : IDisposable } } + private void StartPlayerInputTracking() + { + IGameObject gameObject = _objectTable[0]; + if (gameObject != null) + { + _lastKnownPosition = gameObject.Position; + _expectedPosition = gameObject.Position; + _lastPositionUpdateTime = Environment.TickCount64; + _isTrackingPlayerInput = true; + } + } + + private bool DetectPlayerInputInterference() + { + if (!_configuration.General.StopOnPlayerInput) + { + return false; + } + if (!_isTrackingPlayerInput || !_lastKnownPosition.HasValue) + { + return false; + } + IGameObject gameObject = _objectTable[0]; + if (gameObject == null) + { + return false; + } + Vector3 position = gameObject.Position; + long tickCount = Environment.TickCount64; + if (tickCount - _lastPositionUpdateTime < 100) + { + return false; + } + List waypoints = _navmeshIpc.GetWaypoints(); + if (waypoints.Count > 0) + { + _expectedPosition = waypoints[0]; + } + if (_expectedPosition.HasValue) + { + Vector3 vector = Vector3.Normalize(_expectedPosition.Value - _lastKnownPosition.Value); + Vector3 value = position - _lastKnownPosition.Value; + if (value.Length() > 0.1f) + { + Vector3 vector2 = Vector3.Normalize(value); + float num = Vector3.Dot(vector, vector2); + if (num < 0.7f) + { + _logger.LogDebug("Player movement detected: alignment={Alignment:F2}, actual={Actual}, expected={Expected}", num, value.ToString("G", CultureInfo.InvariantCulture), vector.ToString("G", CultureInfo.InvariantCulture)); + return true; + } + } + } + _lastKnownPosition = position; + _lastPositionUpdateTime = tickCount; + return false; + } + + private void StopPlayerInputTracking() + { + _isTrackingPlayerInput = false; + _lastKnownPosition = null; + _expectedPosition = null; + _lastPositionUpdateTime = 0L; + } + private void Restart(DestinationData destination) { Stop(); @@ -364,6 +461,11 @@ internal sealed class MovementController : IDisposable public void NavigateTo(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint, float? stopDistance = null, float? verticalStopDistance = null, bool land = false) { + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready, cannot start navigation to {Position}", to.ToString("G", CultureInfo.InvariantCulture)); + return; + } fly |= _condition[ConditionFlag.Diving]; if (fly && land) { @@ -404,6 +506,11 @@ internal sealed class MovementController : IDisposable public void NavigateTo(EMovementType type, uint? dataId, List to, bool fly, bool sprint, float? stopDistance, float? verticalStopDistance = null, bool land = false) { + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready, cannot start navigation to {Position}", to.Last().ToString("G", CultureInfo.InvariantCulture)); + return; + } fly |= _condition[ConditionFlag.Diving]; if (fly && land && to.Count > 0) { @@ -416,6 +523,7 @@ internal sealed class MovementController : IDisposable _logger.LogInformation("Moving to {Destination}", Destination); _navmeshIpc.MoveTo(to, fly); MovementStartedAt = DateTime.Now; + StartPlayerInputTracking(); } public void ResetPathfinding() @@ -436,6 +544,11 @@ internal sealed class MovementController : IDisposable private Vector3? TryFindAccessibleDestination(Vector3 target, bool flying, bool landing) { + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready, cannot find accessible destination"); + return null; + } float[] array = ((!(flying && landing)) ? ((!flying) ? new float[3] { 1f, 3f, 5f } : new float[3] { 2f, 5f, 10f }) : new float[3] { 5f, 10f, 15f }); float[] array2 = ((!flying) ? new float[3] { 1f, 2f, 3f } : new float[3] { 3f, 5f, 10f }); for (int i = 0; i < array.Length; i++) @@ -504,17 +617,52 @@ internal sealed class MovementController : IDisposable if (Math.Abs((double)num - Destination.LastWaypoint.Distance2DAtLastUpdate) < 0.5) { int navmeshCalculations = Destination.NavmeshCalculations; - if (navmeshCalculations % 6 == 1) + switch (navmeshCalculations) { - _logger.LogWarning("Jumping to try and resolve navmesh problem (n = {Calculations})", navmeshCalculations); + case 1: + case 7: + _logger.LogWarning("Jumping to try and resolve navmesh problem (n = {Calculations}) at {Position}", navmeshCalculations, Destination.Position.ToString("G", CultureInfo.InvariantCulture)); ActionManager.Instance()->UseAction(ActionType.GeneralAction, 2u, 3758096384uL, 0u, ActionManager.UseActionMode.None, 0u, null); Destination.NavmeshCalculations++; Destination.LastWaypoint.UpdatedAt = Environment.TickCount64; - } - else - { - _logger.LogWarning("Recalculating navmesh (n = {Calculations})", navmeshCalculations); + break; + case 5: + _logger.LogWarning("Reloading navmesh (n = {Calculations}) at {Position}", navmeshCalculations, Destination.Position.ToString("G", CultureInfo.InvariantCulture)); + _navmeshIpc.Reload(); + Destination.LastWaypoint.UpdatedAt = Environment.TickCount64; + break; + case 6: + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready after reload (n = {Calculations})", navmeshCalculations); + return false; + } + _logger.LogInformation("Navmesh ready after reload, restarting navigation (n = {Calculations})", navmeshCalculations); Restart(Destination); + break; + case 8: + _logger.LogWarning("Rebuilding navmesh (n = {Calculations}) at {Position}", navmeshCalculations, Destination.Position.ToString("G", CultureInfo.InvariantCulture)); + _navmeshIpc.Rebuild(); + Destination.LastWaypoint.UpdatedAt = Environment.TickCount64; + break; + case 9: + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready after rebuild (n = {Calculations})", navmeshCalculations); + return false; + } + _logger.LogInformation("Navmesh ready after rebuild, restarting navigation (n = {Calculations})", navmeshCalculations); + Restart(Destination); + break; + default: + if (!IsNavmeshReady) + { + _logger.LogWarning("Navmesh not ready for recalculation (n = {Calculations})", navmeshCalculations); + return false; + } + _logger.LogWarning("Recalculating navmesh (n = {Calculations}) at {Position}", navmeshCalculations, Destination.Position.ToString("G", CultureInfo.InvariantCulture)); + Restart(Destination); + break; } Destination.NavmeshCalculations = navmeshCalculations + 1; return true; @@ -570,6 +718,7 @@ internal sealed class MovementController : IDisposable public void Stop() { + StopPlayerInputTracking(); _navmeshIpc.Stop(); ResetPathfinding(); Destination = null; diff --git a/Questionable/Questionable.Controller/QuestController.cs b/Questionable/Questionable.Controller/QuestController.cs index 19def79..8cf8137 100644 --- a/Questionable/Questionable.Controller/QuestController.cs +++ b/Questionable/Questionable.Controller/QuestController.cs @@ -257,6 +257,7 @@ internal sealed class QuestController : MiniTaskController _toastGui.Toast += OnNormalToast; _condition.ConditionChange += OnConditionChange; _clientState.Logout += OnLogout; + _movementController.PlayerInputDetected += OnPlayerInputDetected; } public void Reload() @@ -683,55 +684,71 @@ internal sealed class QuestController : MiniTaskController { DebugState = "No quest active"; Stop("No quest active"); - return; } - if (_gameFunctions.IsOccupied() && !_gameFunctions.IsOccupiedWithCustomDeliveryNpc(questProgress.Quest)) + else if (questProgress.Step == 255) + { + DebugState = $"Waiting for sequence update (current: {questProgress.Sequence})"; + if (!_taskQueue.AllTasksComplete) + { + DebugState = "Step 255 - processing interrupted tasks"; + } + else + { + if (this.CurrentQuest == null) + { + return; + } + TimeSpan timeSpan = DateTime.Now - this.CurrentQuest.StepProgress.StartedAt; + if (timeSpan > TimeSpan.FromSeconds(3L)) + { + _logger.LogWarning("Step 255 with no tasks for {WaitTime:F1}s, retrying step to ensure completion (quest: {QuestId}, sequence: {Sequence})", timeSpan.TotalSeconds, questProgress.Quest.Id, questProgress.Sequence); + QuestSequence questSequence = questProgress.Quest.FindSequence(questProgress.Sequence); + if (questSequence != null && questSequence.Steps.Count > 0) + { + this.CurrentQuest.SetStep(questSequence.Steps.Count - 1); + CheckNextTasks("Retry last step at 255"); + } + } + } + } + else if (_gameFunctions.IsOccupied() && !_gameFunctions.IsOccupiedWithCustomDeliveryNpc(questProgress.Quest)) { DebugState = "Occupied"; - return; } - if (_movementController.IsPathfinding) + else if (_movementController.IsPathfinding) { DebugState = "Pathfinding is running"; - return; } - if (_movementController.IsPathRunning) + else if (_movementController.IsPathRunning) { DebugState = "Path is running"; - return; } - if (DateTime.Now < _safeAnimationEnd) + else if (DateTime.Now < _safeAnimationEnd) { DebugState = "Waiting for Animation"; - return; } - if (questProgress.Sequence != b) + else if (questProgress.Sequence != b) { questProgress.SetSequence(b); CheckNextTasks($"New sequence {questProgress == _startedQuest}/{_questFunctions.GetCurrentQuestInternal(allowNewMsq: true)}"); } - QuestSequence questSequence = questProgress.Quest.FindSequence(questProgress.Sequence); - if (questSequence == null) - { - DebugState = $"Sequence {questProgress.Sequence} not found"; - Stop("Unknown sequence"); - } - else if (questProgress.Step == 255) - { - DebugState = "Step completed"; - if (!_taskQueue.AllTasksComplete) - { - CheckNextTasks("Step complete"); - } - } - else if (questSequence.Steps.Count > 0 && questProgress.Step >= questSequence.Steps.Count) - { - DebugState = "Step not found"; - Stop("Unknown step"); - } else { - DebugState = null; + QuestSequence questSequence2 = questProgress.Quest.FindSequence(questProgress.Sequence); + if (questSequence2 == null) + { + DebugState = $"Sequence {questProgress.Sequence} not found"; + Stop("Unknown sequence"); + } + else if (questSequence2.Steps.Count > 0 && questProgress.Step >= questSequence2.Steps.Count) + { + DebugState = "Step not found"; + Stop("Unknown step"); + } + else + { + DebugState = null; + } } } } @@ -778,15 +795,21 @@ internal sealed class QuestController : MiniTaskController _logger.LogWarning("Ignoring 'increase step count' for different sequence (expected {ExpectedSequence}, but we are at {CurrentSequence}", sequence, questSequence.Sequence); } _logger.LogInformation("Increasing step count from {CurrentValue}", CurrentQuest.Step); - if (CurrentQuest.Step + 1 < questSequence.Steps.Count) - { - CurrentQuest.SetStep(CurrentQuest.Step + 1); - } - else + bool num = CurrentQuest.Step + 1 >= questSequence.Steps.Count; + if (num) { CurrentQuest.SetStep(255); } + else + { + CurrentQuest.SetStep(CurrentQuest.Step + 1); + } ResetAutoRefreshState(); + if (num) + { + _logger.LogInformation("Completed last step in sequence, waiting for game to update sequence"); + return; + } } using (_logger.BeginScope("IncStepCt")) { @@ -1291,12 +1314,23 @@ internal sealed class QuestController : MiniTaskController } } + private void OnPlayerInputDetected(object? sender, EventArgs e) + { + if (AutomationType != EAutomationType.Manual && IsRunning) + { + _logger.LogInformation("Player input detected during movement, stopping quest automation"); + _chatGui.Print("Player input detected - stopping quest automation.", "Questionable", 576); + Stop("Player input detected"); + } + } + public override void Dispose() { _toastGui.ErrorToast -= base.OnErrorToast; _toastGui.Toast -= OnNormalToast; _condition.ConditionChange -= OnConditionChange; _clientState.Logout -= OnLogout; + _movementController.PlayerInputDetected -= OnPlayerInputDetected; base.Dispose(); } } diff --git a/Questionable/Questionable.Data/ChangelogData.cs b/Questionable/Questionable.Data/ChangelogData.cs index 7ff0c7f..ba17fc2 100644 --- a/Questionable/Questionable.Data/ChangelogData.cs +++ b/Questionable/Questionable.Data/ChangelogData.cs @@ -11,76 +11,80 @@ internal static class ChangelogData static ChangelogData() { - int num = 43; + int num = 44; List list = new List(num); CollectionsMarshal.SetCount(list, num); Span span = CollectionsMarshal.AsSpan(list); int num2 = 0; ref ChangelogEntry reference = ref span[num2]; - DateOnly releaseDate = new DateOnly(2025, 11, 29); + DateOnly releaseDate = new DateOnly(2025, 12, 6); int num3 = 2; List list2 = new List(num3); CollectionsMarshal.SetCount(list2, num3); Span span2 = CollectionsMarshal.AsSpan(list2); int num4 = 0; ref ChangeEntry reference2 = ref span2[num4]; - int num5 = 3; + int num5 = 4; List list3 = new List(num5); CollectionsMarshal.SetCount(list3, num5); Span span3 = CollectionsMarshal.AsSpan(list3); int num6 = 0; - span3[num6] = "Movement update with automatic retrying if character can't reach target position"; + span3[num6] = "Added reloading and rebuilding to movement system"; num6++; - span3[num6] = "Added Hunt mob data"; + span3[num6] = "Improved interrupts and refresh states to allow continuation of questing"; num6++; - span3[num6] = "Refactored commands"; + span3[num6] = "Added player input detection to stop automation when manually moving character"; + num6++; + span3[num6] = "Added various missing quest sequences"; reference2 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list3); num4++; ref ChangeEntry reference3 = ref span2[num4]; - num6 = 3; + num6 = 1; List list4 = new List(num6); CollectionsMarshal.SetCount(list4, num6); span3 = CollectionsMarshal.AsSpan(list4); num5 = 0; - span3[num5] = "Fixed quest (Way of the Archer)"; - num5++; - span3[num5] = "Fixed quest (Spirithold Broken)"; - num5++; - span3[num5] = "Fixed quest (It's Probably Not Pirates)"; - reference3 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list4); - reference = new ChangelogEntry("7.38.8", releaseDate, list2); + span3[num5] = "Fixed reset task state to prevent stuck interactions after interruption"; + reference3 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list4); + reference = new ChangelogEntry("7.38.9", releaseDate, list2); num2++; ref ChangelogEntry reference4 = ref span[num2]; - DateOnly releaseDate2 = new DateOnly(2025, 11, 25); + DateOnly releaseDate2 = new DateOnly(2025, 11, 29); num4 = 2; List list5 = new List(num4); CollectionsMarshal.SetCount(list5, num4); span2 = CollectionsMarshal.AsSpan(list5); num3 = 0; ref ChangeEntry reference5 = ref span2[num3]; - num5 = 2; + num5 = 3; List list6 = new List(num5); CollectionsMarshal.SetCount(list6, num5); span3 = CollectionsMarshal.AsSpan(list6); num6 = 0; - span3[num6] = "Added individual sequence stop condition for each quest"; + span3[num6] = "Movement update with automatic retrying if character can't reach target position"; num6++; - span3[num6] = "Added Trials to Duties tab in config"; - reference5 = new ChangeEntry(EChangeCategory.Added, "Major features", list6); + span3[num6] = "Added Hunt mob data"; + num6++; + span3[num6] = "Refactored commands"; + reference5 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list6); num3++; ref ChangeEntry reference6 = ref span2[num3]; - num6 = 1; + num6 = 3; List list7 = new List(num6); CollectionsMarshal.SetCount(list7, num6); span3 = CollectionsMarshal.AsSpan(list7); num5 = 0; - span3[num5] = "Added IPC for stop conditions: GetQuestSequenceStopCondition, SetQuestSequenceStopCondition, RemoveQuestSequenceStopCondition, GetAllQuestSequenceStopConditions"; - reference6 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list7); - reference4 = new ChangelogEntry("7.38.7", releaseDate2, list5); + span3[num5] = "Fixed quest (Way of the Archer)"; + num5++; + span3[num5] = "Fixed quest (Spirithold Broken)"; + num5++; + span3[num5] = "Fixed quest (It's Probably Not Pirates)"; + reference6 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list7); + reference4 = new ChangelogEntry("7.38.8", releaseDate2, list5); num2++; ref ChangelogEntry reference7 = ref span[num2]; DateOnly releaseDate3 = new DateOnly(2025, 11, 25); - num3 = 3; + num3 = 2; List list8 = new List(num3); CollectionsMarshal.SetCount(list8, num3); span2 = CollectionsMarshal.AsSpan(list8); @@ -91,10 +95,10 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list9, num5); span3 = CollectionsMarshal.AsSpan(list9); num6 = 0; - span3[num6] = "Updated Allied Society journal text"; + span3[num6] = "Added individual sequence stop condition for each quest"; num6++; - span3[num6] = "Improved Allied Society rank handling"; - reference8 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list9); + span3[num6] = "Added Trials to Duties tab in config"; + reference8 = new ChangeEntry(EChangeCategory.Added, "Major features", list9); num4++; ref ChangeEntry reference9 = ref span2[num4]; num6 = 1; @@ -102,34 +106,36 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list10, num6); span3 = CollectionsMarshal.AsSpan(list10); num5 = 0; - span3[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; + span3[num5] = "Added IPC for stop conditions: GetQuestSequenceStopCondition, SetQuestSequenceStopCondition, RemoveQuestSequenceStopCondition, GetAllQuestSequenceStopConditions"; reference9 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list10); - num4++; - ref ChangeEntry reference10 = ref span2[num4]; - num5 = 1; - List list11 = new List(num5); - CollectionsMarshal.SetCount(list11, num5); - span3 = CollectionsMarshal.AsSpan(list11); - num6 = 0; - span3[num6] = "Fixed quest (We Come in Peace)"; - reference10 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list11); - reference7 = new ChangelogEntry("7.38.6", releaseDate3, list8); + reference7 = new ChangelogEntry("7.38.7", releaseDate3, list8); num2++; - ref ChangelogEntry reference11 = ref span[num2]; - DateOnly releaseDate4 = new DateOnly(2025, 11, 24); - num4 = 2; - List list12 = new List(num4); - CollectionsMarshal.SetCount(list12, num4); - span2 = CollectionsMarshal.AsSpan(list12); + ref ChangelogEntry reference10 = ref span[num2]; + DateOnly releaseDate4 = new DateOnly(2025, 11, 25); + num4 = 3; + List list11 = new List(num4); + CollectionsMarshal.SetCount(list11, num4); + span2 = CollectionsMarshal.AsSpan(list11); num3 = 0; + ref ChangeEntry reference11 = ref span2[num3]; + num5 = 2; + List list12 = new List(num5); + CollectionsMarshal.SetCount(list12, num5); + span3 = CollectionsMarshal.AsSpan(list12); + num6 = 0; + span3[num6] = "Updated Allied Society journal text"; + num6++; + span3[num6] = "Improved Allied Society rank handling"; + reference11 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list12); + num3++; ref ChangeEntry reference12 = ref span2[num3]; num6 = 1; List list13 = new List(num6); CollectionsMarshal.SetCount(list13, num6); span3 = CollectionsMarshal.AsSpan(list13); num5 = 0; - span3[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; - reference12 = new ChangeEntry(EChangeCategory.Added, "Major features", list13); + span3[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; + reference12 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list13); num3++; ref ChangeEntry reference13 = ref span2[num3]; num5 = 1; @@ -137,12 +143,12 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list14, num5); span3 = CollectionsMarshal.AsSpan(list14); num6 = 0; - span3[num6] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; - reference13 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list14); - reference11 = new ChangelogEntry("7.38.5", releaseDate4, list12); + span3[num6] = "Fixed quest (We Come in Peace)"; + reference13 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list14); + reference10 = new ChangelogEntry("7.38.6", releaseDate4, list11); num2++; ref ChangelogEntry reference14 = ref span[num2]; - DateOnly releaseDate5 = new DateOnly(2025, 11, 23); + DateOnly releaseDate5 = new DateOnly(2025, 11, 24); num3 = 2; List list15 = new List(num3); CollectionsMarshal.SetCount(list15, num3); @@ -154,15 +160,41 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list16, num6); span3 = CollectionsMarshal.AsSpan(list16); num5 = 0; - span3[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; - reference15 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list16); + span3[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; + reference15 = new ChangeEntry(EChangeCategory.Added, "Major features", list16); num4++; ref ChangeEntry reference16 = ref span2[num4]; - num5 = 8; + num5 = 1; List list17 = new List(num5); CollectionsMarshal.SetCount(list17, num5); span3 = CollectionsMarshal.AsSpan(list17); num6 = 0; + span3[num6] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; + reference16 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list17); + reference14 = new ChangelogEntry("7.38.5", releaseDate5, list15); + num2++; + ref ChangelogEntry reference17 = ref span[num2]; + DateOnly releaseDate6 = new DateOnly(2025, 11, 23); + num4 = 2; + List list18 = new List(num4); + CollectionsMarshal.SetCount(list18, num4); + span2 = CollectionsMarshal.AsSpan(list18); + num3 = 0; + ref ChangeEntry reference18 = ref span2[num3]; + num6 = 1; + List list19 = new List(num6); + CollectionsMarshal.SetCount(list19, num6); + span3 = CollectionsMarshal.AsSpan(list19); + num5 = 0; + span3[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; + reference18 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list19); + num3++; + ref ChangeEntry reference19 = ref span2[num3]; + num5 = 8; + List list20 = new List(num5); + CollectionsMarshal.SetCount(list20, num5); + span3 = CollectionsMarshal.AsSpan(list20); + num6 = 0; span3[num6] = "Fixed quest (Microbrewing) to not get stuck near ramp"; num6++; span3[num6] = "Fixed quest (The Illuminated Land) where pathing would kill the player due to fall damage"; @@ -178,69 +210,37 @@ internal static class ChangelogData span3[num6] = "Fixed quest (Poisoned Hearts) where incorrect pathing caused the player to die"; num6++; span3[num6] = "Fixed quests (Savage Snares) and (An Apple a Day) not detecting kills"; - reference16 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list17); - reference14 = new ChangelogEntry("7.38.4", releaseDate5, list15); + reference19 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list20); + reference17 = new ChangelogEntry("7.38.4", releaseDate6, list18); num2++; - ref ChangelogEntry reference17 = ref span[num2]; - DateOnly releaseDate6 = new DateOnly(2025, 11, 23); - num4 = 3; - List list18 = new List(num4); - CollectionsMarshal.SetCount(list18, num4); - span2 = CollectionsMarshal.AsSpan(list18); - num3 = 0; - ref ChangeEntry reference18 = ref span2[num3]; + ref ChangelogEntry reference20 = ref span[num2]; + DateOnly releaseDate7 = new DateOnly(2025, 11, 23); + num3 = 3; + List list21 = new List(num3); + CollectionsMarshal.SetCount(list21, num3); + span2 = CollectionsMarshal.AsSpan(list21); + num4 = 0; + ref ChangeEntry reference21 = ref span2[num4]; num6 = 2; - List list19 = new List(num6); - CollectionsMarshal.SetCount(list19, num6); - span3 = CollectionsMarshal.AsSpan(list19); + List list22 = new List(num6); + CollectionsMarshal.SetCount(list22, num6); + span3 = CollectionsMarshal.AsSpan(list22); num5 = 0; span3[num5] = "Added RequireHq to crafting InteractionType"; num5++; span3[num5] = "Mark GC quests as Locked if rank not achieved"; - reference18 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list19); - num3++; - ref ChangeEntry reference19 = ref span2[num3]; - num5 = 2; - List list20 = new List(num5); - CollectionsMarshal.SetCount(list20, num5); - span3 = CollectionsMarshal.AsSpan(list20); - num6 = 0; - span3[num6] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; - num6++; - span3[num6] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; - reference19 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list20); - num3++; - ref ChangeEntry reference20 = ref span2[num3]; - num6 = 3; - List list21 = new List(num6); - CollectionsMarshal.SetCount(list21, num6); - span3 = CollectionsMarshal.AsSpan(list21); - num5 = 0; - span3[num5] = "Fixed line breaks not working in dialog strings"; - num5++; - span3[num5] = "Fixed quest (Labor of Love)"; - num5++; - span3[num5] = "Fixed quest (Sea of Sorrow)"; - reference20 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list21); - reference17 = new ChangelogEntry("7.38.3", releaseDate6, list18); - num2++; - ref ChangelogEntry reference21 = ref span[num2]; - DateOnly releaseDate7 = new DateOnly(2025, 11, 18); - num3 = 3; - List list22 = new List(num3); - CollectionsMarshal.SetCount(list22, num3); - span2 = CollectionsMarshal.AsSpan(list22); - num4 = 0; + reference21 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list22); + num4++; ref ChangeEntry reference22 = ref span2[num4]; num5 = 2; List list23 = new List(num5); CollectionsMarshal.SetCount(list23, num5); span3 = CollectionsMarshal.AsSpan(list23); num6 = 0; - span3[num6] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + span3[num6] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; num6++; - span3[num6] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; - reference22 = new ChangeEntry(EChangeCategory.Added, "Major features", list23); + span3[num6] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; + reference22 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list23); num4++; ref ChangeEntry reference23 = ref span2[num4]; num6 = 3; @@ -248,15 +248,13 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list24, num6); span3 = CollectionsMarshal.AsSpan(list24); num5 = 0; - span3[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; + span3[num5] = "Fixed line breaks not working in dialog strings"; num5++; - span3[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; + span3[num5] = "Fixed quest (Labor of Love)"; num5++; - span3[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; - reference23 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list24); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); - reference21 = new ChangelogEntry("7.38.2", releaseDate7, list22); + span3[num5] = "Fixed quest (Sea of Sorrow)"; + reference23 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list24); + reference20 = new ChangelogEntry("7.38.3", releaseDate7, list21); num2++; ref ChangelogEntry reference24 = ref span[num2]; DateOnly releaseDate8 = new DateOnly(2025, 11, 18); @@ -266,13 +264,15 @@ internal static class ChangelogData span2 = CollectionsMarshal.AsSpan(list25); num3 = 0; ref ChangeEntry reference25 = ref span2[num3]; - num5 = 1; + num5 = 2; List list26 = new List(num5); CollectionsMarshal.SetCount(list26, num5); span3 = CollectionsMarshal.AsSpan(list26); num6 = 0; - span3[num6] = "Added new fields to quest schema"; - reference25 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list26); + span3[num6] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + num6++; + span3[num6] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; + reference25 = new ChangeEntry(EChangeCategory.Added, "Major features", list26); num3++; ref ChangeEntry reference26 = ref span2[num3]; num6 = 3; @@ -280,390 +280,422 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list27, num6); span3 = CollectionsMarshal.AsSpan(list27); num5 = 0; + span3[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; + num5++; + span3[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; + num5++; + span3[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; + reference26 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list27); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); + reference24 = new ChangelogEntry("7.38.2", releaseDate8, list25); + num2++; + ref ChangelogEntry reference27 = ref span[num2]; + DateOnly releaseDate9 = new DateOnly(2025, 11, 18); + num3 = 3; + List list28 = new List(num3); + CollectionsMarshal.SetCount(list28, num3); + span2 = CollectionsMarshal.AsSpan(list28); + num4 = 0; + ref ChangeEntry reference28 = ref span2[num4]; + num5 = 1; + List list29 = new List(num5); + CollectionsMarshal.SetCount(list29, num5); + span3 = CollectionsMarshal.AsSpan(list29); + num6 = 0; + span3[num6] = "Added new fields to quest schema"; + reference28 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list29); + num4++; + ref ChangeEntry reference29 = ref span2[num4]; + num6 = 3; + List list30 = new List(num6); + CollectionsMarshal.SetCount(list30, num6); + span3 = CollectionsMarshal.AsSpan(list30); + num5 = 0; span3[num5] = "A Faerie Tale Come True"; num5++; span3[num5] = "Constant Cravings"; num5++; span3[num5] = "A Bridge Too Full"; - reference26 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list27); - num3++; - ref ChangeEntry reference27 = ref span2[num3]; + reference29 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list30); + num4++; + ref ChangeEntry reference30 = ref span2[num4]; num5 = 3; - List list28 = new List(num5); - CollectionsMarshal.SetCount(list28, num5); - span3 = CollectionsMarshal.AsSpan(list28); + List list31 = new List(num5); + CollectionsMarshal.SetCount(list31, num5); + span3 = CollectionsMarshal.AsSpan(list31); num6 = 0; span3[num6] = "Fixed various quest schemas"; num6++; span3[num6] = "Fixed changelog bullet point encoding"; num6++; span3[num6] = "Fixed item use to wait until item is used before next action"; - reference27 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list28); - reference24 = new ChangelogEntry("7.38.1", releaseDate8, list25); + reference30 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list31); + reference27 = new ChangelogEntry("7.38.1", releaseDate9, list28); num2++; - ref ChangelogEntry reference28 = ref span[num2]; - DateOnly releaseDate9 = new DateOnly(2025, 11, 17); - num3 = 5; - List list29 = new List(num3); - CollectionsMarshal.SetCount(list29, num3); - span2 = CollectionsMarshal.AsSpan(list29); - num4 = 0; - ref ChangeEntry reference29 = ref span2[num4]; + ref ChangelogEntry reference31 = ref span[num2]; + DateOnly releaseDate10 = new DateOnly(2025, 11, 17); + num4 = 5; + List list32 = new List(num4); + CollectionsMarshal.SetCount(list32, num4); + span2 = CollectionsMarshal.AsSpan(list32); + num3 = 0; + ref ChangeEntry reference32 = ref span2[num3]; num6 = 2; - List list30 = new List(num6); - CollectionsMarshal.SetCount(list30, num6); - span3 = CollectionsMarshal.AsSpan(list30); + List list33 = new List(num6); + CollectionsMarshal.SetCount(list33, num6); + span3 = CollectionsMarshal.AsSpan(list33); num5 = 0; span3[num5] = "Quest sequence window to show expected sequences in each quest (with quest searching)"; num5++; span3[num5] = "Changelog"; - reference29 = new ChangeEntry(EChangeCategory.Added, "Major features", list30); - num4++; - ref ChangeEntry reference30 = ref span2[num4]; + reference32 = new ChangeEntry(EChangeCategory.Added, "Major features", list33); + num3++; + ref ChangeEntry reference33 = ref span2[num3]; num5 = 2; - List list31 = new List(num5); - CollectionsMarshal.SetCount(list31, num5); - span3 = CollectionsMarshal.AsSpan(list31); + List list34 = new List(num5); + CollectionsMarshal.SetCount(list34, num5); + span3 = CollectionsMarshal.AsSpan(list34); num6 = 0; span3[num6] = "Updated quest schemas"; num6++; span3[num6] = "Added search bar to preferred mounts and capitalization to mirror game mount names"; - reference30 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list31); - num4++; - ref ChangeEntry reference31 = ref span2[num4]; + reference33 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list34); + num3++; + ref ChangeEntry reference34 = ref span2[num3]; num6 = 3; - List list32 = new List(num6); - CollectionsMarshal.SetCount(list32, num6); - span3 = CollectionsMarshal.AsSpan(list32); + List list35 = new List(num6); + CollectionsMarshal.SetCount(list35, num6); + span3 = CollectionsMarshal.AsSpan(list35); num5 = 0; span3[num5] = "Renamed IsQuestCompleted → IsQuestComplete"; num5++; span3[num5] = "Renamed IsQuestAvailable → IsReadyToAcceptQuest"; num5++; span3[num5] = "Added GetCurrentTask IPC"; - reference31 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list32); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); - reference28 = new ChangelogEntry("7.38.0", releaseDate9, list29); - num2++; - ref ChangelogEntry reference32 = ref span[num2]; - DateOnly releaseDate10 = new DateOnly(2025, 11, 8); - num4 = 1; - List list33 = new List(num4); - CollectionsMarshal.SetCount(list33, num4); - span2 = CollectionsMarshal.AsSpan(list33); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); - reference32 = new ChangelogEntry("6.38", releaseDate10, list33); - num2++; - ref ChangelogEntry reference33 = ref span[num2]; - DateOnly releaseDate11 = new DateOnly(2025, 11, 8); - num3 = 1; - List list34 = new List(num3); - CollectionsMarshal.SetCount(list34, num3); - span2 = CollectionsMarshal.AsSpan(list34); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); - reference33 = new ChangelogEntry("6.37", releaseDate11, list34); - num2++; - ref ChangelogEntry reference34 = ref span[num2]; - DateOnly releaseDate12 = new DateOnly(2025, 11, 2); - num4 = 1; - List list35 = new List(num4); - CollectionsMarshal.SetCount(list35, num4); - span2 = CollectionsMarshal.AsSpan(list35); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); - reference34 = new ChangelogEntry("6.36", releaseDate12, list35); + reference34 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list35); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); + reference31 = new ChangelogEntry("7.38.0", releaseDate10, list32); num2++; ref ChangelogEntry reference35 = ref span[num2]; - DateOnly releaseDate13 = new DateOnly(2025, 10, 28); + DateOnly releaseDate11 = new DateOnly(2025, 11, 8); num3 = 1; List list36 = new List(num3); CollectionsMarshal.SetCount(list36, num3); span2 = CollectionsMarshal.AsSpan(list36); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); - reference35 = new ChangelogEntry("6.35", releaseDate13, list36); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); + reference35 = new ChangelogEntry("6.38", releaseDate11, list36); num2++; ref ChangelogEntry reference36 = ref span[num2]; - DateOnly releaseDate14 = new DateOnly(2025, 10, 23); - num4 = 2; + DateOnly releaseDate12 = new DateOnly(2025, 11, 8); + num4 = 1; List list37 = new List(num4); CollectionsMarshal.SetCount(list37, num4); span2 = CollectionsMarshal.AsSpan(list37); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); - reference36 = new ChangelogEntry("6.34", releaseDate14, list37); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); + reference36 = new ChangelogEntry("6.37", releaseDate12, list37); num2++; ref ChangelogEntry reference37 = ref span[num2]; - DateOnly releaseDate15 = new DateOnly(2025, 10, 23); + DateOnly releaseDate13 = new DateOnly(2025, 11, 2); num3 = 1; List list38 = new List(num3); CollectionsMarshal.SetCount(list38, num3); span2 = CollectionsMarshal.AsSpan(list38); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); - reference37 = new ChangelogEntry("6.33", releaseDate15, list38); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); + reference37 = new ChangelogEntry("6.36", releaseDate13, list38); num2++; ref ChangelogEntry reference38 = ref span[num2]; - DateOnly releaseDate16 = new DateOnly(2025, 10, 23); + DateOnly releaseDate14 = new DateOnly(2025, 10, 28); num4 = 1; List list39 = new List(num4); CollectionsMarshal.SetCount(list39, num4); span2 = CollectionsMarshal.AsSpan(list39); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); - reference38 = new ChangelogEntry("6.32", releaseDate16, list39); + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); + reference38 = new ChangelogEntry("6.35", releaseDate14, list39); num2++; ref ChangelogEntry reference39 = ref span[num2]; - DateOnly releaseDate17 = new DateOnly(2025, 10, 21); - num3 = 1; + DateOnly releaseDate15 = new DateOnly(2025, 10, 23); + num3 = 2; List list40 = new List(num3); CollectionsMarshal.SetCount(list40, num3); span2 = CollectionsMarshal.AsSpan(list40); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); - reference39 = new ChangelogEntry("6.31", releaseDate17, list40); + span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); + reference39 = new ChangelogEntry("6.34", releaseDate15, list40); num2++; ref ChangelogEntry reference40 = ref span[num2]; - DateOnly releaseDate18 = new DateOnly(2025, 10, 21); + DateOnly releaseDate16 = new DateOnly(2025, 10, 23); num4 = 1; List list41 = new List(num4); CollectionsMarshal.SetCount(list41, num4); span2 = CollectionsMarshal.AsSpan(list41); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); - reference40 = new ChangelogEntry("6.30", releaseDate18, list41); + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); + reference40 = new ChangelogEntry("6.33", releaseDate16, list41); num2++; ref ChangelogEntry reference41 = ref span[num2]; - DateOnly releaseDate19 = new DateOnly(2025, 10, 20); - num3 = 2; + DateOnly releaseDate17 = new DateOnly(2025, 10, 23); + num3 = 1; List list42 = new List(num3); CollectionsMarshal.SetCount(list42, num3); span2 = CollectionsMarshal.AsSpan(list42); num4 = 0; - ref ChangeEntry reference42 = ref span2[num4]; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); + reference41 = new ChangelogEntry("6.32", releaseDate17, list42); + num2++; + ref ChangelogEntry reference42 = ref span[num2]; + DateOnly releaseDate18 = new DateOnly(2025, 10, 21); + num4 = 1; + List list43 = new List(num4); + CollectionsMarshal.SetCount(list43, num4); + span2 = CollectionsMarshal.AsSpan(list43); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); + reference42 = new ChangelogEntry("6.31", releaseDate18, list43); + num2++; + ref ChangelogEntry reference43 = ref span[num2]; + DateOnly releaseDate19 = new DateOnly(2025, 10, 21); + num3 = 1; + List list44 = new List(num3); + CollectionsMarshal.SetCount(list44, num3); + span2 = CollectionsMarshal.AsSpan(list44); + num4 = 0; + span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); + reference43 = new ChangelogEntry("6.30", releaseDate19, list44); + num2++; + ref ChangelogEntry reference44 = ref span[num2]; + DateOnly releaseDate20 = new DateOnly(2025, 10, 20); + num4 = 2; + List list45 = new List(num4); + CollectionsMarshal.SetCount(list45, num4); + span2 = CollectionsMarshal.AsSpan(list45); + num3 = 0; + ref ChangeEntry reference45 = ref span2[num3]; num5 = 2; - List list43 = new List(num5); - CollectionsMarshal.SetCount(list43, num5); - span3 = CollectionsMarshal.AsSpan(list43); + List list46 = new List(num5); + CollectionsMarshal.SetCount(list46, num5); + span3 = CollectionsMarshal.AsSpan(list46); num6 = 0; span3[num6] = "Added item count to combat handling rework"; num6++; span3[num6] = "Updated Pandora conflicting features"; - reference42 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list43); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); - reference41 = new ChangelogEntry("6.29", releaseDate19, list42); - num2++; - ref ChangelogEntry reference43 = ref span[num2]; - DateOnly releaseDate20 = new DateOnly(2025, 10, 19); - num4 = 1; - List list44 = new List(num4); - CollectionsMarshal.SetCount(list44, num4); - span2 = CollectionsMarshal.AsSpan(list44); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); - reference43 = new ChangelogEntry("6.28", releaseDate20, list44); - num2++; - ref ChangelogEntry reference44 = ref span[num2]; - DateOnly releaseDate21 = new DateOnly(2025, 10, 18); - num3 = 2; - List list45 = new List(num3); - CollectionsMarshal.SetCount(list45, num3); - span2 = CollectionsMarshal.AsSpan(list45); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); - reference44 = new ChangelogEntry("6.27", releaseDate21, list45); - num2++; - ref ChangelogEntry reference45 = ref span[num2]; - DateOnly releaseDate22 = new DateOnly(2025, 10, 18); - num4 = 1; - List list46 = new List(num4); - CollectionsMarshal.SetCount(list46, num4); - span2 = CollectionsMarshal.AsSpan(list46); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); - reference45 = new ChangelogEntry("6.26", releaseDate22, list46); + reference45 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list46); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); + reference44 = new ChangelogEntry("6.29", releaseDate20, list45); num2++; ref ChangelogEntry reference46 = ref span[num2]; - DateOnly releaseDate23 = new DateOnly(2025, 10, 17); + DateOnly releaseDate21 = new DateOnly(2025, 10, 19); num3 = 1; List list47 = new List(num3); CollectionsMarshal.SetCount(list47, num3); span2 = CollectionsMarshal.AsSpan(list47); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); - reference46 = new ChangelogEntry("6.25", releaseDate23, list47); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); + reference46 = new ChangelogEntry("6.28", releaseDate21, list47); num2++; ref ChangelogEntry reference47 = ref span[num2]; - DateOnly releaseDate24 = new DateOnly(2025, 10, 16); - num4 = 1; + DateOnly releaseDate22 = new DateOnly(2025, 10, 18); + num4 = 2; List list48 = new List(num4); CollectionsMarshal.SetCount(list48, num4); span2 = CollectionsMarshal.AsSpan(list48); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); - reference47 = new ChangelogEntry("6.24", releaseDate24, list48); + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); + reference47 = new ChangelogEntry("6.27", releaseDate22, list48); num2++; ref ChangelogEntry reference48 = ref span[num2]; - DateOnly releaseDate25 = new DateOnly(2025, 10, 13); + DateOnly releaseDate23 = new DateOnly(2025, 10, 18); num3 = 1; List list49 = new List(num3); CollectionsMarshal.SetCount(list49, num3); span2 = CollectionsMarshal.AsSpan(list49); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); - reference48 = new ChangelogEntry("6.23", releaseDate25, list49); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); + reference48 = new ChangelogEntry("6.26", releaseDate23, list49); num2++; ref ChangelogEntry reference49 = ref span[num2]; - DateOnly releaseDate26 = new DateOnly(2025, 10, 12); - num4 = 3; + DateOnly releaseDate24 = new DateOnly(2025, 10, 17); + num4 = 1; List list50 = new List(num4); CollectionsMarshal.SetCount(list50, num4); span2 = CollectionsMarshal.AsSpan(list50); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); - reference49 = new ChangelogEntry("6.22", releaseDate26, list50); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); + reference49 = new ChangelogEntry("6.25", releaseDate24, list50); num2++; ref ChangelogEntry reference50 = ref span[num2]; - DateOnly releaseDate27 = new DateOnly(2025, 10, 12); - num3 = 2; + DateOnly releaseDate25 = new DateOnly(2025, 10, 16); + num3 = 1; List list51 = new List(num3); CollectionsMarshal.SetCount(list51, num3); span2 = CollectionsMarshal.AsSpan(list51); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - reference50 = new ChangelogEntry("6.21", releaseDate27, list51); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); + reference50 = new ChangelogEntry("6.24", releaseDate25, list51); num2++; ref ChangelogEntry reference51 = ref span[num2]; - DateOnly releaseDate28 = new DateOnly(2025, 10, 10); - num4 = 2; + DateOnly releaseDate26 = new DateOnly(2025, 10, 13); + num4 = 1; List list52 = new List(num4); CollectionsMarshal.SetCount(list52, num4); span2 = CollectionsMarshal.AsSpan(list52); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); - reference51 = new ChangelogEntry("6.20", releaseDate28, list52); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); + reference51 = new ChangelogEntry("6.23", releaseDate26, list52); num2++; ref ChangelogEntry reference52 = ref span[num2]; - DateOnly releaseDate29 = new DateOnly(2025, 10, 9); + DateOnly releaseDate27 = new DateOnly(2025, 10, 12); num3 = 3; List list53 = new List(num3); CollectionsMarshal.SetCount(list53, num3); span2 = CollectionsMarshal.AsSpan(list53); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); - reference52 = new ChangelogEntry("6.19", releaseDate29, list53); + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); + reference52 = new ChangelogEntry("6.22", releaseDate27, list53); num2++; ref ChangelogEntry reference53 = ref span[num2]; - DateOnly releaseDate30 = new DateOnly(2025, 10, 9); + DateOnly releaseDate28 = new DateOnly(2025, 10, 12); num4 = 2; List list54 = new List(num4); CollectionsMarshal.SetCount(list54, num4); span2 = CollectionsMarshal.AsSpan(list54); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); + span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); - reference53 = new ChangelogEntry("6.18", releaseDate30, list54); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); + reference53 = new ChangelogEntry("6.21", releaseDate28, list54); num2++; ref ChangelogEntry reference54 = ref span[num2]; - DateOnly releaseDate31 = new DateOnly(2025, 10, 8); - num3 = 1; + DateOnly releaseDate29 = new DateOnly(2025, 10, 10); + num3 = 2; List list55 = new List(num3); CollectionsMarshal.SetCount(list55, num3); span2 = CollectionsMarshal.AsSpan(list55); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); - reference54 = new ChangelogEntry("6.17", releaseDate31, list55); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); + reference54 = new ChangelogEntry("6.20", releaseDate29, list55); num2++; ref ChangelogEntry reference55 = ref span[num2]; - DateOnly releaseDate32 = new DateOnly(2025, 10, 8); - num4 = 1; + DateOnly releaseDate30 = new DateOnly(2025, 10, 9); + num4 = 3; List list56 = new List(num4); CollectionsMarshal.SetCount(list56, num4); span2 = CollectionsMarshal.AsSpan(list56); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); - reference55 = new ChangelogEntry("6.16", releaseDate32, list56); + span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); + reference55 = new ChangelogEntry("6.19", releaseDate30, list56); num2++; ref ChangelogEntry reference56 = ref span[num2]; - DateOnly releaseDate33 = new DateOnly(2025, 10, 8); + DateOnly releaseDate31 = new DateOnly(2025, 10, 9); num3 = 2; List list57 = new List(num3); CollectionsMarshal.SetCount(list57, num3); span2 = CollectionsMarshal.AsSpan(list57); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); - reference56 = new ChangelogEntry("6.15", releaseDate33, list57); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); + reference56 = new ChangelogEntry("6.18", releaseDate31, list57); num2++; ref ChangelogEntry reference57 = ref span[num2]; - DateOnly releaseDate34 = new DateOnly(2025, 10, 8); + DateOnly releaseDate32 = new DateOnly(2025, 10, 8); num4 = 1; List list58 = new List(num4); CollectionsMarshal.SetCount(list58, num4); span2 = CollectionsMarshal.AsSpan(list58); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); - reference57 = new ChangelogEntry("6.14", releaseDate34, list58); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); + reference57 = new ChangelogEntry("6.17", releaseDate32, list58); num2++; ref ChangelogEntry reference58 = ref span[num2]; - DateOnly releaseDate35 = new DateOnly(2025, 10, 8); - num3 = 2; + DateOnly releaseDate33 = new DateOnly(2025, 10, 8); + num3 = 1; List list59 = new List(num3); CollectionsMarshal.SetCount(list59, num3); span2 = CollectionsMarshal.AsSpan(list59); num4 = 0; - ref ChangeEntry reference59 = ref span2[num4]; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); + reference58 = new ChangelogEntry("6.16", releaseDate33, list59); + num2++; + ref ChangelogEntry reference59 = ref span[num2]; + DateOnly releaseDate34 = new DateOnly(2025, 10, 8); + num4 = 2; + List list60 = new List(num4); + CollectionsMarshal.SetCount(list60, num4); + span2 = CollectionsMarshal.AsSpan(list60); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); + reference59 = new ChangelogEntry("6.15", releaseDate34, list60); + num2++; + ref ChangelogEntry reference60 = ref span[num2]; + DateOnly releaseDate35 = new DateOnly(2025, 10, 8); + num3 = 1; + List list61 = new List(num3); + CollectionsMarshal.SetCount(list61, num3); + span2 = CollectionsMarshal.AsSpan(list61); + num4 = 0; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); + reference60 = new ChangelogEntry("6.14", releaseDate35, list61); + num2++; + ref ChangelogEntry reference61 = ref span[num2]; + DateOnly releaseDate36 = new DateOnly(2025, 10, 8); + num4 = 2; + List list62 = new List(num4); + CollectionsMarshal.SetCount(list62, num4); + span2 = CollectionsMarshal.AsSpan(list62); + num3 = 0; + ref ChangeEntry reference62 = ref span2[num3]; num6 = 3; - List list60 = new List(num6); - CollectionsMarshal.SetCount(list60, num6); - span3 = CollectionsMarshal.AsSpan(list60); + List list63 = new List(num6); + CollectionsMarshal.SetCount(list63, num6); + span3 = CollectionsMarshal.AsSpan(list63); num5 = 0; span3[num5] = "Context menu option to add required quests and their chain to priority list"; num5++; span3[num5] = "AetheryteShortcut to multiple quests"; num5++; span3[num5] = "Artisan as a recommended plugin/dependency"; - reference59 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list60); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); - reference58 = new ChangelogEntry("6.13", releaseDate35, list59); + reference62 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list63); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); + reference61 = new ChangelogEntry("6.13", releaseDate36, list62); num2++; - ref ChangelogEntry reference60 = ref span[num2]; - DateOnly releaseDate36 = new DateOnly(2025, 10, 7); - num4 = 4; - List list61 = new List(num4); - CollectionsMarshal.SetCount(list61, num4); - span2 = CollectionsMarshal.AsSpan(list61); - num3 = 0; - ref ChangeEntry reference61 = ref span2[num3]; + ref ChangelogEntry reference63 = ref span[num2]; + DateOnly releaseDate37 = new DateOnly(2025, 10, 7); + num3 = 4; + List list64 = new List(num3); + CollectionsMarshal.SetCount(list64, num3); + span2 = CollectionsMarshal.AsSpan(list64); + num4 = 0; + ref ChangeEntry reference64 = ref span2[num4]; num5 = 4; - List list62 = new List(num5); - CollectionsMarshal.SetCount(list62, num5); - span3 = CollectionsMarshal.AsSpan(list62); + List list65 = new List(num5); + CollectionsMarshal.SetCount(list65, num5); + span3 = CollectionsMarshal.AsSpan(list65); num6 = 0; span3[num6] = "FATE combat handling with auto level syncing"; num6++; @@ -672,67 +704,67 @@ internal static class ChangelogData span3[num6] = "Update quest tracking when quests are hidden or prioritised in game"; num6++; span3[num6] = "QuestMap as a recommended plugin/dependency"; - reference61 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list62); - num3++; - ref ChangeEntry reference62 = ref span2[num3]; + reference64 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list65); + num4++; + ref ChangeEntry reference65 = ref span2[num4]; num6 = 3; - List list63 = new List(num6); - CollectionsMarshal.SetCount(list63, num6); - span3 = CollectionsMarshal.AsSpan(list63); + List list66 = new List(num6); + CollectionsMarshal.SetCount(list66, num6); + span3 = CollectionsMarshal.AsSpan(list66); num5 = 0; span3[num5] = "Always prioritise next quest during teleportation/zone transitions"; num5++; span3[num5] = "Improved accepted quest logic with abandoned quest detection"; num5++; span3[num5] = "Show quests without quest paths as Locked"; - reference62 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list63); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); - reference60 = new ChangelogEntry("6.12", releaseDate36, list61); + reference65 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list66); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); + reference63 = new ChangelogEntry("6.12", releaseDate37, list64); num2++; - ref ChangelogEntry reference63 = ref span[num2]; - DateOnly releaseDate37 = new DateOnly(2025, 10, 3); - num3 = 1; - List list64 = new List(num3); - CollectionsMarshal.SetCount(list64, num3); - span2 = CollectionsMarshal.AsSpan(list64); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); - reference63 = new ChangelogEntry("6.11", releaseDate37, list64); - num2++; - ref ChangelogEntry reference64 = ref span[num2]; - DateOnly releaseDate38 = new DateOnly(2025, 10, 2); + ref ChangelogEntry reference66 = ref span[num2]; + DateOnly releaseDate38 = new DateOnly(2025, 10, 3); num4 = 1; - List list65 = new List(num4); - CollectionsMarshal.SetCount(list65, num4); - span2 = CollectionsMarshal.AsSpan(list65); + List list67 = new List(num4); + CollectionsMarshal.SetCount(list67, num4); + span2 = CollectionsMarshal.AsSpan(list67); num3 = 0; - ref ChangeEntry reference65 = ref span2[num3]; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); + reference66 = new ChangelogEntry("6.11", releaseDate38, list67); + num2++; + ref ChangelogEntry reference67 = ref span[num2]; + DateOnly releaseDate39 = new DateOnly(2025, 10, 2); + num3 = 1; + List list68 = new List(num3); + CollectionsMarshal.SetCount(list68, num3); + span2 = CollectionsMarshal.AsSpan(list68); + num4 = 0; + ref ChangeEntry reference68 = ref span2[num4]; num5 = 2; - List list66 = new List(num5); - CollectionsMarshal.SetCount(list66, num5); - span3 = CollectionsMarshal.AsSpan(list66); + List list69 = new List(num5); + CollectionsMarshal.SetCount(list69, num5); + span3 = CollectionsMarshal.AsSpan(list69); num6 = 0; span3[num6] = "Don't show quests as available if player doesn't meet level requirements"; num6++; span3[num6] = "Updated 'required for MSQ' text in Crystal Tower quest preset window"; - reference65 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list66); - reference64 = new ChangelogEntry("6.10", releaseDate38, list65); + reference68 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list69); + reference67 = new ChangelogEntry("6.10", releaseDate39, list68); num2++; - ref ChangelogEntry reference66 = ref span[num2]; - DateOnly releaseDate39 = new DateOnly(2025, 9, 21); - num3 = 5; - List list67 = new List(num3); - CollectionsMarshal.SetCount(list67, num3); - span2 = CollectionsMarshal.AsSpan(list67); - num4 = 0; - ref ChangeEntry reference67 = ref span2[num4]; + ref ChangelogEntry reference69 = ref span[num2]; + DateOnly releaseDate40 = new DateOnly(2025, 9, 21); + num4 = 5; + List list70 = new List(num4); + CollectionsMarshal.SetCount(list70, num4); + span2 = CollectionsMarshal.AsSpan(list70); + num3 = 0; + ref ChangeEntry reference70 = ref span2[num3]; num6 = 4; - List list68 = new List(num6); - CollectionsMarshal.SetCount(list68, num6); - span3 = CollectionsMarshal.AsSpan(list68); + List list71 = new List(num6); + CollectionsMarshal.SetCount(list71, num6); + span3 = CollectionsMarshal.AsSpan(list71); num5 = 0; span3[num5] = "Reworked event quest handling - automatically displays when events are active"; num5++; @@ -741,13 +773,13 @@ internal static class ChangelogData span3[num5] = "Reworked Priority Quests tab (Manual Priority and Quest Presets)"; num5++; span3[num5] = "Quest path viewer site (https://wigglymuffin.github.io/FFXIV-Tools/)"; - reference67 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list68); - num4++; - ref ChangeEntry reference68 = ref span2[num4]; + reference70 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list71); + num3++; + ref ChangeEntry reference71 = ref span2[num3]; num5 = 4; - List list69 = new List(num5); - CollectionsMarshal.SetCount(list69, num5); - span3 = CollectionsMarshal.AsSpan(list69); + List list72 = new List(num5); + CollectionsMarshal.SetCount(list72, num5); + span3 = CollectionsMarshal.AsSpan(list72); num6 = 0; span3[num6] = "Questionable.IsQuestCompleted"; num6++; @@ -756,13 +788,13 @@ internal static class ChangelogData span3[num6] = "Questionable.IsQuestAccepted"; num6++; span3[num6] = "Questionable.IsQuestUnobtainable"; - reference68 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list69); - num4++; - ref ChangeEntry reference69 = ref span2[num4]; + reference71 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list72); + num3++; + ref ChangeEntry reference72 = ref span2[num3]; num6 = 5; - List list70 = new List(num6); - CollectionsMarshal.SetCount(list70, num6); - span3 = CollectionsMarshal.AsSpan(list70); + List list73 = new List(num6); + CollectionsMarshal.SetCount(list73, num6); + span3 = CollectionsMarshal.AsSpan(list73); num5 = 0; span3[num5] = "Improved JSON quest validation with specific error reasons"; num5++; @@ -773,25 +805,25 @@ internal static class ChangelogData span3[num5] = "Improved DialogueChoices regex matching"; num5++; span3[num5] = "Improved refresh checker for all quest states"; - reference69 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list70); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); - reference66 = new ChangelogEntry("6.9", releaseDate39, list67); + reference72 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list73); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); + reference69 = new ChangelogEntry("6.9", releaseDate40, list70); num2++; - ref ChangelogEntry reference70 = ref span[num2]; - DateOnly releaseDate40 = new DateOnly(2025, 9, 2); - num4 = 4; - List list71 = new List(num4); - CollectionsMarshal.SetCount(list71, num4); - span2 = CollectionsMarshal.AsSpan(list71); - num3 = 0; - ref ChangeEntry reference71 = ref span2[num3]; + ref ChangelogEntry reference73 = ref span[num2]; + DateOnly releaseDate41 = new DateOnly(2025, 9, 2); + num3 = 4; + List list74 = new List(num3); + CollectionsMarshal.SetCount(list74, num3); + span2 = CollectionsMarshal.AsSpan(list74); + num4 = 0; + ref ChangeEntry reference74 = ref span2[num4]; num5 = 4; - List list72 = new List(num5); - CollectionsMarshal.SetCount(list72, num5); - span3 = CollectionsMarshal.AsSpan(list72); + List list75 = new List(num5); + CollectionsMarshal.SetCount(list75, num5); + span3 = CollectionsMarshal.AsSpan(list75); num6 = 0; span3[num6] = "Help commands and priority quest command"; num6++; @@ -800,72 +832,72 @@ internal static class ChangelogData span3[num6] = "Duty counts and controls in 'Quest Battles' tab"; num6++; span3[num6] = "'Refresh quest timer' setting (WIP)"; - reference71 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list72); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); - reference70 = new ChangelogEntry("6.8", releaseDate40, list71); + reference74 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list75); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); + reference73 = new ChangelogEntry("6.8", releaseDate41, list74); num2++; - ref ChangelogEntry reference72 = ref span[num2]; - DateOnly releaseDate41 = new DateOnly(2025, 8, 27); - num3 = 4; - List list73 = new List(num3); - CollectionsMarshal.SetCount(list73, num3); - span2 = CollectionsMarshal.AsSpan(list73); - num4 = 0; - ref ChangeEntry reference73 = ref span2[num4]; + ref ChangelogEntry reference75 = ref span[num2]; + DateOnly releaseDate42 = new DateOnly(2025, 8, 27); + num4 = 4; + List list76 = new List(num4); + CollectionsMarshal.SetCount(list76, num4); + span2 = CollectionsMarshal.AsSpan(list76); + num3 = 0; + ref ChangeEntry reference76 = ref span2[num3]; num6 = 2; - List list74 = new List(num6); - CollectionsMarshal.SetCount(list74, num6); - span3 = CollectionsMarshal.AsSpan(list74); + List list77 = new List(num6); + CollectionsMarshal.SetCount(list77, num6); + span3 = CollectionsMarshal.AsSpan(list77); num5 = 0; span3[num5] = "Icon to 'Clear All' button in stop conditions"; num5++; span3[num5] = "Duty counts and 'Enable All' button in 'Duties' tab"; - reference73 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list74); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); - reference72 = new ChangelogEntry("6.7", releaseDate41, list73); + reference76 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list77); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); + reference75 = new ChangelogEntry("6.7", releaseDate42, list76); num2++; - ref ChangelogEntry reference74 = ref span[num2]; - DateOnly releaseDate42 = new DateOnly(2025, 8, 25); - num4 = 2; - List list75 = new List(num4); - CollectionsMarshal.SetCount(list75, num4); - span2 = CollectionsMarshal.AsSpan(list75); - num3 = 0; - ref ChangeEntry reference75 = ref span2[num3]; + ref ChangelogEntry reference77 = ref span[num2]; + DateOnly releaseDate43 = new DateOnly(2025, 8, 25); + num3 = 2; + List list78 = new List(num3); + CollectionsMarshal.SetCount(list78, num3); + span2 = CollectionsMarshal.AsSpan(list78); + num4 = 0; + ref ChangeEntry reference78 = ref span2[num4]; num5 = 2; - List list76 = new List(num5); - CollectionsMarshal.SetCount(list76, num5); - span3 = CollectionsMarshal.AsSpan(list76); + List list79 = new List(num5); + CollectionsMarshal.SetCount(list79, num5); + span3 = CollectionsMarshal.AsSpan(list79); num6 = 0; span3[num6] = "Missing emotes to schema and emote handler"; num6++; span3[num6] = "Improved stop conditions with 'Clear All' button"; - reference75 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list76); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); - reference74 = new ChangelogEntry("6.6", releaseDate42, list75); - num2++; - ref ChangelogEntry reference76 = ref span[num2]; - DateOnly releaseDate43 = new DateOnly(2025, 8, 25); - num3 = 2; - List list77 = new List(num3); - CollectionsMarshal.SetCount(list77, num3); - span2 = CollectionsMarshal.AsSpan(list77); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + reference78 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list79); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); - reference76 = new ChangelogEntry("6.5", releaseDate43, list77); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); + reference77 = new ChangelogEntry("6.6", releaseDate43, list78); + num2++; + ref ChangelogEntry reference79 = ref span[num2]; + DateOnly releaseDate44 = new DateOnly(2025, 8, 25); + num4 = 2; + List list80 = new List(num4); + CollectionsMarshal.SetCount(list80, num4); + span2 = CollectionsMarshal.AsSpan(list80); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); + reference79 = new ChangelogEntry("6.5", releaseDate44, list80); Changelogs = list; } } diff --git a/Questionable/Questionable.External/NavmeshIpc.cs b/Questionable/Questionable.External/NavmeshIpc.cs index 0ed9d8a..0a21170 100644 --- a/Questionable/Questionable.External/NavmeshIpc.cs +++ b/Questionable/Questionable.External/NavmeshIpc.cs @@ -39,6 +39,10 @@ internal sealed class NavmeshIpc private readonly ICallGateSubscriber _buildProgress; + private readonly ICallGateSubscriber _navReload; + + private readonly ICallGateSubscriber _navRebuild; + public bool IsReady { get @@ -115,6 +119,8 @@ internal sealed class NavmeshIpc _queryPointOnFloor = pluginInterface.GetIpcSubscriber("vnavmesh.Query.Mesh.PointOnFloor"); _queryNearestPoint = pluginInterface.GetIpcSubscriber("vnavmesh.Query.Mesh.NearestPoint"); _buildProgress = pluginInterface.GetIpcSubscriber("vnavmesh.Nav.BuildProgress"); + _navReload = pluginInterface.GetIpcSubscriber("vnavmesh.Nav.Reload"); + _navRebuild = pluginInterface.GetIpcSubscriber("vnavmesh.Nav.Rebuild"); } public void Stop() @@ -129,6 +135,30 @@ internal sealed class NavmeshIpc } } + public void Reload() + { + try + { + _navReload.InvokeFunc(); + } + catch (IpcError exception) + { + _logger.LogWarning(exception, "Could not reload navmesh"); + } + } + + public void Rebuild() + { + try + { + _navRebuild.InvokeFunc(); + } + catch (IpcError exception) + { + _logger.LogWarning(exception, "Could not rebuild navmesh"); + } + } + public Task> Pathfind(Vector3 localPlayerPosition, Vector3 targetPosition, bool fly, CancellationToken cancellationToken) { try @@ -147,8 +177,8 @@ internal sealed class NavmeshIpc { try { - _pathSetTolerance.InvokeAction(0.25f); - return _pluginInterface.GetIpcSubscriber>>("vnavmesh.Nav.PathfindWithTolerance").InvokeFunc(localPlayerPosition, targetPosition, fly, tolerance, cancellationToken); + _pathSetTolerance.InvokeAction(tolerance); + return _pluginInterface.GetIpcSubscriber>>("vnavmesh.Nav.PathfindWithTolerance").InvokeFunc(localPlayerPosition, targetPosition, fly, tolerance); } catch (IpcError exception) { diff --git a/Questionable/Questionable.Functions/ChatFunctions.cs b/Questionable/Questionable.Functions/ChatFunctions.cs index 6211668..bd71d4a 100644 --- a/Questionable/Questionable.Functions/ChatFunctions.cs +++ b/Questionable/Questionable.Functions/ChatFunctions.cs @@ -11,6 +11,7 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.System.Framework; using FFXIVClientStructs.FFXIV.Client.System.Memory; using FFXIVClientStructs.FFXIV.Client.System.String; +using FFXIVClientStructs.FFXIV.Client.UI; using Lumina.Excel.Sheets; using Microsoft.Extensions.Logging; using Questionable.Model.Questing; @@ -21,11 +22,6 @@ internal sealed class ChatFunctions { private delegate void ProcessChatBoxDelegate(nint uiModule, nint message, nint unused, byte a4); - private static class Signatures - { - internal const string SendChat = "48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B F2 48 8B F9 45 84 C9"; - } - [StructLayout(LayoutKind.Explicit)] private readonly struct ChatPayload : IDisposable { @@ -72,7 +68,7 @@ internal sealed class ChatFunctions _gameFunctions = gameFunctions; _targetManager = targetManager; _logger = logger; - _processChatBox = Marshal.GetDelegateForFunctionPointer(sigScanner.ScanText("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B F2 48 8B F9 45 84 C9")); + _processChatBox = Marshal.GetDelegateForFunctionPointer(UIModule.Addresses.ProcessChatBoxEntry.Value); _emoteCommands = (from x in dataManager.GetExcelSheet() where x.RowId != 0 where x.TextCommand.IsValid diff --git a/Questionable/Questionable.Functions/GameFunctions.cs b/Questionable/Questionable.Functions/GameFunctions.cs index 9258154..86a8e16 100644 --- a/Questionable/Questionable.Functions/GameFunctions.cs +++ b/Questionable/Questionable.Functions/GameFunctions.cs @@ -14,6 +14,7 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Control; +using FFXIVClientStructs.FFXIV.Client.Game.Event; using FFXIVClientStructs.FFXIV.Client.Game.Fate; using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.UI; @@ -34,11 +35,6 @@ internal sealed class GameFunctions { private delegate void AbandonDutyDelegate(bool a1); - private static class Signatures - { - internal const string AbandonDuty = "E8 ?? ?? ?? ?? 41 B2 01 EB 39"; - } - private readonly QuestFunctions _questFunctions; private readonly IDataManager _dataManager; @@ -74,7 +70,7 @@ internal sealed class GameFunctions _gameGui = gameGui; _configuration = configuration; _logger = logger; - _abandonDuty = Marshal.GetDelegateForFunctionPointer(sigScanner.ScanText("E8 ?? ?? ?? ?? 41 B2 01 EB 39")); + _abandonDuty = Marshal.GetDelegateForFunctionPointer(EventFramework.Addresses.LeaveCurrentContent.Value); _territoryToAetherCurrentCompFlgSet = (from x in dataManager.GetExcelSheet() where x.RowId != 0 where x.AetherCurrentCompFlgSet.RowId != 0 diff --git a/Questionable/Questionable.Functions/GameSignatures.cs b/Questionable/Questionable.Functions/GameSignatures.cs new file mode 100644 index 0000000..19a9aa4 --- /dev/null +++ b/Questionable/Questionable.Functions/GameSignatures.cs @@ -0,0 +1,5 @@ +namespace Questionable.Functions; + +internal static class GameSignatures +{ +} diff --git a/Questionable/Questionable.Windows.ConfigComponents/GeneralConfigComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/GeneralConfigComponent.cs index 1f8492b..fc771c7 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/GeneralConfigComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/GeneralConfigComponent.cs @@ -183,22 +183,28 @@ internal sealed class GeneralConfigComponent : ConfigComponent base.Configuration.General.UseEscToCancelQuesting = v2; Save(); } - bool v3 = base.Configuration.General.ShowIncompleteSeasonalEvents; - if (ImGui.Checkbox("Show details for incomplete seasonal events", ref v3)) + bool v3 = base.Configuration.General.StopOnPlayerInput; + if (ImGui.Checkbox("Stop automation when manually moving character", ref v3)) { - base.Configuration.General.ShowIncompleteSeasonalEvents = v3; + base.Configuration.General.StopOnPlayerInput = v3; Save(); } - bool v4 = base.Configuration.General.HideSeasonalEventsFromJournalProgress; - if (ImGui.Checkbox("Hide Seasonal Events from Journal Progress", ref v4)) + bool v4 = base.Configuration.General.ShowIncompleteSeasonalEvents; + if (ImGui.Checkbox("Show details for incomplete seasonal events", ref v4)) { - base.Configuration.General.HideSeasonalEventsFromJournalProgress = v4; + base.Configuration.General.ShowIncompleteSeasonalEvents = v4; Save(); } - bool v5 = base.Configuration.General.ShowChangelogOnUpdate; - if (ImGui.Checkbox("Show changelog window when plugin updates", ref v5)) + bool v5 = base.Configuration.General.HideSeasonalEventsFromJournalProgress; + if (ImGui.Checkbox("Hide Seasonal Events from Journal Progress", ref v5)) { - base.Configuration.General.ShowChangelogOnUpdate = v5; + base.Configuration.General.HideSeasonalEventsFromJournalProgress = v5; + Save(); + } + bool v6 = base.Configuration.General.ShowChangelogOnUpdate; + if (ImGui.Checkbox("Show changelog window when plugin updates", ref v6)) + { + base.Configuration.General.ShowChangelogOnUpdate = v6; Save(); } } @@ -206,16 +212,16 @@ internal sealed class GeneralConfigComponent : ConfigComponent ImGui.Text("Questing"); using (ImRaii.PushIndent()) { - bool v6 = base.Configuration.General.ConfigureTextAdvance; - if (ImGui.Checkbox("Automatically configure TextAdvance with the recommended settings", ref v6)) + bool v7 = base.Configuration.General.ConfigureTextAdvance; + if (ImGui.Checkbox("Automatically configure TextAdvance with the recommended settings", ref v7)) { - base.Configuration.General.ConfigureTextAdvance = v6; + base.Configuration.General.ConfigureTextAdvance = v7; Save(); } - bool v7 = base.Configuration.General.SkipLowPriorityDuties; - if (ImGui.Checkbox("Unlock certain optional dungeons and raids (instead of waiting for completion)", ref v7)) + bool v8 = base.Configuration.General.SkipLowPriorityDuties; + if (ImGui.Checkbox("Unlock certain optional dungeons and raids (instead of waiting for completion)", ref v8)) { - base.Configuration.General.SkipLowPriorityDuties = v7; + base.Configuration.General.SkipLowPriorityDuties = v8; Save(); } ImGui.SameLine(); @@ -243,10 +249,10 @@ internal sealed class GeneralConfigComponent : ConfigComponent } } ImGui.Spacing(); - bool v8 = base.Configuration.General.AutoStepRefreshEnabled; - if (ImGui.Checkbox("Automatically refresh quest steps when stuck", ref v8)) + bool v9 = base.Configuration.General.AutoStepRefreshEnabled; + if (ImGui.Checkbox("Automatically refresh quest steps when stuck", ref v9)) { - base.Configuration.General.AutoStepRefreshEnabled = v8; + base.Configuration.General.AutoStepRefreshEnabled = v9; Save(); } ImGui.SameLine(); @@ -262,20 +268,20 @@ internal sealed class GeneralConfigComponent : ConfigComponent ImGui.Text("This helps resume automated quest completion when interruptions occur."); } } - using (ImRaii.Disabled(!v8)) + using (ImRaii.Disabled(!v9)) { ImGui.Indent(); - int v9 = base.Configuration.General.AutoStepRefreshDelaySeconds; + int v10 = base.Configuration.General.AutoStepRefreshDelaySeconds; ImGui.SetNextItemWidth(150f); - if (ImGui.SliderInt("Refresh delay (seconds)", ref v9, 10, 180)) + if (ImGui.SliderInt("Refresh delay (seconds)", ref v10, 10, 180)) { - base.Configuration.General.AutoStepRefreshDelaySeconds = v9; + base.Configuration.General.AutoStepRefreshDelaySeconds = v10; Save(); } Vector4 col = new Vector4(0.7f, 0.7f, 0.7f, 1f); ImU8String text2 = new ImU8String(77, 1); text2.AppendLiteral("Quest steps will refresh automatically after "); - text2.AppendFormatted(v9); + text2.AppendFormatted(v10); text2.AppendLiteral(" seconds if no progress is made."); ImGui.TextColored(in col, text2); ImGui.Unindent(); @@ -283,16 +289,16 @@ internal sealed class GeneralConfigComponent : ConfigComponent ImGui.Spacing(); ImGui.Separator(); ImGui.Text("Priority Quest Management"); - bool v10 = base.Configuration.General.ClearPriorityQuestsOnLogout; - if (ImGui.Checkbox("Clear priority quests on character logout", ref v10)) + bool v11 = base.Configuration.General.ClearPriorityQuestsOnLogout; + if (ImGui.Checkbox("Clear priority quests on character logout", ref v11)) { - base.Configuration.General.ClearPriorityQuestsOnLogout = v10; + base.Configuration.General.ClearPriorityQuestsOnLogout = v11; Save(); } - bool v11 = base.Configuration.General.ClearPriorityQuestsOnCompletion; - if (ImGui.Checkbox("Remove priority quests when completed", ref v11)) + bool v12 = base.Configuration.General.ClearPriorityQuestsOnCompletion; + if (ImGui.Checkbox("Remove priority quests when completed", ref v12)) { - base.Configuration.General.ClearPriorityQuestsOnCompletion = v11; + base.Configuration.General.ClearPriorityQuestsOnCompletion = v12; Save(); } ImGui.SameLine(); diff --git a/Questionable/Questionable.Windows.ConfigComponents/PluginConfigComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/PluginConfigComponent.cs index 10ceffd..3a0e311 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/PluginConfigComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/PluginConfigComponent.cs @@ -25,9 +25,9 @@ internal sealed class PluginConfigComponent : ConfigComponent private static readonly IReadOnlyList RequiredPlugins = new global::_003C_003Ez__ReadOnlyArray(new PluginInfo[3] { - new PluginInfo("vnavmesh", "vnavmesh", "vnavmesh handles the navigation within a zone, moving\nyour character to the next quest-related objective.", new Uri("https://github.com/awgil/ffxiv_navmesh/"), new Uri("https://puni.sh/api/repository/veyn")), new PluginInfo("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 PluginInfo("TextAdvance", "TextAdvance", "Automatically accepts and turns in quests, skips cutscenes\nand dialogue.", new Uri("https://github.com/NightmareXIV/TextAdvance"), new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")) + new PluginInfo("TextAdvance", "TextAdvance", "Automatically accepts and turns in quests, skips cutscenes\nand dialogue.", new Uri("https://github.com/NightmareXIV/TextAdvance"), new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")), + new PluginInfo("vnavmesh", "vnavmesh", "vnavmesh handles the navigation within a zone, moving\nyour character to the next quest-related objective.", new Uri("https://github.com/awgil/ffxiv_navmesh/"), new Uri("https://puni.sh/api/repository/veyn")) }); private static readonly ReadOnlyDictionary CombatPlugins = new Dictionary @@ -36,13 +36,13 @@ internal sealed class PluginConfigComponent : ConfigComponent Questionable.Configuration.ECombatModule.BossMod, new PluginInfo("Boss Mod (VBM)", "BossMod", string.Empty, new Uri("https://github.com/awgil/ffxiv_bossmod"), new Uri("https://puni.sh/api/repository/veyn")) }, - { - Questionable.Configuration.ECombatModule.WrathCombo, - new PluginInfo("Wrath Combo", "WrathCombo", string.Empty, new Uri("https://github.com/PunishXIV/WrathCombo"), new Uri("https://puni.sh/api/plugins")) - }, { Questionable.Configuration.ECombatModule.RotationSolverReborn, new PluginInfo("Rotation Solver Reborn", "RotationSolver", string.Empty, new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn"), new Uri("https://raw.githubusercontent.com/FFXIV-CombatReborn/CombatRebornRepo/main/pluginmaster.json")) + }, + { + Questionable.Configuration.ECombatModule.WrathCombo, + new PluginInfo("Wrath Combo", "WrathCombo", string.Empty, new Uri("https://github.com/PunishXIV/WrathCombo"), new Uri("https://puni.sh/api/plugins")) } }.AsReadOnly(); @@ -66,9 +66,10 @@ internal sealed class PluginConfigComponent : ConfigComponent _pluginInterface = pluginInterface; _uiUtils = uiUtils; _commandManager = commandManager; - PluginInfo[] obj = new PluginInfo[5] + PluginInfo[] obj = new PluginInfo[6] { new PluginInfo("Artisan", "Artisan", "Handles automatic crafting for quests that require\ncrafted items.", new Uri("https://github.com/PunishXIV/Artisan"), new Uri("https://puni.sh/api/plugins")), + new PluginInfo("AutoDuty", "AutoDuty", "Automatically handles dungeon and trial completion during\nMain Scenario Quest progression.", new Uri("https://github.com/erdelf/AutoDuty"), new Uri("https://puni.sh/api/repository/erdelf")), null, null, null, @@ -82,7 +83,8 @@ internal sealed class PluginConfigComponent : ConfigComponent Span span = CollectionsMarshal.AsSpan(list); int index = 0; span[index] = new PluginDetailInfo("'Sniper no sniping' enabled", "Automatically completes sniping tasks introduced in Stormblood", () => automatonIpc.IsAutoSnipeEnabled); - obj[1] = new PluginInfo("CBT (formerly known as Automaton)", "Automaton", "Automaton is a collection of automation-related tweaks.", websiteUri, dalamudRepositoryUri, "/cbt", list); + obj[2] = new PluginInfo("CBT (formerly known as Automaton)", "Automaton", "Automaton is a collection of automation-related tweaks.", websiteUri, dalamudRepositoryUri, "/cbt", list); + obj[3] = new PluginInfo("NotificationMaster", "NotificationMaster", "Sends a configurable out-of-game notification if a quest\nrequires manual actions.", new Uri("https://github.com/NightmareXIV/NotificationMaster"), null); Uri websiteUri2 = new Uri("https://github.com/PunishXIV/PandorasBox"); Uri dalamudRepositoryUri2 = new Uri("https://puni.sh/api/plugins"); index = 1; @@ -91,9 +93,8 @@ internal sealed class PluginConfigComponent : ConfigComponent span = CollectionsMarshal.AsSpan(list2); num = 0; span[num] = new PluginDetailInfo("'Auto Active Time Maneuver' enabled", "Automatically completes active time maneuvers in\nsingle player instances, trials and raids\"", () => pandorasBoxIpc.IsAutoActiveTimeManeuverEnabled); - obj[2] = new PluginInfo("Pandora's Box", "PandorasBox", "Pandora's Box is a collection of tweaks.", websiteUri2, dalamudRepositoryUri2, "/pandora", list2); - obj[3] = new PluginInfo("QuestMap", "QuestMap", "Displays quest objectives and markers on the map for\nbetter navigation and tracking.", new Uri("https://github.com/rreminy/QuestMap"), null); - obj[4] = new PluginInfo("NotificationMaster", "NotificationMaster", "Sends a configurable out-of-game notification if a quest\nrequires manual actions.", new Uri("https://github.com/NightmareXIV/NotificationMaster"), null); + obj[4] = new PluginInfo("Pandora's Box", "PandorasBox", "Pandora's Box is a collection of tweaks.", websiteUri2, dalamudRepositoryUri2, "/pandora", list2); + obj[5] = new PluginInfo("QuestMap", "QuestMap", "Displays quest objectives and markers on the map for\nbetter navigation and tracking.", new Uri("https://github.com/rreminy/QuestMap"), null); _recommendedPlugins = new global::_003C_003Ez__ReadOnlyArray(obj); } @@ -147,8 +148,8 @@ internal sealed class PluginConfigComponent : ConfigComponent _pluginInterface.SavePluginConfig(_configuration); } allRequiredInstalled &= DrawCombatPlugin(Questionable.Configuration.ECombatModule.BossMod, checklistPadding); - allRequiredInstalled &= DrawCombatPlugin(Questionable.Configuration.ECombatModule.WrathCombo, checklistPadding); allRequiredInstalled &= DrawCombatPlugin(Questionable.Configuration.ECombatModule.RotationSolverReborn, checklistPadding); + allRequiredInstalled &= DrawCombatPlugin(Questionable.Configuration.ECombatModule.WrathCombo, checklistPadding); } } ImGui.Spacing(); diff --git a/Questionable/Questionable.Windows.JournalComponents/GatheringJournalComponent.cs b/Questionable/Questionable.Windows.JournalComponents/GatheringJournalComponent.cs index f96ee5f..f9bba1f 100644 --- a/Questionable/Questionable.Windows.JournalComponents/GatheringJournalComponent.cs +++ b/Questionable/Questionable.Windows.JournalComponents/GatheringJournalComponent.cs @@ -8,7 +8,7 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin; using Dalamud.Plugin.Services; -using Dalamud.Utility.Signatures; +using FFXIVClientStructs.FFXIV.Client.Game; using LLib.GameData; using Lumina.Excel; using Lumina.Excel.Sheets; @@ -84,12 +84,9 @@ internal sealed class GatheringJournalComponent private string _searchText = string.Empty; - [Signature("48 89 5C 24 ?? 57 48 83 EC 20 8B D9 8B F9")] - private GetIsGatheringItemGatheredDelegate _getIsGatheringItemGathered; - - private bool IsGatheringItemGathered(uint item) + private static bool IsGatheringItemGathered(uint item) { - return _getIsGatheringItemGathered((ushort)item) != 0; + return QuestManager.IsGatheringItemGathered((ushort)item); } public GatheringJournalComponent(IDataManager dataManager, IDalamudPluginInterface pluginInterface, UiUtils uiUtils, IGameInteropProvider gameInteropProvider, GatheringPointRegistry gatheringPointRegistry) diff --git a/Questionable/Questionable/Configuration.cs b/Questionable/Questionable/Configuration.cs index 39cb0a4..47c005a 100644 --- a/Questionable/Questionable/Configuration.cs +++ b/Questionable/Questionable/Configuration.cs @@ -34,7 +34,7 @@ internal sealed class Configuration : IPluginConfiguration public bool AutoStepRefreshEnabled { get; set; } = true; - public int AutoStepRefreshDelaySeconds { get; set; } = 10; + public int AutoStepRefreshDelaySeconds { get; set; } = 60; public bool HideSeasonalEventsFromJournalProgress { get; set; } @@ -43,6 +43,8 @@ internal sealed class Configuration : IPluginConfiguration public bool ClearPriorityQuestsOnCompletion { get; set; } public bool ShowChangelogOnUpdate { get; set; } = true; + + public bool StopOnPlayerInput { get; set; } } internal sealed class StopConfiguration