Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Game/MirageManager.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using FFXIVClientStructs.FFXIV.Client.UI.Agent;

namespace FFXIVClientStructs.FFXIV.Client.Game;

// Client::Game::MirageManager
Expand Down Expand Up @@ -48,6 +50,24 @@ public unsafe partial struct MirageManager {
[MemberFunction("E8 ?? ?? ?? ?? 84 C0 75 ?? 0B F3")]
public partial bool IsSetSlotUnlocked(uint itemIndex, int slot);

/// <summary>
/// Deposits gear into dresser as a <b>new</b> outfit set.
/// </summary>
/// <param name="setItemId">MirageStoreSetItem row id</param>
/// <param name="containers">Containers where each piece is. Must be in order of MirageStoreSetItem. Leftover slots use <see cref="InventoryType.Invalid"/></param>
/// <param name="slots">Slots where each piece is. Leftovers must be 0.</param>
[MemberFunction("E8 ?? ?? ?? ?? 84 C0 74 08 48 8B 47 28")]
public partial bool StoreNewOutfit(uint setItemId, InventoryType* containers, ushort* slots);

/// <summary>
/// Deposits gear into dresser into an <b>existing</b> outfit set.
/// </summary>
/// <param name="prismBoxIndex"><see cref="PrismBoxItemIds"/> index (see also <seealso cref="AgentMiragePrismPrismSetConvert.AgentData.PrismBoxIndex"/>)</param>
/// <param name="containers">Same as <see cref="StoreNewOutfit"/></param>
/// <param name="slots">Same as <see cref="StoreNewOutfit"/></param>
[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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<AtkUnitBase>]
[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<CStringPointer> _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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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<PrismBoxCrystallizeItem> _crystallizeItems;
[FieldOffset(0x11BDE0)] public PrismBoxCrystallizeItem CrystallizeSelectedItem;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/// <summary>Scans inventory for matching pieces and populates <see cref="AgentData.HandIns"/>.</summary>
[MemberFunction("E8 ?? ?? ?? ?? 83 BB ?? ?? ?? ?? ?? 74 AA")]
public partial void PopulateHandInItems(InventoryType container, int slot, int a3);

/// <summary>Validates <see cref="AgentData.Items"/> and refreshes the SetConvert addon.</summary>
[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 {
Expand All @@ -27,22 +35,31 @@ 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;
/// <summary>Index for <see cref="MirageManager.PrismBoxItemIds"/></summary>
[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<ItemSet> _itemSets;
[FieldOffset(0x2C0)] public uint NumItemsInSet;
[FieldOffset(0x2C4), FixedSizeArray] internal FixedSizeArray9<ItemSetItem> _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<HandInItem> _handIns;
[FieldOffset(0x18D8)] public Utf8String HandInItemName; // for tooltip?

[StructLayout(LayoutKind.Explicit, Size = 0x80)]
public struct ItemSet {
[FieldOffset(0x00)] public uint ItemId;
[FieldOffset(0x04)] public uint IconId;
[FieldOffset(0x08)] public uint SlotUnlockMask;

[FieldOffset(0x10)] public Utf8String Name;
}
Expand All @@ -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;

Expand All @@ -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,
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public unsafe partial struct AtkComponentTreeList : ICreatable<AtkComponentTreeL
[MemberFunction("E8 ?? ?? ?? ?? 48 8B 08 F6 01")]
public partial AtkComponentTreeListItem* GetItem(int index);

[MemberFunction("E8 ?? ?? ?? ?? 84 C0 74 25 85 ED")]
public partial bool IsItemGroupHeader(int index);

[MemberFunction("E8 ?? ?? ?? ?? 44 3B FF 75")]
public partial void LoadAtkValues(
int atkValuesCount,
Expand Down
13 changes: 13 additions & 0 deletions ida/data.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1840,6 +1840,8 @@ classes:
0x140893120: Clear
0x1408931E0: RequestPrismBox
0x140893380: IsSetSlotUnlocked
0x1408935F0: StoreNewOutfit
0x140893840: StoreExistingOutfit
0x140893B20: RestorePrismBoxItem
0x140893D00: RestorePrismBoxSetItem
0x1408945F0: RequestGlamourPlates
Expand Down Expand Up @@ -9280,6 +9282,7 @@ classes:
0x1406A2DF0: LoadAtkValues
0x1406A37C0: ExpandGroupExclusively
0x1406A48F0: GetItem
0x1406A4BD0: IsItemGroupHeader
0x1406A4C30: ctor # no xrefs, inlined in AtkUldManager_CreateAtkComponent
0x1406A4CF0: Finalizer # no xrefs
0x1406A7620: CreateItem # inlined (7.3)
Expand Down Expand Up @@ -14158,6 +14161,12 @@ classes:
base: Client::UI::Agent::AgentInterface
funcs:
0x140DA9AD0: ctor
0x140DABCD0: HandleCrystallizeCallback
0x140DACBE0: LoadPrismBoxItems
0x140DADB30: ShouldFilterPrismBoxItem
0x140DAE5C0: UpdateCrystallizePopulate
0x140DAE170: PopulateCrystallizeAndFireRefresh
0x140DAED60: ScanCrystallizeInventoryForCategory
0x140DADDD0: UpdateItems
Client::UI::Agent::AgentMiragePrismPrismItemDetail:
vtbls:
Expand All @@ -14173,6 +14182,8 @@ classes:
funcs:
0x140DB0840: Open # todo: check this (7.4)
0x140DB0B10: OpenPreview
0x140DB1EB0: PopulateHandInItems
0x140DB2980: ValidateItems
Client::UI::Agent::AgentMiragePrismPrismSetConvert::AgentData:
funcs:
#fail 0x140C36B10: ctor # inlined (7.3)
Expand Down Expand Up @@ -23019,6 +23030,8 @@ classes:
base: Component::GUI::AtkUnitBase
funcs:
0x141273410: ctor
0x141274120: ToggleGearsetFilter
0x1412741F0: SwitchCategory
Client::UI::AddonMiragePrismPrismBoxFilter: # 642
vtbls:
- ea: 0x14222BF90
Expand Down
Loading