Compare commits

..

No commits in common. "master" and "v5.4" have entirely different histories.
master ... v5.4

12 changed files with 150 additions and 206 deletions

View File

@ -29,7 +29,7 @@ internal sealed class Configuration : IPluginConfiguration
public bool UncapFrameRate { get; set; } public bool UncapFrameRate { get; set; }
public VirtualKey QuickTurnInKey { get; set; } = VirtualKey.SHIFT; public VirtualKey QuickTurnInKey { get; set; } = VirtualKey.SHIFT;
public MinimizableWindowConfig TurnInWindowConfig { get; } = new(); public WindowConfig TurnInWindowConfig { get; } = new();
public WindowConfig ConfigWindowConfig { get; } = new(); public WindowConfig ConfigWindowConfig { get; } = new();
internal sealed class PurchaseOption internal sealed class PurchaseOption
@ -84,9 +84,4 @@ internal sealed class Configuration : IPluginConfiguration
Warning, Warning,
DisableTurnIn, DisableTurnIn,
} }
internal sealed class MinimizableWindowConfig : WindowConfig
{
public bool IsMinimized { get; set; }
}
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project> <Project>
<Target Name="PackagePluginDebug" AfterTargets="Build" Condition="'$(Configuration)' == 'Debug'"> <Target Name="PackagePlugin" AfterTargets="Build" Condition="'$(Configuration)' == 'Debug'">
<DalamudPackager <DalamudPackager
ProjectDir="$(ProjectDir)" ProjectDir="$(ProjectDir)"
OutputPath="$(OutputPath)" OutputPath="$(OutputPath)"

View File

@ -1,6 +1,6 @@
<Project Sdk="Dalamud.NET.Sdk/11.0.0"> <Project Sdk="Dalamud.NET.Sdk/9.0.2">
<PropertyGroup> <PropertyGroup>
<Version>6.3</Version> <Version>5.4</Version>
<OutputPath>dist</OutputPath> <OutputPath>dist</OutputPath>
</PropertyGroup> </PropertyGroup>

View File

@ -218,11 +218,11 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
{ {
if (CharacterConfiguration.CachedPlayerName != _clientState.LocalPlayer!.Name.ToString() || if (CharacterConfiguration.CachedPlayerName != _clientState.LocalPlayer!.Name.ToString() ||
CharacterConfiguration.CachedWorldName != CharacterConfiguration.CachedWorldName !=
_clientState.LocalPlayer.HomeWorld.Value.Name.ToString()) _clientState.LocalPlayer.HomeWorld.GameData!.Name.ToString())
{ {
CharacterConfiguration.CachedPlayerName = _clientState.LocalPlayer!.Name.ToString(); CharacterConfiguration.CachedPlayerName = _clientState.LocalPlayer!.Name.ToString();
CharacterConfiguration.CachedWorldName = CharacterConfiguration.CachedWorldName =
_clientState.LocalPlayer.HomeWorld.Value.Name.ToString(); _clientState.LocalPlayer.HomeWorld.GameData!.Name.ToString();
CharacterConfiguration.Save(_pluginInterface); CharacterConfiguration.Save(_pluginInterface);
} }
@ -242,7 +242,7 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
} }
} }
private void Logout(int type, int code) private void Logout()
{ {
CharacterConfiguration = null; CharacterConfiguration = null;
} }

View File

