Dynamic interactions
Dynamic interactions are special NPC animations introduced in Half-Life 2: Episode One. They allow two NPCs to perform synchronized scripted_sequences with each other, with or without input from the level. They're mostly used for combat and/or kill animations, like Alyx kicking a zombie or a hunter throwing a citizen to the ground, but other types of interactions are possible.
Two NPCs are involved in dynamic interactions. The main NPC is the NPC which starts and coordinates the interaction, e.g. Alyx in an "alyx vs. zombie" interaction. The partner NPC is the NPC which "receives" the interaction, e.g. the zombie in an "alyx vs. zombie" interaction.
Dynamic interactions are created with sequences and a $keyvalues block embedded in the main NPC's model, which defines how and when to perform a dynamic interaction. The partner NPC only needs a corresponding sequence with the same name as the main NPC's sequence. For example, Alyx has the dynamic interactions defined in her model using $keyvalues, but the zombie model just has sequences with matching names.

Code Fix: You can fix this in code by preventing interactions from starting if the other NPC has the same interaction $keyvalues defined.
Activities are used to allow an interaction to use one of a selection of sequences. If an interaction points to a sequence, only that sequence will be used. If an interaction points to an activity, any sequence with that activity will be used. The partner NPC will still use a sequence that matches the name of the selected sequence. (they should have the same activity definitions, though!)
Interactions can be forced with the ForceInteractionWithNPC
input on the main NPC and can then be monitored with corresponding outputs.
Contents
Example
Found in models/Alyx_animations.mdl

$keyvalues { dynamic_interactions { "alyx_v_zombie_180deg_64" { "trigger" "auto_in_combat" "origin_relative" "64 0 0" "angles_relative" "0 180 0" "activity" "ACT_DI_ALYX_ZOMBIE_MELEE" "delay" "10.0" "needs_weapon" "ME" "weapon_mine" "weapon_alyxgun" } } }
Options
trigger <choices>
- What triggers this interaction... If this isn't defined, the interaction can be trigged via input
forceinteractionwithnpc "<targetname> <interaction name>"
auto_in_combat
- Automatically in combat.
loop_break_trigger <choices>
- Stop looping the action animation if
loop_in_action
was set.on_damage
- Break loop on damage.
on_flashlight_illum
- Break loop once illuminated by player's flashlight.
origin_relative <vector>
- Desired relative origin of the other NPC
angles_relative <angles>
- Desired relative angles of the other NPC
velocity_relative <vector>
- Desired relative velocity of the other NPC
Bug: Non-functional.
Code Fix: Velocity checking can be added in
CAI_BaseNPC::InteractionCouldStart()
.
entry_sequence <sequence>
- What sequence to play for this interaction before the main sequence/activity.
entry_activity <activity>
- What activity to play for this interaction before the main sequence/activity.
sequence <sequence>
- What sequence to play for this interaction. (the "action" animation)
activity <activity>
- What activity to play for this interaction. (the "action" animation)
exit_sequence <sequence>
- What sequence to play for this interaction after the main sequence/activity.
exit_activity <activity>
- What activity to play for this interaction after the main sequence/activity.
delay <float>
- Delay before interaction can be used again
origin_max_delta <float>
- Max distance sqr from the relative origin the NPC is allowed to be to trigger
loop_in_action <float>
Note: While the value is a float, it's used as a bool in code.
- Loop the main animation.
dont_teleport_at_end <choices>
- Don't teleport/fix up positions at the end
me
- Don't teleport/fix up this character's position
them
- Don't teleport/fix up this character's partner's position
both
- Don't teleport/fix up this character's or his partner's position
needs_weapon <choices>
- Needs a weapon to perform this interaction?
ME
- Does this character need a weapon?
THEM
- Does this character's partner need a weapon?
BOTH
- Does both this character and his partner need a weapon?
weapon_mine <classname>
- The weapon required to perform this interaction. If undefined, will perform with any weapon.
weapon_theirs <classname>
- Partner's weapon required to perform this interaction. If undefined, will perform with any weapon.
Related or Useful Stuff
Animation Events
These are useful animation events for those wanted to create an activity for a dynamic interaction. READ: Animation_Events To do: Move to dedicated page or animation event page?
Example:
{ event AE_NPC_HURT_INTERACTION_PARTNER 28 "THEM 100" }
AE_NPC_HURT_INTERACTION_PARTNER "<choices> <int>"
- Hurt either this character or his partner... and how much(the int).
ME
- Hurt this character
THEM
- Hurt the partner
AE_NPC_SET_INTERACTION_CANTDIE "<bool>"
- Set those participating in the interaction to become invincible To do: Which NPC? The partner or this character
AE_NPC_WEAPON_FIRE "<bool>"
- Fire this character's weapon. The bool is whether or not you want him to use the weapon's secondary fire.
Console Variable
ai_debug_dyninteractions "<int>"
- Debug the NPC dynamic interaction system.
If ai_debug_dyninteractions
is enabled, an axis will be created at the required relative position and this informaton is printed to the console while testing whether an interaction could start:
DYNINT: (al) testing interaction "alyx_v_zombie_180deg_64" al is at: 404.55 -67.75 -115.91 al distsqr: 0.37 (468.17 -60.77 -115.91), desired: (468.24 -61.37 -115.91) Idle_Relaxed_Shotgun_2 Speed: 0.00 al angle matched: (0.00 186.25 0.00), desired (0.00, 185.72, 0.00)

2
and selecting the NPC via npc_select
and/or ent_text
prints the distance information even if both NPCs are out of range.If ai_debug_dyninteractions
is enabled, this informaton is printed to the console when a NPC begins a dynamic interaction:
npc_alyx(al) starting dynamic interaction "alyx_v_zombie_180deg_64" with npc_citizen(dude2). - Core sequence: alyx_zombie_fight2