Создание структур - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Непрочитано 13.07.2009, 16:56   #1
Аватар для SinTex
Пользователь

Автор темы (Топик Стартер) Создание структур

Во вам небольшой гайд, по весьма популярной, но практически неосвященной теме. (сильно не ругаться!))
Итак:
На многих форумах посвященным серверам RF Online приведены гайды по созданию структур для DatEdita, (причем все они являются копией друг друга). Я нисколько не умаляю их значимость, тем более в качестве справочной информации. Но вот понять по ним как и что делать достаточно сложно даже опытным людям, не говоря уже о новичках…… Здесь же я поставил цель разъяснить именно новичкам, что такое структуры и как их создавать).
Ну начнем с того что такое структура и зачем она нужна. Скрипты в RF online имеют вид последовательности определенных блоков (вещей, скилов, монстров, и тому подобное). Структура показывает датэдиту порядок, количество, расположение блоков, а также количество байтов внутри блока отвечающих за те или иные параметры.
Разберем создание структуры на примере файла BootyItem.dat в данном файле содержатся ресурсы, их параметры, и цены на них.
Итак, нам понадобятся:
Шестнадцатеричный редактор, например UltraEdit : http://narod.ru/disk/10768342000/UltraEdit.rar.html
Сам DatEdit: http://narod.ru/disk/10768703000/DATedit.rar.html
И блокнот (я думаю сами найдете)).
В первую очередь создаем шапку структуры:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
Первой строчкой мы указываем имя файла для которого мы делаем данную структуру, в последующем Датэдит будет видеть именно этот файл.
Вторая строчка – название нашей структуры, обычно составляется из названия файла и добавления к нему File. Это практика стандартизации, но можете поставить что-нибудь свое).
Далее у нас следует начало структуры первого уровня, она показывает на сколько блоков разбита структура и размер этих блоков.
начинается она с фигурной скобки, поставили её:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
Далее открываем ультра эдитом редактором наш файл.
Видим следующее:


Слева HEX код, представленный виде байтов (каждый байт – 2 символа).
Справа – попытка расшифровки данных байтов, самим редактором (на практике читает только строки да и то не все, но при создании помогает).
Все создание структуры основано на цикличности этой структуры….. то есть она повторяется с определенным периодом. За исключением первых 8-12 байтов. Немного о переменных. Основа любой структуры блок из 4 байтов, чаще используется переменная: u32 она означает что число содержит только положительные десятичные значения и имеет размер в 4 байта (на скрине обозначены рамочками разных цветов). Итак, первоначально начинаем разбивать структуру на блоки по 4 байта….. Причем первые два блока относятся к структуре первого уровня (то есть объясняют серверу размер блока), возможно к нему же относится и третий блок, но мы этого пока не знаем…….. Так что пока останавливаемся на двух. Содержание всегда обозначается переменной u32. Итак у нас получается:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
Опять же nBlocks и nSize – это стандартные обозначения, но можете представить любую другую).
после идет строка: child BootyItemBlock [count=nBlocks];
Где:
child – указание что мы назначаем структуру второго уровня
BootyItemBlock – название структуры второго уровня.
count – количество блоков в структуре (в данном случае count=nBlocks означает что датэдит будет брать данное количество из значения которое мы указывали выше (u32 nBlocks
Вообще это типовые настройки и их при создании можно копировать просто изменяя названия.
Закрываем структуру первого уровня:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
child BootyItemBlock [count=nBlocks];
}
Открываем структуру второго уровня:

Код:
struct BootyItemBlock [preload=1]
Где:
struct – сообщает что мы начинаем структуру второго уровня,
BootyItemBlock – название (должно соответствовать строчке child BootyItemBlock [count=nBlocks]
[preload=1] - показывает следует ли загружать данную структуру, принимает значения 1 (загрузить) и 0 (не загружать) (так как она у нас одна, то разумеется загружаем)).
Открываем структуру

Код:
{
И смотрим что у нас получилось, первые 8 байтов у нас ушли в первую структуру (красная и бордовая рамочки), значит их пропускаем. Далее смотрим дальше, желтая рамочка, это типичный четырехбайтовый блок, но после него идут нули….. То есть это либо просто пустой блок, либо 8 байтовая строка (дальше у нас уже идет строчка, причем заполненная, так что к нашему блоку она не относится). Смотрим на расшифровку справа, строчки напротив желтого блока мы не видим, значит предполагаем что зеленый, просто пустой блок. Так и записываем:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
child BootyItemBlock [count=nBlocks];
}
struct BootyItemBlock [preload=1]
{
u32 nCount;
u32 nCount;
Пока для удобства все 4 байтовые блоки мы будем обозначать строчкой: u32 nCount;
менять параметры и добавлять названия мы будем на стадии расшифровки.
Далее у нас идет строка: iyyyy01 (это видно в редакторе справа), указывается в структуре строчкой: cstr [len=*], где звездочка это количество байтов в данной строке. Так как на строки не распространяются ограничения по 4 байта (хотя обычно они кратны четырем, но не всегда), считаем сколько нулевых байтов идет после нашей строчки до первого не нулевого байта. (синяя рамочка) получилось 64.
Записываем в нашу структуру:


Код:
cstr [len=64];
Смотрим дальше, снова видим блок из 4 байтов (начало с цифрами, потом нули – фиолетовая рамочка), ставим в структуру: u32 nCount;

Далее опять строка, считаем байты опять 64.
ставим:
cstr [len=64];
далее, 4 байта (оранжевая рамочка)
u32 nCount;
Смотрим дальше, и видим 4 заполненых байта, и дальше нулевые, вроде бы строка, но справа ничего понятного нет….. Смотрим на количество нулевых байтов, их много), значит быстрее всего это все же строка, а «крякозябры» быстрее всего название вещи). Просто сервер бразильский, и названия вещей могут быть на португальском, который наши компьютеры не берут. Так что считаем байты (снова 64) и пишем строку:

