Multi-stop elevators: Difference between revisions
Markboydude (talk | contribs) (Fixed grammar (a → an)) |
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified) |
||
(12 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{pov}} | |||
Multi-stop elevators can be used in maps to allow players to move freely between three or more floors without having to cycle all the way through every floor. | Multi-stop elevators can be used in maps to allow players to move freely between three or more floors without having to cycle all the way through every floor. | ||
Line 8: | Line 9: | ||
=== Making the Elevator === | === Making the Elevator === | ||
[[ | [[File:1_Elevator_Properties.png|thumb|200px|right|Figure 1 - The func_tracktrain properties box.]] | ||
We start | We start off by making the elevator. You want to make the walls as tall as the space in between your level's floor and ceiling, in my case 128 units. Make the elevator floor and ceiling as thick as your level's floor and ceiling. Make sure the elevator floor is flush with the floor of your level. Cut out a hole for the doors. I have made the front wall 1 unit thinner so the doors can go in and wont clip through the wall. After that is done, pick a texture of your choice and texture only the inside. Leave the rest nodraw, unless someone can get inside your elevator shaft or see outside of your elevator. | ||
Now select all the elevator brushes and tie them to a [[func_tracktrain]]. Refer to ''Figure 1'' for the properties. You can set the sounds and speed to whatever you like. For the flags, check only <code>No User Control</code>, <code>Fixed Orientation</code>, & <code>Is unblockable by player</code>. Then move the origin (the little blue ball) to the X (in the 2D view) of the floor of the elevator (''Figure 2''). | Now select all the elevator brushes and tie them to a [[func_tracktrain]]. Refer to ''Figure 1'' for the properties. You can set the sounds and speed to whatever you like. For the flags, check only <code>No User Control</code>, <code>Fixed Orientation</code>, & <code>Is unblockable by player</code>. Then move the origin (the little blue ball) to the X (in the 2D view) of the floor of the elevator (''Figure 2''). | ||
[[ | [[File:2_3D_Helper.png|thumb|200px|right|Figure 2 - Location of the blue ball.]] | ||
[[ | [[File:3_Elevator.png|thumb|200px|right|Figure 3 - The appearance of the elevator.]] | ||
=== Making the Shaft === | === Making the Shaft === | ||
Line 26: | Line 27: | ||
First we will make doors for the actual elevator. Just make 2 brushes that fit into the door hole you have cut out. I have mine 2 units thick, 112 units tall, and 32 units wide each. You can texture the doors with anything you like, but I recommend <code>metal/offelevdrsa</code>. It may take a while adjusting the texture so it fits with the door. Now tie each door to a [[func_door]]. Refer to ''Figure 4'' for the properties. Be sure to name both doors the same name and parent them to the elevator. You also might need to change move direction. Again, you can change the sounds and speed to whatever you like. Now go to the flags and uncheck <code>Touch Opens</code>. | First we will make doors for the actual elevator. Just make 2 brushes that fit into the door hole you have cut out. I have mine 2 units thick, 112 units tall, and 32 units wide each. You can texture the doors with anything you like, but I recommend <code>metal/offelevdrsa</code>. It may take a while adjusting the texture so it fits with the door. Now tie each door to a [[func_door]]. Refer to ''Figure 4'' for the properties. Be sure to name both doors the same name and parent them to the elevator. You also might need to change move direction. Again, you can change the sounds and speed to whatever you like. Now go to the flags and uncheck <code>Touch Opens</code>. | ||
[[ | [[File:4_Door_Properties.png|thumb|200px|right|Figure 4 - The elevator door properties box.]] | ||
Next we will make doors for each floor. You can simply copy the doors you made for the elevator and paste them to match with the door hole you made when building the shaft. The only difference is that for each floor they have to be named something different. For example for the first floor I used "elev_doors_1" and for the second floor "elev_doors_2", while for the elevator doors I used "elev_doors". Keep in mind both doors have to be named the same thing. The name only changes for different floors. | Next we will make doors for each floor. You can simply copy the doors you made for the elevator and paste them to match with the door hole you made when building the shaft. The only difference is that for each floor they have to be named something different. For example for the first floor I used "elev_doors_1" and for the second floor "elev_doors_2", while for the elevator doors I used "elev_doors". Keep in mind both doors have to be named the same thing. The name only changes for different floors. | ||
Line 34: | Line 35: | ||
=== Making the Path === | === Making the Path === | ||
We begin our work with the entities by making a [[path_track]]. Line this <code>path_track</code> up with the center X of the floor, just like with the blue ball. Then name it something like "elev_stop_1" (''Figure 5''). Set the <code>Orientation Type</code> to <code>No change</code>. Now copy this path_track and paste it, lining it up with the x in the second floor. Do this for all your floors, making sure to change the name for each <code>path_track</code> to correspond with | We begin our work with the entities by making a [[path_track]]. Line this <code>path_track</code> up with the center X of the floor, just like with the blue ball. Then name it something like "elev_stop_1" (''Figure 5''). Set the <code>Orientation Type</code> to <code>No change</code>. Now copy this path_track and paste it, lining it up with the x in the second floor. Do this for all your floors, making sure to change the name for each <code>path_track</code> to correspond with its floor. | ||
[[ | [[File:5_Path_track_Lineup2.png|thumb|200px|right|Figure 5 - How to place the path_tracks.]] | ||
Now go back to your first <code>path_track</code> and set | Now go back to your first <code>path_track</code> and set its <code>Next Stop Target</code> to "elev_stop_2", or your second floor's <code>path_track</code>. Do this for all your floors except the top floor. Once you've finished that, go to your top floor's <code>path track</code> and set its <code>Branch Path</code> to the <code>path_track</code> below it (elev_stop 3). Do this for all your <code>path_tracks</code> except for the first one (elev_stop_1). Once you've done all this your shaft should look something like ''Figure 6''. | ||
{{bug|It appears as though for some levels the elevator doesn't line up with the floor. I don't know why this is cause because I have all possible properties set to a value that makes sure the elevator wont move out of its origin.}} | {{bug|hidetested=1|It appears as though for some levels the elevator doesn't line up with the floor. I don't know why this is cause because I have all possible properties set to a value that makes sure the elevator wont move out of its origin.}} | ||
[[ | [[File:6_Shaft.png|thumb|200px|right|Figure 6 - The appearance of the elevator shaft.]] | ||
=== Logic Entities === | === Logic Entities === | ||
Line 53: | Line 54: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_doors_1 || Open || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_doors || Open || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_doors_1 || Close || || 5.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_doors || Close || || 5.00 | ||
|} | |} | ||
Line 69: | Line 70: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev || Stop || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_doors || Open || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnTrigger || elev_dooropen* || Trigger || || 0.50 | ||
|} | |} | ||
Line 85: | Line 86: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnEqualTo || elev_stop || Trigger || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnGreaterThan || elev_stop_1 || EnableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnGreaterThan || elev_stop_2 || EnableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnGreaterThan || elev_stop_3 || EnableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnGreaterThan || elev_stop_4 || EnableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnGreaterThan || elev || StartForward || || 1.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnLessThan || elev_stop_1 || DisableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnLessThan || elev_stop_2 || DisableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnLessThan || elev_stop_3 || DisableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnLessThan || elev_stop_4 || DisableAlternatePath || || 0.50 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnLessThan || elev || StartForward || || 1.00 | ||
|} | |} | ||
Line 113: | Line 114: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPass || elev_compare || SetValueCompare || 1 || 0.00 | ||
|} | |} | ||
Line 125: | Line 126: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_doors* || Close || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_compare || Compare || || 2.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_dooropen_* || Disable || || 0.00 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_dooropen_1 || Enable || || 0.20 | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_compare || SetCompareValue || 1 || 0.50 | ||
|} | |} | ||
For each button be sure to change the parameter override for <code>SetCompareValue</code> to the value that corresponds to the floor the button is for. | For each button be sure to change the parameter override for <code>SetCompareValue</code> to the value that corresponds to the floor the button is for. | ||
Copy all the buttons and place each button on the outside of the elevator on the floor that it's for. Then change the name to something like elev_button_call_# (# being the floor number) and unparent the buttons from the elevator. Go to the outputs tab and change the delay of the | Copy all the buttons and place each button on the outside of the elevator on the floor that it's for. Then change the name to something like elev_button_call_# (# being the floor number) and unparent the buttons from the elevator. Go to the outputs tab and change the delay of the output for elev_compare to 1.50. | ||
==== Locking the Buttons ==== | ==== Locking the Buttons ==== | ||
Line 147: | Line 148: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnEqualTo || elev_button* || Unlock || || 0.10 | ||
|} | |} | ||
Line 157: | Line 158: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnPressed || elev_button* || Lock || 1 || 0.00 | ||
|} | |} | ||
Line 169: | Line 170: | ||
=== Shake === | === Shake === | ||
[[ | [[File:7_Env_shake_Properties.png|thumb|200px|right|Figure 7 - The env_shake properties box.]] | ||
You can also add an [[env_shake]]. You can use two outputs to make it work. In your <code>logic_compare</code> add this output: | You can also add an [[env_shake]]. You can use two outputs to make it work. In your <code>logic_compare</code> add this output: | ||
Line 176: | Line 177: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnEqualTo || elev_shake || StopShake || || 0.00 | ||
|} | |} | ||
Line 184: | Line 185: | ||
! || Output named || Target entities || Via this input || Parameter || Delay | ! || Output named || Target entities || Via this input || Parameter || Delay | ||
|- | |- | ||
|[[ | |[[File:Io11.png]] || OnStart || elev_shake || StartShake || || 0.10 | ||
|} | |} | ||
Line 191: | Line 192: | ||
== Hammer Map File == | == Hammer Map File == | ||
A [http://www.mediafire.com/download/xeay3upiwd1ni7g/elev_tut.vmf vmf] that contains what can be constructed if one follows this tutorial is included. | |||
[[Category:Level Design Tutorials]] | |||
[[Category:Level Design]] | |||
[[Category:Tutorials]] |
Latest revision as of 07:13, 20 May 2025

Multi-stop elevators can be used in maps to allow players to move freely between three or more floors without having to cycle all the way through every floor.


Brush Work
Making the Elevator
We start off by making the elevator. You want to make the walls as tall as the space in between your level's floor and ceiling, in my case 128 units. Make the elevator floor and ceiling as thick as your level's floor and ceiling. Make sure the elevator floor is flush with the floor of your level. Cut out a hole for the doors. I have made the front wall 1 unit thinner so the doors can go in and wont clip through the wall. After that is done, pick a texture of your choice and texture only the inside. Leave the rest nodraw, unless someone can get inside your elevator shaft or see outside of your elevator.
Now select all the elevator brushes and tie them to a func_tracktrain. Refer to Figure 1 for the properties. You can set the sounds and speed to whatever you like. For the flags, check only No User Control
, Fixed Orientation
, & Is unblockable by player
. Then move the origin (the little blue ball) to the X (in the 2D view) of the floor of the elevator (Figure 2).
Making the Shaft
Now you will want to make a shaft that encloses the elevator and goes all the way up to the first floor. It's really just 3 tall brushes and then a floor and ceiling. Make sure that you have door holes cut out that are the same size as the elevator's door hole. You want to keep the entire shaft nodraw unless someone can somehow see it.
Making the Doors
First we will make doors for the actual elevator. Just make 2 brushes that fit into the door hole you have cut out. I have mine 2 units thick, 112 units tall, and 32 units wide each. You can texture the doors with anything you like, but I recommend metal/offelevdrsa
. It may take a while adjusting the texture so it fits with the door. Now tie each door to a func_door. Refer to Figure 4 for the properties. Be sure to name both doors the same name and parent them to the elevator. You also might need to change move direction. Again, you can change the sounds and speed to whatever you like. Now go to the flags and uncheck Touch Opens
.
Next we will make doors for each floor. You can simply copy the doors you made for the elevator and paste them to match with the door hole you made when building the shaft. The only difference is that for each floor they have to be named something different. For example for the first floor I used "elev_doors_1" and for the second floor "elev_doors_2", while for the elevator doors I used "elev_doors". Keep in mind both doors have to be named the same thing. The name only changes for different floors.
Entity Work
Making the Path
We begin our work with the entities by making a path_track. Line this path_track
up with the center X of the floor, just like with the blue ball. Then name it something like "elev_stop_1" (Figure 5). Set the Orientation Type
to No change
. Now copy this path_track and paste it, lining it up with the x in the second floor. Do this for all your floors, making sure to change the name for each path_track
to correspond with its floor.
Now go back to your first path_track
and set its Next Stop Target
to "elev_stop_2", or your second floor's path_track
. Do this for all your floors except the top floor. Once you've finished that, go to your top floor's path track
and set its Branch Path
to the path_track
below it (elev_stop 3). Do this for all your path_tracks
except for the first one (elev_stop_1). Once you've done all this your shaft should look something like Figure 6.

Logic Entities
Opening Doors
To open and close the doors automatically, we will first create a logic_relay. Name it something like "elev_dooropen_1" and set start disabled to "Yes". Now add these outputs:
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnTrigger | elev_doors_1 | Open | 0.00 | |
![]() |
OnTrigger | elev_doors | Open | 0.00 | |
![]() |
OnTrigger | elev_doors_1 | Close | 5.00 | |
![]() |
OnTrigger | elev_doors | Close | 5.00 |
If you have different names for the doors be sure to change the outputs to yours. Now copy that logic_relay
and rename it to correspond with the next floor. Change the outputs to correspond with the next floor too (e.g. for floor 3 "elev_doors_1
would become elev_doors_3
).
Now make another logic_relay
and name it something like "elev_stop". This one is NOT starting disabled. Set these outputs for it:
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnTrigger | elev | Stop | 0.00 | |
![]() |
OnTrigger | elev_doors | Open | 0.50 | |
![]() |
OnTrigger | elev_dooropen* | Trigger | 0.50 |

elev_dooropen*
is in red, it will work.Making It All Move
Create a logic_compare and name it something like "elev_compare". Set the Intitial value
and Compare value
to the floor the elevator starts on, in my case, 1 or the 1st floor. Now add these outputs:
Now go to your first path_track
and add this output:
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnPass | elev_compare | SetValueCompare | 1 | 0.00 |
Do this for the rest of your path_tracks
, changing the parameter to correspond with the floor (e.g. Floor 4 will have a parameter
of 4).
Buttons
For our final step we will be adding buttons. Create a brush for each floor, texture it to your likings, and tie each to a func_button. Name each button corresponding to the floor it's for (such as elev_button_1) and parent each button to the elevator. Now go to the flags and check only Don't Move
and Use Activates
. After that, go to the outputs tab and add these:
For each button be sure to change the parameter override for SetCompareValue
to the value that corresponds to the floor the button is for.
Copy all the buttons and place each button on the outside of the elevator on the floor that it's for. Then change the name to something like elev_button_call_# (# being the floor number) and unparent the buttons from the elevator. Go to the outputs tab and change the delay of the output for elev_compare to 1.50.
Locking the Buttons
You wouldn't want someone spamming the buttons and causing the elevator to glitch, so to fix this we will lock the buttons when the elevator is in use. To do this, first add this output to your logic_compare
:
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnEqualTo | elev_button* | Unlock | 0.10 |

Now add this output to ALL your elevator buttons (including the call ones):
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnPressed | elev_button* | Lock | 1 | 0.00 |
Further Editing
That's it! You have made a multi-stop elevator. Now you can make it better with lights, sprites, sounds, etc.
Bell Sound
For an elevator bell sound, I found that plats/elevbell1.wav
works well. You can implement it into your elevator with an ambient_generic and some outputs.
Shake
You can also add an env_shake. You can use two outputs to make it work. In your logic_compare
add this output:
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnEqualTo | elev_shake | StopShake | 0.00 |
and this output in your func_tracktrain
(your elevator):
Output named | Target entities | Via this input | Parameter | Delay | |
---|---|---|---|---|---|
![]() |
OnStart | elev_shake | StartShake | 0.10 |
Refer to Figure 7 for env_shake
propeties.
Hammer Map File
A vmf that contains what can be constructed if one follows this tutorial is included.