Skip to content

Add item and action tooltip mappings#1891

Open
lokinmodar wants to merge 7 commits into
aers:mainfrom
lokinmodar:feature/tooltip-signatures
Open

Add item and action tooltip mappings#1891
lokinmodar wants to merge 7 commits into
aers:mainfrom
lokinmodar:feature/tooltip-signatures

Conversation

@lokinmodar

@lokinmodar lokinmodar commented Jul 22, 2026

Copy link
Copy Markdown

Summary

Adds the item and action tooltip mappings used by the corresponding UI agents and addons.

  • Adds AgentItemDetail.HandleItemHover and AgentItemDetail.OnItemHovered.
  • Adds AgentActionDetail.HandleActionHover and records the fields it initializes.
  • Adds the item-detail tooltip helpers and the action-detail UI node pointers used while generating tooltip text.
  • Regenerates ida/ffxiv_structs.yml from the updated layouts.

This is intentionally a draft while the RE evidence gets a second set of eyes.

AgentItemDetail

HandleItemHover has a unique direct match at RVA 0x1036950. Its final explicit argument is read from the stack and stored with mov dword [rbx + 0x128], eax (VA 0x1410369A1). Flag1 is therefore mapped as a uint, and the argument is named flag1 rather than left as an unknown value.

OnItemHovered is added from its own direct match at RVA 0x1038DC0.

AgentActionDetail

The existing E8 signature has one call-site match and resolves to the HandleActionHover target at RVA 0xEE1F80. The method initializes the existing action identifiers and the confirmed fields at 0x4C, 0x50, 0x54, 0x68, and 0x6C; names remain Unk* where static analysis only establishes storage and width.

Addons

AddonItemDetail.GenerateTooltip calls the following helpers with the same (NumberArrayData*, StringArrayData*) pair:

  • SetEquipRestrictionInfo at RVA 0x12DAFB0
  • SetSpiritbondInfo at RVA 0x12DB330
  • SetBonuses at RVA 0x12DB850
  • SetMateria at RVA 0x12DBB80

The AddonActionDetail node fields are kept private and conservatively typed as AtkTextNode* or AtkResNode* only where their uses establish the node type.

Evidence

The signatures above each matched exactly once in the local ffxiv_dx11.exe used for this pass:

4236E770E673150E85F8D10BEAB2FC4834C82F86AAB8A555A9175439FC906A6D

For the E8 action-detail signature, the call-site and relative target are treated separately; the wrapper remains a member-function mapping for the resolved target.

Methodology

This work followed the Dalamud reverse-engineering guidelines and combined static signature analysis, disassembly, existing ClientStructs/IDA metadata, layout and API validation, and limited read-only runtime corroboration. Runtime observations were complementary; ABI-facing claims were based on corroborating static evidence and validation.

Validation

  • dotnet restore .\\FFXIVClientStructs.slnx
  • dotnet build .\\FFXIVClientStructs.slnx --no-restore
  • dotnet format .\\FFXIVClientStructs.slnx --verify-no-changes
  • dotnet run --project .\\CExporter\\CExporter.csproj -c Release -- --no-write
  • dotnet run --project .\\CExporter\\CExporter.csproj -c Release

ida/errors.txt was empty after the write-mode export.

Language assistance

Codex (an LLM) was used to help translate, organize, and edit the English wording in the documentation and this PR description. It was not used to establish offsets, sizes, signatures, layouts, or other ABI details.

The reverse-engineering work, validation, and all technical claims were independently verified by the author, who remains responsible for the technical accuracy of this PR.

@lokinmodar
lokinmodar marked this pull request as ready for review July 22, 2026 15:09
@github-actions github-actions Bot added the breaking change PR contains breaking changes and wont be merged before a new patch label Jul 22, 2026
@lokinmodar
lokinmodar marked this pull request as draft July 22, 2026 15:14
@lokinmodar

Copy link
Copy Markdown
Author

The API-compat check correctly flags the byte -> uint change for AgentItemDetail.Flag1 as breaking.

The reason for changing it was that AgentItemDetail::HandleItemHover reads its final explicit argument as a 32-bit value and stores it with mov dword [rbx + 0x128], eax. That same value is exposed as uint in AtkTooltipItemArgs.Flag1.

What representation would you prefer for this patch window?

  • Keep the existing public byte Flag1 and model the 32-bit storage separately/privately for compatibility; or
  • Leave the corrected public uint Flag1 mapping for a future patch where breaking API changes are allowed.

Happy to update the PR in the direction that best fits the project's compatibility policy.

@lokinmodar
lokinmodar marked this pull request as ready for review July 22, 2026 15:22
@github-actions

Copy link
Copy Markdown
Contributor

Breaking Changes

Member exists in left but not in right

FFXIVClientStructs.FFXIV.Client.UI.Agent: 1

AgentItemDetail: 1

  • byte Flag1

@Caraxi

Caraxi commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

at least have the decency to disclose the whole PR was created by vibes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking change PR contains breaking changes and wont be merged before a new patch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants