Нам нужны:
1)Мозг и прямые руки
2)Dateditor
3)Notepad или любой текстовой редактор
4)Знание хотя бы клиента рфки и устройства dat файлов
Файлы структур имеют расширение strs и открываются тестовым редактором
I.Типы данных и их атрибуты
u8-целое число занимающие 1 байт(от 0 до 256)
u16-целое число занимающие 2 байта(от 0 до 65535)
u32-целое число занимающее 4 байта (от 0 до 16777215)
cstr-текст
x8-16-ричное число занимающие 1 байт(от 00 до FF)
x16-16-ричное число занимающие 2 байта(от 0000 до FFFF)
x32-16-ричное число занимающее 4 байта (от 0 до FFFFFFFF)
float - число с плавающей запятой(
)
Атрибуты для типов данных типа u* и x* и float
а)tag="Название"-название данного блока
б)hidden=Число- если число=1 то блок скрыт
Атрибуты для cstr
а)len="Число"-Длина текста в байтах(1 буква кодируется байтом)
Для рфки в серве обычно ид записаны с длиной 64 а в клиенте 32
Атрибуты записываются в квадратных скобках и через запятую
PHP код:
u32 ***91;tag="***8213;-",hidden=1***93; DWORD;
float ***91;tag="***8213;-",hidden=1***93; DWORD;
cstr ***91;len=64***93; "Название";
II.Создание однородной структуры
Первый оператор-это какой файл мы будем загружать
PHP код:
***91;filemask="Имя файла.dat"***93;
Здесь можно указать * тогда можно будет загрузить любой файл([filemask="*.dat"])
Дальше идет описание структуры самого файла
Для рфки- файлы начинаются с количество блоков длиной u32 потом размер блока длиной u32 (для сервера идет дальше размер файла длиной u32)
Дальше идет загрузка структуры блока
PHP код:
struct "Название"
{
u32 nBlocks;
u32 nBlockSize
child Block ***91;count=nBlocks***93;;
}
Атрибуты child
a) count - сколько блоков будет с данной структурой блока
б)offset - оффсет с которого начнутся блоки с данной структурой
в)group="Название" - Название группы данных блоков
Дальше мы пишем структуру блока с название которое мы указали при child
PHP код:
struct block
{
u32 ***91;tag="***8213;-"***93; DWORD;
....
...
....
...
...
}
Писать структуру можно добавляя(убавляя) кол-во блоков u32 пока не увидите упорядоченность в Dateditor а потом меняя всякие значения смотреть что изменилось в клиенте
III.Создание структуры для файла состоящего из нескольких частей
(например:Item.edf Character.edf и тд)
Такое возникает когда мы написали однородную структуру а в окне показа самого файла в Dateditor видите что файл не кончился.

Для этого нам понадобится оператор seek
Он пропускает опреденное количество байтов в файле(те чтение структуры начинается с какогото оффсета а не с начала)
PHP код:
struct "Название"
{
u32 nBlocks1;
u32 nBlockSize1;
child Block1 ***91;group="1",count=nBlocks1***93;;
seek(nBlocks1*nBlockSize1 +8)
u32 nBlocks2;
u32 nBlockSize2;
child Block2 ***91;group="2",count=nBlocks2,offset=nBlocks1*nBlockSize1 +16***93;;
}
Как правило между частями файла в рф находится 8 байтов(хотя в некоторых есть и 4)
PHP код:
seek(nBlocks1*nBlockSize1 +8)
Это означает что мы пропустили первую часть файла (те кол-во блоков1*размер блока1 + 8 свободных байтов)
Обязательно указывайте группу для child
Так же в child для второй части указан оффсет с которой эта часть начнется (те кол-во блоков1*размер блока1+8 свободных байтов + 8 байтов отвечающих за кол-во блоков2 и размер блока2)
После структуры для блока Block1 пишем структуру для блока Block2
PHP код:
struct Block1
{
u32 ***91;tag="***8213;-"***93; DWORD;
....
...
....
...
...
}
struct Block2
{
u32 ***91;tag="***8213;-"***93; DWORD;
....
...
....
...
...
}
PHP код:
Итак мы получаем структуру вида
***91;filemask="Имя файла.dat"***93;
struct "Название"
{
u32 nBlocks1;
u32 nBlockSize1;
child Block1 ***91;group="1",count=nBlocks1***93;;
seek(nBlocks1*nBlockSize1 +8)
u32 nBlocks2;
u32 nBlockSize2;
child Block2 ***91;group="2",count=nBlocks2,offset=nBlocks1*nBlockSize1 +16***93;;
......
.....
}
struct Block1
{
u32 ***91;tag="***8213;-"***93; DWORD;
....
...
....
...
...
}
struct Block2
{
u32 ***91;tag="***8213;-"***93; DWORD;
....
...
....
...
...
}
IV.Оператор repeat
Так же существует оперотор repeat-он повторяет данный блок несколько раз
Например
PHP код:
repeat 7
{
u32 ***91;tag="***8213;-"***93; DWORD;
}
И мы увидим в Dateditor что он повторен 7 раз
Это удобно когда мы видим что одно и тоже повторяется много раз( например Store,StoreList и тд) и чтобы структура была удобнее для чтение можно употреблять данный оператор