Skip to content
RF DataData reference
RU

Characters and creatures

Classes

Class tree, experience, ranks

Total 228 Known 62 Derived 155 Unused 11

Overview

Character classes, experience and ranks. Four server tables and the client Character.edf, where classes, ranks and experience are separate blocks with the same row and number.

Class.dat  ── m_strCh_Class[8] ──> Class.dat (next grade)
   │          m_strLinkClassSkill[10] ──> ClassSkill.dat
   │          m_strDefaultItem[9] ──> item tables (by code)
   └─ client: Character.edf, block 0
Exp.dat    ── row number = level ──> Character.edf, block 5
Grade.dat  ── (level, ranking place) → rank 0–7 ──> Character.edf, block 1
PlayerCharacter.dat ── race and sex ──> PlayerCharacter.edf

How it works

  • A class is two records: a Class.dat row and a block 0 row of Character.edf with the same number. The client one is derived from the server one: next-class and item codes are packed, the item quantity is a byte, skill group bonuses do not go to the client, flags are collected into a mask.
  • The row number is the key: it is stored in the character DB (the current class by code, the history by number). Rows cannot be inserted in the middle or reordered; rows 45 (BSB0) and 49 (BSS2) are hard-coded in the server.
  • The class tree is a graph over m_strCh_Class: codes of the same race, grade one higher, at most 8 transitions per row, history no deeper than 3 changes. Class change is request 11/6, reset is 11/24; the change reward is given once per grade.
  • Class flags and bonuses act over the whole class history of the character (as a sum or “any of”).
  • Exp.dat: the server reads only the Bellato column, the other columns and the three client columns are copies of it; ≥ 50 rows, values increase.
  • Grade.dat: rows of one level are consecutive in increasing m_fRanking, the last is 1.0; 8 ranks per race.
  • PlayerCharacter.dat and PlayerCharacter.edf are one entity of 5 rows (race and sex).

Character.edf — 7 blocks, all derived from server tables (classes, ranks, monsters, ?, mastery limits, experience, animus); except block 3 (Action), whose source was not found in the digests. The monster and animus blocks are described in their own domains and only repeated here as part of the file.

Files of the category

6 in the registry
FileSideFormatLevelCorporaRecordDigestNote
script\Class.datserverdatready for fullAoP ✓, GU ✓, Sirin ✓AoP 2256, GU 2256, Sirin 2256classes.md, skills.mdclasses.md §2
script\Exp.datserverdatready for fullAoP ✓, GU ✓, Sirin ✓AoP 260, GU 260, Sirin 260classes.mdclasses.md §6.1
script\Grade.datserverdatready for fullAoP ✓, GU ✓, Sirin ✓AoP 76, GU 76, Sirin 76classes.mdclasses.md §7
script\PlayerCharacter.datserverdatready for fullAoP ✓, GU ✓, Sirin ✓AoP 168, GU 168, Sirin 168classes.mdclasses.md §8
DataTable\Character.edfclientedfderivedAoP ✓, GU ✓, Sirin ✓AoP 7 sections: 1532/112/224/48/46/24/112, G…classes.md, monsters.md, skills.md, animus.mdDerived from: Class.dat, Grade.dat, MonsterCharacter.dat, *MasteryLimit.dat, Exp.dat, animus tables. 7 blocks: classes, ranks, monsters, actions, mastery limits, experience, animus (classes.md §9, monsters.md §7.1)
DataTable\PlayerCharacter.edfclientedfderivedAoP ✓, GU ✓, Sirin ✓AoP 72, GU 72, Sirin 72classes.mdDerived from: PlayerCharacter.dat.

“ready for full” — the format is understood and the fields are described; “derived” — the file is assembled from another; “opaque” — the format is not fully known; “postponed” and “out of scope” — the studio does not edit the file.

Sections of the category

The files of the category are split into groups; every group and subgroup has its own page with the fields of its files only.

Classes

script\Class.dat

Total 34 Known 34 Derived 0 Unused 0

Unused parameters

Fields that neither the server nor the client reads. For each: why it was decided so and where that was established. The editor keeps their bytes as they are.

DataTable\Character.edf client file

Record: ClassLimit (Class)

OffsetFieldWhy unusedData
+0x002--11_u8--
padding before the u32 of the number
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x003--12_u8--
padding before the u32 of the number
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x1F5--5_u8--
padding before the u32 of flags
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x1F6--6_u8--
padding before the u32 of flags
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x1F7--7_u8--
padding before the u32 of flags
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0

Record: Rank

OffsetFieldWhy unusedData
+0x061--1_u8--
padding before the u32 of icons
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x062--2_u8--
padding before the u32 of icons
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0
+0x063--3_u8--
padding before the u32 of icons
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0

DataTable\PlayerCharacter.edf client file

OffsetFieldWhy unusedData
+0x02A(2 bytes) ×2
padding before float
classes.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP
always 0 / 0

script\Exp.dat server file

OffsetFieldWhy unusedData
+0x084m_strCora
unused
classes.md §9.5: the experience table is referenced in code only by 1400C6F30 (reads +0x44), the loader and the g_Main constructor/destructor (search for all references to g_Main+0x388EB0D0/1797DE440 in dzs.txt); records are not stored in objects; the client does not receive the file
66 values; most often 0 (2%)
+0x0C4m_strAccretia
unused
classes.md §9.5: the experience table is referenced in code only by 1400C6F30 (reads +0x44), the loader and the g_Main constructor/destructor (search for all references to g_Main+0x388EB0D0/1797DE440 in dzs.txt); records are not stored in objects; the client does not receive the file
66 values; most often 0 (2%)
RF Online is a trademark of its owners. The reference is compiled from research for content development. Built 01.11.2026 · field catalog dated 29.10.2026 · Adagio UI 0.5.0