From 585f64e0decfe67ee2afa24b7d9a28f7790a7ef2 Mon Sep 17 00:00:00 2001 From: Knightmore <35805408+Knightmore@users.noreply.github.com> Date: Sun, 17 May 2026 21:47:34 +0200 Subject: [PATCH 1/2] Glamour Dresser (MiragePrismPrismBox) --- .../Client/UI/AddonMiragePrismPrismBox.cs | 42 +++++++++++++++++++ .../UI/Agent/AgentMiragePrismPrismBox.cs | 33 +++++++++++++-- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBox.cs b/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBox.cs index 1476a268f..477a7762a 100644 --- a/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBox.cs +++ b/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBox.cs @@ -10,11 +10,53 @@ namespace FFXIVClientStructs.FFXIV.Client.UI; [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0x1440)] public unsafe partial struct AddonMiragePrismPrismBox { + [StructLayout(LayoutKind.Explicit, Size = 0x50)] + public struct ItemSlot { + [FieldOffset(0x00)] public AtkComponentButton* Button; + [FieldOffset(0x08)] public AtkImageNode* SlotIcon; + [FieldOffset(0x10)] public AtkResNode* Dye1Res; + [FieldOffset(0x18)] public AtkImageNode* Dye1Image; + [FieldOffset(0x20)] public AtkResNode* Dye2Res; + [FieldOffset(0x28)] public AtkImageNode* Dye2Image; + [FieldOffset(0x30)] public AtkResNode* SlotRes; + [FieldOffset(0x38)] public AtkResNode* OutfitGlamour; + [FieldOffset(0x40)] public AtkResNode* OutfitItemAmountRes; + [FieldOffset(0x48)] public AtkTextNode* OutfitItemAmountResText; + } + + [FieldOffset(0x238), FixedSizeArray] internal FixedSizeArray50 _itemSlots; + [FieldOffset(0x11E8)] public AtkComponentButton* PrevButton; [FieldOffset(0x11F0)] public AtkComponentButton* NextButton; [FieldOffset(0x11F8)] public AtkComponentButton* EditGlamourPlatesButton; + [FieldOffset(0x1200)] private AtkResNode* Unk1200; + [FieldOffset(0x1208)] private AtkTextNode* Unk1208; + [FieldOffset(0x1210)] public AtkTextNode* UsedSlotsText; + [FieldOffset(0x1218)] public AtkTextNode* CategoryLabelText; + [FieldOffset(0x1220)] public AtkImageNode* CategoryIcon; + [FieldOffset(0x1228)] public AtkComponentWindow* WindowComponent; + [FieldOffset(0x1230)] public AtkResNode* SlotsContentNode; + [FieldOffset(0x1238)] public AtkComponentDropDownList* JobDropdown; + [FieldOffset(0x1240)] public AtkResNode* FilterNode; + [FieldOffset(0x1248)] public AtkComponentBase* FilterButton; + [FieldOffset(0x1250)] public AtkComponentTextInput* SearchInput; + [FieldOffset(0x1258)] public AtkResNode* SearchBar; + [FieldOffset(0x1260)] public AtkComponentDropDownList* OrderDropdown; + + [FieldOffset(0x1268)] public AtkComponentButton* GuideButton; + + [FieldOffset(0x1270), FixedSizeArray] internal FixedSizeArray13> _slotTabs; + + [FieldOffset(0x12D8)] private uint Unk12D8; + [FieldOffset(0x12DC)] public uint SelectedTabIndex; + + [FieldOffset(0x12E0), FixedSizeArray] internal FixedSizeArray35 _jobLabels; + + [FieldOffset(0x13F8), FixedSizeArray] internal FixedSizeArray35 _jobIds; + + [FieldOffset(0x1420), FixedSizeArray] internal FixedSizeArray2 _orderLabels; } diff --git a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs index 42a68249b..92f9fa337 100644 --- a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs +++ b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs @@ -11,8 +11,15 @@ namespace FFXIVClientStructs.FFXIV.Client.UI.Agent; [StructLayout(LayoutKind.Explicit, Size = 0x98)] public unsafe partial struct AgentMiragePrismPrismBox { [FieldOffset(0x28)] public MiragePrismPrismBoxData* Data; + [FieldOffset(0x30)] private nint OpenerCallbackPtr; // unsure about that + [FieldOffset(0x38)] public bool IsDataLoaded; [FieldOffset(0x39)] public byte TabIndex; [FieldOffset(0x3A)] public byte PageIndex; + [FieldOffset(0x3C)] public uint CrystalizeAddonId; + [FieldOffset(0x40)] public uint ContextAddonId; // AddonId slot for active context dialogs (crystallize confirm, YesNo, prism-set preview) + [FieldOffset(0x44)] public uint ContextAddon2Id; // AddonId slot for the restore-as-outfit dialog (addon 0x285). + [FieldOffset(0x48)] public short SavedAddonX; + [FieldOffset(0x4A)] public short SavedAddonY; [FieldOffset(0x50)] public InventoryItem TempDyeItem; [MemberFunction("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 0F B6 43 3A")] @@ -22,6 +29,10 @@ public unsafe partial struct AgentMiragePrismPrismBox { [GenerateInterop] [StructLayout(LayoutKind.Explicit, Size = 0x123A00)] public unsafe partial struct MiragePrismPrismBoxData { + [FieldOffset(0x00)] private byte Unk00; + [FieldOffset(0x01)] public byte IsAsyncLoadComplete; // Set to true once all async item-name loads have completed. gates the sort and page-index update in Update. + [FieldOffset(0x02)] public byte PendingTabIndex; // Pending tab/slot filter to apply. written by context actions, cleared to 13 (All) once processed + [FieldOffset(0x08), FixedSizeArray] internal FixedSizeArray8000 _prismBoxItems; [FieldOffset(0x119408)] public PrismBoxItem TempContextItem; @@ -30,10 +41,18 @@ public unsafe partial struct MiragePrismPrismBoxData { [FieldOffset(0x11AD98), FixedSizeArray] internal FixedSizeArray50 _pageItemIndexes; [FieldOffset(0x11AE60)] public int TempContextItemIndex; [FieldOffset(0x11AE64)] public int SelectedPageIndex; + [FieldOffset(0x11AE68)] private uint Unk11AE68; [FieldOffset(0x11AE6C)] public int UsedSlots; - // 7.1: a new 32-bit int was added between UsedSlots and CrystallizeCategory + [FieldOffset(0x11AE70)] public uint ItemCount; + [FieldOffset(0x11AE74)] public uint FilterSettingsAddonId; + [FieldOffset(0x11AE78)] public bool IsPopulatingList; + [FieldOffset(0x11AE7B)] private byte Unk11AE7B; + [FieldOffset(0x11AE7C)] public byte IsAddonReady; + [FieldOffset(0x11AE7D)] private byte Unk11AE7D; + [FieldOffset(0x11AE7E)] private byte Unk11AE7E; + [FieldOffset(0x11AE7F)] public byte IsPositionSaved; [FieldOffset(0x11AE84)] public int CrystallizeCategory; [FieldOffset(0x11AE88)] public ushort CrystallizeItemIndex; @@ -42,17 +61,24 @@ public unsafe partial struct MiragePrismPrismBoxData { [FieldOffset(0x11AE90), FixedSizeArray] internal FixedSizeArray140 _crystallizeItems; [FieldOffset(0x11BDE0)] public PrismBoxCrystallizeItem CrystallizeSelectedItem; + [FieldOffset(0x1238A0)] public uint PendingState; + [FieldOffset(0x1238A4)] public uint PendingStateStep; + [FieldOffset(0x1238A8)] public uint LastProcessedStep; + [FieldOffset(0x1238AC)] public byte CrystallizeFilterFlags; [FieldOffset(0x1238AD)] public byte SortType; // 0 = Descending, 2 = Ascending [FieldOffset(0x1238B0)] internal AgentCabinet* AgentCabinet; [FieldOffset(0x1238B8)] internal AgentMiragePrismMiragePlate* AgentMiragePrismMiragePlate; [FieldOffset(0x1238C0)] public byte FilterLevel; // 0 = Unspecified = Max Level + [FieldOffset(0x1238C1)] private byte Unk1238C1; [FieldOffset(0x1238C2)] public byte FilterSex; // 0 = Unspecified, 1 = Current, 2 = Male, 3 = Female + [FieldOffset(0x1238C3)] public byte FilterGlamour; // 0 = Unspecified, 1 = Hide not eligible, 2 = Display only outfit glamours - [FieldOffset(0x1238C8)] public Utf8String FilterString; // Inline buffer only - [FieldOffset(0x123930)] public Utf8String SearchString; // Inline buffer only + [FieldOffset(0x1238C8)] public Utf8String FilterString; // Inline Buffer only + [FieldOffset(0x123930)] public Utf8String FilterString2; // Inline Buffer only + [FieldOffset(0x123998)] public Utf8String SearchString; // Inline Buffer only } [GenerateInterop] @@ -67,6 +93,7 @@ public partial struct PrismBoxItem { [FieldOffset(0x7E)] public ushort ItemLevel; [FieldOffset(0x80)] public ushort LevelEquip; [FieldOffset(0x82), FixedSizeArray] internal FixedSizeArray2 _stains; + [FieldOffset(0x84)] private byte Unk84; // Zero = item name not yet async-loaded [FieldOffset(0x85)] public byte EquipSlotCategory; [FieldOffset(0x87)] public byte ClassJobCategory; [FieldOffset(0x88)] private byte Unk88; // Seemingly always 255 From 4f7049a6b695e28e73b8c094525c84a114e732cf Mon Sep 17 00:00:00 2001 From: Knightmore <35805408+Knightmore@users.noreply.github.com> Date: Mon, 18 May 2026 13:46:46 +0200 Subject: [PATCH 2/2] Change byte fields to bool in MiragePrismPrismBoxData --- .../FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs index 92f9fa337..37147d6e3 100644 --- a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs +++ b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs @@ -30,7 +30,7 @@ public unsafe partial struct AgentMiragePrismPrismBox { [StructLayout(LayoutKind.Explicit, Size = 0x123A00)] public unsafe partial struct MiragePrismPrismBoxData { [FieldOffset(0x00)] private byte Unk00; - [FieldOffset(0x01)] public byte IsAsyncLoadComplete; // Set to true once all async item-name loads have completed. gates the sort and page-index update in Update. + [FieldOffset(0x01)] public bool IsAsyncLoadComplete; // Set to true once all async item-name loads have completed. gates the sort and page-index update in Update. [FieldOffset(0x02)] public byte PendingTabIndex; // Pending tab/slot filter to apply. written by context actions, cleared to 13 (All) once processed [FieldOffset(0x08), FixedSizeArray] internal FixedSizeArray8000 _prismBoxItems; @@ -49,10 +49,10 @@ public unsafe partial struct MiragePrismPrismBoxData { [FieldOffset(0x11AE74)] public uint FilterSettingsAddonId; [FieldOffset(0x11AE78)] public bool IsPopulatingList; [FieldOffset(0x11AE7B)] private byte Unk11AE7B; - [FieldOffset(0x11AE7C)] public byte IsAddonReady; + [FieldOffset(0x11AE7C)] public bool IsAddonReady; [FieldOffset(0x11AE7D)] private byte Unk11AE7D; [FieldOffset(0x11AE7E)] private byte Unk11AE7E; - [FieldOffset(0x11AE7F)] public byte IsPositionSaved; + [FieldOffset(0x11AE7F)] public bool IsPositionSaved; [FieldOffset(0x11AE84)] public int CrystallizeCategory; [FieldOffset(0x11AE88)] public ushort CrystallizeItemIndex;