WiseNPCrapjump: Police rappel and jump
This tutorial was originally created by wisemx. It was originally posted on SDKnuts.net.
The sample file for this project, at the page bottom, illustrates:
- Combine Police Rappels from ceiling then jumps down to join the attack.
- Second Combine Police jumps down from above and begins to attack.
As you see there are two methods of getting NPC’s to jump down from heights illustrated in this project.
- The first method is a scripted_sequence that begins when the rappelling Combine Police has completed its rappel.
- The second method uses info_node_hint entities to get the Combine Police to jump down.
Both methods require some finessing. The NPC won’t jump down if it is too far and in the first method the animation is already set so you need to use landing points that match.
As you can see in this project I’ve created an electrical panel and a toolbox for the first Combine Police to jump down onto. These are brush based and work out well for a project like this.
For the second Combine Police that makes use of info_node_hint
entities I’ve created a group for the hints this NPC will use. This is to keep the NPC from getting distracted.
The first method works much better as the info_node_hint
method can easily be interrupted by other events in your project.
The first Combine Police
These are the setting for the first Combine Police.
npc_metropolice
{{entity-kvalue-start|npc_metropolice} |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-left: thin solid grey;"|Name |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-right: thin solid grey; padding-right:10px; "|Police01 |align="left" style="padding-left:10px; font-size:90%;"| |- |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-left: thin solid grey;"|Waiting to rappel |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-right: thin solid grey; padding-right:10px; "|Yes |align="left" style="padding-left:10px; font-size:90%;"| |- |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-left: thin solid grey;"|Weapons |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-right: thin solid grey; padding-right:10px; "|SMG1 |align="left" style="padding-left:10px; font-size:90%;"| |- |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-left: thin solid grey;"|Number of manhacks |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-right: thin solid grey; padding-right:10px; "|None |align="left" style="padding-left:10px; font-size:90%;"| |- |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-left: thin solid grey;"|Pistols start drawn |align="left" style="padding-left:10px; background: 262626; font-size:90%; border-right: thin solid grey; padding-right:10px; "|No |align="left" style="padding-left:10px; font-size:90%;"| |- |colspan="2" style="border-top: thin solid grey;"| || |}
Flag | ||||
Simple cops | ||||
My output | Target entity | Target input | Parameter | Delay | Only once | Comments | ||
OnRappelTouchdown | police01_jumpss | BeginSequence | 0.25 | Yes | ||||
point_template
Class: point_template | ||
Keyvalues | Comments | |
Name | police01_template | |
Template 1 | police01 | |
Flag | ||||
Preserve entity names | ||||
scripted_sequence
Class: scripted_sequence | ||
Keyvalues | Comments | |
Name | police01_jumpss | |
Target NPC | police01 | |
Action Animation | canal1jump1 | |
Move to Position | Run | |
Flag | ||||
No interruptions | ||||
Override AI | ||||
My output | Target entity | Target input | Parameter | Delay | Only once | Comments | ||
OnEndSequence | police01_ai | RevertRelationship | ||||||
trigger_once
This trigger_once starts the events into place.
Class: trigger_once | ||
Keyvalues | Comments | |
Start disabled | No | |
Flag | ||||
Clients | ||||
My output | Target entity | Target input | Parameter | Delay | Only once | Comments | ||
OnTrigger | police01_template | ForceSpawn | 1.0 | Yes | ||||
OnTrigger | police02_ss | BeginSequence | 1.0 | Yes | ||||
OnTrigger | police01 | BeginRappel | 1.5 | Yes | ||||
ai_relationship
The ai_relationship is used to keep the first Combine Police from shooting until it has jumped down. The second Combine Police will shoot at will and still jump down.
Class: ai_relationship | ||
Keyvalues | Comments | |
Name | police01_ai | |
Subjects | !player | |
Disposition | Like | |
Start Active | Yes | |
Reciprocal | No | |
On the ground level for the first Combine Police I’ve placed one info_node but even this isn’t needed as its motions are all scripted up until the point where the NPC begins to attack. The effect I’ve created for this NPC is a spot it will jump down to and defend.
The second Combine Police
These are the properties for the second Combine Police.
npc_metropolice
Class: npc_metropolice | ||
Keyvalues | Comments | |
Name | Police02 | |
Hint Group | jump02 | |
Waiting to rappel | No | |
Weapons | Pistol | |
Number of manhacks | None | |
Pistols start drawn | Yes | |
Flag | ||||
Allowed to respond to thrown objects | ||||
Fall to Ground | ||||
info_node_hint
The info_node_hint
entities under and in front of this NPC.
Class: info_node_hint | ||
Keyvalues | Comments | |
Hint | Override jump permission | |
Start disabled | No | |
Hint Group | jump02 | |
scripted_sequence
The scripted_sequence
used for this NPC.
Class: scripted_sequence | ||
Keyvalues | Comments | |
Name | police02_ss | |
Target NPC | police02 | |
Move to position | Run | |
Flag | ||||
No Interruptions | ||||
Override AI | ||||
Priority Script | ||||