NAV (file format)

From Valve Developer Community
Revision as of 23:26, 6 October 2021 by Amicdict (talk | contribs)
Jump to navigation Jump to search
English (en)Translate (Translate)
Broom icon.png
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.
Nav Mesh
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.

Tip.pngTip:NAV creation is an open-source task available in the SDK.

File format

Todo: Add approach spot data.
Note.pngNote:This is reverse engineered data. Reverse engineered format code can also be found here.

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 ID;
	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.
};

See also