Skip to main content
The data.yml file is the central knowledge database for FFXIVClientStructs. It contains all reverse-engineered information about the FFXIV client’s internal structures, functions, and memory layout.

File Location

FFXIVClientStructs/
└── ida/
    └── data.yml
This file is ingested by ffxiv_idarename.py to automatically name symbols in your disassembler.

Version Header

Every data.yml must start with a version field indicating which game version it corresponds to:
version: 2026.02.20.0000.0000
This follows the FFXIV patch version format: YYYY.MM.DD.HHMM.SSSS
Always update the version field when making changes to data.yml for a new game patch.

Top-Level Structure

data.yml has three main sections:
version: 2026.02.20.0000.0000

globals:
  # Global variables and constants

functions:
  # Standalone function addresses

classes:
  # Class definitions with vtables and members

Globals Section

Global variables, constants, and singleton instance pointers.

Format

globals:
  <address>: <name>  # optional comment

Examples

globals:
  0x142049D58: g_FloatHalf # 0.5f
  0x142049DB8: g_FloatOne # 1f
  0x142049DF4: g_FloatSix # 6f
  0x14205FAD0: g_UIColorTable
  0x14279EB80: g_EmptyUtf8String # empty Utf8String with just the null terminator
  0x1429CB9AC: g_Client::Game::UI::Chain.MaxTime # not a pointer
  0x1429A2C28: g_Client::Game::Control::Control_LocalPlayerEntityId
  0x1429A2C30: g_Client::Game::Control::Control_LocalPlayer

