NPC movement

From Valve Developer Community
Jump to navigation Jump to search
Broom icon.png
This article is an orphan, meaning that few or no articles link to it.
You can help by adding links to this article from other relevant articles.
January 2024

This is a list of important components of an NPC movement schedule and task. One day it may end up as a full tutorial.

Schedule tasks

All of these tasks can be found in CAI_BaseNPC::StartTask(). Their TASK_ prefixes have been removed for readability.

Find targets

GET_PATH_TO_PLAYER
Sets the NPC's goal to the player's location at the time of calculation.
WANDER <int|min_dist * 10000 + int|max_dist>
Pick a random location for a goal. The parameter is complex because it is actually two values forced into one.
GET_PATH_TO_ENEMY_LOS
GET_FLANK_RADIUS_PATH_TO_ENEMY_LOS
GET_FLANK_ARC_PATH_TO_ENEMY_LOS
GET_PATH_TO_ENEMY_LKP_LOS
Various hostile-related goal selection tasks.
FIND_COVER_FROM_BEST_SOUND
FIND_HINTNODE
FIND_LOCK_HINTNODE

Walk/Run

WALK_PATH
RUN_PATH
WALK_PATH_FOR_UNITS <units>
RUN_PATH_FOR_UNITS <units>
WALK_PATH_WITHIN_DIST <units>
RUN_PATH_WITHIN_DIST <units>
Basic movement tasks. WITHIN_DIST are useful when the target itself isn't accessible, e.g. is an entity's origin.
RUN_PATH_FLEE <units>
Run this many units. Won't set a goal though, so use it in conjunction with another task.
WALK_PATH_TIMED <float|seconds>
RUN_PATH_TIMED <float|seconds>
Wait this many seconds, then move.
Icon-Bug.pngBug:Seems to be broken.
WEAPON_RUN_PATH
ITEM_RUN_PATH
Move to pick up a weapon or item; fail if it is picked up or otherwise removed.
SCRIPT_RUN_TO_TARGET
SCRIPT_WALK_TO_TARGET
SCRIPT_CUSTOM_MOVE_TO_TARGET
For scripted movement.
MOVE_TO_TARGET_RANGE
MOVE_TO_GOAL_RANGE
Move within weapons range. Identical, except that one uses a goal while the other uses a target entity.
GET_PATH_AWAY_FROM_BEST_SOUND
MOVE_AWAY_PATH

Turning/Facing

TURN_RIGHT
TURN_LEFT
FACE_ENEMY
FACE_PLAYER
FACE_HINTNODE
FACE_LASTPOSITION
FACE_SAVEPOSITION
FACE_AWAY_FROM_SAVEPOSITION
FACE_TARGET
FACE_IDEAL
FACE_SCRIPT
FACE_PATH
FACE_REASONABLE

SavePosition

STORE_POSITION_IN_SAVEPOSITION
STORE_BESTSOUND_IN_SAVEPOSITION
CLEAR_LASTPOSITION
STORE_LASTPOSITION
TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION
TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION
TASK_FIND_BACKAWAY_FROM_SAVEPOSITION

Utility

WAIT_FOR_MOVEMENT <float|seconds>
Wait this long for any ongoing movement to complete (pass 0 to wait forever if necessary). A very common task.
WAIT_FOR_MOVEMENT_STEP <float|seconds>
Same as above, but fails if the goal is a cover location which a hostile has LOS to.
Tip.pngTip: Given the name, Valve presumably intended this task to handle all sorts of "mid-stride" fails that didn't make good interrupts. This makes it a good place to add your own!
SET_ROUTE_SEARCH_TIME <seconds>
Maximum time to spend building a route. The schedule will fail if it is overrun. Remember that different CPU speeds will give different results - don't use it except as a fail-safe.
STOP_MOVING
Like, duh.

Task functions

General

SetTarget( CBaseEntity )
The NPC's target is the entity it is acting upon - moving towards, looking at, shooting at, etc. Theoretically, multiple targets can be acted upon in the same frame by changing this value over the course of execution.

GetNavigator()->

The NPC's CAI_Navigator instance, which defines the core movement functions.

SetGoal(const AI_NavGoal_t &goal, unsigned int flags = 0)
The standard function for telling an NPC where it should head to when next given the command to move. Can be called with only a vector thanks to an AI_NavGoal_t overload.
SetDirectGoal( vector &goalPos, Navigation_t navType = <npc default> )
Bypasses much of SetGoal's code. Purpose is unclear.
SetArrivalDirection( vector || qangle || CBaseEntity )
The direction to face on arrival at the task goal. The NPC will probably begin turning shortly before arrival.
Tip.pngTip: If a CBaseEntity is passed the NPC will turn to look at it. To use an entity's angles themselves, call GetAbsAngles().
StopMoving( bool bImmediate )
bImmediate doesn't seem to have any effect on walking NPCs - they stop immediately either way.

GetTacticalServices()->

Combat movement functions.