NAV (file format): Difference between revisions
Jump to navigation
Jump to search

Tip:NAV creation is an open-source task available in the SDK.
Note:This is reverse engineered data. Reverse engineered format code can also be found here.
mNo edit summary |
m (Elaborate on hiding spot ID.) |
||
Line 126: | Line 126: | ||
struct hidingSpot_t { | struct hidingSpot_t { | ||
unsigned int ID | unsigned int AreaID; // ID of the Area the hiding spot belongs too. | ||
float position[3]; // Position of the hiding spot. | float position[3]; // Position of the hiding spot. | ||
Attribute Attributes; // Attributes | Attribute Attributes; // Attributes |
Revision as of 23:27, 6 October 2021



This article or section needs to be updated to include current information regarding the subject because:
The information listed on the NAV file structure is too vague.
Remember to check for any notes left by the tagger at this article's talk page.Not to be confused with AIN.
A NAV file is a map specific Navigation Mesh file that defines the walkable space in a level for bots in Source games. They usually reside in <game folder>/maps
and can be integrated into BSPs in some Source games.[Clarify]
In Template:Game name and Template:Game name, the file is generated automatically when bots are played for the first time on a specific map.

File format
Todo: Add approach spot data.

unsigned int magicNumber; // Magic number to check if the file is a .nav file
unsigned int version; // Version of the .nav file, for example GMod and TF2 has 16
if ( version >= 10 ) {
unsigned int subVersion; // Sub version of the .nav file, for example GMod has 0, TF2 has 2. This is usedt
}
if ( version >= 4 ) {
unsigned int saveBspSize; // Size of source bsp file to verify that the bsp hasn't changed
}
if ( version >= 14 ) {
unsigned char isAnalyzed;
}
if ( version >= 5 ) {
// Places data. This is the "Mid", "Banana", etc stuff that is used in this nav mesh
unsigned short count;
for( int i = 0; i < count; ++i ) {
unsigned short len; // length of the name
char name[len]; // The name. Maximum len is 256
}
if ( version > 11 ) {
unsigned char m_hasUnnamedAreas;
}
}
{
// PreLoadAreas( count )
// This is by default is completely unused, it is left for mods to store custom data
// Assuming that the data is per nav area
//for( int i = 0; i < count; ++i ) {
//}
}
unsigned int areaCount; // number of CNavAreas
area_t area[areaCount];
if ( version >= 6 ) {
unsigned int count; // number of CNavAreas
for( i = 0; i < count; ++i ) {
// Ladder data
}
}
{
// Load Custom Data
// Again, by default this is unused
}
Area
Todo: Add visibility data.
struct area_t {
unsigned int ID;
union Attributes {
unsigned char; // In NAV versions ≤ 8
unsigned short; // In NAV versions < 13
unsigned int;
};
float nwCorner[3]; // North-West corner vector.
float seCorner[3]; // South-East corner vector.
float NorthEastZ; // Z coordinate of North-East corner.
float SouthWestZ; // Z coordinate of South-West corner.
connectionData_t connectionData[4]; // Connection data in NESW (North, East, South, West) order.
unsigned char hidingSpotCount; // Amount of hiding spots.
hidingSpot_t hidingSpots[hidingSpotCount]; // Hiding spot data.
// Approach spot data.
unsigned int encounterPathCount; // Amount of encounter paths.
encounterPath_t encounterPaths[encounterPathCount]; // Encounter path data.
unsigned short PlaceID; // ID of place.
// Ladder data stored in order of vertical direction (up then down).
struct ladderData_t {
unsigned int ladderCount; // Amount of ladder Ids.
unsigned int ladderIDs[ladderCount]; // Ladder IDs
} ladderData[2];
float EarliestOccupyTimes[2]; // Earliest occupy times for teams.
float LightIntensity[4]; // Light Intensities for each corner.
// Insert visibility data.
unsigned int InheritVisibilityFromAreaID; // Inherit visibility from area.
void* customData; // Game-specific data.
}
Connection
struct connectionData_t {
unsigned int count; // Amount of connections.
unsigned int AreaIDs[count]; // List of area IDs that each connection points to.
};
Hiding Spot
enum Attribute : unsigned char // Hiding Spot attribute values.
{
IN_COVER = 0x01, // In a corner with good hard cover nearby
GOOD_SNIPER_SPOT = 0x02, // Had at least one decent sniping corridor
IDEAL_SNIPER_SPOT = 0x04, // Can see either very far, or a large area, or both
EXPOSED = 0x08 // Spot in the open, usually on a ledge or cliff
};
struct hidingSpot_t {
unsigned int AreaID; // ID of the Area the hiding spot belongs too.
float position[3]; // Position of the hiding spot.
Attribute Attributes; // Attributes
};
Encounter Path
struct encounterPath_t {
unsigned int EntryAreaID; // ID of the Area entered from.
unsigned byte EntryDirection; // Direction of entry.
unsigned int DestAreaID; // Id of the Area destination.
unsigned byte DestDirection; // Direction towards the destination area.
unsigned char encounterSpotCount; // Amount of encounter spots.
encounterSpot_t encounterSpots[encounterSpotCount]; // Encounter spots.
};
Encounter Spot
struct encounterSpot_t {
unsigned int OrderID; // Unknown.
unsigned char ParametricDistance; // Parametric distance in bytes.
};