Пути (GTA SA) — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
м (Общая структура файла)
м
 
Строка 34: Строка 34:
 
     CPathNode **m_ppToThisNodeInNextNode;
 
     CPathNode **m_ppToThisNodeInNextNode;
 
     class CompressedVector {
 
     class CompressedVector {
         unsigned short x, y, z;
+
    public:
 +
         short x, y, z;
 
     } m_posn;
 
     } m_posn;
 
     unsigned short m_wSearchList;
 
     unsigned short m_wSearchList;
Строка 66: Строка 67:
 
  {
 
  {
 
  public:
 
  public:
     short x;
+
     struct {
    short y;
+
        short x;
     CNodeAddress address;
+
        short y;
     char dirX;
+
    } m_posn;
     char dirY;
+
     CNodeAddress m_address;
     unsigned int pathNodeWidth : 8;
+
     char m_nDirX;
 +
     char m_nDirY;
 +
     unsigned int m_nPathNodeWidth : 8;
 
   
 
   
 
     unsigned int m_nNumLeftLanes : 3;
 
     unsigned int m_nNumLeftLanes : 3;

Текущая версия на 09:21, 21 апреля 2014

В 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