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