Door creation

From Valve Developer Community
Revision as of 17:50, 7 September 2022 by Equalizer5118 (talk | contribs) (started revamping article)
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)
Warning.pngWarning:This article is being revamped, please excuse inconsistencies

In this tutorial, you will learn how to create a functioning brush-based door.

Brush or Point Based?

It is important to know the difference between a "brush-based" and a "point-based" door. For starters, brush-based doors are, obviously, created from a brush that is tied to an entity. You generally have more control over how the door is shaped and how it looks compared to a point-based door. Point-based doors, however, can have functioning opening hardware, such as handles, push bars, and keypads. They are, however, restricted to a select few models that may not be present in more modern titles, such as Portal 2 Portal 2.

Making the Doorway

Note.pngNote:The pictures were taken in the Portal 2 hammer editor, but it works the same in older versions as well.

To create a brush-based door, make a wall with a gap that the player can move through. See dimensions for sizing. To make a gap in the wall, use the Clipping Tool to create a separated section, then make a hole at the bottom of that section. Make sure to put a brush underneath the doorway or there will be a leak.

Door brush 1.png

Note.pngNote:click on the image for a higher quality

Creating the Brush Door

To create the actual door, create a brush that fills the hole in the doorway. It is recommended to make the door have a different texture to make it stand out against the wall.

Door brush 2.png

Turning the Brush Into the Door

To turn the brush into a functioning door, select it and press ctrl+T. If you want a door that raises up and down, select func_door. For rotating, select func_door_rotating

Making a Button for Your Door

Name your door something like door1. To make a button for the door, create a small brush (can be any shape you want), and tie it (via Tie to Entity) to func_button. Name your button as well (e.g., door1_button). Then, once you have selected 'Apply', select 'Outputs' and 'Add Output'. The output should be:

  My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnPress door1 Open 0.00 No

Then press 'Apply' again, to make the button.
When you test the map, walk up to the button and press 'Use'. The door should then open.

Making Double Doors

To make two func_doors or func_door_rotatings open and close together, it is necessary to use a combination of Outputs and logic_relays. First, make two doors through the process stated above and name them accordingly (e.g., door1 and door2). Second, add two logic_relay's somewhere near the doors (the location is not important, but it helps for organizational reasons to keep them close) and name them as well (e.g., door1_relay and door2_relay). Third, open the properties of the first door, go to the 'Outputs' tab, and add an output similar to the following:

  My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnOpen door2 Open 0.00 No

Do this for the other door too, but change the Target Entity to door1. What these outputs do is open one door when another one is opened (whether that be done via Touch, Toggle, a button, etc.). At this point, you could save and compile to test the doors out if you wanted, but they would only be able to open each other, not close each other. That is where the logic_relay's come in.

Now normally, you would think that you could repeat the process for closing the doors via Outputs (i.e., having one door be closed by the other), but such is not the case. If you try it out for yourself, you will find that the game crashes as soon as you go to close one of the doors. So, to work around this little bug, you need to introduce a logic_relay for each door. If you've followed the above process so far, you should already have the two relays placed and named. Now, open the properties of the first door and add an output similar to this: :

Again, repeat this for the other door, changing the Target Entity to door2_relay. Next, open the properties for the first relay and add an output like so: :
  My Output Target Entity Target Input Parameter Delay Only Once
Repeat this for the other relay, changing the Target Entity to door1. Now save and compile, and you should have a working set of double doors.
<be> To help you understand this concept of Outputs and logic_relay's better, here is a little diagram for the above example: Player opens door1 -->The opening of door1 triggers door2 to open via the Output of door1 Player opens door2 -->The opening of door2 triggers door1 to open via the Output of door2 Player closes door1 -->The closing of door1 triggers door1_relay -->The triggering of door1_relay triggers door2 to close Player closes door2 -->The closing of door2 triggers door2_relay -->The triggering of door2_relay triggers door1 to close
  My Output Target Entity Target Input Parameter Delay Only Once