From 1f8ff12dc1e2b269d66af52aab521a8162ce8278 Mon Sep 17 00:00:00 2001 From: verniy Date: Fri, 7 Aug 2026 15:23:19 -0400 Subject: [PATCH] feat: stand during spectral currents --- AutoFishingStool/AutoFishingStool.csproj | 4 +- AutoFishingStool/AutoFishingStool.json | 2 +- AutoFishingStool/Configuration.cs | 10 ++ AutoFishingStool/Plugin.cs | 215 ++++++++++++++++++++--- pluginmaster.json | 8 +- repo/AutoFishingStool/latest.zip | Bin 96000 -> 98499 bytes 6 files changed, 207 insertions(+), 32 deletions(-) create mode 100644 AutoFishingStool/Configuration.cs diff --git a/AutoFishingStool/AutoFishingStool.csproj b/AutoFishingStool/AutoFishingStool.csproj index 97b8922..1e51ad0 100644 --- a/AutoFishingStool/AutoFishingStool.csproj +++ b/AutoFishingStool/AutoFishingStool.csproj @@ -1,9 +1,9 @@ - 1.1.3.0 + 1.2.0.0 Bep - Automatically uses /sit after fishing becomes ready. + Automatically uses /sit while fishing, with an option to stand during Spectral Currents. MIT false true diff --git a/AutoFishingStool/AutoFishingStool.json b/AutoFishingStool/AutoFishingStool.json index fa1affb..57a3ec2 100644 --- a/AutoFishingStool/AutoFishingStool.json +++ b/AutoFishingStool/AutoFishingStool.json @@ -2,7 +2,7 @@ "Author": "Bep", "Name": "Auto Fishing Stool", "Punchline": "Automatically sits after entering fishing mode.", - "Description": "Uses /sit once after fishing becomes active and the current fishing action finishes.", + "Description": "Automatically uses /sit while fishing, with an option to stand during Spectral Currents.", "ApplicableVersion": "any", "RepoUrl": "https://git.bep.moe/verniy/xiv-plugins", "IconUrl": "https://git.bep.moe/verniy/xiv-plugins/raw/branch/main/AutoFishingStool/icon.png", diff --git a/AutoFishingStool/Configuration.cs b/AutoFishingStool/Configuration.cs new file mode 100644 index 0000000..696121e --- /dev/null +++ b/AutoFishingStool/Configuration.cs @@ -0,0 +1,10 @@ +using Dalamud.Configuration; + +namespace AutoFishingStool; + +public sealed class Configuration : IPluginConfiguration +{ + public int Version { get; set; } = 1; + + public bool StandDuringSpectralCurrents { get; set; } = true; +} diff --git a/AutoFishingStool/Plugin.cs b/AutoFishingStool/Plugin.cs index e89fc44..aec229e 100644 --- a/AutoFishingStool/Plugin.cs +++ b/AutoFishingStool/Plugin.cs @@ -1,8 +1,12 @@ using System; +using System.Numerics; +using Dalamud.Bindings.ImGui; +using Dalamud.Configuration; using Dalamud.Game.ClientState.Conditions; using Dalamud.IoC; using Dalamud.Plugin; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game.Event; using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.UI; @@ -10,10 +14,20 @@ namespace AutoFishingStool; public sealed unsafe class Plugin : IDalamudPlugin { + private enum PostureAction + { + None, + Sit, + Stand, + } + private const int SitDelayMilliseconds = 2500; private const int ActionSettleMilliseconds = 500; private const uint FisherClassJobId = 18; + [PluginService] + internal static IDalamudPluginInterface PluginInterface { get; private set; } = null!; + [PluginService] internal static ICondition Condition { get; private set; } = null!; @@ -26,14 +40,25 @@ public sealed unsafe class Plugin : IDalamudPlugin [PluginService] internal static IPluginLog Log { get; private set; } = null!; - private DateTime? sitAt; - private bool satThisSession; + private readonly Configuration configuration; + private DateTime? postureAt; + private PostureAction pendingPosture; + private bool satByPlugin; + private bool stoodForSpectral; + private bool spectralCurrentActive; private bool waitingForActionToFinish; + private bool configWindowOpen; public Plugin() { + configuration = PluginInterface.GetPluginConfig() as Configuration ?? new Configuration(); + spectralCurrentActive = IsSpectralCurrentActive(); + Condition.ConditionChange += OnConditionChange; Framework.Update += OnFrameworkUpdate; + PluginInterface.UiBuilder.Draw += DrawConfigWindow; + PluginInterface.UiBuilder.OpenConfigUi += OpenConfigWindow; + PluginInterface.UiBuilder.OpenMainUi += OpenConfigWindow; Log.Information("Auto Fishing Stool loaded"); } @@ -43,16 +68,14 @@ public sealed unsafe class Plugin : IDalamudPlugin { Log.Information("Fishing condition changed to {Value}", value); - if (value && Condition[ConditionFlag.Gathering] && IsFisher() && !satThisSession) + if (value && Condition[ConditionFlag.Gathering] && IsFisher() && !satByPlugin && !ShouldStandForSpectral()) { - sitAt = DateTime.UtcNow.AddMilliseconds(SitDelayMilliseconds); - waitingForActionToFinish = false; + SchedulePosture(PostureAction.Sit, SitDelayMilliseconds); Log.Information("Fishing became active; stable Sit timer started"); } - else if (!value && !satThisSession) + else if (!value && !satByPlugin) { - sitAt = null; - waitingForActionToFinish = false; + CancelPendingPosture(); Log.Information("Fishing became inactive; stable Sit timer reset"); } @@ -69,32 +92,44 @@ public sealed unsafe class Plugin : IDalamudPlugin if (!IsFisher()) return; - satThisSession = false; - sitAt = null; - waitingForActionToFinish = false; + satByPlugin = false; + stoodForSpectral = false; + CancelPendingPosture(); Log.Information("Fisher gathering session started"); return; } - sitAt = null; - satThisSession = false; - waitingForActionToFinish = false; + satByPlugin = false; + stoodForSpectral = false; + CancelPendingPosture(); } private void OnFrameworkUpdate(IFramework framework) { - if (satThisSession || sitAt is null) + UpdateSpectralCurrentState(); + + if (pendingPosture == PostureAction.None || postureAt is null) return; if (!Condition[ConditionFlag.Gathering] || !Condition[ConditionFlag.Fishing] || !IsFisher()) { - sitAt = null; - satThisSession = false; - waitingForActionToFinish = false; + CancelPendingPosture(); return; } - if (DateTime.UtcNow < sitAt.Value) + if (pendingPosture == PostureAction.Sit && ShouldStandForSpectral()) + { + CancelPendingPosture(); + return; + } + + if (pendingPosture == PostureAction.Stand && !ShouldStandForSpectral()) + { + CancelPendingPosture(); + return; + } + + if (DateTime.UtcNow < postureAt.Value) return; if (Condition[ConditionFlag.ExecutingGatheringAction]) @@ -111,16 +146,18 @@ public sealed unsafe class Plugin : IDalamudPlugin if (waitingForActionToFinish) { waitingForActionToFinish = false; - sitAt = DateTime.UtcNow.AddMilliseconds(ActionSettleMilliseconds); - Log.Information("Fishing action finished; Sit command scheduled after settling"); + postureAt = DateTime.UtcNow.AddMilliseconds(ActionSettleMilliseconds); + Log.Information("Fishing action finished; posture command scheduled after settling"); return; } + var completedPosture = pendingPosture; + var uiModule = UIModule.Instance(); if (uiModule is null) { Log.Warning("Could not access the game's UI module"); - sitAt = null; + CancelPendingPosture(); return; } @@ -128,17 +165,142 @@ public sealed unsafe class Plugin : IDalamudPlugin try { uiModule->ProcessChatBoxEntry(command); - Log.Information("Submitted /sit after fishing started"); + Log.Information("Submitted /sit to {Posture}", completedPosture); } finally { command->Dtor(true); } - satThisSession = true; - sitAt = null; + + if (completedPosture == PostureAction.Sit) + { + satByPlugin = true; + stoodForSpectral = false; + } + else + { + satByPlugin = false; + stoodForSpectral = true; + } + + CancelPendingPosture(); + } + + private void UpdateSpectralCurrentState() + { + var active = IsSpectralCurrentActive(); + if (active == spectralCurrentActive) + return; + + spectralCurrentActive = active; + Log.Information("Spectral Current changed to {Value}", active); + + if (!configuration.StandDuringSpectralCurrents) + return; + + if (active) + { + if (pendingPosture == PostureAction.Sit) + CancelPendingPosture(); + + if (satByPlugin) + SchedulePosture(PostureAction.Stand, 0); + + return; + } + + if (stoodForSpectral && Condition[ConditionFlag.Gathering] && Condition[ConditionFlag.Fishing] && IsFisher()) + SchedulePosture(PostureAction.Sit, ActionSettleMilliseconds); + } + + private static bool IsSpectralCurrentActive() + { + try + { + var eventFramework = EventFramework.Instance(); + var oceanFishing = eventFramework is null ? null : eventFramework->GetInstanceContentOceanFishing(); + return oceanFishing is not null && oceanFishing->SpectralCurrentActive; + } + catch (Exception exception) + { + Log.Warning(exception, "Could not read Ocean Fishing state"); + return false; + } + } + + private bool ShouldStandForSpectral() + { + return configuration.StandDuringSpectralCurrents && spectralCurrentActive; + } + + private void SchedulePosture(PostureAction posture, int delayMilliseconds) + { + pendingPosture = posture; + postureAt = DateTime.UtcNow.AddMilliseconds(delayMilliseconds); waitingForActionToFinish = false; } + private void CancelPendingPosture() + { + pendingPosture = PostureAction.None; + postureAt = null; + waitingForActionToFinish = false; + } + + private void OpenConfigWindow() + { + configWindowOpen = true; + } + + private void DrawConfigWindow() + { + if (!configWindowOpen) + return; + + ImGui.SetNextWindowSize(new Vector2(430, 0), ImGuiCond.FirstUseEver); + if (!ImGui.Begin("Auto Fishing Stool Settings###AutoFishingStoolSettings", ref configWindowOpen, ImGuiWindowFlags.AlwaysAutoResize)) + { + ImGui.End(); + return; + } + + var standDuringSpectralCurrents = configuration.StandDuringSpectralCurrents; + if (ImGui.Checkbox("Stand during Spectral Currents", ref standDuringSpectralCurrents)) + { + configuration.StandDuringSpectralCurrents = standDuringSpectralCurrents; + PluginInterface.SavePluginConfig(configuration); + ApplySpectralSettingChange(); + } + + ImGui.TextWrapped("Stand while a Spectral Current is active, then sit again when it ends."); + ImGui.Separator(); + ImGui.Text($"Spectral Current detected: {(spectralCurrentActive ? "Yes" : "No")}"); + ImGui.End(); + } + + private void ApplySpectralSettingChange() + { + if (!spectralCurrentActive) + return; + + if (configuration.StandDuringSpectralCurrents) + { + if (pendingPosture == PostureAction.Sit) + CancelPendingPosture(); + + if (satByPlugin) + SchedulePosture(PostureAction.Stand, 0); + + return; + } + + if (pendingPosture == PostureAction.Stand) + CancelPendingPosture(); + + if (stoodForSpectral && Condition[ConditionFlag.Gathering] && Condition[ConditionFlag.Fishing] && IsFisher()) + SchedulePosture(PostureAction.Sit, ActionSettleMilliseconds); + } + private static bool IsFisher() { return PlayerState.IsLoaded && PlayerState.ClassJob.RowId == FisherClassJobId; @@ -148,5 +310,8 @@ public sealed unsafe class Plugin : IDalamudPlugin { Condition.ConditionChange -= OnConditionChange; Framework.Update -= OnFrameworkUpdate; + PluginInterface.UiBuilder.Draw -= DrawConfigWindow; + PluginInterface.UiBuilder.OpenConfigUi -= OpenConfigWindow; + PluginInterface.UiBuilder.OpenMainUi -= OpenConfigWindow; } } diff --git a/pluginmaster.json b/pluginmaster.json index aafa731..dd89b01 100644 --- a/pluginmaster.json +++ b/pluginmaster.json @@ -3,9 +3,9 @@ "Author": "Bep", "Name": "Auto Fishing Stool", "InternalName": "AutoFishingStool", - "AssemblyVersion": "1.1.3.0", + "AssemblyVersion": "1.2.0.0", "TestingAssemblyVersion": null, - "Description": "Uses /sit once after fishing becomes active and the current fishing action finishes.", + "Description": "Automatically uses /sit while fishing, with an option to stand during Spectral Currents.", "Punchline": "Automatically sits after entering fishing mode.", "RepoUrl": "https://git.bep.moe/verniy/xiv-plugins", "ApplicableVersion": "any", @@ -14,12 +14,12 @@ "IsTestingExclusive": false, "DownloadLinkInstall": "https://git.bep.moe/verniy/xiv-plugins/raw/branch/main/repo/AutoFishingStool/latest.zip", "DownloadLinkUpdate": "https://git.bep.moe/verniy/xiv-plugins/raw/branch/main/repo/AutoFishingStool/latest.zip", - "LastUpdate": "1786068591", + "LastUpdate": "1786130579", "IconUrl": "https://git.bep.moe/verniy/xiv-plugins/raw/branch/main/AutoFishingStool/icon.png", "Tags": [ "fishing", "utility" ], - "Changelog": "Initial custom repository release." + "Changelog": "Add a setting to stand during Spectral Currents and sit again afterward." } ] diff --git a/repo/AutoFishingStool/latest.zip b/repo/AutoFishingStool/latest.zip index d9f9def3b0c317974133813e3ab4f568f2c06969..d450fb4a42d4facd2bc3c778667afa63a13e0c46 100644 GIT binary patch delta 15485 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 XS*~Eh;LE%zJFZ}OQ02gXM1%ehK7wK_ delta 12994 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