Actbusy: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
 
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
 
(50 intermediate revisions by 18 users not shown)
Line 1: Line 1:
An actbusy routine provides a framework for NPCs to perform interesting actions when not doing anything useful. The presence of hostiles or anything else that requires a response will end an actbusy schedule. It consists of two components:
The '''Actbusy''' system is used by level designers to make [[NPC]]s look "busy". NPCs act busy on level designer placed [[node]]s, and continue to act busy until one of several conditions are met (such as spotting an enemy). The level designer has full control of when NPCs act busy, what actions they should perform when acting busy, and what conditions should cause them to stop.
==Games==
* '''ai_goal_actbusy''' (One per NPC name group)
{{confirm}}
OR
# {{hl2|4}}
* '''ai_goal_actbusy_queue''' (One per NPC name group)
# {{as|4}}
* '''[[info_node_hint|info_node_hints]]''' with '''Hint''' set to '''World: Act Busy Hint'''.


==Limitations/Bugs==
{{bug|hidetested=1|The check to see if npcs will fit on an actbusy node is slightly off. It references the placement of the node in editor. If ai_debug_actbusy 3 is showing issues, try moving the nodes up a couple units. Forcing the npc to teleport to the node avoids this issue.}}
{{bug|hidetested=1|Only some {{hl2|4}} NPCs know how to act busy. These are:
* [[Combine Soldier]]s
* [[Metropolice]]
* [[Player companion]]s ([[Citizen]]s, [[Alyx]], [[Barney]], [[Grigori]])
}}
{{bug|hidetested=1|At one point during testing there were two groups of identical '''info_node_hints''' being alternated in a map, but only one group would work.}}
Use [https://github.com/ValveSoftware/Source-1-Games GitHub] to prevent duplicate or outdated bug reports at the wiki.


An actbusy system is semi-scripted. NPCs will be told to actbusy and will be told at which locations they can do so, but will decide which specific location to use themselves. An actbusy_queue system is fully scripted.
== File format ==
This text file resides inside your {{file|mod\scripts}} directory. It contains the list of Actbusy actions that Actbusy hint nodes can use. Entries match the following format (from the {{file|actbusy|txt}} file):


==Structure==
"act busy name" This is the name that the level designer specifies in the hint node.
<center>[[Image:Actbusy_structure.png]]</center>
{
"busy_anim" "Activity Name".
"entry_anim" "Activity Name"
"exit_anim" "Activity Name"
"busy_sequence" "Sequence Name".
                                  If specified, this is used over the activity name. Specify it in the hint node.
"entry_sequence" "Sequence Name".
                                  If specified, this is used over the entry anim.
"exit_sequence" "Sequence Name".
                                  If specified, this is used over the exit anim.
"busy_sound" "Sound Name".
                                  If specified, the NPC will play this sound when it plays the busy anim/seq.
                                  Can be a GameSound name or a response rules concept.
"entry_sound" "Sound Name".
                                  If specified, the NPC will play this sound when it plays the entry anim/seq.
                                  Can be a GameSound name or a response rules concept.
"exit_sound" "Sound Name".
                                  If specified, the NPC will play this sound when it plays the exit anim/seq.
                                  Can be a GameSound name or a response rules concept.
  "min_time" "Minimum time to spend in this busy anim"
"max_time" "Maximum time to spend in this busy anim"
                                  0 = only stop when interrupted by external event
"interrupts" One of:
"BA_INT_NONE"  break out only when time runs out. No external influence will break me out.
"BA_INT_DANGER" break out only if threatened
"BA_INT_PLAYER" break out if I can see the player, or I'm threatened
"BA_INT_AMBUSH" break out if I see an enemy in my forward view cone.
"BA_INT_COMBAT" break out if I see an enemy or any sign of combat (bullet impacts, etc).
}


Either:
An example entry might look like this:
# An ai_goal_actbusy tells a NPC to actbusy, and the NPC chooses from actbusy hints in its hint group.
# An ai_goal_actbusy_queue tells a NPC to join a preset queue of actbusy hints. The NPC moves along the queue under the control of the goal.


"sit_in_chair_03"
{
    "busy_sequence"  "Sit_Chair03"
    "entry_sequence"  "Idle_to_Sit_Chair03"
    "exit_sequence"  "Sit_Chair03_to_Idle"
    "min_time"        "10.0"
    "max_time"        "20.0"
    "interrupts"      "BA_INT_COMBAT"
}


----
To use this entry, the level designer would specify <code>sit_in_chair_03</code> in the '''Hint Activity''' of the Actbusy hint node. Any NPC who's model contained the required entry, busy, and exit sequences would be allowed to use the node. An NPC choosing to use the node would walk to it, play the <code>Idle_to_Sit_Chair03</code> entry sequence, and then repeatedly loop the <code>Sit_Chair03</code> busy sequence. The min_time and max_time entries would make the NPC act busy on the node for a random amount of time between 10 and 20 seconds. The <code>BA_INT_COMBAT</code> option would make the NPC break out of the act busy early if it saw an enemy, or heard a nearby combat sound (bullet impact, explosion, etc). When the NPC left the act busy node (due to the time being met or seeing combat), the NPC would play the <code>Sit_Chair03_to_Idle</code> exit sequence before falling back to normal AI.
===ai_goal_actbusy===
Controls the hints and NPCs that are the act busy. Although it forces a NPC to actbusy, it does not force it to do so at a particular hint.


====Keyvalues====
Note that some Actbusy entries specific 0 min & max times. NPCs using these entries will never leave the node due to a timeout. If the entry also specifies an interrupt of <code>BA_INT_NONE</code>, the NPC will never leave the node, until they receive further input from the [[Inputs and Outputs|I/O system]].
* '''Actor(s) to affect:''' the name of any NPCs to act busy. Supports wildcards.
* '''Search Range for Busy Hints:''' maximum distance between an actbusy hint and NPC for the NPC to consider it.
* '''Visible Busy Hints Only:''' a NPC will only consider actbusy hints in view when deciding which to use. Once the choice has been made it will not change, even if new hints become visible.


====Inputs====
==ai_goal_actbusy==
* '''Activate:''' begins ordering NPCs to actbusy.
<center>[[File:Actbusy_structure.png]]</center>
* '''Deactivate:''' ends ordering NPCs to actbusy. They will remain busy until they next decide to move, at which point they will return to normal behaviour.
* '''SetBusySearchRange:''' alter the '''Search Range for Busy Hints''' keyvalue.
* '''ForceNPCToActBusy:''' Force a specified NPC to actbusy. Takes the following optional parameters, separated by spaces:
** Name of NPC(s)
** Name of '''Hint Group'''
** Named destination to teleport to
** Custom activity/sequence to perform at actbusy node
*** Activities prefixed with $ will be performed while moving to the hint, e.g. $ACT_RUN
** Maximum time to actbusy
*** Specify 0 to have them actbusy until disturbed
* '''ForceThisNPCToActBusy:''' makes a parameter-specified NPC actbusy. Supports wildcards.
** If there are multiple NPCs with the same name, only one will be ordered
* '''ForceThisNPCToLeave:''' makes a parameter-specified NPC find a '''NPC exit point''' hint and vanish. Supports wildcards.


====Outputs====
An {{ent|ai_goal_actbusy}} tells an NPC or group of NPCs to actbusy, and the NPCs then choose from actbusy hints in their [[hint group]]. There are several criteria that the node must match for the NPC to be able to choose it:
* '''OnNPCStartedBusy:''' Fires when a NPC targeted by the goal starts an actbusy sequence.
* The node type must be set to '''World: Act Busy Hint'''
** Outputs the NPC name
* The distance to the node must be less than the radius specified by the '''Search Range for Busy Hints''' key in the '''ai_goal_actbusy'''.
* '''OnNPCFinishedBusy:''' Fires when a NPC targeted by the goal finishes an actbusy sequence.
* The node must not be locked by any other NPC.
** Outputs the NPC name
* The NPC must be able to play the animations required by the node.
* '''OnNPCLeft:''' Fires when a NPC ordered by the '''ForceThisNPCToLeave''' input leaves.
* The info_node_hint entity sometimes should be placed 4 units above the ground for correct working.
** Outputs the NPC name


----
NPCs will lock their chosen node immediately, before walking to it. This prevents multiple NPCs from trying to walk into each other at the node.
=== ai_goal_actbusy_queue===
Behaves in the same way as ai_goal_actbusy, except that actbusy hints and NPCs are ordered in a queue. The queue can be moved forwards, and the when  first NPC in the queue leaves it can be given orders.


'''Actbusy hints not specified in the keyvalues will function as normal, as will NPCs who cannot join the queue. '''
== One or more {{ent|info_node_hint}}'s ==
These node entities make up the actbusy locations. (They cannot be [[info hint]] or [[info node air hint]] nodes.)
Their ''hinttype'' keyvalue must be set to 12 (''World: Act Busy Hint'') to become an actbusy hint, and their ''hintactivity'' keyvalue specifies the name of the entry in the ''actbusy.txt'' file that contains the data needed by the NPC to act busy on this node. It must be an [[Activities|actbusy activity]], and must be performable by an NPC for the NPC to consider the hint.


'''Hint activities should not require exiting or the queue will freeze.'''
If <code>teleport</code> is added to the ''hintactivity'' keyvalue (after the activity name, separated with a space), NPCs are teleported into their actbusy state, instead of navigating to it. This appears to be of most use when the hint is on or near other geometry and props, e.g. when the NPC is sitting in a chair.


====Keyvalues====
For a more general guide on hint nodes, see [[Hint nodes]].
* '''Exit Node:''' The name of the first [[info_node_hint]] or [[path_corner]] a NPC should head to when leaving the queue. Required.
* '''Node 1-20:''' The [[info_node_hint| info_node_hints]] that make up this queue.
** '''Node 1''' is the front of the queue
** Defines the maximum number of NPCs queuing
* '''Must Reach Front:''' a NPC must strictly be at '''Node 1''' before being able to leave the queue.


====Inputs====
==Debugging==
* '''PlayerStartedBlocking:''' Informs the goal that the player is blocking the point in the queue passed as a parameter.
The [[ai debug actbusy]] [[ConVar]] is the easiest way to debug act busy problems. Set it to a value between 1 & 4. The values are as follows:
* '''PlayerStoppedBlocking:''' Informs the goal that the player is no longer blocking the point in the queue passed as a parameter.
# Constantly draws a line from each NPC to their selected act busy node.
* '''MoveQueueUp:''' Moves all NPCs in the queue up one position, and sends the first NPC to the '''Exit Node'''.
# Whenever any NPC chooses to act busy, draw a line to the selected node, and draw the NPC's hull at the node.
 
#* This is useful to spot nodes placed in locations where the NPC will be unable to actually stand on the node. Make sure the NPC's hull doesn't interpenetrate the world around the node.
====Outputs====
# Selected NPCs will display why they're not able to choose act busy nodes.
* '''OnQueueMoved:''' fires when the queue is moved.
#* To use this, select the desired NPC with the {{command|npc_select}} command. When that NPC next looks for an act busy node, you'll see a small text string appear on every node explaining why the NPC didn't choose that node.
** Outputs remaining NPCs in queue
# Display all act busy logic.
* '''OnNPCStartedLeavingQueue:''' fires when the NPC at the head of the queue starts to leave.
#* This will show you all the logic decisions that each NPC makes as it runs the act busy AI. It's mostly useful for detecting bad entity I/O in the map.
** Activator is NPC
** Outputs the NPC name
* '''OnNPCLeftQueue:''' fires when the NPC that has just left the queue reaches the '''Exit Node'''.
 
----
===info_node_hint===
These make up the actbusy locations. They cannot by '''info_hint''' or '''info_node_hint_air''' entities. For a more general guide on hints, see [[info_hint]].
 
====Keyvalues====
* '''Hint:''' must be set to '''World: Act Busy Hint''' to become an actbusy hint.
* '''Hint Activity:''' specifies what the NPC should do while acting busy on this node.
** Must be an [[Activities|actbusy activity]]
** Must be performable by a NPC for NPC to consider hint
 
==Limitations and Bugs==
* There will always be a certain proportion of NPCs covered by an '''ai_goal_actbusy''' that do not actbusy. This does not seem to be configurable.
* Some actbusy activities do not end on their own, and require further input from the [[Entity_I/O_-_How_to_hook_up_entity_inputs_and_outputs.|I/O system]].
* At one point during testing there were two groups of identical '''info_node_hints''' being alternated in a map, but only one group would work.


==Example==
==Example==
This example map contains 16 npc_citizens and 16 actbusy hints. Each actbusy hint is set to an activity that can be performed by a npc_citizen. Try spawning hostile NPCs and observing the citizens' reactions to it.
This example map contains 16 npc_citizens and 16 actbusy hints. Each actbusy hint is set to an activity that can be performed by a npc_citizen. Try spawning hostile NPCs and observing the citizens' reactions to it.


[http://www.btinternet.com/~varsity_uk/VDC/Actbusy/ai_actbusy_example.zip Example (VMF)]
:'''[http://www.steamreview.org/external/vdc/actbusy/ai_actbusy_example.zip Download Example (VMF)]'''
 
== Files ==
{{file|mod\scripts\actbusy|txt}} - lists all the usable Actbusy actions.


==See also==
==See also==
* [[Activities]]
* [[Actbusy Queues]] - Another actbusy system, used when handling queues.
* [[ActBusy Script Editor]]


[[Info_node_hint]]
[[Category:AI]]


[[Activities]]
[[Category:Plain text formats|actbusy]]
[[Category:Plain text files|actbusy.txt]]


[[Category:AI]]
[[Category:Alien Swarm]]
[[Category:Half-Life 2]]

Latest revision as of 07:08, 20 May 2025

The Actbusy system is used by level designers to make NPCs look "busy". NPCs act busy on level designer placed nodes, and continue to act busy until one of several conditions are met (such as spotting an enemy). The level designer has full control of when NPCs act busy, what actions they should perform when acting busy, and what conditions should cause them to stop.

Games

[confirm]

  1. Half-Life 2 Half-Life 2
  2. Alien Swarm Alien Swarm

Limitations/Bugs

Icon-Bug.pngBug:The check to see if npcs will fit on an actbusy node is slightly off. It references the placement of the node in editor. If ai_debug_actbusy 3 is showing issues, try moving the nodes up a couple units. Forcing the npc to teleport to the node avoids this issue.
Icon-Bug.pngBug:Only some Half-Life 2 Half-Life 2 NPCs know how to act busy. These are:
Icon-Bug.pngBug:At one point during testing there were two groups of identical info_node_hints being alternated in a map, but only one group would work.

Use GitHub to prevent duplicate or outdated bug reports at the wiki.

File format

This text file resides inside your 🖿mod\scripts directory. It contains the list of Actbusy actions that Actbusy hint nodes can use. Entries match the following format (from the 🖿actbusy.txt file):

"act busy name"			This is the name that the level designer specifies in the hint node.
{ 
	"busy_anim" 		"Activity Name".
	"entry_anim"		"Activity Name"
	"exit_anim"		"Activity Name"
	"busy_sequence"		"Sequence Name". 
                                  If specified, this is used over the activity name. Specify it in the hint node.
	"entry_sequence" 	"Sequence Name". 
                                  If specified, this is used over the entry anim.
	"exit_sequence" 	"Sequence Name". 
                                  If specified, this is used over the exit anim.
	"busy_sound"		"Sound Name". 
                                  If specified, the NPC will play this sound when it plays the busy anim/seq. 
                                  Can be a GameSound name or a response rules concept.
	"entry_sound"		"Sound Name". 
                                  If specified, the NPC will play this sound when it plays the entry anim/seq. 
                                  Can be a GameSound name or a response rules concept.
	"exit_sound"		"Sound Name". 
                                  If specified, the NPC will play this sound when it plays the exit anim/seq. 
                                  Can be a GameSound name or a response rules concept.
 	"min_time"		"Minimum time to spend in this busy anim"
	"max_time"		"Maximum time to spend in this busy anim"	
                                  0 = only stop when interrupted by external event
	"interrupts"		One of:
				 "BA_INT_NONE"   break out only when time runs out. No external influence will break me out.
				 "BA_INT_DANGER" break out only if threatened
			 	 "BA_INT_PLAYER" break out if I can see the player, or I'm threatened
				 "BA_INT_AMBUSH" break out if I see an enemy in my forward view cone.
				 "BA_INT_COMBAT" break out if I see an enemy or any sign of combat (bullet impacts, etc).
}

An example entry might look like this:

"sit_in_chair_03"
{	
   "busy_sequence"   "Sit_Chair03"
   "entry_sequence"  "Idle_to_Sit_Chair03"
   "exit_sequence"   "Sit_Chair03_to_Idle"
   "min_time"        "10.0"
   "max_time"        "20.0"
   "interrupts"      "BA_INT_COMBAT"
}

To use this entry, the level designer would specify sit_in_chair_03 in the Hint Activity of the Actbusy hint node. Any NPC who's model contained the required entry, busy, and exit sequences would be allowed to use the node. An NPC choosing to use the node would walk to it, play the Idle_to_Sit_Chair03 entry sequence, and then repeatedly loop the Sit_Chair03 busy sequence. The min_time and max_time entries would make the NPC act busy on the node for a random amount of time between 10 and 20 seconds. The BA_INT_COMBAT option would make the NPC break out of the act busy early if it saw an enemy, or heard a nearby combat sound (bullet impact, explosion, etc). When the NPC left the act busy node (due to the time being met or seeing combat), the NPC would play the Sit_Chair03_to_Idle exit sequence before falling back to normal AI.

Note that some Actbusy entries specific 0 min & max times. NPCs using these entries will never leave the node due to a timeout. If the entry also specifies an interrupt of BA_INT_NONE, the NPC will never leave the node, until they receive further input from the I/O system.

ai_goal_actbusy

Actbusy structure.png

An ai_goal_actbusy tells an NPC or group of NPCs to actbusy, and the NPCs then choose from actbusy hints in their hint group. There are several criteria that the node must match for the NPC to be able to choose it:

  • The node type must be set to World: Act Busy Hint
  • The distance to the node must be less than the radius specified by the Search Range for Busy Hints key in the ai_goal_actbusy.
  • The node must not be locked by any other NPC.
  • The NPC must be able to play the animations required by the node.
  • The info_node_hint entity sometimes should be placed 4 units above the ground for correct working.

NPCs will lock their chosen node immediately, before walking to it. This prevents multiple NPCs from trying to walk into each other at the node.

One or more info_node_hint's

These node entities make up the actbusy locations. (They cannot be info hint or info node air hint nodes.) Their hinttype keyvalue must be set to 12 (World: Act Busy Hint) to become an actbusy hint, and their hintactivity keyvalue specifies the name of the entry in the actbusy.txt file that contains the data needed by the NPC to act busy on this node. It must be an actbusy activity, and must be performable by an NPC for the NPC to consider the hint.

If teleport is added to the hintactivity keyvalue (after the activity name, separated with a space), NPCs are teleported into their actbusy state, instead of navigating to it. This appears to be of most use when the hint is on or near other geometry and props, e.g. when the NPC is sitting in a chair.

For a more general guide on hint nodes, see Hint nodes.

Debugging

The ai debug actbusy ConVar is the easiest way to debug act busy problems. Set it to a value between 1 & 4. The values are as follows:

  1. Constantly draws a line from each NPC to their selected act busy node.
  2. Whenever any NPC chooses to act busy, draw a line to the selected node, and draw the NPC's hull at the node.
    • This is useful to spot nodes placed in locations where the NPC will be unable to actually stand on the node. Make sure the NPC's hull doesn't interpenetrate the world around the node.
  3. Selected NPCs will display why they're not able to choose act busy nodes.
    • To use this, select the desired NPC with the npc_select command. When that NPC next looks for an act busy node, you'll see a small text string appear on every node explaining why the NPC didn't choose that node.
  4. Display all act busy logic.
    • This will show you all the logic decisions that each NPC makes as it runs the act busy AI. It's mostly useful for detecting bad entity I/O in the map.

Example

This example map contains 16 npc_citizens and 16 actbusy hints. Each actbusy hint is set to an activity that can be performed by a npc_citizen. Try spawning hostile NPCs and observing the citizens' reactions to it.

Download Example (VMF)

Files

🖿mod\scripts\actbusy.txt - lists all the usable Actbusy actions.

See also