From 36c52f433b7f0d36f40ffc97c9ec90250bc6527e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 13 Sep 2023 15:16:28 +0200 Subject: [PATCH 1/2] Character post processing --- ARDiscard/AutoDiscardPlogon.cs | 96 +++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/ARDiscard/AutoDiscardPlogon.cs b/ARDiscard/AutoDiscardPlogon.cs index e22a102..9085337 100644 --- a/ARDiscard/AutoDiscardPlogon.cs +++ b/ARDiscard/AutoDiscardPlogon.cs @@ -56,36 +56,52 @@ public class AutoDiscardPlogon : IDalamudPlugin _autoRetainerApi = new(); _taskManager = new(); - _autoRetainerApi.OnRetainerReadyToPostprocess += DoPostProcess; - _autoRetainerApi.OnRetainerPostprocessStep += CheckPostProcess; + _autoRetainerApi.OnRetainerPostprocessStep += CheckRetainerPostProcess; + _autoRetainerApi.OnRetainerReadyToPostprocess += DoRetainerPostProcess; + _autoRetainerApi.OnCharacterPostprocessStep += CheckCharacterPostProcess; + _autoRetainerApi.OnCharacterReadyToPostProcess += DoCharacterPostProcess; } public string Name => "Discard after AutoRetainer"; - private unsafe void CheckPostProcess(string retainerName) + private void CheckRetainerPostProcess(string retainerName) => + CheckPostProcessInternal(PostProcessType.Retainer, retainerName); + + private void CheckCharacterPostProcess() => + CheckPostProcessInternal(PostProcessType.Character, "current character"); + + private unsafe void CheckPostProcessInternal(PostProcessType type, string name) { if (!_configuration.RunAfterVenture) { - PluginLog.Information($"Not running post-venture tasks for {retainerName}, disabled globally"); + PluginLog.Information($"Not running post-venture tasks for {name}, disabled globally"); } else if (_configuration.ExcludedCharacters.Any(x => x.LocalContentId == _clientState.LocalContentId)) { - PluginLog.Information($"Not running post-venture tasks for {retainerName}, disabled for current character"); + PluginLog.Information($"Not running post-venture tasks for {name}, disabled for current character"); } else if (_inventoryUtils.GetNextItemToDiscard() == null) { - PluginLog.Information($"Not running post-venture tasks for {retainerName}, no items to discard"); + PluginLog.Information($"Not running post-venture tasks for {name}, no items to discard"); } else { - PluginLog.Information($"Requesting post-processing for {retainerName}"); - _autoRetainerApi.RequestPostprocess(); + PluginLog.Information($"Requesting post-processing for {name}"); + if (type == PostProcessType.Retainer) + _autoRetainerApi.RequestRetainerPostprocess(); + else if (type == PostProcessType.Character) + _autoRetainerApi.RequestCharacterPostprocess(); } } - private void DoPostProcess(string retainerName) + private void DoRetainerPostProcess(string retainerName) { - _taskManager.Enqueue(() => DiscardNextItem(true)); + _taskManager.Enqueue(() => DiscardNextItem(PostProcessType.Retainer)); + } + + private void DoCharacterPostProcess() + { + _taskManager.Enqueue(() => DiscardNextItem(PostProcessType.Character)); } private void OpenConfig(string command, string arguments) => OpenConfigUi(); @@ -97,18 +113,20 @@ public class AutoDiscardPlogon : IDalamudPlugin private void ProcessCommand(string command, string arguments) { - _taskManager.Enqueue(() => DiscardNextItem(false)); + _taskManager.Enqueue(() => DiscardNextItem(PostProcessType.FromCommand)); } - private unsafe void DiscardNextItem(bool finishRetainerAction) + private unsafe void DiscardNextItem(PostProcessType type) { - PluginLog.Information($"DiscardNextItem (retainer = {finishRetainerAction})"); + PluginLog.Information($"DiscardNextItem (type = {type})"); InventoryItem* nextItem = _inventoryUtils.GetNextItemToDiscard(); if (nextItem == null) { PluginLog.Information($"No item to discard found"); - if (finishRetainerAction) - _autoRetainerApi.FinishPostProcess(); + if (type == PostProcessType.Retainer) + _autoRetainerApi.FinishRetainerPostProcess(); + else if (type == PostProcessType.Character) + _autoRetainerApi.FinishCharacterPostProcess(); else _chatGui.Print("Done discarding."); } @@ -122,11 +140,11 @@ public class AutoDiscardPlogon : IDalamudPlugin _cancelDiscardAfter = DateTime.Now.AddSeconds(15); _taskManager.DelayNext(20); - _taskManager.Enqueue(() => ConfirmDiscardItem(finishRetainerAction, inventoryType, slot)); + _taskManager.Enqueue(() => ConfirmDiscardItem(type, inventoryType, slot)); } } - private unsafe void ConfirmDiscardItem(bool finishRetainerAction, InventoryType inventoryType, short slot) + private unsafe void ConfirmDiscardItem(PostProcessType type, InventoryType inventoryType, short slot) { var addon = GetDiscardAddon(); if (addon != null) @@ -136,7 +154,7 @@ public class AutoDiscardPlogon : IDalamudPlugin ClickSelectYesNo.Using((nint)addon).Yes(); _taskManager.DelayNext(20); - _taskManager.Enqueue(() => ContinueAfterDiscard(finishRetainerAction, inventoryType, slot)); + _taskManager.Enqueue(() => ContinueAfterDiscard(type, inventoryType, slot)); } else { @@ -144,8 +162,10 @@ public class AutoDiscardPlogon : IDalamudPlugin if (nextItem == null) { PluginLog.Information("Addon is not visible, but next item is also no longer set"); - if (finishRetainerAction) - _autoRetainerApi.FinishPostProcess(); + if (type == PostProcessType.Retainer) + _autoRetainerApi.FinishRetainerPostProcess(); + else if (type == PostProcessType.Character) + _autoRetainerApi.FinishCharacterPostProcess(); else _chatGui.Print("Done discarding."); } @@ -154,26 +174,28 @@ public class AutoDiscardPlogon : IDalamudPlugin PluginLog.Information( $"Addon is not (yet) visible, still trying to discard item in slot {slot} in inventory {inventoryType}"); _taskManager.DelayNext(100); - _taskManager.Enqueue(() => ConfirmDiscardItem(finishRetainerAction, inventoryType, slot)); + _taskManager.Enqueue(() => ConfirmDiscardItem(type, inventoryType, slot)); } else { PluginLog.Information( $"Addon is not (yet) visible, but slot or inventory type changed, retrying from start"); _taskManager.DelayNext(100); - _taskManager.Enqueue(() => DiscardNextItem(finishRetainerAction)); + _taskManager.Enqueue(() => DiscardNextItem(type)); } } } - private unsafe void ContinueAfterDiscard(bool finishRetainerAction, InventoryType inventoryType, short slot) + private unsafe void ContinueAfterDiscard(PostProcessType type, InventoryType inventoryType, short slot) { InventoryItem* nextItem = _inventoryUtils.GetNextItemToDiscard(); if (nextItem == null) { - PluginLog.Information($"Continuing after discard: no next item (retainer = {finishRetainerAction})"); - if (finishRetainerAction) - _autoRetainerApi.FinishPostProcess(); + PluginLog.Information($"Continuing after discard: no next item (type = {type})"); + if (type == PostProcessType.Retainer) + _autoRetainerApi.FinishRetainerPostProcess(); + else if (type == PostProcessType.Character) + _autoRetainerApi.FinishCharacterPostProcess(); else _chatGui.Print("Done discarding."); } @@ -182,8 +204,10 @@ public class AutoDiscardPlogon : IDalamudPlugin if (_cancelDiscardAfter < DateTime.Now) { PluginLog.Information("No longer waiting for plugin to pop up, assume discard failed"); - if (finishRetainerAction) - _autoRetainerApi.FinishPostProcess(); + if (type == PostProcessType.Retainer) + _autoRetainerApi.FinishRetainerPostProcess(); + else if (type == PostProcessType.Character) + _autoRetainerApi.FinishCharacterPostProcess(); else _chatGui.PrintError("Discarding probably failed due to an error."); } @@ -191,18 +215,23 @@ public class AutoDiscardPlogon : IDalamudPlugin { PluginLog.Information($"ContinueAfterDiscard: Waiting for server response until {_cancelDiscardAfter}"); _taskManager.DelayNext(20); - _taskManager.Enqueue(() => ContinueAfterDiscard(finishRetainerAction, inventoryType, slot)); + _taskManager.Enqueue(() => ContinueAfterDiscard(type, inventoryType, slot)); } } else { PluginLog.Information($"ContinueAfterDiscard: Discovered different item to discard"); - _taskManager.EnqueueImmediate(() => DiscardNextItem(finishRetainerAction)); + _taskManager.EnqueueImmediate(() => DiscardNextItem(type)); } } public void Dispose() { + _autoRetainerApi.OnRetainerPostprocessStep -= CheckRetainerPostProcess; + _autoRetainerApi.OnRetainerReadyToPostprocess -= DoRetainerPostProcess; + _autoRetainerApi.OnCharacterPostprocessStep -= CheckCharacterPostProcess; + _autoRetainerApi.OnCharacterReadyToPostProcess -= DoCharacterPostProcess; + _autoRetainerApi.Dispose(); ECommonsMain.Dispose(); @@ -240,4 +269,11 @@ public class AutoDiscardPlogon : IDalamudPlugin return null; } + + public enum PostProcessType + { + Retainer, + Character, + FromCommand, + } } From 2025b0253d323adcf524c0431b96993ba7f7846f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 13 Sep 2023 20:26:48 +0200 Subject: [PATCH 2/2] Character post processing settings --- ARDiscard/ARDiscard.csproj | 2 +- ARDiscard/AutoDiscardPlogon.cs | 8 ++++---- ARDiscard/ConfigWindow.cs | 9 ++++++++- ARDiscard/Configuration.cs | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ARDiscard/ARDiscard.csproj b/ARDiscard/ARDiscard.csproj index c2f432d..736fba3 100644 --- a/ARDiscard/ARDiscard.csproj +++ b/ARDiscard/ARDiscard.csproj @@ -17,7 +17,7 @@ $(appdata)\XIVLauncher\addon\Hooks\dev\ - $(appdata)\XIVLauncher\installedPlugins\AutoRetainer\4.1.0.9\ + $(appdata)\XIVLauncher\installedPlugins\AutoRetainer\4.1.1.1\ diff --git a/ARDiscard/AutoDiscardPlogon.cs b/ARDiscard/AutoDiscardPlogon.cs index 9085337..8a0331f 100644 --- a/ARDiscard/AutoDiscardPlogon.cs +++ b/ARDiscard/AutoDiscardPlogon.cs @@ -65,14 +65,14 @@ public class AutoDiscardPlogon : IDalamudPlugin public string Name => "Discard after AutoRetainer"; private void CheckRetainerPostProcess(string retainerName) => - CheckPostProcessInternal(PostProcessType.Retainer, retainerName); + CheckPostProcessInternal(PostProcessType.Retainer, retainerName, _configuration.RunAfterVenture); private void CheckCharacterPostProcess() => - CheckPostProcessInternal(PostProcessType.Character, "current character"); + CheckPostProcessInternal(PostProcessType.Character, "current character", _configuration.RunBeforeLogout); - private unsafe void CheckPostProcessInternal(PostProcessType type, string name) + private unsafe void CheckPostProcessInternal(PostProcessType type, string name, bool enabled) { - if (!_configuration.RunAfterVenture) + if (!enabled) { PluginLog.Information($"Not running post-venture tasks for {name}, disabled globally"); } diff --git a/ARDiscard/ConfigWindow.cs b/ARDiscard/ConfigWindow.cs index 83c6b35..2956388 100644 --- a/ARDiscard/ConfigWindow.cs +++ b/ARDiscard/ConfigWindow.cs @@ -57,6 +57,13 @@ public class ConfigWindow : Window Save(); } + bool runBeforeLogout = _configuration.RunBeforeLogout; + if (ImGui.Checkbox("[Global] Run before logging out in Multi-Mode", ref runBeforeLogout)) + { + _configuration.RunBeforeLogout = runBeforeLogout; + Save(); + } + if (ImGui.BeginTabBar("AutoDiscardTabs")) { DrawDiscardList(); @@ -181,7 +188,7 @@ public class ConfigWindow : Window } else { - if (_configuration.RunAfterVenture) + if (_configuration.RunAfterVenture || _configuration.RunBeforeLogout) { ImGui.TextColored(ImGuiColors.HealerGreen, "This character is currently included (and will be post-processed in autoretainer)."); diff --git a/ARDiscard/Configuration.cs b/ARDiscard/Configuration.cs index b5e1fae..60ed387 100644 --- a/ARDiscard/Configuration.cs +++ b/ARDiscard/Configuration.cs @@ -7,6 +7,7 @@ public class Configuration : IPluginConfiguration { public int Version { get; set; } = 1; public bool RunAfterVenture { get; set; } + public bool RunBeforeLogout { get; set; } public List DiscardingItems { get; set; } = new(); public List ExcludedCharacters { get; set; } = new();