Show currency count for 'Allied Societies' glamour set tab

This commit is contained in:
Liza 2024-11-30 18:15:17 +01:00
parent cfc4189bc7
commit 2ae5143ad6
Signed by: liza
GPG Key ID: 8DD6D21C03BB0848

View File

@ -3,13 +3,11 @@ using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using Dalamud.Game.Addon.Events;
using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle;
using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes;
using Dalamud.Game.Command; using Dalamud.Game.Command;
using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Interface.Colors; using Dalamud.Interface.Colors;
using Dalamud.Interface.Style;
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Plugin; using Dalamud.Plugin;
@ -28,6 +26,13 @@ internal sealed class GlamourSetter : Window, IDisposable
private const uint ItemMgp = 29; private const uint ItemMgp = 29;
private const uint ItemTrophyCrystals = 36656; private const uint ItemTrophyCrystals = 36656;
private static readonly (uint ItemId, string Name)[] AlliedSocietyCurrencies =
[
(21074, "Vanu Whitebone"),
(21079, "Black Copper Gil"),
(21081, "Kojin Sango"),
];
private static readonly ImmutableHashSet<uint> MgpMakaiSets = new HashSet<uint> private static readonly ImmutableHashSet<uint> MgpMakaiSets = new HashSet<uint>
{ {
// makai gear // makai gear
@ -109,23 +114,25 @@ internal sealed class GlamourSetter : Window, IDisposable
.Where(x => x.RowId > 0) .Where(x => x.RowId > 0)
.Select(x => x.Item.RowId) .Select(x => x.Item.RowId)
.ToHashSet(); .ToHashSet();
var specialShopItems = dataManager.GetExcelSheet<SpecialShop>() var specialShopItems = BuildSpecialShopItems(dataManager);
.Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name.ToString())) _glamourSets = BuildGlamourSets(dataManager, armoireItems, specialShopItems);
.SelectMany(x => x.Item.SelectMany(y =>
y.ReceiveItems.Select(z => new SpecialShopItem
{
ItemId = z.Item.RowId,
CostItemId = y.ItemCosts[0].ItemCost.Value.RowId,
CostType = y.ItemCosts[0].ItemCost.Value.ItemUICategory.RowId,
CostName = y.ItemCosts[0].ItemCost.Value.Name.ToString(),
CostQuantity = y.ItemCosts[0].CurrencyCost,
})
.Where(z => z.ItemId > 0 && (z.CostItemId < 100 || z.CostType == 100))))
.GroupBy(x => x.ItemId)
.ToDictionary(x => x.Key, x => x.FirstOrDefault());
_commandManager.AddHandler("/glamoursets", new CommandInfo(ProcessCommand)
{
HelpMessage = "Shows the glamour set tracker"
});
_addonLifecycle.RegisterListener(AddonEvent.PostRefresh, "MiragePrismPrismBox", UpdateFromGlamourDresser);
_clientState.Logout += Reset;
if (_clientState.IsLoggedIn)
Update();
}
private static ReadOnlyCollection<GlamourSet> BuildGlamourSets(IDataManager dataManager, HashSet<uint> armoireItems,
Dictionary<uint, SpecialShopItem> specialShopItems)
{
ExcelSheet<Item> itemSheet = dataManager.GetExcelSheet<Item>(); ExcelSheet<Item> itemSheet = dataManager.GetExcelSheet<Item>();
_glamourSets = dataManager.GetExcelSheet<MirageStoreSetItem>() return dataManager.GetExcelSheet<MirageStoreSetItem>()
.Where(x => x.RowId > 0) .Where(x => x.RowId > 0)
.Select(x => .Select(x =>
{ {
@ -160,20 +167,7 @@ internal sealed class GlamourSetter : Window, IDisposable
ItemId = x.RowId, ItemId = x.RowId,
Name = itemSheet.GetRow(x.RowId).Name.ToString(), Name = itemSheet.GetRow(x.RowId).Name.ToString(),
Items = items, Items = items,
SetType = SetType = DetermineSetType(x, items),
x.RowId == MostRecentPvpSet
? ESetType.PvP
: UnobtainableSets.Contains(x.RowId)
? ESetType.Unobtainable
: EternalBondingSets.Contains(x.RowId) || UndyedRathalosSets.Contains(x.RowId) || MgpMakaiSets.Contains(x.RowId)
? ESetType.Special
: items.FirstOrDefault()?.ShopItem?.CostItemId switch
{
ItemWolfMarks or ItemTrophyCrystals => ESetType.PvP,
ItemMgp => ESetType.MGP,
> 100 => ESetType.AlliedSociety,
_ => ESetType.Default,
},
}; };
}) })
.Where(x => x.Items.Count > 0 && x.Items.Any(y => !armoireItems.Contains(y.ItemId))) .Where(x => x.Items.Count > 0 && x.Items.Any(y => !armoireItems.Contains(y.ItemId)))
@ -181,16 +175,49 @@ internal sealed class GlamourSetter : Window, IDisposable
.ThenBy(x => x.ItemId) .ThenBy(x => x.ItemId)
.ToList() .ToList()
.AsReadOnly(); .AsReadOnly();
}
_commandManager.AddHandler("/glamoursets", new CommandInfo(ProcessCommand) private static ESetType DetermineSetType(MirageStoreSetItem item, ReadOnlyCollection<GlamourItem> items)
{
if (item.RowId == MostRecentPvpSet)
return ESetType.PvP;
if (UnobtainableSets.Contains(item.RowId))
return ESetType.Unobtainable;
if (EternalBondingSets.Contains(item.RowId) ||
UndyedRathalosSets.Contains(item.RowId) ||
MgpMakaiSets.Contains(item.RowId))
return ESetType.Special;
uint? costItemId = items.FirstOrDefault()?.ShopItem?.CostItemId;
if (AlliedSocietyCurrencies.Any(x => x.ItemId == costItemId))
return ESetType.AlliedSociety;
return costItemId switch
{ {
HelpMessage = "Shows the glamour set tracker" ItemWolfMarks or ItemTrophyCrystals => ESetType.PvP,
}); ItemMgp => ESetType.MGP,
_addonLifecycle.RegisterListener(AddonEvent.PostRefresh, "MiragePrismPrismBox", UpdateFromGlamourDresser); _ => ESetType.Default,
_clientState.Logout += Reset; };
}
if (_clientState.IsLoggedIn) private static Dictionary<uint, SpecialShopItem> BuildSpecialShopItems(IDataManager dataManager)
Update(); {
return dataManager.GetExcelSheet<SpecialShop>()
.Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name.ToString()))
.SelectMany(x => x.Item.SelectMany(y =>
y.ReceiveItems.Select(z => new SpecialShopItem
{
ItemId = z.Item.RowId,
CostItemId = y.ItemCosts[0].ItemCost.Value.RowId,
CostType = y.ItemCosts[0].ItemCost.Value.ItemUICategory.RowId,
CostName = y.ItemCosts[0].ItemCost.Value.Name.ToString(),
CostQuantity = y.ItemCosts[0].CurrencyCost,
})
.Where(z => z.ItemId > 0 && (z.CostItemId < 100 || z.CostType == 100))))
.GroupBy(x => x.ItemId)
.ToDictionary(x => x.Key, x => x.First());
} }
private void ProcessCommand(string command, string arguments) private void ProcessCommand(string command, string arguments)
@ -241,6 +268,8 @@ internal sealed class GlamourSetter : Window, IDisposable
_ownedCurrencies[ItemMgp] = inventoryManager->GetItemCountInContainer(ItemMgp, InventoryType.Currency); _ownedCurrencies[ItemMgp] = inventoryManager->GetItemCountInContainer(ItemMgp, InventoryType.Currency);
_ownedCurrencies[ItemWolfMarks] = (int)inventoryManager->GetWolfMarks(); _ownedCurrencies[ItemWolfMarks] = (int)inventoryManager->GetWolfMarks();
_ownedCurrencies[ItemTrophyCrystals] = inventoryManager->GetInventoryItemCount(ItemTrophyCrystals); _ownedCurrencies[ItemTrophyCrystals] = inventoryManager->GetInventoryItemCount(ItemTrophyCrystals);
foreach (var (itemId, _) in AlliedSocietyCurrencies)
_ownedCurrencies[itemId] = inventoryManager->GetInventoryItemCount(itemId);
} }
else else
_ownedCurrencies.Clear(); _ownedCurrencies.Clear();
@ -332,6 +361,15 @@ internal sealed class GlamourSetter : Window, IDisposable
$"MGP: {_ownedCurrencies.GetValueOrDefault(ItemMgp):N0} / {missingItems.Where(x => x is { ShopItem.CostItemId: ItemMgp }).Sum(x => x.ShopItem!.CostQuantity):N0}"); $"MGP: {_ownedCurrencies.GetValueOrDefault(ItemMgp):N0} / {missingItems.Where(x => x is { ShopItem.CostItemId: ItemMgp }).Sum(x => x.ShopItem!.CostQuantity):N0}");
ImGui.Separator(); ImGui.Separator();
} }
else if (setType == ESetType.AlliedSociety)
{
foreach (var (itemId, name) in AlliedSocietyCurrencies)
{
ImGui.Text(
$"{name}: {_ownedCurrencies.GetValueOrDefault(itemId):N0} / {missingItems.Where(x => x is { ShopItem: { } shopItem } && shopItem.CostItemId == itemId).Sum(x => x.ShopItem!.CostQuantity):N0}");
}
ImGui.Separator();
}
} }
private void DrawSetRange(List<GlamourSet> glamourSets, List<GlamourSet> ownedSets, private void DrawSetRange(List<GlamourSet> glamourSets, List<GlamourSet> ownedSets,