diff --git a/FFXIVClientStructs/FFXIV/Client/Game/MirageManager.cs b/FFXIVClientStructs/FFXIV/Client/Game/MirageManager.cs
index afe5f50e3..d71db4165 100644
--- a/FFXIVClientStructs/FFXIV/Client/Game/MirageManager.cs
+++ b/FFXIVClientStructs/FFXIV/Client/Game/MirageManager.cs
@@ -1,3 +1,5 @@
+using FFXIVClientStructs.FFXIV.Client.UI.Agent;
+
namespace FFXIVClientStructs.FFXIV.Client.Game;
// Client::Game::MirageManager
@@ -48,6 +50,24 @@ public unsafe partial struct MirageManager {
[MemberFunction("E8 ?? ?? ?? ?? 84 C0 75 ?? 0B F3")]
public partial bool IsSetSlotUnlocked(uint itemIndex, int slot);
+ ///
+ /// Deposits gear into dresser as a new outfit set.
+ ///
+ /// MirageStoreSetItem row id
+ /// Containers where each piece is. Must be in order of MirageStoreSetItem. Leftover slots use
+ /// Slots where each piece is. Leftovers must be 0.
+ [MemberFunction("E8 ?? ?? ?? ?? 84 C0 74 08 48 8B 47 28")]
+ public partial bool StoreNewOutfit(uint setItemId, InventoryType* containers, ushort* slots);
+
+ ///
+ /// Deposits gear into dresser into an existing outfit set.
+ ///
+ /// index (see also )
+ /// Same as
+ /// Same as
+ [MemberFunction("E8 ?? ?? ?? ?? EB 1A E8 ?? ?? ?? ?? 8B 57 40")]
+ public partial bool StoreExistingOutfit(uint prismBoxIndex, InventoryType* containers, ushort* slots);
+
[GenerateInterop]
[StructLayout(LayoutKind.Explicit, Size = 0x48)]
public partial struct GlamourPlate {
diff --git a/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBoxCrystallize.cs b/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBoxCrystallize.cs
new file mode 100644
index 000000000..8995505d8
--- /dev/null
+++ b/FFXIVClientStructs/FFXIV/Client/UI/AddonMiragePrismPrismBoxCrystallize.cs
@@ -0,0 +1,24 @@
+using FFXIVClientStructs.FFXIV.Component.GUI;
+
+namespace FFXIVClientStructs.FFXIV.Client.UI;
+
+// Client::UI::AddonMiragePrismPrismBoxCrystallize
+// Component::GUI::AtkUnitBase
+// Component::GUI::AtkEventListener
+[Addon("MiragePrismPrismBoxCrystallize")]
+[GenerateInterop]
+[Inherits]
+[StructLayout(LayoutKind.Explicit, Size = 0x2E0)]
+public unsafe partial struct AddonMiragePrismPrismBoxCrystallize {
+ [FieldOffset(0x238)] public AtkComponentTreeList* ItemTreeList;
+ [FieldOffset(0x240)] private void* Unk240; // icon renderer?
+ [FieldOffset(0x248)] private void* Unk248; // text renderer?
+ [FieldOffset(0x250)] private void* Unk250; // I think it's some callback to the tree list populator
+ [FieldOffset(0x268)] public AtkComponentCheckBox* GearsetFilterCheckbox;
+ [FieldOffset(0x270), FixedSizeArray] internal FixedSizeArray6 _categoryLabels;
+ [FieldOffset(0x2A0)] private byte Unk2A0;
+ [FieldOffset(0x2A8)] public AtkComponentDropDownList* CategoryDropDown;
+ [FieldOffset(0x2B0)] public AtkComponentButton* CategoryPrevButton;
+ [FieldOffset(0x2B8)] public AtkComponentButton* CategoryNextButton;
+ [FieldOffset(0x2D8)] public bool IsTooltipVisible;
+}
diff --git a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs
index 37147d6e3..4a45bbba7 100644
--- a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs
+++ b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismBox.cs
@@ -24,6 +24,9 @@ public unsafe partial struct AgentMiragePrismPrismBox {
[MemberFunction("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 0F B6 43 3A")]
public partial void UpdateItems(bool resetTabIndex, bool a2);
+
+ [MemberFunction("E8 ?? ?? ?? ?? 84 C0 0F 84 ?? ?? ?? ?? 48 8B 46 28 C6 80 ?? ?? ?? ?? ??")]
+ public partial bool PopulateCrystallizeAndFireRefresh();
}
[GenerateInterop]
@@ -48,15 +51,19 @@ public unsafe partial struct MiragePrismPrismBoxData {
[FieldOffset(0x11AE70)] public uint ItemCount;
[FieldOffset(0x11AE74)] public uint FilterSettingsAddonId;
[FieldOffset(0x11AE78)] public bool IsPopulatingList;
+ [FieldOffset(0x11AE79)] public bool IsPopulatingComplete;
[FieldOffset(0x11AE7B)] private byte Unk11AE7B;
[FieldOffset(0x11AE7C)] public bool IsAddonReady;
[FieldOffset(0x11AE7D)] private byte Unk11AE7D;
[FieldOffset(0x11AE7E)] private byte Unk11AE7E;
[FieldOffset(0x11AE7F)] public bool IsPositionSaved;
+ [FieldOffset(0x11AE80)] private int Unk11AE80; // something with the category
[FieldOffset(0x11AE84)] public int CrystallizeCategory;
[FieldOffset(0x11AE88)] public ushort CrystallizeItemIndex;
[FieldOffset(0x11AE8A)] public ushort CrystallizeItemCount;
+ [FieldOffset(0x11AE8C)] public ushort CrystallizeTreeRowCount;
+ [FieldOffset(0x11AE8E)] private ushort Unk11AE8E; // cursor related?
[FieldOffset(0x11AE90), FixedSizeArray] internal FixedSizeArray140 _crystallizeItems;
[FieldOffset(0x11BDE0)] public PrismBoxCrystallizeItem CrystallizeSelectedItem;
diff --git a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismSetConvert.cs b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismSetConvert.cs
index 13105c599..a78441ea3 100644
--- a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismSetConvert.cs
+++ b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentMiragePrismPrismSetConvert.cs
@@ -18,6 +18,14 @@ public unsafe partial struct AgentMiragePrismPrismSetConvert {
// OpenPreview in data.yml
public void Open(uint itemId) => Open(itemId, InventoryType.Invalid, 0, 0, 0, false);
+ /// Scans inventory for matching pieces and populates .
+ [MemberFunction("E8 ?? ?? ?? ?? 83 BB ?? ?? ?? ?? ?? 74 AA")]
+ public partial void PopulateHandInItems(InventoryType container, int slot, int a3);
+
+ /// Validates and refreshes the SetConvert addon.
+ [MemberFunction("E9 ?? ?? ?? ?? 48 83 C4 28 41 5E 5D E9 ?? ?? ?? ?? 48 83 C4 28")]
+ public partial void ValidateItems();
+
[GenerateInterop]
[StructLayout(LayoutKind.Explicit, Size = 0x1940)]
public partial struct AgentData {
@@ -27,15 +35,23 @@ public partial struct AgentData {
[FieldOffset(0x0C)] public ushort CrystallizeAddonId; // MiragePrismPrismBoxCrystallize, the opener
[FieldOffset(0x0E)] public ushort PrismBoxAddonId; // MiragePrismPrismBoxAddonId
+ [FieldOffset(0x10)] public AddonState State;
+ [FieldOffset(0x14)] public uint SelectedSetIndex;
[FieldOffset(0x18)] public int ContextMenuItemIndex;
-
- [FieldOffset(0x2C)] public bool EnableSorting;
+ [FieldOffset(0x1C)] public uint YesNoAddonId;
+ [FieldOffset(0x24)] public uint GlamourPrismCount;
+ /// Index for
+ [FieldOffset(0x28)] public uint PrismBoxIndex;
+ [FieldOffset(0x2C), Obsolete("Renamed to EnableStoring")] public bool EnableSorting;
+ [FieldOffset(0x2C)] public bool EnableStoring; // false = preview mode
+ [FieldOffset(0x2D)] public bool StoreInExistingOutfit; // false = will be a new outfit, set on Open
+ [FieldOffset(0x38)] public uint ItemSetCount;
[FieldOffset(0x40), FixedSizeArray] internal FixedSizeArray5 _itemSets;
[FieldOffset(0x2C0)] public uint NumItemsInSet;
[FieldOffset(0x2C4), FixedSizeArray] internal FixedSizeArray9 _items;
- [FieldOffset(0x408)] private uint Unk408;
- [FieldOffset(0x40C)] private uint Unk40C;
+ [FieldOffset(0x408)] public uint HandInItemCount;
+ [FieldOffset(0x40C)] public uint HandInItemValidCount; // ones that are able to be turned in (i.e. 100% condition)
[FieldOffset(0x410), FixedSizeArray] internal FixedSizeArray190 _handIns;
[FieldOffset(0x18D8)] public Utf8String HandInItemName; // for tooltip?
@@ -43,6 +59,7 @@ public partial struct AgentData {
public struct ItemSet {
[FieldOffset(0x00)] public uint ItemId;
[FieldOffset(0x04)] public uint IconId;
+ [FieldOffset(0x08)] public uint SlotUnlockMask;
[FieldOffset(0x10)] public Utf8String Name;
}
@@ -51,7 +68,7 @@ public struct ItemSet {
public struct ItemSetItem {
[FieldOffset(0x00)] public uint ItemId;
[FieldOffset(0x04)] public uint IconId;
- [FieldOffset(0x08)] private uint SlotIndex; // probably? seems to match MainHand, OffHand, Head, Body etc.
+ [FieldOffset(0x08)] public uint MirageStoreSetItemColumn; // column index of MirageStoreSetItem
[FieldOffset(0x0C)] public InventoryType InventoryType;
@@ -76,3 +93,12 @@ public partial struct HandInItem {
}
}
}
+
+public enum AddonState : uint {
+ None = 0, // idle/closed
+ Loading = 1, // loads the icons/names
+ Unk2 = 2,
+ Unk3 = 3,
+ RefreshHandInSlots = 4,
+ Ready = 5,
+}
diff --git a/FFXIVClientStructs/FFXIV/Component/GUI/AtkComponentTreeList.cs b/FFXIVClientStructs/FFXIV/Component/GUI/AtkComponentTreeList.cs
index 4edaefbbb..85c2625d6 100644
--- a/FFXIVClientStructs/FFXIV/Component/GUI/AtkComponentTreeList.cs
+++ b/FFXIVClientStructs/FFXIV/Component/GUI/AtkComponentTreeList.cs
@@ -28,6 +28,9 @@ public unsafe partial struct AtkComponentTreeList : ICreatable