NAV (file format)

From Valve Developer Community
Jump to: navigation, search
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 Counter-Strike: Source Counter-Strike: Source and Counter-Strike: Global Offensive Counter-Strike: Global Offensive, the file is generated automatically when bots are played or being added into a map for the first time on a specific map that doesn't have one.

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

File format

Blank image.pngTodo: The information listed on the NAV file structure is too vague.
Confirm:At least two versions of .nav files.
Blank image.pngTodo: Add approach spot data.
Note.pngNote:This is reverse engineered 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 ) {
	// Callouts. 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]; // Area Data

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


A navigation area is a bounding square in which bots can move.

struct nav_area_t {
	unsigned int ID; // Identifier of the navigation area.
	union AttributeBitField {
		unsigned char; // In NAV versions ≤ 8
		unsigned short; // In NAV versions ≤ 12
		unsigned int; // In NAV Versions ≥ 13
	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 spots were removed in NAV version 15.
	unsigned char approachSpotCount; // Amount of approach spots
	approachSpot_t approachSpotData[approachSpotCount]; // 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 ladderIDSequence_t {
		unsigned int ladderCount; // Amount of ladder Ids.
		unsigned int ladderIDs[ladderCount]; // Ladder IDs
	} ladderIDSequence[2];
	float EarliestOccupyTimes[2]; // Earliest occupy times for teams.
	float LightIntensity[4]; // Light Intensities for each corner.

	unsigned int areaBindCount; // Amount of area-binds stored.
	nav_area_bind_t areaBindSequence[areaBindCount]; // Sequence of area-binds stored.

	unsigned int InheritVisibilityFromAreaID; // Inherit visibility from area.
	void* customData; // Game-specific data.

Approach Spot

Blank image.pngTodo: Describe variables.
struct approachSpot_t {
	uint approachHereId; 
	uint approachPrevId;
	byte approachType;
	uint approachNextId;
	byte approachHow;


Area-binds are a structure type used in nav areas to determine the visibility between the parent area and another navigation area, based on area ID.

struct nav_area_bind_t {
  unsigned int target_area_id; // Area ID of area.
  unsigned char AttributeBitField; // Attribute flag field that determines the visibility type.

Area-binds were added in NAV version 16.


struct connectionData_t {
	unsigned int count; // Amount of connections.
	unsigned int AreaIDs[count]; // List of area IDs that each connection points to.

Hiding Spot

Hiding spots are data structures used to determine points in a nav mesh that bots can hide at.

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; // Identifier of hide spot. Added in NAV version 2.
	float position[3]; // Position of the hiding spot. Added in NAV version 1.
	Attribute Attributes; // Attribute field. Added in NAV version 2.
Game Used For
Team Fortress 2 Team Fortress 2 Determines where Spy bots can lurk for targets.
Counter-Strike: Source Counter-Strike: Source Determines where bots can take cover and shoot at.
Counter-Strike: Global Offensive Counter-Strike: Global Offensive Determines where bots can take cover and shoot at.

Encounter Path

Encounter paths are structures used to determine routes to take to get to certain areas.

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.
Warning.pngWarning:Encounter paths are only used in Counter-Strike: Source Counter-Strike: Source and Counter-Strike: Global Offensive Counter-Strike: Global Offensive.

Encounter Spot

Encounter Spots (better termed waypoints) are data structures used in encounter paths to determine the order of area IDs in a route.

struct encounterSpot_t {
	unsigned int AreaID; // The Area ID to go to.
	unsigned char ParametricDistance; // Parametric distance in bytes.
Warning.pngWarning:Encounter spots are only used in Counter-Strike: Source Counter-Strike: Source and Counter-Strike: Global Offensive Counter-Strike: Global Offensive.

Custom Data

Some games store custom data in areas.

Custom Area Data
Subversion Data Label
2 unsigned int Team Fortress 2 Team Fortress 2 specific attributes.

Versions Used By Games

Game Version Subversion
Team Fortress 2 Team Fortress 2 16 2

See also

NAV processors

It has been suggested that this article or section be merged with Nav Mesh/en. (Discuss)