Пути (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 {
        unsigned 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:
    short x;
    short y;
    CNodeAddress address;
    char dirX;
    char dirY;
    unsigned int pathNodeWidth : 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