Naming Conventions

  • Prefix with g_ for true globals
  • Use full namespace paths when applicable
  • Add comments to clarify type or purpose
  • Mark non-pointer data with comments (e.g., ”# not a pointer”)

Commented Entries

Prefix with #fail for broken or unverified entries:
#fail   0x141F0C404: g_ConfigFileName
#fail   0x142919548: g_Client::Game::Object::GameObjectManager_ObjectList

Functions Section

Standalone functions that are not members of a class.

Format

functions:
  <address>: <name>  # optional comment

Examples

functions:
  0x14005DB70: WinMain
  0x1400DF310: Client::UI::GetUIConst
  0x1400DF3F0: Client::UI::IsValidPlayerCharacterName
  0x1400DFD60: Client::UI::PlaySoundEffect # static function, arg1 is the SE
  0x1400E1360: Client::UI::GetUIColor # (idx, &color, &edgeColor)
  0x1401D6210: GetTime
  0x1406BFA50: IntToString
  0x14005F160: GetStdOut
  0x140093790: IsMacClient
  0x1400D60F0: CreateDirectoryRecursive
  0x140972FB0: GetRandomInteger
  0x140973010: GetRandomFloat

Documentation Comments

Add parameter and return value information:
  0x1400E1360: Client::UI::GetUIColor # (idx, &color, &edgeColor)
  0x14080CF60: GetItemName # (uint itemId, byte itemKind, Component::Exd::Sheets::Item* itemRow, bool withLinkPrefix) -> byte*
  0x14080D1E0: GetItemIcon # (uint itemId, Component::Exd::Sheets::Item* itemRow) -> uint

Namespaces

Use :: to indicate namespace hierarchy:
  0x1400DF310: Client::UI::GetUIConst
  0x1400E0CF0: GetEurekaPublicContentDirector

Classes Section

The most complex section, containing class definitions with vtables, virtual functions, member functions, and instances.

Basic Class Structure

classes:
  <FullClassName>:
    instances:     # Global instances of this class
      - ea: <address>
        name: <optional_name>  # defaults to "Instance"
    vtbls:         # Virtual tables
      - ea: <address>
        base: <optional_base_class>
    vfuncs:        # Virtual functions (by index)
      <index>: <name>
    funcs:         # Member functions (by address)
      <address>: <name>

Complete Example

Client::System::Framework::Framework:
  instances:
    - ea: 0x1420A83B8
    - ea: 0x1420A9F58
      name: InstancePointer2
  vtbls:
    - ea: 0x1418E0698
  vfuncs:
    0: dtor
    1: Setup
    2: Destroy
    3: Free
    4: Tick
  funcs:
    0x1400901D0: ctor
    0x140090530: Initialize
    0x140091FA0: GetUIModule

Instances

Global pointers to class instances.

Format

instances:
  - ea: <address>
    name: <optional_name>  # defaults to "Instance"
  - ea: <address>
    name: <custom_name>

Examples

Client::System::Framework::Framework:
  instances:
    - ea: 0x1420A83B8  # Named: g_Client::System::Framework::Framework_Instance
    - ea: 0x1420A9F58
      name: InstancePointer2  # Named: g_Client::System::Framework::Framework_InstancePointer2
The script generates names: g_{ClassName}_{InstanceName}

Vtbls (Virtual Tables)

Virtual function table addresses and inheritance relationships.

Format

vtbls:
  - ea: <address>  # Primary vtable
    base: <BaseClassName>  # Optional: immediate base class
  - ea: <address>  # Secondary vtable (for multiple inheritance)
    base: <SecondaryBaseClassName>

Single Inheritance Example

Component::GUI::AtkResNode:
  vtbls:
    - ea: 0x1418E1234

With Base Class

Component::GUI::AtkImageNode:
  vtbls:
    - ea: 0x1418E5678
      base: Component::GUI::AtkResNode

Multiple Inheritance

When a class inherits from multiple bases:
Client::UI::AddonSomeWindow:
  vtbls:
    - ea: 0x141900000  # Primary vtable (derives from Component::GUI::AtkUnitBase)
      base: Component::GUI::AtkUnitBase
    - ea: 0x141900100  # Secondary vtable (for second base class)
      base: Component::GUI::AtkModuleInterface::AtkEventInterface
The first vtable is the main one. Additional vtables represent other bases in the hierarchy.

Vfuncs (Virtual Functions)

Virtual functions indexed by their position in the vtable.

Format

vfuncs:
  <index>: <function_name>
Index starts at 0. Each increment is 8 bytes (size of a pointer on x64).

Examples

Component::GUI::AtkResNode:
  vfuncs:
    0: dtor
    1: GetType
    2: GetId
    3: GetWidth
    4: GetHeight
    5: SetPositionShort
    6: SetPositionFloat
    # ... more vfuncs

Common Virtual Function Names

  • dtor - Destructor
  • GetXXX - Getter methods
  • SetXXX - Setter methods
  • Initialize, Finalize - Lifecycle methods
  • Update, Draw, Render - Per-frame methods
  • OnEvent, HandleXXX - Event handlers

Unknown Virtual Functions

When the purpose is unknown, the script automatically generates vfX names:
vfuncs:
  0: dtor
  1: Initialize
  2: vf2  # Unknown function at index 2
  3: vf3  # Unknown function at index 3
  4: Update
You don’t need to explicitly write vf2 - omit it and the script will generate it automatically. Only include entries you’ve identified.

Funcs (Member Functions)

Non-virtual member functions indexed by their address.

Format

funcs:
  <address>: <function_name>

Examples

Component::GUI::AtkUnitBase:
  funcs:
    0x140620B10: ctor
    0x140621340: Initialize
    0x140622AB0: Close
    0x140623120: SetPosition
    0x140623450: SetScale
    0x140624890: Show
    0x140624920: Hide

Common Member Function Names

  • ctor - Constructor
  • Initialize, Finalize - Setup/teardown
  • Load, Unload - Resource management
  • ProcessXXX - Data processing
  • HandleXXX - Event handling
  • Descriptive action names: Open, Close, Show, Hide, Update, etc.

Schema Definition

The data.yml structure is validated by data_schema.py:
class DefinedDataClassInstance:
    def __init__(self, ea, pointer=False, name=None):
        self.ea = ea          # Address
        self.pointer = pointer  # Is it a pointer?
        self.name = name      # Optional custom name

class DefinedDataClassVtable:
    def __init__(self, ea, base=None):
        self.ea = ea    # Vtable address
        self.base = base  # Base class name

class DefinedDataClassFunction:
    def __init__(self, num, name):
        self.num = num    # Index (vfuncs) or address (funcs)
        self.name = name  # Function name

class DefinedDataClass:
    def __init__(self, name, instances=[], vtbls=[], functions=[], vfuncs=[]):
        self.instances = instances
        self.vtbls = vtbls
        self.functions = functions  # Member funcs
        self.vfuncs = vfuncs       # Virtual funcs
        self.name = name
See /home/daytona/workspace/source/ida/data_schema.py for the complete schema.

Inheritance Handling

The ffxiv_idarename.py script automatically handles inheritance:

Base Class Resolution

When you specify a base class:
DerivedClass:
  vtbls:
    - ea: 0x141234567
      base: BaseClass
The script:
  1. Looks up BaseClass in the classes section
  2. Inherits all virtual function names from BaseClass
  3. Allows DerivedClass to override specific vfuncs
  4. Adds an inheritance tree comment to the vtable

Inheritance Tree Comments

The script adds visual inheritance trees:
Component::GUI::AtkModule
└── Component::GUI::AtkModuleInterface::AtkEventInterface
    └── Client::UI::Agent::AgentInterface
This appears as a comment at the vtable address in your disassembler.

Missing Base Classes

If you reference a base class that doesn’t exist in data.yml:
Warning: Inherited class "SomeBaseClass" is not documented, add a placeholder entry
Add a minimal entry:
SomeBaseClass:
  # Placeholder for base class

Overriding Base Functions

Derived classes inherit base vfunc names automatically. Only specify vfuncs that:
  • Override with a different implementation
  • Have a more specific name in this context
BaseClass:
  vfuncs:
    0: dtor
    1: Initialize
    2: ProcessData

DerivedClass:
  vtbls:
    - ea: 0x14100000
      base: BaseClass
  vfuncs:
    2: ProcessSpecializedData  # Override base name
    3: DerivedOnlyFunction     # New in derived class
  # vfunc 0 (dtor) and 1 (Initialize) are inherited automatically

Address Format and Rebasing

Standard Addresses

All addresses use the Windows 64-bit default image base:
0x140000000  # Base address
Addresses in data.yml are absolute:
0x1400901D0  # Base (0x140000000) + Offset (0x901D0)

Hexadecimal Format

Always use 0x prefix for hex addresses:
# Correct
0x1400901D0: ctor

# Incorrect
1400901D0: ctor  # Will fail validation

Rebasing

The ffxiv_idarename.py script automatically handles rebased databases:
STANDARD_IMAGE_BASE = 0x140000000
current_image_base = api.get_image_base()
if STANDARD_IMAGE_BASE != current_image_base:
    rebase_offset = current_image_base - STANDARD_IMAGE_BASE
    for vtbl in vtbls:
        vtbl.ea += rebase_offset
    for ea in funcs.keys():
        funcs[ea + rebase_offset] = funcs.pop(ea)
You should always use 0x140000000-based addresses in data.yml.

Best Practices

Organization

  1. Group related classes together in the file
  2. Sort addresses in ascending order within each section
  3. Use comments liberally to document findings
  4. Keep formatting consistent for readability

Naming

  1. Use full namespaces: Client::UI::AddonActionBar not ActionBar
  2. Be descriptive: GetItemById not Get1
  3. Follow C++ conventions: ctor, dtor, Initialize, etc.
  4. Match game terminology when known

Verification

  1. Cross-reference with multiple tools when possible
  2. Test scripts after adding entries
  3. Validate inheritance hierarchies make sense
  4. Check addresses are within valid ranges

Documentation

  1. Add parameter information in comments
  2. Note special behaviors or edge cases
  3. Link to related structures when relevant
  4. Mark uncertain entries for future verification

Common Patterns

Singleton Pattern

globals:
  0x1420A83B8: g_Framework  # Global instance pointer

Client::System::Framework::Framework:
  instances:
    - ea: 0x1420A83B8
  # ...

Manager Classes

Classes that manage collections:
Client::Game::Object::GameObjectManager:
  instances:
    - ea: 0x142919548
  funcs:
    0x140E98A30: GetGameObjectByIndex
    0x140E99120: GetObjectCount

Interface Classes

Abstract base classes with pure virtual functions:
Component::GUI::AtkModuleInterface::AtkEventInterface:
  vtbls:
    - ea: 0x1418EBCA0
  vfuncs:
    0: dtor
    1: ReceiveEvent  # Pure virtual in base

Addon/UI Classes

Game UI windows:
Client::UI::AddonActionBar:
  vtbls:
    - ea: 0x141A12340
      base: Component::GUI::AtkUnitBase
  vfuncs:
    0: dtor
    63: Update
    64: Draw
  funcs:
    0x14075A120: Setup
    0x14075A890: UpdateSlots

Validation and Testing

Before Committing

  1. Run the script on a clean database
  2. Check for errors in the console output
  3. Verify names appear correctly in the disassembler
  4. Test inheritance chains for correctness
  5. Ensure version is updated

Common Errors

“Multiple vtables are defined at…”
  • Duplicate vtable address in data.yml
“Multiple classes are registered with the name…”
  • Duplicate class name in data.yml
“has an invalid address”
  • Address is not an integer (missing 0x prefix or typo)
“Extra key ‘XXX’ present in…”
  • Unrecognized key in class definition
  • Check spelling: vfuncs not vfunctions

Working with Large Files

data.yml can grow very large. Tips for managing it:

Use an Editor with YAML Support

  • VS Code with YAML extension
  • PyCharm / IntelliJ IDEA
  • Sublime Text with YAML package

Search Efficiently

Find classes by name:
Client::System::Framework::Framework:
Find addresses:
0x1400901D0

Split Testing

When adding many classes, test incrementally:
  1. Add a few classes
  2. Run script
  3. Fix errors
  4. Add more classes

Use Version Control

Git diff shows exactly what changed:
git diff ida/data.yml

Next Steps

Build docs developers (and LLMs) love