Working Ladders
In most Source engine games (with a few exceptions), a ladder in-game consists of the prop or brush that the player perceives as the ladder, and the invisible entity/brush system in front of it that actually makes the ladder climbable. This gives the illusion that the player is climbing the visible ladder, where in fact he is scaling the invisible ladder entity/brush just in front of it. To create the visible ladder, you can either use:
- A prop_static entity with a ladder model (like models\props_c17\metalladder001.mdl)
- A brush with a ladder texture (like metal/metalladder001a).
The ladder's climbing system is created depends on which Source game it is intended for. Ladders in Half-Life 2 and Half-Life 2: Deathmatch are created a little differently than those of earlier games to provide better control for the level designer and player alike, while ladders in Counter-Strike: Source and Day of Defeat: Source are implemented pretty much the same way as the older games.
Ladder Entities
Creating the Ladder
To create a ladder you must define the volume in which the player will move through space while on the ladder. This volume can be defined in two ways: Using the func_useableladder entity, or using the deprecated func_ladderendpoint entity (which is only briefly described below to provide understanding of the workings of older maps).
The func_useableladder entity can be divided into two sub-entities: a starting point and an ending point (see Fig. 1a). Their positions can be typed into the keyvalue fields, or more typically the ladder volume can be defined using the visual ladder tool, by dragging its center circle that is visible when the entity is selected (see Fig. 1b). Using this tool, you can drag the start and end points of the ladder into appropriate positions in the 2D view. The ladder's start and ending points may be of arbitrary orientation and length (see Fig. 1c). Simply pull the endpoints where you want them, and the player will move between these points while on the ladder.
As you place the endpoints, make sure that you place them a couple of units away from the visible ladder brush (or any other brush or model), because if any four sides of the ladder volume are even touching against a surface of a brush or a model, this will make that part of the ladder volume unclimbable.
The now-obsolete func_ladderendpoint entity just consists of a single endpoint. A ladder volume is created by linking two func_ladderendpoint together using their properties. A ladder volume is created between two func_ladderendpoints by naming one of the endpoints and having the other endpoint point to its name in its Other value. (It is not necessary for the second endpoint to point back at the first as stated in properties.)
Dismounts
Along with the volume of movement, you can also provide dismount points for the ladder (see Fig. 2) to allow easier and more controlled dismounts. These points are marked using the info_ladder_dismount entity. While next to and facing one of these markers, the player can press his use key to dismount to the position of the marker (typically when ladders run between more than two floors). If he has reached one of the ends of the ladder, he can also simply walk off the ladder by facing one of the markers nearby and walking forward. You can use multiple info_ladder_dismount markers for each dismount place to provide more directions to exit the ladder in.
To avoid possible confusion between nearby ladders using different dismount markers, each info_ladder_dismount entity has a property value called LadderName, which can be used to contain the name of the ladder it belongs to.
Like the ladder volume, the dismount points must be free of obstruction and allow the player to stand at their position without intersecting solid world geometry.
In-Game Testing
Once you have created your ladders, you can compile your map and test them. If you wish, you can also display the ladder entities in-game along with some debug information by opening the console and typing sv_showladders 1
to enable this, and then load or reload (by typing restart) the map you wish to view.
This will show you all the start and end points of the ladders (func_useableladder and func_ladderendpoint entities), as well as the dismount points (info_ladder_dismount entities; see Fig. 3a). It can also help you determine if these entities are set up properly if ladder entities are colliding with solid world geometry or the prop model of the ladder itself (see Fig. 3b) and which func_ladderendpoint entities connect to each other.
How Ladders Work In-Game
The safest way to mount a ladder is to approach its invisible ladder volume and, within reaching distance, press the use key. This will automatically position you on the ladder. (You can also walk into the ladder volume, with greater risk of missing it and falling down any holes.)
To dismount a ladder you can always either jump off or press your use key. If the ladder has info_ladder_dismounts, you can also simply walk off from its endpoints, and pressing your use key while next to and facing an info_ladder_dismount will also allow more controlled dismounts anywhere on the ladder.
Brush Ladders
Object-Brush–Based Ladders
- Used in: Left 4 Dead series, Counter-Strike: Source, Day of Defeat: Source, Garry's Mod, Vampire: The Masquerade - Bloodlines, The Ship: Murder Party, Black Mesa, Half-Life: Source, Jabroni Brawl: Episode 3
Create another brush in front of the object/brush you want to be climbable, as close as you can to it, but without touching it. Make sure that the face is the same width/height as the climbable object. Assign the material tools/toolsinvisibleladder to this brush, then tie it to an entity (via Ctrl+T). Select func_ladder from the Object Properties dialog. You now have a climbable face in front of the object/brush. While on a ladder in Counter-Strike: Source, your shooting accuracy will be significantly reduced.
Ladders can also be dismounted sideways. For example, climbing a ladder that dismounts to the left side of the ladder prop, as opposed to climbing over the func_ladder brush.
Those ladders should have the ladder brush extend about 56 units above the floor it will dismount to, but not touch any roof above the ladder.
If the func_ladder does not reach high enough, you cannot dismount onto the floor and fall down instead. If the func_ladder comes too close to a roof, or any solid prop above, the AI will stick to that roof/prop, because AI always climbs to the very top of a ladder and won't think about when dismounting makes most sense.
Non-Object Brush-Based Ladders
- Used in: INFRA, Counter-Strike: Global Offensive
- Also works in: Counter-Strike: Source, Day of Defeat: Source, Garry's Mod, Half-Life: Source
This ladder type is set up and works in exactly the same way as object brush ladders, but it shouldn't be tied to a func_ladder entity, or it will make the ladder nonexistent in-game. To make it, create a brush in front of the object/brush you want to be climbable, as close as you can to it but without touching it.
Make sure that the face is the same width/height as the climbable object and then assign the material tools/toolsinvisibleladder to this brush. You now have a climbable face which is in front of the object/brush. No other setup is required for your ladder to work in game.
$contents "ladder"
QC command.Brush-Based Ladder Workaround
Used in: Team Fortress 2, Portal 2
Some Source games do not support the standard ladder entity; however, it is possible to fake a ladder by creating a very narrow staircase.
To start off, make a prop_static and set the world model to models/props_c17/metalladder002.mdl or similar. You can also make a ladder prop out of brushes or use a ladder texture on a single brush face.
Next, create a brush 16 units high using a clip texture. Use the clip brushes to make a stack of blocks, making sure each higher block is one unit "behind" the lower one. The players will climb these 16-unit-high brushes as stairs. To keep them from going too far out once you reach the bottom select the no clip blocks group them and then compress them as long as the top step sticks out past where the prop ends and each block still has a small lip it will work just fine. There you have it—a good-looking, climbable ladder.
Video Showing how to create it: TF2 mapping: Ladders in TF2
Optimizing Ladders
The ladder props, like every prop_static, default to using VPhysics for collision detection. This will provide more detailed physics collisions, but in some cases this might not be preferable. In multiplayer maps and very resource-demanding maps, using VPhysics props costs precious resources, and you might want to sacrifice good physics to avoid potential lag. Here are some good methods to minimize resource cost:
- If the ladder is for Half-Life 2 or Half-Life 2: Deathmatch, and the ladder is straight, the best method depends on whether somebody is going to be able to shoot through the ladder. If they are not (like if the ladder is against a wall), you could simply change the Collisions keyvalue to "Use Bounding Box." If they are, you could change the keyvalue to "Not Solid" and place an invisible Clip brush to detect collision with it instead.
- If you are creating a slanting ladder for Half-Life 2 or Half-Life 2: Deathmatch, a bounding box will not rotate with the prop, and will obstruct the climbing system, in which case you are better off making the ladder prop Not Solid and place an invisible, rotated Clip- or Player Clip–textured brush alongside the ladder. Alternatively, you may turn off SmartEdit and set the prop's solid keyvalue to 3, which will cause it to use a properly-rotated version of the prop's bounding box.
- If the ladder is for a Counter-Strike: Source or Day of Defeat: Source map, you could change the Collisions keyvalue to "Not Solid" and make the func_ladder brush cover the ladder prop, rotating it if necessary.
In multiplayer maps, it's also an understood expectation to be able to move freely parallel to the surface that a ladder covers. When it comes to brush based ladders, you can get away with turning the ladder brush into a non-solid func_brush to avoid players getting temporarily "stuck" against the side of the ladder, but when it comes to prop ladders, they often protrude from the wall too much to make a player standing inside one believable. In that case, you are probably better off using two Player Clip–textured wedges at the sides of the prop, guiding the player to the front of the prop.
If nothing else, you could turn a brush ladder into a func_detail to avoid unnecessary visleafs.
See also
- func_useableladder
- func_ladderendpoint
- info_ladder_dismount
- func_ladder
- Brush ladders Tutorial on implementing Brush ladders for your Source Engine mod