This commit is contained in:
Liza 2023-10-04 10:37:09 +02:00
parent 1ffeb4ae14
commit 33f3639ea9
Signed by: liza
GPG Key ID: 7199F8D727D55F67
8 changed files with 65 additions and 82 deletions

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<Version>2.5</Version>
<Version>3.0</Version>
<LangVersion>11.0</LangVersion>
<Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
@ -17,7 +17,7 @@
<PropertyGroup>
<DalamudLibPath>$(appdata)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
<AutoRetainerLibPath>$(appdata)\XIVLauncher\installedPlugins\AutoRetainer\4.1.2.3\</AutoRetainerLibPath>
<AutoRetainerLibPath>$(appdata)\XIVLauncher\installedPlugins\AutoRetainer\4.2.0.2\</AutoRetainerLibPath>
</PropertyGroup>
<PropertyGroup Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'">
@ -25,8 +25,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dalamud.ContextMenu" Version="1.2.3"/>
<PackageReference Include="DalamudPackager" Version="2.1.11"/>
<PackageReference Include="Dalamud.ContextMenu" Version="1.3.1" />
<PackageReference Include="DalamudPackager" Version="2.1.12"/>
</ItemGroup>
<ItemGroup>
@ -38,10 +38,6 @@
<HintPath>$(DalamudLibPath)ImGui.NET.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="ImGuiScene">
<HintPath>$(DalamudLibPath)ImGuiScene.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="Lumina">
<HintPath>$(DalamudLibPath)Lumina.dll</HintPath>
<Private>false</Private>
@ -58,10 +54,6 @@
<HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="FFXIVClientStructs">
<HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="AutoRetainerAPI">
<HintPath>$(AutoRetainerLibPath)AutoRetainerAPI.dll</HintPath>
</Reference>

View File

