Простой пример работы(большего и не нужно!)
#include "CAinFileDecoder.h"
int main()
{
CAinFileDecoder ain("gm_construct.ain"); //Вся работа с AIN осуществляется в процессе создания объекта
//output -> gm_construct(excel 97).ain.xls
//Подведение итогов:
std::vector<ain_node> n_list(*ain.node_list);
std::vector<ain_link> l_list(*ain.link_list);
std::vector<int> lut_list(*ain.lut);
}
Need help with EN comments trasnalation!
Структура GMOD AIN
Поле | Размер | Тип | Описание |
---|---|---|---|
ain_header | 8 байт | struct | Заголовк карты. Для GMOD значения составляют 37 и 17 |
numNodes | 4 байта | int32_t | Поле содержащее количество узлов |
ain_node | n * 61 байт | struct | Узел |
numLinks | 4 байта | int32_t | Поле содерщаее количество межузловых соединений |
ain_link | n * 40 байт | struct | Межузловые соединения |
lut_int | n * 4 байта | int32_t | Список ИД узлов |
Структура заголовка
struct ain_header
{
int ainet_ver; //Версия файла(37 для GMOD)
int map_ver; //Версия карты(17 для GMOD)
};
Поле | Размер | Тип | Описание |
---|---|---|---|
ainet_ver | 4 байта | int32_t | Версия файла(37 для GMOD) |
map_ver | 4 байта | int32_t | Версия карты(17 для GMOD) |
Структура узла
#deinfe NUM_HULLS 10 //99% карт читаются с таким параметром
PACKED_DATA(struct ain_node //Размер 61 байт
{
Vector3 pos; //[0 +12]x, y, z
float yaw; //[12+4 ]Радиус поиска подсказок для ИИ
float flOffsets[NUM_HULLS]; //[16+40]Вертикальное смещение для каждого типа сущности, можно оставить 0
uint8_t nodeType; //[56+1 ]Тип узла(определяется через перечислитель NodeType_enum)
uint16_t nodeInfoBits; //[57+2 ]Биты настройки ноды
uint8_t zone; //[59+1 ]??? AI_ZoneIds ???, по умолчанию 0
uint8_t next; //[60+1 ]Первая ссылка для проверки?
});
Поле | Размер | Тип | Описание |
---|---|---|---|
pos | 12 байт | Vector3 | Структура состоящая из 3 float координат(см Vector3) |
yaw | 4 байта | float | Радиус поиска подсказок для ИИ |
flOffsets | 4 * NUM_HULLS байт | float | Вертикальное смещение для каждого типа сущности, можно оставить 0 |
nodeType | 1 байт | uint8_t | Тип узла(определяется через перечислитель NodeType_enum) |
nodeInfoBits | 2 байта | uint16_t | Биты настройки ноды |
zone | 1 байт | uint8_t | По умолчанию 0 |
next | 1 байт | uint8_t | Первая ссылка для проверки? |
Структура межузлового соединения
#deinfe NUM_HULLS 10 //99% карт читаются с таким параметром
PACKED_DATA(struct ain_link //Размер 40 байт
{
int16_t srcId; //Номер узла, который будет соединён
int16_t desId; //Номер узла, к которой присоединяется
uint8_t moves[NUM_HULLS]; //Как правило тут 1, разрешает переход для конкретного типа сущности(1 - разрешён, 0 - не разрешён)
});
Поле | Размер | Тип | Описание |
---|---|---|---|
srcId | 2 байта | int16_t | Номер узла, который будет соединён |
desId | 2 байта | int16_t | Номер узла, к которой присоединяется |
moves | 1 байт | uint8_t | Как правило тут 1, разрешает переход для конкретного типа сущности(1 - разрешён, 0 - не разрешён) |
lut_int содержит массив int32_t с ИД всех описанных в файле узлов
Структура Vector3
struct Vector3
{
float x;
float y;
float z;
};
Поле | Размер | Тип | Описание |
---|---|---|---|
x | 4 байта | float | X координата |
y | 4 байта | float | Y координата |
z | 4 байта | float | Z координата |