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)
 
(42 intermediate revisions by 17 users not shown)
Line 1: Line 1:
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.
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==
{{confirm}}
# {{hl2|4}}
# {{as|4}}


The components of the Actbusy system are as follows:
==Limitations/Bugs==
* '''actbusy.txt'''
{{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.}}
**A text file that resides inside your mod\scripts directory. It lists all the usable Actbusy actions.
{{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.


* '''ai_goal_actbusy'''
== File format ==
**The Actbusy control entity. Used to control how & when the NPCs it controls should act busy.
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):
 
* One or more '''[[info_node_hint|info_node_hints]]''' with '''Hint''' set to '''World: Act Busy Hint'''
**These specify the places in the world where NPCs can act busy, and point to an entry within the '''actbusy.txt''' file. The entry tells the NPCs what actions they should perform at the node.
 
 
==Structure==
<center>[[Image:Actbusy_structure.png]]</center>
 
 
An '''ai_goal_actbusy''' tells a 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.
NPCs will lock their chosen node immediately, before walking to it. This prevents multiple NPCs trying to walk into each other at the node.
 
 
 
----
===actbusy.txt===
This text file resides inside your <code>mod\scripts</code> directory. It contains the list of Actbusy actions that Actbusy hint nodes can use. Entries match the following format (from the <code>actbusy.txt</code> file):


  "act busy name" This is the name that the level designer specifies in the hint node.
  "act busy name" This is the name that the level designer specifies in the hint node.
Line 35: Line 24:
  "exit_anim" "Activity Name"
  "exit_anim" "Activity Name"
  "busy_sequence" "Sequence Name".  
  "busy_sequence" "Sequence Name".  
                                   If specified, this is used over the activity name. Specify it in the hint node.
                                   If specified, this is used over the activity name. Specify it in the hint node.
  "entry_sequence" "Sequence Name".  
  "entry_sequence" "Sequence Name".  
                                   If specified, this is used over the entry anim.
                                   If specified, this is used over the entry anim.
Line 74: Line 63:
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.
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.


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 [[Entity_I/O_-_How_to_hook_up_entity_inputs_and_outputs.|I/O system]].
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]].


==ai_goal_actbusy==
<center>[[File:Actbusy_structure.png]]</center>


----
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:
* 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.


===ai_goal_actbusy===
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.
The ai_goal_actbusy entity points to a set of NPCs to control, and contains options about how it should go about making those NPCs act busy. There are two common methods of using ai_goal_actbusy entities. The first is to fire the '''Activate''' input on the ai_goal_actbusy entity, which will cause it to start ordering the NPCs under its command to act busy. The second is to leave the ai_goal_actbusy inactive, and send it '''ForceNPCToActBusy''' inputs to order specific NPCs under its command to act busy.


== 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.


====Keyvalues====
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.
* '''Actor(s) to affect:''' the name of any NPCs to act busy. Supports wildcards. Can be a class name or a targetname.
* '''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====
* '''Activate:''' begins ordering NPCs to actbusy.
* '''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 the '''Hint''' node. Used to force an NPC to act busy on a specific node.
** "teleport"
*** If this keyword is specified as a parameter, the NPC will teleport onto the actbusy node instead of navigating to it.
** "nearest"
*** If this keyword is specified as a parameter, the NPC will choose the nearest valid actbusy node, instead of choosing one randomly from all valid actbusy nodes.
** Custom activity to use when navigating to the 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 act busy.
**Only useful as a connection for outputs of other entities that pass along the NPC. The most common usage of this is to connect the "OnSpawnNPC" output of an [[npc_maker]] to this input, since the "OnSpawnNPC" output contains the spawned NPC in the parameter.
** 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====
* '''OnNPCStartedBusy:''' Fires when a NPC targeted by the goal starts an actbusy sequence.
** Outputs the NPC name
* '''OnNPCFinishedBusy:''' Fires when a NPC targeted by the goal finishes an actbusy sequence.
** Outputs the NPC name
* '''OnNPCLeft:''' Fires when a NPC ordered by the '''ForceThisNPCToLeave''' input leaves.
** Outputs the NPC name
 
 
----
===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 the name of the entry in the '''actbusy.txt''' file that contains the data needed by the NPC to act busy on this node.
** Must be an [[Activities|actbusy activity]]
** Must be performable by a NPC for NPC to consider hint
 
==Limitations and Bugs==
* Only some HL2 NPCs know how to act busy. These are:
** Combine Soldiers
** Metropolice
** Player companions ( Citizens, Alyx, Barney, Grigori, Eli, Kleiner )
* 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.


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


==Debugging==
==Debugging==
The <code>ai_debug_actbusy</code> convar is the easiest way to debug act busy problems. Set it to a value between 1 & 4. The values are as follows:
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:
# Constantly draws a line from each NPC to their selected act busy node.
# Constantly draws a line from each NPC to their selected act busy node.
# Whenever any NPC chooses to act busy, draw a line to the selected node, and draw the NPC's hull at the 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.
#* 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.
# Selected NPCs will display why they're not able to choose act busy nodes.
# 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.
#* 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.
# Display all act busy logic.
# 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.
#* 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.
Line 149: Line 98:
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]]


[[Actbusy_Queues|Actbusy Queues]]
[[Category:AI]]


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


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

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