Skip to content
Merged
14 changes: 14 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Game/Event/NpcRepairCallback.cs
Original file line number Diff line number Diff line change
@@ -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::EventHandler>
// Client::Game::Event::UICallbackBaseInterface
// Component::GUI::AtkModuleInterface::AtkEventInterface
[GenerateInterop]
[Inherits<AtkModuleInterface.AtkEventInterface>]
[StructLayout(LayoutKind.Explicit, Size = 0x30)]
public unsafe partial struct NpcRepairCallback {
[FieldOffset(0x10)] public CustomTalkEventHandler* EventHandler;
}
9 changes: 9 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Game/InventoryItemRef.cs
Original file line number Diff line number Diff line change
@@ -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
}
7 changes: 6 additions & 1 deletion FFXIVClientStructs/FFXIV/Client/Game/RepairManager.cs
Original file line number Diff line number Diff line change
@@ -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);

Expand Down
102 changes: 71 additions & 31 deletions FFXIVClientStructs/FFXIV/Client/UI/Agent/AgentRepair.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -10,50 +12,88 @@ namespace FFXIVClientStructs.FFXIV.Client.UI.Agent;
[Inherits<AgentInterface>]
[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<RepairItemInfo> _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<RepairEntry> _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;
/// <remarks> Temporarily used while refreshing. 3 per Item. </remarks>
[FieldOffset(0x70)] private StdVector<Utf8String> Strings;
[FieldOffset(0x88), FixedSizeArray] internal FixedSizeArray140<InventoryItemRef> _filterItemRefs;
[FieldOffset(0x948)] public bool IsAddonRefreshPending;
/// <remarks> Amount of total inventory items for the selected <see cref="Filter"/> </remarks>
[FieldOffset(0x94C)] public int FilterItemCount;
[FieldOffset(0x950)] public int ProcessedFilterItemCount;
/// <remarks> Holds all items of the selected Filter in the same order as ItemODR </remarks>
[FieldOffset(0x954), FixedSizeArray] internal FixedSizeArray140<ItemEntry> _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<RepairItemInfo> _repairItemInfos;
[FieldOffset(0x94C), Obsolete("Renamed to InventoryItemEntryAmount")] public int RepairEntriesAmount;
[FieldOffset(0x954), FixedSizeArray, Obsolete("Use InventoryItemEntries")] internal FixedSizeArray140<RepairEntry> _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.

/// <summary>
/// Changes the selected inventory container of the repair gear dropdown.
/// </summary>
/// <remarks>
/// Needs <see cref="Filter"/> to be set first.
/// </remarks>
[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;
[FieldOffset(0x4)] public ushort Slot;
[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
}
}
10 changes: 9 additions & 1 deletion ida/data.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -11419,7 +11423,7 @@ classes:
base: Client::UI::Agent::AgentInterface
funcs:
0x140BE4F30: ctor
0x140BE5720: ChangeInventoryContainer
0x140BE5720: ChangeRepairInventory
Client::UI::Agent::AgentRepairRequest:
vtbls:
- ea: 0x1420D28A8
Expand Down Expand Up @@ -15068,6 +15072,10 @@ classes:
vtbls:
- ea: 0x1421DC4B8
base: Component::GUI::AtkModuleInterface::AtkEventInterface # this should be Client::Game::Event::UICallbackBase<Client::Game::Event::EventHandler> 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::EventHandler>
Client::Game::Event::EventSceneModule:
funcs:
0x141709150: ctor
Expand Down