Your First Left 4 Dead Map
This tutorial will cover the basics of Left 4 Dead map creation. It will explain the required entities, such as the director, weapons, and spawns. It will also answer some of the questions that Left 4 Dead mappers will have. This tutorial is not intended for new mappers: The L4D Level Design Basics Tutorial tutorial covers this topic for novices.
For this tutorial we will be making a simple 2 level campaign that never ends. Sounds fun, right? Well, the purpose really isn't to create a full campaign, but to explain the basics of level construction in L4D.
First, lets cover what our L4D campaign will need to work right:
- A director
- Spawn points for each survivor
- 2 safe room doors
- Some weapons, ammo, and health
- A rescue closet
- A change-level
- A fog controller (for the particle effects)
The image on the right will be used for our map layout during this tutorial.
The Spawn Room
In order for each of the survivors to have their own spawn point, you must have three different types of entity in your map. These are
1) Add one
info_player_start and an
info_director into your spawn room. (Note: these can go anywhere). Name the
2) Place four
info_survivor_positions. Where you put these is where the survivors will start.(Note: if you want each spawn to spawn a random survivor, just leave it as it is. However, if you want to specify where a certain survivor will spawn you must set the SurvivorName flag to that survivor's name.
3) Double click on your
info_director to bring up the properties screen. Goto the output tab, where we will add two outputs to force the survivors to goto their proper spawns.
4) Add the outputs:
OnGameplayStart, director, ForceSurvivorPositions, Delay = 0.00, Fire only once = no
OnGameplayStart, director, ReleaseSurvivorPositions, Delay = 0.01, Fire only once = no
Now that that is done place a
env_fog_controller in your map. make sure the fog_controller's "Fog Enable" property is set to "Yes". This will control particles ect. You can also make your map foggy using this entity.
For a supplies area create a small brush to act as a table and add these entities on top:
- health kits, 4
- 2 weapons;
- an ammunition resupply,
weapon_ammo_spawn, set the world model to
Now for an exit add a "
prop_door_rotating_checkpoint" entity. For it's properties, name it "checkpoint_exit", set its "body" property to "1", the "Spawn Position" to "Closed" (spawnpos keyvalue 0), the "world model" to "models/props_doors/checkpoint_door_01.mdl", and the make sure the "Starts Open" flag is unchecked. Make sure the side of the door with the EXIT sign in the center is facing the inside of the room.
That should finish the starting point, but before we move on, lets add a
info_landmark to the room as well, name it "landmark_a". Well go more into detail on this later.
Next we'll make the two small rooms near the number 2 into places for dead players to respawn (referred to as a rescue closets). Rescue closets are fairly basic and only consist of 4 entities, 3
info_survivor_rescue entities and a
prop_door_rotating. Add the 3
info_survivor_rescue entities to the inside of each room. Next up is the door. You will want a space with a width of 56 and height of 104 for the door to sit in, add the
prop_door_rotating and set it's world model to "models/props_doors/doormain01.mdl".
The safe house and changing levels
Now to connect this map to another inside the campaign with a safe room. To start with, we'll add another "
prop_door_rotating_checkpoint" entity to the entrance of area 3 for the safe houses door. This one is set up a bit different from the last one. Open its properties and set the name to "checkpoint_entrance", the "body" property to "0", the "Spawn Position" to "Open Forward" (spawnpos keyvalue 1), the "world model" to "models/props_doors/checkpoint_door_02.mdl", and then make sure the "Starts Open" flag is checked. You want the side of the door with the picture of the house facing outside.
To finish setting up the transition from one map to the next we still need to add an
info_landmark and a
trigger_changelevel. First add the
info_landmark to the center of the room near the ceiling, then open it's properties and name it "landmark_b". Now create a large brush to cover the floorspace inside the safehouse and tie it to the
trigger_changelevel entity, make sure the brush comes in contact with the floorspace inside the room (doesn't necessarily have to overlap the floor space, but it does have to at least touch it). Open the changelevel's properties and set the landmark name to the one we just created, "landmark_b" and for the "next map" property, enter "lst_l4dmap_b".
For the survivor bots and infected to be able to move, you will need to create a navigation mesh ("mapname.nav" file) for your map. To build a basic mesh you need to have the map already compiled and loaded. Once the map is running, aim your crosshairs at the floor space, open up the console in game, and then type the following:
sv_cheats 1; nav_edit 1; nav_mark_walkable; nav_generate
The map will be reloaded after you type nav_generate, and if all goes well, we should no longer have the "NAV ERRORS - Map is unplayable!" message displayed on the screen when the map loads. This is because nav_generate assigned certain attributes to the nav mesh through a process known as "nav marking".
You can see the changes using the "select_with_attribute A" command. What this console command does is select all the nav areas that have been "marked" with the attribute "A". For instance, by using "select_with_attribute CHECKPOINT", all the nav areas that have been marked with the "CHECKPOINT" attribute would be highlighted.
For example, with "nav_edit 1" set, you would open the console and type:
- select_with_attribute DOOR
- 4 nav squares should be highlighted telling the bot AI there is a door in these locations.
- select_with_attribute CHECKPOINT
- The nav areas in the safehouse at the end of the level should be highlighted.
- select_with_attribute RESCUE_CLOSET
- The two two rescue closets should have there nav squares highlighted
- select_with_attribute ESCAPE_ROUTE
- Now a lot of nav squares are highlighted forming a path from the player spawn to the nav areas marked "checkpoint" at the end of the level.
In this case, nav_generate did a fairly good job at locating and assigning the final checkpoint, rescue closets, and other attributes to the nav mesh, but you may not always be so lucky. To manually assign attributes to nav squares, you will need use the MARK command via 'mark A', where A is the attribute you wish to mark the nav area with.
For example, before we can get our level working correctly, we will have to manually "mark" one additional location on the nav mesh that nav_generate missed, a starting checkpoint. To do this, we need to be in nav editing mode with:
sv_cheats 1 nav_edit 1
Now inside the starting safe room we will label one nav square at a time by pointing the targeting reticule at them then typing this into the console:
Or, to speed things up, you can use the nav gui by opening up the console again and typing:
With the nav gui enabled, you can now left click multiple meshes, and use the
mark CHECKPOINT console command to set the attribute for all the selected areas.
If you make a mistake, you can remove a single attribute from a selected nav area by using:
- where A is the attribute you wish to remove (eg:
- where A is the attribute you wish to remove (eg:
Or, if you wanted to remove all nav attributes from the selected area, you could use:
Once you have finished with nav marking, be sure to save the changes to your map with
nav_save, then re-analyze it with
Getting the infected to spawn
Now that the nav mesh is built, you should be able to get the infected to spawn by using the console commands:
You should only have to do this once inside the map, then every time you load the map after that the director should start on its own.
Making the second chapter
With the first map out of the way, the second map can be made quite easily. Back in Hammer, with the map we just compiled still loaded, go up to the file menu and choose "Save As". Now type in "lst_l4dmap_b" to save the current map under a new name. Go up to the exit menu and hit "Select all", hit CTRL and M to bring up the translation tool and type 180 into the Z field and hit "Ok".
Change the name of the
info_landmark entities so that the one in the starting room is named "landmark_b" and the one in the ending safehouse is named "landmark_a". Remember "landmark_a" we created in the first map? We're going to link the changelevel in our new map to it, open the trigger_changelevel's properties and replace "landmark_b" with "landmark_a" and "lst_l4dmap_b" with "lst_l4dmap_a". After changing up the names, finish up by compiling the map and repeating the nav creation steps you used for the previous map, don't forget to mark the spawn room with the checkpoint attribute. If all goes well, you should now have a working 2 level campaign.
For spawn areas in later chapters of the campaign, you do not have to keep using the
weapon_pumpshotgun_spawn you used in the first map as most players will likely have already swapped these for other more powerful weapons they've found along the way. These more powerful weapons you can use in the spawn areas for the later chapters will usually consist of:
weapon_autoshotgun_spawn, and a