cstr [len=64];
итого у нас получается:


Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
child BootyItemBlock [count=nBlocks];
}
struct BootyItemBlock [preload=1]
{
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
Далее заполняем структуру по тому же принципу: там где нулевых байтов меньше 8 подряд, пишем «u32 nCount;» Там где больше: cstr [len=*] (количество байтов) - светло зеленые блоки.

Получилось следующее:


Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
child BootyItemBlock [count=nBlocks];
}
struct BootyItemBlock [preload=1]
{
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=68];
вот тут мы немного застопориваемся. Дальше явно идет начало второго блока (новый код вещи), но перед кодом только один четырехбайтовый блок (черные рамочки) А у нас по структуре их должно быть два! Значит самый первый блок у нас относится к структуре первого уровня. Переделываем и закрываем структуру:


Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
u32 nColumns;
child BootyItemBlock [count=nBlocks];
}
struct BootyItemBlock [preload=1]
{
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=68];
}

Сохраняем её как документ с расщирением strs.
В нашем случае: BootyItem.strs
Открываем Датэдит, загружаем структуру, редактируемый файл и смотрим что получилось:



Просматриваем по пунктам, если смещений нету (как у нас), то мы все сделали правильно, и можно себя поздравить . Если есть то, ищем и исправляем.
После того как мы закончили составлять, переходим к расшифровке, ну в первую очередь, можно поставить названия надписей: iyyyy01; A30200; tiyyyy01 (черные рамочки) – код вещи, ставим в пояснения:


Код:
[filemask="BootyItem.dat"]

struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
u32 nColumns;
child BootyItemBlock [count=nBlocks];
}

struct BootyItemBlock [preload=1]
{
u32 nCount;
cstr [len=64] Code1;
u32 nCount;
cstr [len=64] Code2;
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=68] Code3;
}
Пояснения нужны только нам самим что бы не путаться в структуре).
Странная сточка: Е¬ёµ (красная рамка) - это название вещи (причина такого вида описана выше), ставим:


Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
u32 nColumns;
child BootyItemBlock [count=nBlocks];
}

struct BootyItemBlock [preload=1]
{
u32 nCount;
cstr [len=64] Code1;
u32 nCount;
cstr [len=64] Code2;
u32 nCount;
cstr [len=64] Name;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=64];
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=68] Code3;
}
C последней строкой, которая равна 1 (синяя рамка), ничего не понятно, значит можно её и не трогать.
Далее нам нужно найти то ради чего мы собственно все и затеяли, а именно цену ресурсов. для этого просматриваем строчки, и ищем строку которая активно меняется, заходим в игру и сравниваем цены ресурса (по коду) и цифры указанные в скрипте (еще раз обращаю внимания, что цена может немного отличаться – у магазинов свои надбавки). В итоге мы вывели что строчка цены – 280 (фиолетовая рамка) ставим туда Price, синтаксис коды выглядит так:


Код:
u32 [tag="название"] nCount;
В нашем случае:

Код:
u32 [tag="Price"] nCount;
Итак у нас получилось:

Код:
[filemask="BootyItem.dat"]
struct BootyItemFile
{
u32 nBlocks;
u32 nSize;
u32 nColumns;
child BootyItemBlock [count=nBlocks];
}

struct BootyItemBlock [preload=1]
{
u32 nCount;
cstr [len=64] Code1;
u32 nCount;
cstr [len=64] Code2;
u32 nCount;
cstr [len=64] Name;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=64];
u32 [tag="Price"] nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
u32 nCount;
cstr [len=68] Code3;
}
Сохраняем структуру, и перезапускаем DatEdit:



Вот собственно и все. На остальные пункты можно не обращать внимания (хотя кто хочет, может попробовать заняться расшифровкой)).
Надеюсь кому нибудь данное руководство помогло).
SinTex вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 27.07.2009, 13:08   #2
Новичок

По умолчанию Ответ: Создание структур

у меня при открытии этого блокнотика или как вы называете файлика. открывается он как блокнотик... и нечего подобного как на скрине нету...
cold вне форума Ответить с цитированием
Непрочитано 28.08.2009, 20:07   #3
Пользователь

По умолчанию Ответ: Создание структур

Спасибо огромное , не чего подобного и не где так подробно описанного я не видел. Очень помог, правдо с первого раза не получилось но раза так с пятого =) я врубился всёж как это всё работает. (Кажеться полным бредом а всёж ВЕЩЬ =))) СПАСИБО!)
kamosko вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 18:49. Часовой пояс GMT +3.

Вверх