From Valve Developer Community
Revision as of 14:03, 23 July 2021 by Mandrew (talk | contribs)
Jump to: navigation, search
Portal Level Creation

This tutorial will show how to create the switch seen throughout the later test chambers of Portal. The switch is activated by a player using it, and can either be permanently pressed, or stay pressed for a set amount of time.


Step 1

Create a 64w*64l*8h brush. Texture the sides of the brush with signage/hazard_orange_03b, and texture the top of the brush with concrete/concrete_modular_floor001a.

Step 2

Create a prop_dynamic entity and set its World Model to models/props/switch001.mdl, and set its Name to switch1.

Step 3

Create a ambient_generic and set its Name to button1_down, its Sound Name to Portal.button_down, and its Source Entity Name to switch1. Create another ambient_generic and set its Name to button1_up, its Sound Name to Portal.button_up, and its Source Entity Name to switch1.

Step 4

Create a logic_timer entity. Set its Name to timer_ticktock1, set Start Disabled to Yes and set its Refire Interval to 1. Next, create an ambient_generic entity and set its Name to sound_ticktock1, set its Sound Name to Portal.room1_TickTock, set its Max Audible Distance to 441 and set it Source Entity Name to switch1. Now add the following output to timer_ticktock1:

  My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnTimer sound_ticktock1 PlaySound   0.00 No

Step 5

To do: You can parent the button prop to a hidden func_button to make it use the prop's collision mesh for interactions. Use this instead, it's a much better method than putting a massive func_button surrounding the top. Create a 16w*16l*16h brush 32 units above the bottom of the switch model. Texture it with tools/toolsplayerclip and tie it to a func_door_rotating entity. (Alternatively, you can use a func_button with the flags Don't Move and Use Activates enabled.) Set its Speed to 500, its Distance to 0 and its Delay before reset to how long it should stay pressed for, in seconds. Set it to -1 to make it stay pressed forever after being activated. Next, check the Use Opens and Door Silent flags. Next, add the following outputs to the door:

  My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnOpen switch1 SetAnimation down 0.00 No
Io11.png OnFullyOpen button1_down PlaySound   0.00 No
Io11.png OnFullyOpen timer_ticktock1 Enable   0.00 No
Io11.png OnClose switch1 SetAnimation up 0.00 No
Io11.png OnFullyClosed button1_up PlaySound   0.00 No
Io11.png OnFullyClosed timer_ticktock1 Disable   0.00 No

The switch is now finished and ready to be implemented in a map.


Step 1

Place the switch where it should be in the map. Rotate it if necessary.

Step 2

Add the outputs that should fire when the switch is activated. The outputs that should fire when the switch is pressed should be the OnFullyOpen output on the func_door_rotating entity, and the OnFullyClosed output when the button is reset after its timer has run out.

See Also