@ -1,12 +1,13 @@
using System.Data; using System;
using System.Data;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Dalamud.Game.Text; using Dalamud.Game.Text;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using LLib; using LLib;
using Lumina.Excel; using Lumina.Excel;
using Lumina.Excel.Sheets; using Lumina.Excel.CustomSheets;
using Lumina.Text.ReadOnly; using Lumina.Excel.GeneratedSheets;
namespace Deliveroo.GameData; namespace Deliveroo.GameData;
@ -23,10 +24,10 @@ internal sealed class GameStrings
ExchangeItems = dataManager.GetRegex<Addon>(3290, addon => addon.Text, pluginLog) ExchangeItems = dataManager.GetRegex<Addon>(3290, addon => addon.Text, pluginLog)
?? throw new ConstraintException($"Unable to resolve {nameof(ExchangeItems)}"); ?? throw new ConstraintException($"Unable to resolve {nameof(ExchangeItems)}");
TradeHighQualityItem = TradeHighQualityItem =
dataManager.GetString<Addon>(102434, addon => addon.Text, pluginLog) dataManager.GetString<Addon>(102434, addon => addon.Text, pluginLog)?.ReplaceLineEndings("")
?? throw new ConstraintException($"Unable to resolve {nameof(TradeHighQualityItem)}"); ?? throw new ConstraintException($"Unable to resolve {nameof(TradeHighQualityItem)}");
var rankUpFc = dataManager.GetExcelSheet<LogMessage>().GetRow(3123); var rankUpFc = dataManager.GetExcelSheet<LogMessage>()!.GetRow(3123)!;
RankUpFc = rankUpFc.GetRegex(logMessage => logMessage.Text, pluginLog) RankUpFc = rankUpFc.GetRegex(logMessage => logMessage.Text, pluginLog)
?? throw new ConstraintException($"Unable to resolve {nameof(RankUpFc)}"); ?? throw new ConstraintException($"Unable to resolve {nameof(RankUpFc)}");
RankUpFcType = (XivChatType)rankUpFc.LogKind; RankUpFcType = (XivChatType)rankUpFc.LogKind;
@ -42,16 +43,7 @@ internal sealed class GameStrings
[Sheet("custom/000/ComDefGrandCompanyOfficer_00073")] [Sheet("custom/000/ComDefGrandCompanyOfficer_00073")]
[SuppressMessage("Performance", "CA1812")] [SuppressMessage("Performance", "CA1812")]
private readonly struct ComDefGrandCompanyOfficer(ExcelPage page, uint offset, uint row) private sealed class ComDefGrandCompanyOfficer : QuestDialogueText
: IQuestDialogueText, IExcelRow<ComDefGrandCompanyOfficer>
{ {
public uint RowId => row;
public ReadOnlySeString Key => page.ReadString(offset, offset);
public ReadOnlySeString Value => page.ReadString(offset + 4, offset);
static ComDefGrandCompanyOfficer IExcelRow<ComDefGrandCompanyOfficer>.Create(ExcelPage page, uint offset,
uint row) =>
new(page, offset, row);
} }
} }

