Navigation Mesh Editing
This page is about creating and editing the NAV file for a map in-game.
For a list of commands, see Navigation Mesh Commands.
- 1 Limitations
- 2 Automatic Navigation Mesh Generation
- 3 Editing the Navigation Mesh
- 4 Testing the Nav Mesh
- 5 Place names (callouts)
- 6 Common mesh problems and solutions
- 7 Advanced editing techniques
- 8 See also
- 9 External Links
A new navigation mesh
<game>/maps/<mapname>.nav for a map can be generated by using the
nav_generate command while the map is loaded which requires
sv_cheats 1. Depending on the size and complexity of the map, this may take a few minutes to a few hours, but mostly about 5 minutes. Large forests however are examples for structures that might take a long time to compute a .nav for. You can then upload the created .nav file to your server.
It is recommended that map creators create navigation meshes before releasing their map to the public.
What is computed during generation
The following steps occur during Navigation Mesh generation:
- Starting at a player spawn point, walkable space is sampled by "flood-filling" outwards from that spot, searching for adjacent walkable points
- Rectangular Navigation Areas are constructed from the sampled data
- Hiding and Sniper spots are computed
- Encounter Spots and Approach Points are computed (this can take awhile)
- Initial Encounter areas are computed
To see the current navigation mesh, type
nav_edit 1. To turn the mesh editor off, type
nav_edit 0. You will need to have
sv_cheats 1 to be able to view the navigation mesh.
Explicitly marking walkable areas (i.e: "There's no mesh upstairs")
Some maps that have very steep stairs, ramps, or hills may confuse the generation system, resulting in the Navigation Mesh not covering the entire map. To solve this, you can manually place additional walkable markers that tell the generator to search outwards from that point during its sampling phase.
To add one or more walkable markers, first aim your view towards a known walkable spot in your map, then type
nav_mark_walkable in the console. When you are finished placing markers, type
nav_generate_incremental (followed by
nav_generate to re-generate the mesh.
You can remove all previously placed walkable markers using the
Quickly generating meshes for testing
The analysis phase of the generator can be quite time consuming. To skip it, type
nav_quicksave 1 in the console.
The automated Navigation Mesh generator does a reasonable job of constructing a mesh, allowing you to start using Bots and Hostages on custom maps easily.
However, careful hand-tuning of the Navigation Mesh can noticeably improve the performance of Bots. In addition, manually decorating the mesh with Place names allows the Bots to tell others where events occur, enhances the Counter-Strike radar and includes Place names in all radio messages.
To enable the editor, type
nav_edit 1 in the console (type
nav_edit 0 to disable it).
- The white cross in the center of your view is the cursor.
- The navigation area you are pointing at is the selected area or highlighted area and is shown with a yellow outline.
- Navigation areas that can be reached from the selected area are shown in red.
- The white line in the selected area denotes where the area will be split if the
nav_splitcommand is executed.
- Exactly one area can be marked (or unmarked) by pointing at it and invoking
nav_markand is shown with a cyan outline. This is used for many other commands that need two operands, being the marked and the selected area.
- Areas that are part of the current selected set have a white tint. To clear any selection, invoke
Creating a new area
This can be done with the commands
To delete an area, aim your cursor at it so that it is highlighted and execute
nav_delete. Alternatively you can mark an area or select a set of areas to delete multiple areas.
Connect two areas
The connections between areas define whether one can move from one area to another.
Usually these connections are bidirectional, meaning one can move back and forth between two areas at will. However, sometimes the connection is one way, as in the case of ledges that can be jumped down, but not back up. One-way links can also be useful for forcing bots to travel a specific direction, perhaps to set up for a tricky jump.
To make a one-way connection from area A to area B (meaning you can move from A to B):
- Mark area A: Place your cursor on it and execute
- Aim at area B and execute
To make a bidirectional connection, repeat the above steps reversing the roles of A and B.
Disconnect two areas
To remove all connections between the areas A and B:
- Mark area A: Place your cursor on it and execute
- Aim at area B and execute
Splitting divides an area into two bidirectionally connected areas.
Merging two areas reduces the area count.
Both areas must be the same size along the edge to be merged. It is not required that the two areas are adjacent.
The resulting area will retain all of the connections of the original two areas, and inherit properties (i.e: Place names, etc) from the marked area.
Splicing creates a new area between two existing areas. Splicing is a powerful tool, and can be used to easily create sloped areas, as shown in the example below.
nav_mark allows you to mark at most one area, Selected Sets allow you to select multiple areas and operate on them. Adding or removing areas to the selected set does not manipulate them in the first place.
The advantage of using selected sets is that it makes it a lot easier to do the same operation on multiple areas at once such as marking them with area attributes or moving them, see below.
There are multiple ways to add and remove areas to the selected set:
- To clear any selection, invoke
- To add or remove single areas from the selected set, point at an area and invoke
nav_remove_from_selected_set. If any selected set exists,
nav_marktoggles the selected state of the area that is pointed at.
- To add or remove areas by looking at them, point at an area and invoke
nav_begin_selecting. From now on until
nav_end_selectingis invoked, every (!) area that the player points at is added to the selected set.
nav_end_deselectingwork analogously except that areas are removed from the selected set.
- To select connected areas, point at an area and invoke
nav_flood_selectto add the area that was pointed at to the selected set as well as all areas that can be reached from it in terms of outgoing and ingoing connections. This means that if there is a path from area A to area B then flood selecting at A yields the same result as flood selecting at B even though the path from A to B might be one-way.
- To add areas in a sphere around yourself, position yourself appropriately and invoke
nav_select_radius <distance>to add all areas to the selected set that are at most
<distance>units away from yourself. After the invokation, the game prints the number of areas that have been added to the selected set. Passing a negative distance behaves like passing a positive one.
- To select areas using a rectangle, invoke
nav_begin_drag_selectingat one corner of it. From now on, the game shows a quboid with a fixed height of 32 units between the point that the player looked at when the previous command was executed and the current point that the player looks at. All areas that touch this quboid are drawn with a green tint. All green areas are added to the selected set when
nav_end_drag_deselectingwork analogously but with a red tint.
Area attributes influence the behavior of bots to act in specific ways. Each area can have any combination of attributes. Most area attributes are required to be set manually, but a portion of attributes are set automatically and cannot be set manually.
These are the attributes that exist since.
- To set or to clear an attribute from the highlighted area or all areas of a selected set, invoke
nav_clear_attribute <ATTRIBUTE>. The game will list all available attributes in the console while typing.
- To toggle an attribute for an area, aim at it and execute the corresponding command, e.g.
||blue diagonal||Forces bots to crouch when moving through this area.|
||green X||Tells bots to jump in order to reach the higher connected area and that this area is not usable as a hiding/sniping spot.|
||green +||Prevents bots from skipping this area and stops bots from avoiding obstacles. The precise attribute can help in places where bots can easily fall off, like catwalks with no railing, or when setting up specific routes for a jump.|
||red rhombus ♢||Forces bots not to jump. This is useful to prevent excessive jumping. However, bots can get stuck if jumping is required to keep going.|
This attribute will not prevent an explicit
||red octagon||Tells bots to stand still for a short moment when entering this area. Useful to slow bots down to line up tricky jumps more accurately.|
||two blue arrows||Tells bots explicitly to run in this area.|
||one green arrow||Tells bots explicitly to walk silently in this area.|
||two red triangles||Tells bots not to use the area unless the normal route has become too dangerous.|
||-||Tells bots not to use this area as a hiding spot.|
||-||Tells bots not to crouch while hiding in this area.|
||-||Tells hostage NPCs not to use this area. Only effective in .|
|Blocked||?||-||Tells bots not to use this area. This attribute is only set automatically by the game. Example cases include:
Furthermore, there are the related console commands
|Damaging||?||-||Tells bots not to use this area. This attribute is only set automatically by the game. Example cases include:
Furthermore, there are the related console commands
Left 4 Dead 1&2
Inand , an alternate set of area attributes named "Spawn Attributes" is available with a very different implementation. Spawn Attributes are identified not by shapes but color, and their attribute names use the color white rather than yellow. The attributes's roles are also different, commonly assisting the "Director" over player AI decision-making.
z_debug 1 is required to view Spawn Attributes.
Team Fortress 2
has fittingly named "TF attributes", a simpler implementation of "Spawn Attributes" from and which tends to assist the game logic in a general sense, such as blocking nav areas when a capture point is captured.
tf_markexists for TF2 that auto-fills these attribute names, is this the way to use these attributes or should we use
tf_show_mesh_decoration 1 to display all TF attributes at once, coloring all nav areas with a specific color even if not hovered over.
|(Exclusionary) processing order|
After changing the nav mesh, use
nav_analyze to generate data used by bots. It will reload the map upon completion.
bot_moveto, to direct puppet bots to move to a particular point.
Place names (callouts)
Once a nav mesh is generated, Place names can be assigned to nav areas to label regions of the map. For instance, if there is a prominent house in the map, all of the nav areas in the house can be tagged with the
House place name.
Place names have multiple uses:
- In the top left of the screen, each player sees his current place, which is the place name of the closest nav area.
- The chat displays the place of players using a radio command. This is also the case when they throw grenades. Example:
ChicagoTed @ Apartment (RADIO): Fire in the hole!
- Bots use them to announce from where they are reporting in.
- When using the ping tool, the place name is shown with it.
Adding Place names
|Nav Area Color||Nav Area...|
|red||has no place name|
|green||has the current place name|
|blue||has a place name, but not the current|
To add or change the name of a location, you need to turn on the place name editor. Make sure
nav_edit is set to 1, then type
When the place name editor is enabled for the first time, all nav areas should turn red. To select a place name that should be assigned to some areas, type
nav_use_place <place name>,
For a list of all available place names, execute
nav_use_place with no argument.
Next, aim your cursor at an area you want to label with that place name and toggle the Place Painting Mode by executing
Look around carefully! While Place Painting is active, each area that you point at with your crosshair will be tagged with the current place name that you selected and turn green in color. To stop painting, invoke the same command again.
You can change the place name you are painting with by typing
nav_use_place <new place name>. Notice that after changing the place name, all areas that are already painted with a different name will turn blue and areas painted with the name you just changed to will turn green.
When you are finished editing place names, exit the place mode with
There are several additional commands that provide tools for picking, flood-filling, replacing, and so on. For a complete reference, see Place name Commands.
Common mesh problems and solutions
Extraneous areas on stairs and ramps
The automatic generation system tends to build areas that hang off the side of stairs and ramps. These should be removed to force the bots to take the stairs or ramp straight-on.
Railings can be a problem for the current bot navigation system, this includes jump-down links that must pass over railings, they should be avoided unless necessary. The bots will eventually make these jumps, but they are not terribly elegant while doing so.
Preventing excessive jumping
nav_no_jump command to flag the area to disable jumping.
Dealing with rotating doors
Clip off the nav area to leave an empty space in the nav mesh to allow for the rotating door. You may have to remake the nav square if deleting part of an existing one doesn't work.
Bots will sometimes try to walk through the opened door brush from one nav area to another and get stuck. Either removing the adjacent nav area or configuring the areas and connections so the bots have to walk around the opened door should prevent this.
Advanced editing techniques
For ladders, there is a slightly different type of nav area that must be built manually on climbable surfaces. Your editing cursor will turn green when pointing at one. But once created, nav areas on ladders behave the same as every other nav area in terms of selecting and connecting.
- Creation using
nav_build_ladder isn't what you need, you can manually create a ladder. This can be useful to get bots to start going up the ladder, and jump off halfway up, onto the crate:
- Reversing Ladders
Sometimes a ladder will be created facing the wrong way and show up red. The ladder is drawn in green if it is facing you. To change its orientation, simply point at it and use
Obstacle avoidance and precision movement
nav_stop to disable local obstacle avoidance behaviors and control bot movement.
STOP attributes are only used in and .
Controlling where bots can hide
Setting up sniper spots
Mark an area using
nav_walk and execute
nav_make_sniper_spots. This will break the area into small sub-areas which are used internally by the navigation mesh to encourage sniping.
Lining up tricky jumps and narrow doorways
Arranging nav areas to force specific paths.
- If the bots are getting hung up on the sides of a door or window, you can carve out a narrow path through the middle of the opening.
- The highest a bot will try to jump is 58 units. If the top of a jump is 59 or more units above the bottom, bots will give up as soon as they jump. If this happens in a spot that the bots can actually jump up to, use
nav_corner_lowerto lower the upper nav area slightly.
Import and Export areas
Nav areas can be imported and exported through
nav_save_selected exports nav areas in a selected set to a KeyValues file, while
nav_merge_mesh imports nav areas from the selected file and selects them.
The KV file used by these commands can be edited to force custom nav area shapes and connections that otherwise would be impossible to make.
These commands can be useful for:
- Creating connections that are difficult or impossible to make manually with
nav_connect, such as a bidirectional connection between two areas in areaportals.
- Fit areas on to skewed surfaces.
Bots will attempt to move on a nav area regardless if they are on the ground. This mechanism can be exploited by utilizing nav areas in the air to produce aerial movement in bots. For example, areas can be manipulated to produce an L-shaped path where the middle area (preferably marked with PRECISE) is low enough for the bot to "touch" the area and move on it. When touching the area, the bot will turn to go to the next area, hence the bot performing to air strafes.
Left 4 Dead
- Left 4 Dead Navigation Meshes
- L4D Level Design/Nav Meshes
- L4D Level Design/Nav Flow
- L4D Level Design/Advanced Nav Editing