Копи паст автор не я.
Геодата - это инструмент, который позволяет проконтролировать некоторые действия клиента (а именно - передвижение и взаимодействие с другими объектами с точки зрения геометрического положения в пространстве). NPC проходящие сквозь стены, игроки стреляющие через препятствия - всего этого можно избежать если использовать геодату. Именно она позволяет серверу проверить может ли обьект пройти от точки А в точку Б; можно ли как-то возамодействовать с обьектом в точке Б, находясь в точке А; может ли вас видеть обьект находящийся в точке Б и многое другое.
Сервер геодаты может быть как встроенным (большинство сборок Aion) так и внешним, который можно запустить на отдельном компьютере.
Как вы наверное заметили, существует два формата геодаты: *.map и *.geo, которые я и попробую описать в данном обзоре.
*.map
Как уже многие знают, карта высот в клиенте предаставлена файлами land_map.h32 которые находятся в архивах \Levels\[имя карты]\Level.pak
На картинке внизу этот показана часть файла в шестнадцатиричном редакторе. Для сравнения - показана структура .map-файла
Весь файл представляет собой непрерывный перечень: [высота в точке1][высота в точке2][высота в точке3]...[высота в точкеN] Если карта у нас размером 1536х1536 то этот файл содержит 2359296 записей (занимает примерно 7Мб).
Каждая запись это всего три байта:
struct PointData{
shot Aptitude; //высота (2 байта)
byte Special; //служебный байт (1 байт)
}
На картинке внизу показана структура .map файла, видно что она почти такая же, отсутствует лишь служебный байт и байты "развернуты" (было [B0 11] стало [11 B0])
struct PointData{
shot Aptitude; //высота (2 байта)
}
Для перевода .h32 файлов в .map можно воспользоваться либо уже готовыми утилитами (Aion Geodata Tools) , либо написать самому, благо это недолго.
Проблема данной геодаты состоит в следующем: она описывает только поверхность на уровне земли. Да, мобы не будут проваливаться внутрь холма или пролетать над овражком, но в то же время будут спокойно проходить сквозь стены.
*.geo
Кроме земли в игровом мире существуют деревья, камни, и прочие "препятствия". Формат .geo можно предствить как расширение .map . Он описывает как "землю", так и внутриигровые объекты. Также вроме файлов карт (210010000.geo, 400000000.geo и т.д) включает файл meshs.geo в котором и описываются обьекты.
Структура формата немного сложнее:
UDP: Флаг геодаты 0 - геодаты земли нет, 1 - есть земля. Насколько я понимаю это для удобства, чтобы не заполнять файл .geo нулями.
Имя обьекта - это ссылка на обьект в папках игры (Levels\common\Mesh_Meshes_XXX.pak)
Вначале идет такая же геодата как в .map-файлах (но байты не повернуты!), затем перечисляются обьекты присутствующие на карте, причем для каждого обьекта задаются координаты где он расположен, повороты по осям, масштабирование и некоторые другие параметры. Получается файл на основе игровых данных, но в целом ничего сложного из себя не представляет.
Однако без meshs-файла геодата бесполезна, поскольку хотя и содержит информацию об объектах на карте, в ней нет самих моделей.
meshs - файл, как уже было сказано описывает игровые модели и является основным файлом геодаты.
Представление моделей в этом файле - самое простое: имя модели, число вершин, список вершин в формате {x,y,z}, число полигонов, список индексов (ID вершин образующих полигон). Считывая все эти данные, геосервер строит пространственное отображение игрового мира, по сути воссоздает такой же игровой клиент. Поэтому и требует большой объем памяти и вычислительных ресурсов.
Файл meshs.geo строится на основе файла brush.lst из levels.pak и содержит ссылки на игровые модели (UDP: Формат brush.lst - разбирайте сами, он там не сложный))
). Однако, одна игровая модель может содержать несколько подмоделей, например модель - дерева обычно состоит из трех частей: ствол, крона и collision (геодата). Да, большинство игровых моделей уже содержат в себе данные которые можно использовапть в качестве геодаты. Основная проблема - как из модели вытащить нужную часть )).
Можно использовать несколько подходов:
-) Пихать в геодату все модели подряд. Быстро, легко, парсер пишется буквально за пару часов, но громозко. Файл занимает очень много времени и содержит кучу ненужных данных которые будут сказываться на производительности
-) Просматривать каждую модель вручную и доставать из нее нужный обьект. Эффективно, но чертовски медленно (бездна например состоит из более чем 2000 моделей).
-) Полуавтоматический вариант. Компьютер просматривает модель, если находит обьект "collision" - записывает его в геодату, если нет - пропускает файл. Пропущенные файлы в последствии обрабатываются вручную. Тоже медленно, но это пожалуй лучший вариант.
Из этого мини-обзора можно сделать следующие выводы:
1) Геодата в формате .map - бесполезна, мобы все равно будут ходить сквозь препятствия.
2) Файл h32 для бездны - пустой, т.к. в бездне нет уровня земли (и не только в бездне кстати).
3) Бесполезно просить геодату для определенной карты ("ну подарите мне геодату для абисса"), т.к. файл .geo без meshs - также бесполезен.
4) Создание геодаты - тяжкий труд.
P.S. Кусок кода программы на Delphi для перевода h32 в формат geo (кода обьектов тут нет, только земля, но нужен хоть 1 обьект иначе сервер будет вылетать с ошибкой!!!)
Геодата - это инструмент, который позволяет проконтролировать некоторые действия клиента (а именно - передвижение и взаимодействие с другими объектами с точки зрения геометрического положения в пространстве). NPC проходящие сквозь стены, игроки стреляющие через препятствия - всего этого можно избежать если использовать геодату. Именно она позволяет серверу проверить может ли обьект пройти от точки А в точку Б; можно ли как-то возамодействовать с обьектом в точке Б, находясь в точке А; может ли вас видеть обьект находящийся в точке Б и многое другое.
Сервер геодаты может быть как встроенным (большинство сборок Aion) так и внешним, который можно запустить на отдельном компьютере.
Как вы наверное заметили, существует два формата геодаты: *.map и *.geo, которые я и попробую описать в данном обзоре.
*.map
Как уже многие знают, карта высот в клиенте предаставлена файлами land_map.h32 которые находятся в архивах \Levels\[имя карты]\Level.pak
На картинке внизу этот показана часть файла в шестнадцатиричном редакторе. Для сравнения - показана структура .map-файла
Весь файл представляет собой непрерывный перечень: [высота в точке1][высота в точке2][высота в точке3]...[высота в точкеN] Если карта у нас размером 1536х1536 то этот файл содержит 2359296 записей (занимает примерно 7Мб).
Каждая запись это всего три байта:
struct PointData{
shot Aptitude; //высота (2 байта)
byte Special; //служебный байт (1 байт)
}
На картинке внизу показана структура .map файла, видно что она почти такая же, отсутствует лишь служебный байт и байты "развернуты" (было [B0 11] стало [11 B0])
struct PointData{
shot Aptitude; //высота (2 байта)
}
Для перевода .h32 файлов в .map можно воспользоваться либо уже готовыми утилитами (Aion Geodata Tools) , либо написать самому, благо это недолго.
Проблема данной геодаты состоит в следующем: она описывает только поверхность на уровне земли. Да, мобы не будут проваливаться внутрь холма или пролетать над овражком, но в то же время будут спокойно проходить сквозь стены.
*.geo
Кроме земли в игровом мире существуют деревья, камни, и прочие "препятствия". Формат .geo можно предствить как расширение .map . Он описывает как "землю", так и внутриигровые объекты. Также вроме файлов карт (210010000.geo, 400000000.geo и т.д) включает файл meshs.geo в котором и описываются обьекты.
Структура формата немного сложнее:
UDP: Флаг геодаты 0 - геодаты земли нет, 1 - есть земля. Насколько я понимаю это для удобства, чтобы не заполнять файл .geo нулями.
Имя обьекта - это ссылка на обьект в папках игры (Levels\common\Mesh_Meshes_XXX.pak)
Вначале идет такая же геодата как в .map-файлах (но байты не повернуты!), затем перечисляются обьекты присутствующие на карте, причем для каждого обьекта задаются координаты где он расположен, повороты по осям, масштабирование и некоторые другие параметры. Получается файл на основе игровых данных, но в целом ничего сложного из себя не представляет.
Однако без meshs-файла геодата бесполезна, поскольку хотя и содержит информацию об объектах на карте, в ней нет самих моделей.
meshs - файл, как уже было сказано описывает игровые модели и является основным файлом геодаты.
Представление моделей в этом файле - самое простое: имя модели, число вершин, список вершин в формате {x,y,z}, число полигонов, список индексов (ID вершин образующих полигон). Считывая все эти данные, геосервер строит пространственное отображение игрового мира, по сути воссоздает такой же игровой клиент. Поэтому и требует большой объем памяти и вычислительных ресурсов.
Файл meshs.geo строится на основе файла brush.lst из levels.pak и содержит ссылки на игровые модели (UDP: Формат brush.lst - разбирайте сами, он там не сложный))
). Однако, одна игровая модель может содержать несколько подмоделей, например модель - дерева обычно состоит из трех частей: ствол, крона и collision (геодата). Да, большинство игровых моделей уже содержат в себе данные которые можно использовапть в качестве геодаты. Основная проблема - как из модели вытащить нужную часть )).
Можно использовать несколько подходов:
-) Пихать в геодату все модели подряд. Быстро, легко, парсер пишется буквально за пару часов, но громозко. Файл занимает очень много времени и содержит кучу ненужных данных которые будут сказываться на производительности
-) Просматривать каждую модель вручную и доставать из нее нужный обьект. Эффективно, но чертовски медленно (бездна например состоит из более чем 2000 моделей).
-) Полуавтоматический вариант. Компьютер просматривает модель, если находит обьект "collision" - записывает его в геодату, если нет - пропускает файл. Пропущенные файлы в последствии обрабатываются вручную. Тоже медленно, но это пожалуй лучший вариант.
Из этого мини-обзора можно сделать следующие выводы:
1) Геодата в формате .map - бесполезна, мобы все равно будут ходить сквозь препятствия.
2) Файл h32 для бездны - пустой, т.к. в бездне нет уровня земли (и не только в бездне кстати).
3) Бесполезно просить геодату для определенной карты ("ну подарите мне геодату для абисса"), т.к. файл .geo без meshs - также бесполезен.
4) Создание геодаты - тяжкий труд.
P.S. Кусок кода программы на Delphi для перевода h32 в формат geo (кода обьектов тут нет, только земля, но нужен хоть 1 обьект иначе сервер будет вылетать с ошибкой!!!)




