diff --git a/FFXIVClientStructs/FFXIV/Client/Game/Event/NpcRepairCallback.cs b/FFXIVClientStructs/FFXIV/Client/Game/Event/NpcRepairCallback.cs new file mode 100644 index 000000000..ce464c2a9 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Game/Event/NpcRepairCallback.cs @@ -0,0 +1,14 @@ +using FFXIVClientStructs.FFXIV.Component.GUI; + +namespace FFXIVClientStructs.FFXIV.Client.Game.Event; + +// Client::Game::Event::NpcRepairCallback +// Client::Game::Event::UICallbackBase +// Client::Game::Event::UICallbackBaseInterface +// Component::GUI::AtkModuleInterface::AtkEventInterface +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x30)] +public unsafe partial struct NpcRepairCallback { + [FieldOffset(0x10)] public CustomTalkEventHandler* EventHandler; +} diff --git a/FFXIVClientStructs/FFXIV/Client/Game/InventoryItemRef.cs b/FFXIVClientStructs/FFXIV/Client/Game/InventoryItemRef.cs new file mode 100644 index 000000000..deab5bab6 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Game/InventoryItemRef.cs @@ -0,0 +1,9 @@ +namespace FFXIVClientStructs.FFXIV.Client.Game; + +[StructLayout(LayoutKind.Explicit, Size = 0x10)] +public struct InventoryItemRef { + [FieldOffset(0x00)] public InventoryType Container; + [FieldOffset(0x04)] public short Slot; + [FieldOffset(0x08)] public uint ItemId; + [FieldOffset(0x0C)] private int UnkC; // used by AgentFreeCompanyChest, AgentTradeMultiple +} diff --git a/FFXIVClientStructs/FFXIV/Client/Game/RepairManager.cs b/FFXIVClientStructs/FFXIV/Client/Game/RepairManager.cs index 9bdc16e29..b41967cbf 100644 --- a/FFXIVClientStructs/FFXIV/Client/Game/RepairManager.cs +++ b/FFXIVClientStructs/FFXIV/Client/Game/RepairManager.cs @@ -1,12 +1,17 @@ +using FFXIVClientStructs.FFXIV.Common.Component.Excel; + namespace FFXIVClientStructs.FFXIV.Client.Game; // Client::Game::RepairManager [GenerateInterop] -[StructLayout(LayoutKind.Explicit, Size = 0x8)] +[StructLayout(LayoutKind.Explicit, Size = 0x78)] public unsafe partial struct RepairManager { [StaticAddress("48 8D 0D ?? ?? ?? ?? BA ?? ?? ?? ?? 41 0F 94 C0 45 33 C9", 3)] public static partial RepairManager* Instance(); + [FieldOffset(0x08)] private ExcelSheet* ItemSheet; + [FieldOffset(0x10)] private ExcelSheetWaiter* SheetWaiter; + [MemberFunction("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 48 83 F8 03 75 46")] public partial bool RepairItem(InventoryType itemToRepairInventory, ushort itemToRepairSlot, bool isNpc); diff --git a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentRepair.cs b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentRepair.cs index d5c92a6ec..90f1a7973 100644 --- a/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentRepair.cs +++ b/FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentRepair.cs @@ -1,4 +1,6 @@ using FFXIVClientStructs.FFXIV.Client.Game; +using FFXIVClientStructs.FFXIV.Client.Game.Event; +using FFXIVClientStructs.FFXIV.Client.System.String; namespace FFXIVClientStructs.FFXIV.Client.UI.Agent; @@ -10,40 +12,66 @@ namespace FFXIVClientStructs.FFXIV.Client.UI.Agent; [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xDE0)] public unsafe partial struct AgentRepair { - [FieldOffset(0x28)] private nint Unk_28; - [FieldOffset(0x30)] public bool IsSelfRepairOpen; - [FieldOffset(0x31)] public bool UseSelfRepair; - [FieldOffset(0x38)] private nint CustomTalkHandler; // assigned when using NPC. .data:0000000142740FB8 off_142740FB8 dq offset off_142175380 ; - [FieldOffset(0x40)] public int SelectedItemInventoryType; - [FieldOffset(0x44)] public ushort SelectedItemInventorySlot; - [FieldOffset(0x48)] public int SelectedItemId; - [FieldOffset(0x50)] public int AddonId_SelectYesno; - [FieldOffset(0x54)] public int InventoryContainerIndex; // Used to lookup static array. Mapped index ids of repair gear dropdown. (7 = Equipped, 0 = Main/Off Hand, 1 = Head/Body/Hands, ...) - [FieldOffset(0x58)] public int SelectedItemIndex; - [FieldOffset(0x5C)] public int ShownRepairEntryAmount; - [FieldOffset(0x60)] public int TotalRepairCost; - [FieldOffset(0x68)] private nint Unk_68; // points to a data structure that holds all information about the currently shown repairable items. likely some Atk Data? - [FieldOffset(0x70)] private nint Unk_70; // same pointer as in Unk_68 - [FieldOffset(0x78)] private nint Unk_78; - [FieldOffset(0x80)][FixedSizeArray] internal FixedSizeArray140 _repairItemInfos; - [FieldOffset(0x948)] private byte Unk_948; // Seems to be some loading state - [FieldOffset(0x94C)] public int RepairEntriesAmount; - [FieldOffset(0x950)] private int Unk_950; // Ends to be the same number as in RepairEntriesAmount. Maybe some counter for adding up AtkEntries. - [FieldOffset(0x954)][FixedSizeArray] internal FixedSizeArray140 _repairEntries; - [FieldOffset(0xDB4)] private int Unk_DB4; // This is checked in AgentRepair_Update for 1 or 2 - [FieldOffset(0xDB8)] private int Unk_DB8; // Some InventoryType - [FieldOffset(0xDBC)] private ushort Unk_DBC; - [FieldOffset(0xDC0)] private nint Unk_DC0; - [FieldOffset(0xDC8)] private int Unk_DC8; - [FieldOffset(0xDCC)] private byte Unk_DCC; - [FieldOffset(0xDD0)] private int Unk_DDD0; // Maybe some AddonId - [FieldOffset(0xDD4)] private bool Unk_DD4; // Some state. Is set from argument in ChangeInventoryContainer. Changes for a short amount of time to true after "Repair all" - - + [FieldOffset(0x28)] private nint Unk28; // new VTable that seems to be used with the new "Repair all" function + [FieldOffset(0x30)] public InventoryItem* TargetInventorySlot; // temporarily set when opening via rightlick on an item + [FieldOffset(0x38)] public bool IsSelfRepairOpen; + [FieldOffset(0x39)] public bool UseSelfRepair; + [FieldOffset(0x40)] public NpcRepairCallback* NpcRepairCallback; + [FieldOffset(0x48)] public InventoryItemRef SelectedItem; + [FieldOffset(0x58)] public int DialogAddonId; + [FieldOffset(0x5C)] public ItemFilter Filter; + [FieldOffset(0x60)] public int SelectedItemIndex; + [FieldOffset(0x64)] public int ShownRepairEntryAmount; + [FieldOffset(0x68)] public int TotalRepairCost; + /// Temporarily used while refreshing. 3 per Item. + [FieldOffset(0x70)] private StdVector Strings; + [FieldOffset(0x88), FixedSizeArray] internal FixedSizeArray140 _filterItemRefs; + [FieldOffset(0x948)] public bool IsAddonRefreshPending; + /// Amount of total inventory items for the selected + [FieldOffset(0x94C)] public int FilterItemCount; + [FieldOffset(0x950)] public int ProcessedFilterItemCount; + /// Holds all items of the selected Filter in the same order as ItemODR + [FieldOffset(0x954), FixedSizeArray] internal FixedSizeArray140 _inventoryItemEntries; + [FieldOffset(0xDB4)] private int UnkDB4; // This is checked in AgentRepair_Update for 1 or 2 + [FieldOffset(0xDB8)] private InventoryItemRef UnkDB8ItemRef; // from here on saved state when opening RepairAuto? + [FieldOffset(0xDC8)] private ItemFilter UnkDC8Filter; + [FieldOffset(0xDCC)] private byte UnkDCC; + [FieldOffset(0xDD0)] private int UnkDD0AddonId; + [FieldOffset(0xDD4)] private bool UnkDD4; + [FieldOffset(0xDD5)] private bool UnkDD5; + [FieldOffset(0xDD6)] private bool UnkDD6; + [FieldOffset(0xDD8)] public int RepairAutoAddonId; + [FieldOffset(0x48), Obsolete("Use SelectedItem.Container")] public int SelectedItemInventoryType; + [FieldOffset(0x4C), Obsolete("Use SelectedItem.Slot")] public ushort SelectedItemInventorySlot; + [FieldOffset(0x50), Obsolete("Use SelectedItem.ItemId")] public int SelectedItemId; + [FieldOffset(0x58), Obsolete("Renamed to DialogAddonId")] public int AddonId_SelectYesno; + [FieldOffset(0x5C), Obsolete("Renamed to Filter")] public int InventoryContainerIndex; + [FieldOffset(0x64), Obsolete("Renamed to ShownRepairEntryAmount")] public int RepairableItemAmount; + [FieldOffset(0x88), FixedSizeArray, Obsolete("Use to FilterItemRefs")] internal FixedSizeArray140 _repairItemInfos; + [FieldOffset(0x94C), Obsolete("Renamed to InventoryItemEntryAmount")] public int RepairEntriesAmount; + [FieldOffset(0x954), FixedSizeArray, Obsolete("Use InventoryItemEntries")] internal FixedSizeArray140 _repairEntries; + + [Obsolete("Use ChangeRepairInventory.")] [MemberFunction("E8 ?? ?? ?? ?? 40 F6 C7 08 74 2D")] public partial RepairEntry* ChangeInventoryContainer(bool arg0); // false for self- and NPC-Repair but will be set in 0xDCC. unsure for what that's used. + /// + /// Changes the selected inventory container of the repair gear dropdown. + /// + /// + /// Needs to be set first. + /// + [MemberFunction("E8 ?? ?? ?? ?? 40 F6 C7 08 74 2D")] + public partial ItemEntry* ChangeRepairInventory(bool arg0); // false for self- and NPC-Repair but will be set in 0xDCC. unsure for what that's used. + + [StructLayout(LayoutKind.Explicit, Size = 0x8)] + public struct ItemEntry { + [FieldOffset(0x0)] public InventoryType InventoryType; + [FieldOffset(0x4)] public int Slot; + } + + // TODO: remove (was replaced by InventoryItemRef) [StructLayout(LayoutKind.Explicit, Size = 0x10)] public struct RepairItemInfo { [FieldOffset(0x0)] public int InventoryType; @@ -51,9 +79,21 @@ public struct RepairItemInfo { [FieldOffset(0x8)] public int ItemId; } + // TODO: remove with ChangeInventoryContainer (was replaced by ItemEntry) [StructLayout(LayoutKind.Explicit, Size = 0x8)] public struct RepairEntry { [FieldOffset(0x0)] public uint InventoryType; - [FieldOffset(0x4)] private uint Unk_4; + [FieldOffset(0x4)] public uint Slot; + } + + public enum ItemFilter { + None = -1, + Equipped, + ArmouryMainHandOffHand, + ArmouryHeadBodyHands, + ArmouryLegsFeet, + ArmouryNeckEars, + ArmouryWristsRing, + Inventory } } diff --git a/ida/data.yml b/ida/data.yml index ce71cf5fd..3ae90f641 100644 --- a/ida/data.yml +++ b/ida/data.yml @@ -1730,6 +1730,10 @@ classes: 0x14085F460: GetParameterValue 0x140B6DD50: GetParameterMaxValue #oldfail 0x1408A0170: GetEquipErrorLogMessageId # (this, race, sex, level, classJob, grandCompany, pvpRank, itemRow) + Client::Game::InventoryItemRef: + funcs: + 0x1401176F0: Set + 0x140117770: Get Client::Game::InventoryContainer: vtbls: - ea: 0x1420BC698 @@ -11419,7 +11423,7 @@ classes: base: Client::UI::Agent::AgentInterface funcs: 0x140BE4F30: ctor - 0x140BE5720: ChangeInventoryContainer + 0x140BE5720: ChangeRepairInventory Client::UI::Agent::AgentRepairRequest: vtbls: - ea: 0x1420D28A8 @@ -15068,6 +15072,10 @@ classes: vtbls: - ea: 0x1421DC4B8 base: Component::GUI::AtkModuleInterface::AtkEventInterface # this should be Client::Game::Event::UICallbackBase but it's too hard to find + Client::Game::Event::NpcRepairCallback: + vtbls: + - ea: 0x1421DC9E0 + base: Component::GUI::AtkModuleInterface::AtkEventInterface # this should be Client::Game::Event::UICallbackBase Client::Game::Event::EventSceneModule: funcs: 0x141709150: ctor