View File

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Excel.Sheets; using Lumina.Excel.GeneratedSheets;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
namespace Deliveroo.GameData; namespace Deliveroo.GameData;
@ -10,32 +10,31 @@ internal sealed class GcRewardsCache
{ {
public GcRewardsCache(IDataManager dataManager) public GcRewardsCache(IDataManager dataManager)
{ {
var categories = dataManager.GetExcelSheet<GCScripShopCategory>() var categories = dataManager.GetExcelSheet<GCScripShopCategory>()!
.Where(x => x.RowId > 0) .Where(x => x.RowId > 0)
.ToDictionary(x => x.RowId, .ToDictionary(x => x.RowId,
x => x =>
(GrandCompany: (GrandCompany)x.GrandCompany.RowId, (GrandCompany: (GrandCompany)x.GrandCompany.Row,
Tier: (RewardTier)x.Tier, Tier: (RewardTier)x.Tier,
SubCategory: (RewardSubCategory)x.SubCategory)); SubCategory: (RewardSubCategory)x.SubCategory));
Rewards = dataManager.GetSubrowExcelSheet<GCScripShopItem>() Rewards = dataManager.GetExcelSheet<GCScripShopItem>()!
.SelectMany(x => x) .Where(x => x.RowId > 0 && x.Item.Row > 0)
.Where(x => x.RowId > 0 && x.Item.RowId > 0)
.GroupBy(item => .GroupBy(item =>
{ {
var category = categories[item.RowId]; var category = categories[item.RowId];
return new return new
{ {
ItemId = item.Item.RowId, ItemId = item.Item.Row,
Name = item.Item.Value.Name.ToString(), Name = item.Item.Value!.Name.ToString(),
IconId = item.Item.RowId == ItemIds.Venture ? 25917 : item.Item.Value.Icon, IconId = item.Item.Row == ItemIds.Venture ? 25917 : item.Item.Value!.Icon,
category.Tier, category.Tier,
category.SubCategory, category.SubCategory,
RequiredRank = item.RequiredGrandCompanyRank.RowId, RequiredRank = item.RequiredGrandCompanyRank.Row,
item.Item.Value.StackSize, item.Item!.Value.StackSize,
SealCost = item.CostGCSeals, SealCost = item.CostGCSeals,
InventoryLimit = item.Item.Value.IsUnique ? 1 InventoryLimit = item.Item.Value!.IsUnique ? 1
: item.Item.RowId == ItemIds.Venture ? item.Item.Value.StackSize : item.Item.Row == ItemIds.Venture ? item.Item.Value!.StackSize
: int.MaxValue, : int.MaxValue,
}; };
}) })

View File

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Excel.Sheets; using Lumina.Excel.GeneratedSheets;
namespace Deliveroo.GameData; namespace Deliveroo.GameData;
@ -10,7 +10,7 @@ internal sealed class ItemCache
public ItemCache(IDataManager dataManager) public ItemCache(IDataManager dataManager)
{ {
foreach (var item in dataManager.GetExcelSheet<Item>()) foreach (var item in dataManager.GetExcelSheet<Item>()!)
{ {
string name = item.Name.ToString(); string name = item.Name.ToString();
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
@ -19,7 +19,7 @@ internal sealed class ItemCache
if (_itemNamesToIds.TryGetValue(name, out HashSet<uint>? itemIds)) if (_itemNamesToIds.TryGetValue(name, out HashSet<uint>? itemIds))
itemIds.Add(item.RowId); itemIds.Add(item.RowId);
else else
_itemNamesToIds.Add(name, [item.RowId]); _itemNamesToIds.Add(name, new HashSet<uint>{item.RowId});
} }
} }

View File

@ -15,10 +15,8 @@ using FFXIVClientStructs.FFXIV.Client.Game.Control;
using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Common.Math; using FFXIVClientStructs.FFXIV.Common.Math;
using FFXIVClientStructs.FFXIV.Component.Excel;
using Lumina.Excel; using Lumina.Excel;
using Lumina.Excel.Sheets; using Lumina.Excel.GeneratedSheets;
using Lumina.Text.ReadOnly;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
namespace Deliveroo; namespace Deliveroo;
@ -43,7 +41,7 @@ internal sealed class GameFunctions : IDisposable
_pluginLog = pluginLog; _pluginLog = pluginLog;
_gcRankInfo = dataManager.GetExcelSheet<GrandCompanyRank>().Where(x => x.RowId > 0) _gcRankInfo = dataManager.GetExcelSheet<GrandCompanyRank>()!.Where(x => x.RowId > 0)
.ToDictionary(x => x.RowId, x => new GcRankInfo .ToDictionary(x => x.RowId, x => new GcRankInfo
{ {
NameTwinAddersMale = ExtractRankName<GCRankGridaniaMaleText>(dataManager, x.RowId, r => r.Singular), NameTwinAddersMale = ExtractRankName<GCRankGridaniaMaleText>(dataManager, x.RowId, r => r.Singular),
@ -55,7 +53,7 @@ internal sealed class GameFunctions : IDisposable
ExtractRankName<GCRankUldahFemaleText>(dataManager, x.RowId, r => r.Singular), ExtractRankName<GCRankUldahFemaleText>(dataManager, x.RowId, r => r.Singular),
MaxSeals = x.MaxSeals, MaxSeals = x.MaxSeals,
RequiredSeals = x.RequiredSeals, RequiredSeals = x.RequiredSeals,
RequiredHuntingLog = x.Unknown0, RequiredHuntingLog = x.Unknown10,
}) })
.AsReadOnly(); .AsReadOnly();
@ -63,14 +61,14 @@ internal sealed class GameFunctions : IDisposable
_clientState.TerritoryChanged += TerritoryChanged; _clientState.TerritoryChanged += TerritoryChanged;
} }
private static string ExtractRankName<T>(IDataManager dataManager, uint rankId, Func<T, ReadOnlySeString> func) private static string ExtractRankName<T>(IDataManager dataManager, uint rankId, Func<T, Lumina.Text.SeString> func)
where T : struct, IExcelRow<T> where T : ExcelRow
{ {
return func(dataManager.GetExcelSheet<T>().GetRow(rankId)).ToString(); return func(dataManager.GetExcelSheet<T>()!.GetRow(rankId)!).ToString();
} }
private void Logout(int type, int code) private void Logout()
{ {
_retainerItemCache.Clear(); _retainerItemCache.Clear();
} }

View File

@ -103,66 +103,66 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
_configuration.ItemsAvailableToPurchase.Count == 1 && purchaseOption.ItemId == ItemIds.Venture); _configuration.ItemsAvailableToPurchase.Count == 1 && purchaseOption.ItemId == ItemIds.Venture);
var item = _itemLookup[purchaseOption.ItemId]; var item = _itemLookup[purchaseOption.ItemId];
using (var icon = _iconCache.GetIcon(item.IconId)) var icon = _iconCache.GetIcon(item.IconId);
Vector2 pos = ImGui.GetCursorPos();
Vector2 iconSize = new Vector2(ImGui.GetTextLineHeight() + ImGui.GetStyle().ItemSpacing.Y);
icon.TryGetWrap(out IDalamudTextureWrap? wrap, out _);
if (wrap != null)
{ {
Vector2 pos = ImGui.GetCursorPos(); ImGui.SetCursorPos(pos + new Vector2(iconSize.X + ImGui.GetStyle().FramePadding.X,
Vector2 iconSize = new Vector2(ImGui.GetTextLineHeight() + ImGui.GetStyle().ItemSpacing.Y); ImGui.GetStyle().ItemSpacing.Y / 2));
}
if (icon != null) ImGui.Selectable($"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}{(purchaseOption.SameQuantityForAllLists ? $" {((SeIconChar)57412).ToIconString()} (Limit: {purchaseOption.GlobalLimit:N0})" : "")}",
false, ImGuiSelectableFlags.SpanAllColumns);
if (ImGui.BeginDragDropSource())
{
ImGui.SetDragDropPayload("DeliverooDragDrop", nint.Zero, 0);
_dragDropSource = purchaseOption;
ImGui.EndDragDropSource();
}
if (ImGui.BeginDragDropTarget())
{
if (_dragDropSource != null &&
ImGui.AcceptDragDropPayload("DeliverooDragDrop").NativePtr != null)
{ {
ImGui.SetCursorPos(pos + new Vector2(iconSize.X + ImGui.GetStyle().FramePadding.X, itemToAdd = _dragDropSource;
ImGui.GetStyle().ItemSpacing.Y / 2)); indexToAdd = i;
_dragDropSource = null;
} }
ImGui.Selectable( ImGui.EndDragDropTarget();
$"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}{(purchaseOption.SameQuantityForAllLists ? $" {((SeIconChar)57412).ToIconString()} (Limit: {purchaseOption.GlobalLimit:N0})" : "")}", }
false, ImGuiSelectableFlags.SpanAllColumns);
if (ImGui.BeginDragDropSource()) ImGui.OpenPopupOnItemClick($"###ctx{i}", ImGuiPopupFlags.MouseButtonRight);
if (ImGui.BeginPopup($"###ctx{i}"))
{
bool sameQuantityForAllLists = purchaseOption.SameQuantityForAllLists;
if (ImGui.MenuItem("Use same quantity for global and character-specific lists", null,
ref sameQuantityForAllLists))
{ {
ImGui.SetDragDropPayload("DeliverooDragDrop", nint.Zero, 0); purchaseOption.SameQuantityForAllLists = sameQuantityForAllLists;
_dragDropSource = purchaseOption; Save();
ImGui.EndDragDropSource();
} }
if (ImGui.BeginDragDropTarget()) if (ImGui.MenuItem($"Remove {_itemLookup[purchaseOption.ItemId].Name}"))
{ itemToRemove = purchaseOption;
if (_dragDropSource != null &&
ImGui.AcceptDragDropPayload("DeliverooDragDrop").NativePtr != null)
{
itemToAdd = _dragDropSource;
indexToAdd = i;
_dragDropSource = null; ImGui.EndPopup();
} }
ImGui.EndDragDropTarget(); if (wrap != null)
} {
ImGui.SameLine(0, 0);
ImGui.SetCursorPos(pos);
ImGui.Image(wrap.ImGuiHandle, iconSize);
ImGui.OpenPopupOnItemClick($"###ctx{i}", ImGuiPopupFlags.MouseButtonRight); wrap.Dispose();
if (ImGui.BeginPopup($"###ctx{i}"))
{
bool sameQuantityForAllLists = purchaseOption.SameQuantityForAllLists;
if (ImGui.MenuItem("Use same quantity for global and character-specific lists", null,
ref sameQuantityForAllLists))
{
purchaseOption.SameQuantityForAllLists = sameQuantityForAllLists;
Save();
}
if (ImGui.MenuItem($"Remove {_itemLookup[purchaseOption.ItemId].Name}"))
itemToRemove = purchaseOption;
ImGui.EndPopup();
}
if (icon != null)
{
ImGui.SameLine(0, 0);
ImGui.SetCursorPos(pos);
ImGui.Image(icon.ImGuiHandle, iconSize);
}
} }
ImGui.EndDisabled(); ImGui.EndDisabled();
@ -202,14 +202,14 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
foreach (var item in comboValues.Where(x => foreach (var item in comboValues.Where(x =>
x.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase))) x.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase)))
{ {
using (var icon = _iconCache.GetIcon(item.IconId)) var icon = _iconCache.GetIcon(item.IconId);
if (icon.TryGetWrap(out IDalamudTextureWrap? wrap, out _))
{ {
if (icon != null) ImGui.Image(wrap.ImGuiHandle, new Vector2(ImGui.GetFrameHeight()));
{ ImGui.SameLine();
ImGui.Image(icon.ImGuiHandle, new Vector2(ImGui.GetFrameHeight())); ImGui.SetCursorPosY(ImGui.GetCursorPosY() + ImGui.GetStyle().FramePadding.X);
ImGui.SameLine();
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + ImGui.GetStyle().FramePadding.X); wrap.Dispose();
}
} }
bool addThis = bool addThis =
@ -217,8 +217,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
$"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}##SelectVenture{item.IconId}"); $"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}##SelectVenture{item.IconId}");
if (addThis || addFirst) if (addThis || addFirst)
{ {
_configuration.ItemsAvailableToPurchase.Add(new Configuration.PurchaseOption _configuration.ItemsAvailableToPurchase.Add(new Configuration.PurchaseOption { ItemId = item.ItemId });
{ ItemId = item.ItemId });
if (addFirst) if (addFirst)
{ {
@ -244,7 +243,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
if (_clientState is { IsLoggedIn: true, LocalContentId: > 0 }) if (_clientState is { IsLoggedIn: true, LocalContentId: > 0 })
{ {
string currentCharacterName = _clientState.LocalPlayer!.Name.ToString(); string currentCharacterName = _clientState.LocalPlayer!.Name.ToString();
string currentWorldName = _clientState.LocalPlayer.HomeWorld.Value.Name.ToString(); string currentWorldName = _clientState.LocalPlayer.HomeWorld.GameData!.Name.ToString();
ImGui.Text($"Current Character: {currentCharacterName} @ {currentWorldName}"); ImGui.Text($"Current Character: {currentCharacterName} @ {currentWorldName}");
ImGui.Spacing(); ImGui.Spacing();
ImGui.Separator(); ImGui.Separator();

View File

@ -10,7 +10,6 @@ using Dalamud.Interface.Colors;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Deliveroo.GameData; using Deliveroo.GameData;
@ -22,7 +21,7 @@ using LLib.ImGui;
namespace Deliveroo.Windows; namespace Deliveroo.Windows;
internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configuration.MinimizableWindowConfig> internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig
{ {
private static readonly IReadOnlyList<InventoryType> InventoryTypes = new[] private static readonly IReadOnlyList<InventoryType> InventoryTypes = new[]
{ {
@ -56,7 +55,6 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
private readonly IconCache _iconCache; private readonly IconCache _iconCache;
private readonly IKeyState _keyState; private readonly IKeyState _keyState;
private readonly GameFunctions _gameFunctions; private readonly GameFunctions _gameFunctions;
private readonly TitleBarButton _minimizeButton;
private bool _state; private bool _state;
private Guid? _draggedItem; private Guid? _draggedItem;
@ -90,20 +88,6 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
ShowCloseButton = false; ShowCloseButton = false;
AllowClickthrough = false; AllowClickthrough = false;
_minimizeButton = new TitleBarButton
{
Icon = FontAwesomeIcon.Minus,
Priority = int.MinValue,
IconOffset = new Vector2(1.5f, 1),
Click = _ =>
{
IsMinimized = !IsMinimized;
_minimizeButton!.Icon = IsMinimized ? FontAwesomeIcon.WindowMaximize : FontAwesomeIcon.Minus;
},
AvailableClickthrough = true,
};
TitleBarButtons.Insert(0, _minimizeButton);
TitleBarButtons.Add(new TitleBarButton TitleBarButtons.Add(new TitleBarButton
{ {
Icon = FontAwesomeIcon.Cog, Icon = FontAwesomeIcon.Cog,
@ -119,17 +103,7 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
}); });
} }
public Configuration.MinimizableWindowConfig WindowConfig => _configuration.TurnInWindowConfig; public WindowConfig WindowConfig => _configuration.TurnInWindowConfig;
private bool IsMinimized
{
get => WindowConfig.IsMinimized;
set
{
WindowConfig.IsMinimized = value;
SaveWindowConfig();
}
}
public bool State public bool State
{ {
@ -152,7 +126,7 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
private bool IsOnHomeWorld => private bool IsOnHomeWorld =>
_clientState.LocalPlayer == null || _clientState.LocalPlayer == null ||
_clientState.LocalPlayer.HomeWorld.RowId == _clientState.LocalPlayer.CurrentWorld.RowId; _clientState.LocalPlayer.HomeWorld.Id == _clientState.LocalPlayer.CurrentWorld.Id;
private IItemsToPurchase ItemsWrapper => UseCharacterSpecificItemsToPurchase private IItemsToPurchase ItemsWrapper => UseCharacterSpecificItemsToPurchase
? new CharacterSpecificItemsToPurchase(_plugin.CharacterConfiguration!, _pluginInterface) ? new CharacterSpecificItemsToPurchase(_plugin.CharacterConfiguration!, _pluginInterface)
@ -244,59 +218,56 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
} }
float indentSize = ImGui.GetFrameHeight() + ImGui.GetStyle().ItemInnerSpacing.X; float indentSize = ImGui.GetFrameHeight() + ImGui.GetStyle().ItemInnerSpacing.X;
ImGui.Indent(indentSize);
if (!string.IsNullOrEmpty(Error)) if (!string.IsNullOrEmpty(Error))
{ {
using (ImRaii.PushIndent(indentSize)) ImGui.TextColored(ImGuiColors.DalamudRed, Error);
ImGui.TextColored(ImGuiColors.DalamudRed, Error);
} }
else else
{ {
using (ImRaii.PushIndent(indentSize)) if (_configuration.BehaviorOnOtherWorld == Configuration.EBehaviorOnOtherWorld.Warning && !IsOnHomeWorld)
{ {
if (_configuration.BehaviorOnOtherWorld == Configuration.EBehaviorOnOtherWorld.Warning && ImGui.TextColored(ImGuiColors.DalamudRed,
!IsOnHomeWorld) "You are not on your home world and will not earn FC points.");
{ }
ImGui.TextColored(ImGuiColors.DalamudRed,
"You are not on your home world and will not earn FC points.");
}
if (Multiplier == 1m) if (Multiplier == 1m)
{ {
ImGui.TextColored(ImGuiColors.DalamudYellow, "You do not have an active seal buff."); ImGui.TextColored(ImGuiColors.DalamudYellow, "You do not have an active seal buff.");
} }
else else
{ {
ImGui.TextColored(ImGuiColors.HealerGreen, $"Current Buff: {(Multiplier - 1m) * 100:N0}%%"); ImGui.TextColored(ImGuiColors.HealerGreen, $"Current Buff: {(Multiplier - 1m) * 100:N0}%%");
} }
if (Multiplier <= 1.10m) if (Multiplier <= 1.10m)
{
InventoryManager* inventoryManager = InventoryManager.Instance();
AgentInventoryContext* agentInventoryContext = AgentInventoryContext.Instance();
if (inventoryManager->GetInventoryItemCount(ItemIds.PrioritySealAllowance) > 0)
{ {
InventoryManager* inventoryManager = InventoryManager.Instance(); ImGui.BeginDisabled(_condition[ConditionFlag.OccupiedInQuestEvent] ||
AgentInventoryContext* agentInventoryContext = AgentInventoryContext.Instance(); _condition[ConditionFlag.Casting] ||
if (inventoryManager->GetInventoryItemCount(ItemIds.PrioritySealAllowance) > 0) agentInventoryContext == null);
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Bolt, "Use Priority Seal Allowance (15%)"))
{ {
ImGui.BeginDisabled(_condition[ConditionFlag.OccupiedInQuestEvent] || agentInventoryContext->UseItem(ItemIds.PrioritySealAllowance);
_condition[ConditionFlag.Casting] ||
agentInventoryContext == null);
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Bolt,
"Use Priority Seal Allowance (15%)"))
{
agentInventoryContext->UseItem(ItemIds.PrioritySealAllowance);
}
ImGui.EndDisabled();
} }
ImGui.EndDisabled();
} }
} }
if (!IsMinimized) ImGui.Unindent(indentSize);
{ ImGui.Separator();
ImGui.Separator(); ImGui.BeginDisabled(state);
using (ImRaii.Disabled(state))
DrawItemsToBuy(grandCompany); DrawItemsToBuy(grandCompany);
}
ImGui.EndDisabled();
} }
ImGui.Separator();
if (_configuration.QuickTurnInKey != VirtualKey.NO_KEY) if (_configuration.QuickTurnInKey != VirtualKey.NO_KEY)
{ {
var key = _configuration.QuickTurnInKey switch var key = _configuration.QuickTurnInKey switch
@ -307,22 +278,14 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
_ => _configuration.QuickTurnInKey.ToString() _ => _configuration.QuickTurnInKey.ToString()
}; };
if (!State && _keyState[_configuration.QuickTurnInKey]) if (!State && _keyState[_configuration.QuickTurnInKey])
{
ImGui.Separator();
ImGui.TextColored(ImGuiColors.HealerGreen, "Click an item to turn it in without confirmation"); ImGui.TextColored(ImGuiColors.HealerGreen, "Click an item to turn it in without confirmation");
} else
else if (!IsMinimized)
{
ImGui.Separator();
ImGui.Text($"Hold '{key}' when clicking an item to turn it in without confirmation."); ImGui.Text($"Hold '{key}' when clicking an item to turn it in without confirmation.");
}
ImGui.Separator();
} }
if (!IsMinimized) ImGui.Text($"Debug (State): {_plugin.CurrentStage}");
{
ImGui.Separator();
ImGui.Text($"Debug (State): {_plugin.CurrentStage}");
}
} }
private unsafe void DrawNextRankPrequesites() private unsafe void DrawNextRankPrequesites()
@ -453,7 +416,7 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
itemsWrapper.Save(); itemsWrapper.Save();
} }
if (_configuration.ItemsAvailableToPurchase.Any(x => if (_configuration.ItemsToPurchase.Any(x =>
itemsWrapper.GetItemsToPurchase().All(y => x.ItemId != y.ItemId))) itemsWrapper.GetItemsToPurchase().All(y => x.ItemId != y.ItemId)))
{ {
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Plus, "Add Item")) if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Plus, "Add Item"))
@ -467,8 +430,7 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
{ {
if (ImGui.MenuItem($"{reward.Name}##{purchaseOption.ItemId}")) if (ImGui.MenuItem($"{reward.Name}##{purchaseOption.ItemId}"))
{ {
itemsWrapper.Add(new Configuration.PurchasePriority itemsWrapper.Add(new Configuration.PurchasePriority { ItemId = purchaseOption.ItemId, Limit = 0 });
{ ItemId = purchaseOption.ItemId, Limit = 0 });
itemsWrapper.Save(); itemsWrapper.Save();
ImGui.CloseCurrentPopup(); ImGui.CloseCurrentPopup();
} }
@ -479,10 +441,9 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
} }
ImGui.SameLine(); ImGui.SameLine();
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Cog, "Configure available Items"))
_configWindow.IsOpen = true;
} }
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Cog, "Configure available Items"))
_configWindow.IsOpen = true;
} }
private void DrawItemToBuy(GrandCompany grandCompany, int i, IItemsToPurchase itemsWrapper, private void DrawItemToBuy(GrandCompany grandCompany, int i, IItemsToPurchase itemsWrapper,
@ -553,13 +514,13 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
} }
var comboItem = comboValues[comboValueIndex]; var comboItem = comboValues[comboValueIndex];
using (var icon = _iconCache.GetIcon(comboItem.Item.IconId)) var icon = _iconCache.GetIcon(comboItem.Item.IconId);
if (icon.TryGetWrap(out IDalamudTextureWrap? wrap, out _))
{ {
if (icon != null) ImGui.Image(wrap.ImGuiHandle, new Vector2(ImGui.GetFrameHeight()));
{ ImGui.SameLine(0, 3);
ImGui.Image(icon.ImGuiHandle, new Vector2(ImGui.GetFrameHeight()));
ImGui.SameLine(0, 3); wrap.Dispose();
}
} }
indentX = ImGui.GetCursorPosX() - indentX; indentX = ImGui.GetCursorPosX() - indentX;
@ -640,7 +601,7 @@ internal sealed class TurnInWindow : LWindow, IPersistableWindowConfig<Configura
: "Remaining items to buy"; : "Remaining items to buy";
if (ImGui.InputInt(label, ref limit, stepSize, stepSize * 10)) if (ImGui.InputInt(label, ref limit, stepSize, stepSize * 10))
{ {
int newLimit = Math.Min(Math.Max(0, limit), (int)comboItem.Item.InventoryLimit); int newLimit = Math.Min(Math.Max(0, limit), (int)comboItem.Item.InventoryLimit);
if (purchaseOption != null) if (purchaseOption != null)
{ {
purchaseOption.GlobalLimit = newLimit; purchaseOption.GlobalLimit = newLimit;

View File

@ -4,9 +4,9 @@
"net8.0-windows7.0": { "net8.0-windows7.0": {
"DalamudPackager": { "DalamudPackager": {
"type": "Direct", "type": "Direct",
"requested": "[11.0.0, )", "requested": "[2.1.13, )",
"resolved": "11.0.0", "resolved": "2.1.13",
"contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ=="
}, },
"DotNet.ReproducibleBuilds": { "DotNet.ReproducibleBuilds": {
"type": "Direct", "type": "Direct",
@ -79,7 +79,7 @@
"llib": { "llib": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"DalamudPackager": "[11.0.0, )" "DalamudPackager": "[2.1.13, )"
} }
} }
} }

2
LLib

@ -1 +1 @@
Subproject commit b581e2ea2a61f44ed3f0cb4f6ea8cc1595525544 Subproject commit 7027d291efbbff6a55944dd521d3907210ddecbe