L4D Level Design/Finale Events Part 1
- Getting Started
- Your First L4D Level
- Ladders
- Visibility
- Nav Meshes
- Checkpoints
- Checkpoint Rooms
- Outdoor Levels
- Level Organization
- Level Standards
- Clip Brushes
- Elevators
- Panic Events
- Breakable Walls
- Finale Events Part 1
- Finale Events Part 2
- Finale Events Part 3
- Additional Finale Components
- Nav Flow
- Advanced Nav Editing
- Versus Maps
The 5th map in each of the campaigns that shipped with Left 4 Dead had a finale where the survivors would need to call for help on a radio, fight waves of infected and tanks in one location, and escape onboard a vehicle. There is also an example of this in the tutorial_standards map.
[edit] Final Event Components
There are several things that you need to make a finale work properly:
- A trigger_finale – the radio that you call for help from.
- An area of the nav mesh marked with FINALE.
- An escape vehicle that picks the survivors up (usually a prop_dynamic with an animation).
- A trigger_multiple to check if all the survivors have made it to the escape vehicle.
- 4 info_survivor_positions for the survivors to teleport to when they're rescued.
Optional but standard things that you should place in a finale:
- Supplies (ammo stash, weapons to switch to, health packs).
- A point_viewcontrol_multiplayer which is a camera for the outro.
- Some env_fade entities to fade in/out the camera during the outro.
- An entity called "env_outtro_stats" for the credits to roll during the outro.
- A prop_minigun that the survivors can use for defense.
- A rescue closet – a small room with a door and 3 info_survivor_rescue entities inside.
[edit] Placing a trigger_finale
Go to the Entity Creation Tool and select "trigger_finale" from the Objects drop-down menu.
Place it in the Camera viewport and open its properties.
Click on the World model row and click on the Browse button on the right side.
Type "radio" in the Filter field.
Select the model "props\terror\hamradio.mdl" and click OK.
Change the Name to "radio".
Change the Disable Shadows field to "Yes".
This will allow us to send an input to "radio" or the trigger_finale and it won't allow a shadow to draw through the table.
There is also a Use Delay field that we use frequently. This is the amount of seconds before the finale will start after pressing the button. For now, just leave this as the default value of 0.
Save and compile your level and enter the following in the console when it loads:
- director_stop
- nb_delete_all
- nav_edit 1
- z_debug 1
Use "noclip" to fly to where your trigger_finale is.
Select the nav areas around the trigger_finale and grow the selection just like you did with the BATTLEFIELD areas in the Panic Event/Minifinale.
Use "mark FINALE" in the console to add the FINALE attribute.

Frequently Used Nav Attributes:
- PLAYER_START
- EMPTY
- CHECKPOINT
- BATTLEFIELD
- BATTLESTATION
- FINALE
- NOT_CLEARABLE
- NO_MOBS
- OBSCURED
- RESCUE_CLOSET
- RESCUE_VEHICLE