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.
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.
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”)
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.
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
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.
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.
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.
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.
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:
- Looks up
BaseClass in the classes section
- Inherits all virtual function names from
BaseClass
- Allows
DerivedClass to override specific vfuncs
- Adds an inheritance tree comment to the vtable
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
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)
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
- Group related classes together in the file
- Sort addresses in ascending order within each section
- Use comments liberally to document findings
- Keep formatting consistent for readability
Naming
- Use full namespaces:
Client::UI::AddonActionBar not ActionBar
- Be descriptive:
GetItemById not Get1
- Follow C++ conventions:
ctor, dtor, Initialize, etc.
- Match game terminology when known
Verification
- Cross-reference with multiple tools when possible
- Test scripts after adding entries
- Validate inheritance hierarchies make sense
- Check addresses are within valid ranges
Documentation
- Add parameter information in comments
- Note special behaviors or edge cases
- Link to related structures when relevant
- 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
- Run the script on a clean database
- Check for errors in the console output
- Verify names appear correctly in the disassembler
- Test inheritance chains for correctness
- 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:
Split Testing
When adding many classes, test incrementally:
- Add a few classes
- Run script
- Fix errors
- Add more classes
Use Version Control
Git diff shows exactly what changed:
Next Steps