@ -5,18 +5,13 @@ using ARDiscard.GameData;
using ARDiscard.Windows;
using AutoRetainerAPI;
using ClickLib.Clicks;
using Dalamud.Data;
using Dalamud.Game.ClientState;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.Command;
using Dalamud.Game.Gui;
using Dalamud.Interface.Windowing;
using Dalamud.Logging;
using Dalamud.Memory;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using ECommons;
using ECommons.Automation;
using ECommons.DalamudServices;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Component.GUI;
@ -32,9 +27,11 @@ public class AutoDiscardPlogon : IDalamudPlugin
private readonly DiscardWindow _discardWindow;
private readonly DalamudPluginInterface _pluginInterface;
private readonly ChatGui _chatGui;
private readonly ClientState _clientState;
private readonly CommandManager _commandManager;
private readonly IChatGui _chatGui;
private readonly IClientState _clientState;
private readonly IPluginLog _pluginLog;
private readonly IGameGui _gameGui;
private readonly ICommandManager _commandManager;
private readonly InventoryUtils _inventoryUtils;
private readonly AutoRetainerApi _autoRetainerApi;
private readonly TaskManager _taskManager;
@ -42,8 +39,8 @@ public class AutoDiscardPlogon : IDalamudPlugin
private DateTime _cancelDiscardAfter = DateTime.MaxValue;
public AutoDiscardPlogon(DalamudPluginInterface pluginInterface, CommandManager commandManager, ChatGui chatGui,
DataManager dataManager, ClientState clientState, Condition condition)
public AutoDiscardPlogon(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IChatGui chatGui,
IDataManager dataManager, IClientState clientState, ICondition condition, IPluginLog pluginLog, IGameGui gameGui)
{
ItemCache itemCache = new ItemCache(dataManager);
@ -51,6 +48,8 @@ public class AutoDiscardPlogon : IDalamudPlugin
_configuration = (Configuration?)_pluginInterface.GetPluginConfig() ?? new Configuration();
_chatGui = chatGui;
_clientState = clientState;
_pluginLog = pluginLog;
_gameGui = gameGui;
_commandManager = commandManager;
_commandManager.AddHandler("/discardconfig", new CommandInfo(OpenConfig)
{
@ -64,7 +63,7 @@ public class AutoDiscardPlogon : IDalamudPlugin
{
HelpMessage = "Show what will be discarded with your current configuration",
});
_inventoryUtils = new InventoryUtils(_configuration, itemCache);
_inventoryUtils = new InventoryUtils(_configuration, itemCache, _pluginLog);
_pluginInterface.UiBuilder.Draw += _windowSystem.Draw;
_pluginInterface.UiBuilder.OpenConfigUi += OpenConfigUi;
@ -84,7 +83,7 @@ public class AutoDiscardPlogon : IDalamudPlugin
ECommonsMain.Init(_pluginInterface, this);
_autoRetainerApi = new();
_taskManager = new();
_contextMenuIntegration = new(_configuration, _configWindow);
_contextMenuIntegration = new(_pluginInterface, _configuration, _configWindow);
_clientState.Login += _discardWindow.Login;
_clientState.Logout += _discardWindow.Logout;
@ -94,8 +93,6 @@ public class AutoDiscardPlogon : IDalamudPlugin
_autoRetainerApi.OnCharacterReadyToPostProcess += DoCharacterPostProcess;
}
public string Name => "Discard after AutoRetainer";
private void CheckRetainerPostProcess(string retainerName) =>
CheckPostProcessInternal(PostProcessType.Retainer, retainerName, _configuration.RunAfterVenture);
@ -106,19 +103,19 @@ public class AutoDiscardPlogon : IDalamudPlugin
{
if (!enabled)
{
PluginLog.Information($"Not running post-venture tasks for {name}, 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 {name}, disabled for current character");
_pluginLog.Information($"Not running post-venture tasks for {name}, disabled for current character");
}
else if (_inventoryUtils.GetNextItemToDiscard(ItemFilter.None) == null)
{
PluginLog.Information($"Not running post-venture tasks for {name}, no items to discard");
_pluginLog.Information($"Not running post-venture tasks for {name}, no items to discard");
}
else
{
PluginLog.Information($"Requesting post-processing for {name}");
_pluginLog.Information($"Requesting post-processing for {name}");
if (type == PostProcessType.Retainer)
_autoRetainerApi.RequestRetainerPostprocess();
else if (type == PostProcessType.Character)
@ -155,20 +152,20 @@ public class AutoDiscardPlogon : IDalamudPlugin
private unsafe void DiscardNextItem(PostProcessType type, ItemFilter? itemFilter)
{
PluginLog.Information($"DiscardNextItem (type = {type})");
_pluginLog.Information($"DiscardNextItem (type = {type})");
_discardWindow.Locked = true;
InventoryItem* nextItem = _inventoryUtils.GetNextItemToDiscard(itemFilter);
if (nextItem == null)
{
PluginLog.Information($"No item to discard found");
_pluginLog.Information($"No item to discard found");
FinishDiscarding(type);
}
else
{
var (inventoryType, slot) = (nextItem->Container, nextItem->Slot);
PluginLog.Information(
_pluginLog.Information(
$"Discarding itemId {nextItem->ItemID} in slot {nextItem->Slot} of container {nextItem->Container}.");
_inventoryUtils.Discard(nextItem);
_cancelDiscardAfter = DateTime.Now.AddSeconds(15);
@ -184,7 +181,7 @@ public class AutoDiscardPlogon : IDalamudPlugin
var addon = GetDiscardAddon();
if (addon != null)
{
PluginLog.Information("Addon is visible, clicking 'yes'");
_pluginLog.Information("Addon is visible, clicking 'yes'");
((AddonSelectYesno*)addon)->YesButton->AtkComponentBase.SetEnabledState(true);
ClickSelectYesNo.Using((nint)addon).Yes();
@ -196,19 +193,19 @@ public class AutoDiscardPlogon : IDalamudPlugin
InventoryItem* nextItem = _inventoryUtils.GetNextItemToDiscard(itemFilter);
if (nextItem == null)
{
PluginLog.Information("Addon is not visible, but next item is also no longer set");
_pluginLog.Information("Addon is not visible, but next item is also no longer set");
FinishDiscarding(type);
}
else if (nextItem->Container == inventoryType && nextItem->Slot == slot)
{
PluginLog.Information(
_pluginLog.Information(
$"Addon is not (yet) visible, still trying to discard item in slot {slot} in inventory {inventoryType}");
_taskManager.DelayNext(100);
_taskManager.Enqueue(() => ConfirmDiscardItem(type, itemFilter, inventoryType, slot));
}
else
{
PluginLog.Information(
_pluginLog.Information(
$"Addon is not (yet) visible, but slot or inventory type changed, retrying from start");
_taskManager.DelayNext(100);
_taskManager.Enqueue(() => DiscardNextItem(type, itemFilter));
@ -222,26 +219,26 @@ public class AutoDiscardPlogon : IDalamudPlugin
InventoryItem* nextItem = _inventoryUtils.GetNextItemToDiscard(itemFilter);
if (nextItem == null)
{
PluginLog.Information($"Continuing after discard: no next item (type = {type})");
_pluginLog.Information($"Continuing after discard: no next item (type = {type})");
FinishDiscarding(type);
}
else if (nextItem->Container == inventoryType && nextItem->Slot == slot)
{
if (_cancelDiscardAfter < DateTime.Now)
{
PluginLog.Information("No longer waiting for plugin to pop up, assume discard failed");
_pluginLog.Information("No longer waiting for plugin to pop up, assume discard failed");
FinishDiscarding(type, "Discarding probably failed due to an error.");
}
else
{
PluginLog.Information($"ContinueAfterDiscard: Waiting for server response until {_cancelDiscardAfter}");
_pluginLog.Information($"ContinueAfterDiscard: Waiting for server response until {_cancelDiscardAfter}");
_taskManager.DelayNext(20);
_taskManager.Enqueue(() => ContinueAfterDiscard(type, itemFilter, inventoryType, slot));
}
}
else
{
PluginLog.Information($"ContinueAfterDiscard: Discovered different item to discard");
_pluginLog.Information($"ContinueAfterDiscard: Discovered different item to discard");
_taskManager.EnqueueImmediate(() => DiscardNextItem(type, itemFilter));
}
}
@ -284,19 +281,19 @@ public class AutoDiscardPlogon : IDalamudPlugin
_commandManager.RemoveHandler("/discardconfig");
}
private static unsafe AtkUnitBase* GetDiscardAddon()
private unsafe AtkUnitBase* GetDiscardAddon()
{
for (int i = 1; i < 100; i++)
{
try
{
var addon = (AtkUnitBase*)Svc.GameGui.GetAddonByName("SelectYesno", i);
var addon = (AtkUnitBase*)_gameGui.GetAddonByName("SelectYesno", i);
if (addon == null) return null;
if (addon->IsVisible && addon->UldManager.LoadedState == AtkLoadState.Loaded)
{
var textNode = addon->UldManager.NodeList[15]->GetAsAtkTextNode();
var text = MemoryHelper.ReadSeString(&textNode->NodeText).ExtractText();
PluginLog.Information($"YesNo prompt: {text}");
_pluginLog.Information($"YesNo prompt: {text}");
if (text.StartsWith("Discard"))
{
return addon;

View File

@ -6,6 +6,7 @@ using ARDiscard.Windows;
using Dalamud.ContextMenu;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
namespace ARDiscard;
@ -18,7 +19,7 @@ internal sealed class ContextMenuIntegration : IDisposable
private readonly InventoryContextMenuItem _removeItem;
private readonly DalamudContextMenu _dalamudContextMenu;
public ContextMenuIntegration(Configuration configuration, ConfigWindow configWindow)
public ContextMenuIntegration(DalamudPluginInterface pluginInterface, Configuration configuration, ConfigWindow configWindow)
{
_configuration = configuration;
_configWindow = configWindow;
@ -33,7 +34,7 @@ internal sealed class ContextMenuIntegration : IDisposable
.Append(new UIForegroundPayload(0)).Append("Remove from Auto Discard List"),
RemoveFromDiscardList);
_dalamudContextMenu = new();
_dalamudContextMenu = new(pluginInterface);
_dalamudContextMenu.OnOpenInventoryContextMenu += OpenInventoryContextMenu;
}

View File

@ -1,8 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Dalamud.Logging;
using Dalamud.Utility.Signatures;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
@ -38,18 +37,13 @@ internal sealed class InventoryUtils
private readonly Configuration _configuration;
private readonly ItemCache _itemCache;
private readonly IPluginLog _pluginLog;
private unsafe delegate void DiscardItemDelegate(AgentInventoryContext* inventoryManager, InventoryItem* itemSlot,
InventoryType inventory, int slot, uint addonId, int position = -1);
[Signature("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 85 C0 74 ?? 0F B7 48")]
private DiscardItemDelegate _discardItem = null!;
public InventoryUtils(Configuration configuration, ItemCache itemCache)
public InventoryUtils(Configuration configuration, ItemCache itemCache, IPluginLog pluginLog)
{
_configuration = configuration;
_itemCache = itemCache;
SignatureHelper.Initialise(this);
_pluginLog = pluginLog;
}
public unsafe List<ItemWrapper> GetAllItemsToDiscard()
@ -129,7 +123,7 @@ internal sealed class InventoryUtils
//PluginLog.Verbose($"{i} → {item->ItemID}");
if (_configuration.DiscardingItems.Contains(item->ItemID))
{
PluginLog.Information(
_pluginLog.Information(
$"Found item {item->ItemID} to discard in inventory {inventoryType} in slot {i}");
toDiscard.Add(new ItemWrapper { InventoryItem = item });
}
@ -168,7 +162,7 @@ internal sealed class InventoryUtils
gearset->Neck,
gearset->Wrists,
gearset->RingRight,
gearset->RightLeft, // why is this called RightLeft
gearset->RingLeft,
};
foreach (var gearsetItem in gearsetItems)
{
@ -186,7 +180,7 @@ internal sealed class InventoryUtils
if (InternalConfiguration.BlacklistedItems.Contains(item->ItemID))
throw new Exception($"Can't discard {item->ItemID}");
_discardItem(AgentInventoryContext.Instance(), item, item->Container, item->Slot, 0);
AgentInventoryContext.Instance()->DiscardItem(item, item->Container, item->Slot, 0);
}
public sealed unsafe class ItemWrapper

View File

@ -1,5 +1,5 @@
using System.Collections.Generic;
using Dalamud.Data;
using Dalamud.Plugin.Services;
using Lumina.Excel.GeneratedSheets;
namespace ARDiscard.GameData;
@ -8,7 +8,7 @@ internal sealed class ItemCache
{
private readonly Dictionary<uint, CachedItemInfo> _items = new();
public ItemCache(DataManager dataManager)
public ItemCache(IDataManager dataManager)
{
foreach (var item in dataManager.GetExcelSheet<Item>()!)
{

View File

@ -3,15 +3,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using ARDiscard.GameData;
using Dalamud.Game.ClientState;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using ECommons;
using ImGuiNET;
using Condition = Dalamud.Game.ClientState.Conditions.Condition;
namespace ARDiscard.Windows;
@ -20,8 +19,8 @@ internal sealed class ConfigWindow : Window
private readonly DalamudPluginInterface _pluginInterface;
private readonly Configuration _configuration;
private readonly ItemCache _itemCache;
private readonly ClientState _clientState;
private readonly Condition _condition;
private readonly IClientState _clientState;
private readonly ICondition _condition;
private string _itemName = string.Empty;
private List<(uint ItemId, string Name)> _searchResults = new();
@ -33,7 +32,7 @@ internal sealed class ConfigWindow : Window
public event EventHandler? ConfigSaved;
public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, ItemCache itemCache,
ClientState clientState, Condition condition)
IClientState clientState, ICondition condition)
: base("Auto Discard###AutoDiscardConfig")
{
_pluginInterface = pluginInterface;

View File

@ -2,10 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using ARDiscard.GameData;
using Dalamud.Game.ClientState;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Interface;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Common.Math;
using ImGuiNET;
@ -15,16 +15,16 @@ internal sealed class DiscardWindow : Window
{
private readonly InventoryUtils _inventoryUtils;
private readonly ItemCache _itemCache;
private readonly ClientState _clientState;
private readonly Condition _condition;
private readonly IClientState _clientState;
private readonly ICondition _condition;
private List<SelectableItem> _displayedItems = new();
public event EventHandler? OpenConfigurationClicked;
public event EventHandler<ItemFilter>? DiscardAllClicked;
public DiscardWindow(InventoryUtils inventoryUtils, ItemCache itemCache, ClientState clientState,
Condition condition)
public DiscardWindow(InventoryUtils inventoryUtils, ItemCache itemCache, IClientState clientState,
ICondition condition)
: base("Discard Items")
{
_inventoryUtils = inventoryUtils;
@ -140,7 +140,7 @@ internal sealed class DiscardWindow : Window
}
}
public void Login(object? sender, EventArgs e) => RefreshInventory(false);
public void Login() => RefreshInventory(false);
public void Logout(object? sender, EventArgs e) => _displayedItems.Clear();
public void Logout() => _displayedItems.Clear();
}

View File

@ -4,15 +4,15 @@
"net7.0-windows7.0": {
"Dalamud.ContextMenu": {
"type": "Direct",
"requested": "[1.2.3, )",
"resolved": "1.2.3",
"contentHash": "ydemplF7DNcA/LLeongDVzWUD/JV0Fw3EwA2+P0jYq3Le2ZYSt4U8qyJq4FyoChqt0lFG8BxYCAzfeWp4Jmnqw=="
"requested": "[1.3.1, )",
"resolved": "1.3.1",
"contentHash": "ptAxut5PiLnzZ4G/KQdHJVcyklC/BF3otHJ7zYVUPiKBjsOCoF0n/6h2jK7e+8ev2Y1yAY3Wtx2GuXLFQgt9Uw=="
},
"DalamudPackager": {
"type": "Direct",
"requested": "[2.1.11, )",
"resolved": "2.1.11",
"contentHash": "9qlAWoRRTiL/geAvuwR/g6Bcbrd/bJJgVnB/RurBiyKs6srsP0bvpoo8IK+Eg8EA6jWeM6/YJWs66w4FIAzqPw=="
"requested": "[2.1.12, )",
"resolved": "2.1.12",
"contentHash": "Sc0PVxvgg4NQjcI8n10/VfUQBAS4O+Fw2pZrAqBdRMbthYGeogzu5+xmIGCGmsEZ/ukMOBuAqiNiB5qA3MRalg=="
}
}
}