Пути (GTA SA)
Материал из GTAModding.ru
В GTA San Andreas существует несколько видов путей - это пути пешеходов и транспорта, пути поездов и трамвая, скриптовые пути и carrec-пути.
Содержание |
Пути пешеходов и транспорта
Эти пути настраиваются в файлах nodes<id>.dat (где id - регион карты, число в рамках [0;64]). Данные файлы игра загружает из архива gta3.img. Каждый из файлов (nodes1.dat - nodes64.dat) отвечает за пути на территории карты размером 750x750 юнит (размер всей карты - 6000x6000 юнит).
Общая структура файла
Пути хранятся в виде связных графов. Каждый файл начинается из заголовка, после чего следую структуры данных о путях.
[Хедер] unsigned int m_dwTotalNumPathNodes общее кол-во узлов путей unsigned int m_dwNumVehiclePathNodes кол-во узлов путей транспорта unsigned int m_dwNumPedPathNodes кол-во узлов путей пешеходов unsigned int m_dwNumCarPathLinks кол-во связей путей транспорта (связь - соединение двух узлов путей транспорта) unsigned int m_dwNumAddresses кол-во адресов точек путей (адрес представлен в виде (регион;индекс)) [Секция #1 - Узлы путей (CPathNode). Размер этой секции - 28 (sizeof(CPathNode)) * кол-во узлов (m_dwTotalNumPathNodes)] CPathNode m_aPathNodes[m_dwTotalNumPathNodes] [Секция #2 - Связи узлов путей транспорта (CCarPathLink). Размер этой секции - 14 (sizeof(CCarPathLink)) * кол-во связей (m_dwNumCarPathLinks)] CCarPathLink m_aCarPathLinks[m_dwNumCarPathLinks] [Секция #3 - Адреса узлов путей (CNodeAddress). Размер этой секции - 4 (sizeof(CNodeAddress)) * кол-во адресов (m_dwNumAddresses) + 768] CNodeAddress m_aNodeAddresses[m_dwNumAddresses] char unknown[768] [Секция #4 - Адреса связей узлов путей транспорта (CCarPathLinkAddress). Размер этой секции - 2 * кол-во адресов (m_dwNumAddresses)] unsigned short m_aCarPathLinksAddresses[m_dwNumAddresses] [Секция #5 - Длина путей (?). Размер этой секции - кол-во адресов (m_dwNumAddresses) + 192] unsigned short m_aLinkLengths[m_dwNumAddresses] char unknown[192] [Секция #6 - Флаги пересечения путей (CPathIntersectionInfo). Размер этой секции - кол-во адресов (m_dwNumAddresses) + 192] CPathIntersectionInfo m_aIntersectionFlags[m_dwNumAddresses] char unknown[192]
Секция 1 - Узлы путей (CPathNode)
Представляет собой точку пути пешехода/транспорта. Размер одной структуры - 28 (0x1C) байт.
class CPathNode { public: CPathNode *m_pPrev; CPathNode **m_ppToThisNodeInNextNode; class CompressedVector { public: short x, y, z; } m_posn; unsigned short m_wSearchList; short m_wBaseLinkId; short m_wAreaId; short m_wNodeId; unsigned char m_nPathWidth; unsigned char m_nNodeType; unsigned int m_nNumLinks : 4; unsigned int m_nTrafficLevel : 2; unsigned int m_bRoadBlocks : 1; unsigned int m_bWaterNode : 1; unsigned int m_bEmergencyVehiclesOnly : 1; unsigned int unk1 : 1; unsigned int m_bDontWander : 1; unsigned int unk2 : 1; unsigned int m_bNotHighway : 1; unsigned int m_bHighway : 1; unsigned int unk3 : 1; unsigned int unk4 : 1; unsigned int m_nSpawnProbability : 4; unsigned int m_nBehaviourType : 4; // 1 - roadblock // 2 - parking node };
Секция 2 - Связи узлов путей транспорта (CCarPathLink)
Связывает две точки пути транспорта. Размер одной структуры - 14 (0xE) байт.
class CCarPathLink { public: struct { short x; short y; } m_posn; CNodeAddress m_address; char m_nDirX; char m_nDirY; unsigned int m_nPathNodeWidth : 8; unsigned int m_nNumLeftLanes : 3; unsigned int m_nNumRightLanes : 3; unsigned int m_bTrafficLightDirection : 1; unsigned int unk1 : 1; unsigned int m_nTrafficLightState : 2; unsigned int m_bTrainCrossing : 1; };
Секция 3 - Адреса узлов путей (CNodeAddress)
Представляет адрес узла пути на карте графов путей. Размер одной структуры - 4 (0x4) байт.
class CNodeAddress { public: short m_wAreaId; short m_wNodeId; };
Секция 4 - Адреса связей узлов путей транспорта (CCarPathLinkAddress)
Представляет адрес связи узла пути транспорта на карте графов путей. Размер одной структуры - 2 (0x2) байт.
class CCarPathLinkAddress { public: short m_wCarPathLinkId : 10; short m_wAreaId : 6; };
Секция 6 - Флаги пересечения путей (CPathIntersectionInfo)
Размер одной структуры - 1 (0x1) байт.
class CPathIntersectionInfo { public: unsigned char m_bRoadCross : 1; unsigned char m_bPedTrafficLight : 1; };
Пути поездов и трамвая
Скриптовые пути
RRR-пути
См. RRR