Персонажи и существа
Классы
Дерево классов, опыт, ранги
Обзор
Классы, опыт и ранги персонажа. Четыре серверные таблицы и клиентский Character.edf, в котором классы, ранги и опыт лежат отдельными блоками той же строкой и тем же номером.
Class.dat ── m_strCh_Class[8] ──> Class.dat (следующая ступень)
│ m_strLinkClassSkill[10] ──> ClassSkill.dat
│ m_strDefaultItem[9] ──> таблицы предметов (по коду)
└─ клиент: Character.edf, блок 0
Exp.dat ── номер строки = уровень ──> Character.edf, блок 5
Grade.dat ── (уровень, место в рейтинге) → ранг 0–7 ──> Character.edf, блок 1
PlayerCharacter.dat ── раса и пол ──> PlayerCharacter.edf
Как работает
- Класс — две записи: строка
Class.datи строка блока 0Character.edfс тем же номером. Клиентская выводится из серверной: коды следующих классов и предметов упаковываются, количество предметов — байт, бонусы групп скиллов в клиент не идут, флаги собираются в маску. - Номер строки — ключ: он хранится в БД персонажей (текущий класс по коду, история — по номеру). Строки нельзя вставлять в середину и переставлять; строки 45 (
BSB0) и 49 (BSS2) зашиты в код сервера. - Дерево классов — граф по
m_strCh_Class: коды той же расы, ступень на 1 больше, не больше 8 переходов на строку, история не глубже 3 смен. Смена класса — запрос 11/6, сброс — 11/24; награда за смену выдаётся один раз за ступень. - Флаги и бонусы класса действуют по всей истории классов персонажа (суммой или «любой из»).
Exp.dat: сервер читает только столбец Беллато, остальные столбцы и три столбца клиента копируются из него; строк ≥ 50, значения растут.Grade.dat: строки одного уровня подряд по возрастаниюm_fRanking, последняя — 1,0; рангов 8 на расу.PlayerCharacter.datиPlayerCharacter.edf— одна сущность из 5 строк (раса и пол).
Character.edf — 7 блоков, все производные от серверных таблиц (классы, ранги, монстры, ?, потолки мастерства, опыт, анимусы); кроме блока 3 (Action), источник которого в сводах не найден. Блоки монстров и анимусов описаны в своих доменах, здесь только повторены как часть файла.
Файлы категории
6 в реестре| Файл | Сторона | Формат | Уровень | Корпуса | Запись | Свод | Примечание |
|---|---|---|---|---|---|---|---|
script\Class.dat | сервер | dat | готов к полному | AoP ✓, GU ✓, Sirin ✓ | AoP 2256, GU 2256, Sirin 2256 | classes.md, skills.md | classes.md §2 |
script\Exp.dat | сервер | dat | готов к полному | AoP ✓, GU ✓, Sirin ✓ | AoP 260, GU 260, Sirin 260 | classes.md | classes.md §6.1 |
script\Grade.dat | сервер | dat | готов к полному | AoP ✓, GU ✓, Sirin ✓ | AoP 76, GU 76, Sirin 76 | classes.md | classes.md §7 |
script\PlayerCharacter.dat | сервер | dat | готов к полному | AoP ✓, GU ✓, Sirin ✓ | AoP 168, GU 168, Sirin 168 | classes.md | classes.md §8 |
DataTable\Character.edf | клиент | edf | производный | AoP ✓, GU ✓, Sirin ✓ | AoP 7 секц.: 1532/112/224/48/46/24/112, GU 7… | classes.md, monsters.md, skills.md, animus.md | Производный из: Class.dat, Grade.dat, MonsterCharacter.dat, *MasteryLimit.dat, Exp.dat, таблицы анимусов. 7 блоков: классы, ранги, монстры, действия, потолки мастерства, опыт, анимусы (classes.md §9, monsters.md §7.1) |
DataTable\PlayerCharacter.edf | клиент | edf | производный | AoP ✓, GU ✓, Sirin ✓ | AoP 72, GU 72, Sirin 72 | classes.md | Производный из: PlayerCharacter.dat. |
«готов к полному» — формат разобран и поля описаны; «производный» — файл собирается из другого; «непрозрачный» — формат известен не до конца; «отложен» и «вне рамок» — файл студией не редактируется.
Разделы категории
Файлы категории разбиты на группы; у каждой группы и подгруппы своя страница с полями только её файлов.
Персонажи (раса и пол)
DataTable\PlayerCharacter.edf; script\PlayerCharacter.dat
Всего 19 Известно 12 Производное 6 Не используется 1Клиентский Character.edf
DataTable\Character.edf
Всего 166 Известно 9 Производное 149 Не используется 8Неиспользуемые параметры
Поля, которые не читает ни сервер, ни клиент. Для каждого — почему так решено и где это установлено. Редактор сохраняет их байты как есть.
DataTable\Character.edf клиентский файл
Запись: ClassLimit (Class)
| Смещ. | Поле | Почему не используется | Данные |
|---|---|---|---|
+0x002 | --11_u8-- | выравнивание перед u32 номераclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x003 | --12_u8-- | выравнивание перед u32 номераclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x1F5 | --5_u8-- | выравнивание перед u32 флаговclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x1F6 | --6_u8-- | выравнивание перед u32 флаговclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x1F7 | --7_u8-- | выравнивание перед u32 флаговclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
Запись: Rank
| Смещ. | Поле | Почему не используется | Данные |
|---|---|---|---|
+0x061 | --1_u8-- | выравнивание перед u32 иконокclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x062 | --2_u8-- | выравнивание перед u32 иконокclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
+0x063 | --3_u8-- | выравнивание перед u32 иконокclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 |
DataTable\PlayerCharacter.edf клиентский файл
| Смещ. | Поле | Почему не используется | Данные |
|---|---|---|---|
+0x02A | (2 байта) ×2 | выравнивание перед floatclasses.md §9.5; не используется: байты выравнивания (после байтового поля до поля с кратного 4 смещения; у безымянных байтов нет чтений в коде MSVC, кроме копирования записи целиком; исходник 2004 citemdatamgr.h); в AoP везде 0 | всегда 0 / 0 |
script\Exp.dat серверный файл
| Смещ. | Поле | Почему не используется | Данные |
|---|---|---|---|
+0x084 | m_strCora | не используется classes.md §9.5: таблицу опыта в коде упоминают только 1400C6F30 (читает +0x44), загрузчик и конструктор/деструктор g_Main (поиск всех ссылок на g_Main+0x388EB0D0/1797DE440 в dzs.txt); записи не сохраняются в объекты; клиент файл не получает | 66 знач.; чаще 0 (2%) |
+0x0C4 | m_strAccretia | не используется classes.md §9.5: таблицу опыта в коде упоминают только 1400C6F30 (читает +0x44), загрузчик и конструктор/деструктор g_Main (поиск всех ссылок на g_Main+0x388EB0D0/1797DE440 в dzs.txt); записи не сохраняются в объекты; клиент файл не получает | 66 знач.; чаще 0 (2%) |