NPC movement
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
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.
Contents
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.
- Bug:Seems to be broken. [todo tested in?]
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: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.
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:If a
CBaseEntity
is passed the NPC will turn to look at it. To use an entity's angles themselves, callGetAbsAngles()
. StopMoving( bool bImmediate )
bImmediate
doesn't seem to have any effect on walking NPCs - they stop immediately either way.
GetTacticalServices()->
Combat movement functions.