Portal BTS - Tutorial - Piston Crushers

From Valve Developer Community
Jump to navigation Jump to search
Portal Level Creation
Skill Level

This tutorial expects you to have this amount of knowledge within the topic to follow along smoothly.

Novice Familiar Competent Proficient Expert

Introduction

This guide will show you how to create various piston types.

Vertical Pistons

Piston Type 1

Piston Base

Create a prop_static and enter the following properties.

Piston Base
Property Name Value
World Model models/props_bts/vertical_small_piston_base.mdl
Disable Shadows Yes

Piston Model

Piston Body

Create a prop_dynamic and enter the following properties.

Property Name Value
Parent crusher_1
World Model models/props_bts/vertical_small_piston_body.mdl
Disable Shadows Yes
Collisions Not Solid
Lighting Origin crusher_lighting_1

Piston Movement

Create a 32*32*288 brush with the nodraw texture and create a 146*146*4 Cylinder with 16 sides with the nodraw texture. Position the brushes as seen in the screenshot.

The func_door positioned

After positioning the brushes, select both brushes and tie them to a func_door and enter the following properties

Property Name Value
Name crusher_1
Delay Before Reset -1
Lip 128
Blocking Damage 25
Force Closed Yes
Move Direction 90 0 0
My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyClosed relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyClosed !self Open <none> 2.00 No
Io12.png OnFullyOpen relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyOpen !self Close <none> 2.00 No

Do not miss the Delay.

Under flags, uncheck Touch Opens and check Door Silent

Piston Collision

The func_brush on the piston body

Create a 146*146*322 cylinder with 16 sides with the playerclip texture and set tie it to a func_brush. Set its parent to crusher_1.

Piston Sounds

Create a logic_relay entity and enter the following properties

Property Name Value
Name relay_stop_sound_room_1_1
Start Disabled Yes

Enter this output

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnTrigger stop_sound_room_1_1 Playsound <none> 0.00 No

Create an ambient_generic and enter the following properties.

Property Name Value
Name stop_sound_room_1_1
Sound Name Portal.giant_piston
Pitch 200
Start Pitch 200
SourceEntityName crusher_1

Crusher Lighting

Create an info_target and set its name to crusher_lighting_1. This is the light source of the piston body model. Place this in a logical spot like near the piston base model.

Implementation

Completed Piston

To start the piston, enable the relay_stop_sound_room_1_1 entity and open crusher_1. When the player gets considerably far away from the piston, disable the relay_stop_sound_room_1_1 entity

Piston Type 2

Piston Base

These pistons were specifically used to block off an entry in escape_00.

Piston Base

Create a prop_static and enter the following properties

Property Name Value
World Model models/props_bts/vertical_med_piston_base.mdl
Disable Shadows Yes

Piston Body

Piston Body

Create a prop_dynamic and enter the following properties

Property Name Value
Parent crusher_blocker_1
World Model models/props_bts/vertical_med_piston_body.mdl
Disable Shadows Yes
Lighting Origin crusher_blocker_lighting_1

Piston Movement

Piston Door

Create a 32*32*384 brush with the invisible texture, tie it to a func_door and enter the following properties

Property Name Value
Name crusher_blocker_1
Speed 80
Delay Before Reset -1
Lip 288
Blocking Damage 25
Force Closed Yes
Move Direction 90 0 0
My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyClosed relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyClosed !self Open <none> 2.00 No
Io12.png OnFullyOpen relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyOpen !self Close <none> 2.00 No

Do not miss the Delay.

Under flags, uncheck Touch Opens, check Passable and Door Silent

Piston Sounds

Create a logic_relay entity and enter the following properties

Property Name Value
Name relay_stop_sound_room_1_1
Start Disabled Yes

Enter this output

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnTrigger stop_sound_room_1_1 Playsound <none> 0.00 No
Completed Piston

Create an ambient_generic and enter the following properties.

Property Name Value
Name stop_sound_room_1_1
Sound Name Portal.giant_piston
Pitch 200
Start Pitch 200
SourceEntityName crusher_blocker_1

Crusher Lighting

Create an info_target and set its name to crusher_blocker_lighting_1. This is the light source of the piston body model. Place this in a logical spot like near the piston base model.

Implementation

To start the piston, enable the relay_stop_sound_room_1_1 entity and open crusher_blocker_1. When the player gets considerably far away from the piston, disable the relay_stop_sound_room_1_1 entity.

Piston Type 3

This is the most common vertical piston

Piston Base

Create a prop_static and enter the following properties.

Piston Base
Property Name Value
World Model models/props_bts/vertical_large_piston_base.mdl
Disable Shadows Yes

Piston Body

Create a prop_dynamic and enter the following properties.

Piston Body
Property Name Value
Parent crusher_1
World Model models/props_bts/vertical_large_piston_body.mdl
Disable Shadows Yes
Name crusher_brush_1
Lighting Origin crusher_lighting_1

Piston Movement

Piston Door

Create a 32*32*640 brush with the invisible texture and tie it to a func_door.

Property Name Value
Name crusher_1
Speed 90
Delay Before Reset -1
Lip 16
Blocking Damage 25
Force Closed Yes
Move Direction 90 0 0


Enter these outputs:

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyClosed relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyClosed !self Open <none> 2.00 No
Io12.png OnFullyOpen relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyOpen !self Close <none> 2.00 No

Do not miss the delays

Under flags, uncheck Touch Opens and check Door Silent

Piston Collision

Piston Brush

Create a 152*152*960 cylinder with 16 sides with the invisible texture and tie it to a func_brush.

Set its parent to crusher_1

Piston Sounds

Create a logic_relay entity and enter the following properties

Property Name Value
Name relay_stop_sound_room_1_1
Start Disabled Yes

Enter this output

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnTrigger stop_sound_room_1_1 Playsound <none> 0.00 No
Completed Piston

Create an ambient_generic and enter the following properties.

Property Name Value
Name stop_sound_room_1_1
Sound Name Portal.giant_piston
Pitch 200
Start Pitch 200
SourceEntityName crusher_1

Crusher Lighting

Create an info_target and set its name to crusher_lighting_1. This is the light source of the piston body model. Place this in a logical spot like near the piston base model.

Implementation

To start the piston, enable the relay_stop_sound_room_1_1 entity and open crusher_1. When the player gets considerably far away from the piston, disable the relay_stop_sound_room_1_1 entity.

Horizontal Pistons

Fast Piston

Piston Base

Piston Base

Create a prop_static and enter the following properties

Property Name Value
Pitch Yaw Roll 90 0 0
World Model models/props_bts/horizontal_piston_base.mdl
Disable Shadows Yes

Piston Body

Piston Body

Create a prop_dynamic and enter the following properties

Property Name Value
Pitch Yaw Roll 90 0 0
World Model models/props_bts/horizontal_piston_body.mdl
Disable Shadows Yes
Lighting Origin crusher_lighting01

Piston Movement

While all brushes are selected, tie the selection to a func_door and enter the following properties

Property Name Value
Name crusher01
Speed 200
Start Sound Doors.Move10
Stop Sound Doors.FullClose10
Delay Before Reset -1
Lip 64
Blocking Damage 100
Force Closed Yes
Move Direction 0 180 0

Enter these outputs:

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyClosed shake_crusher01 StartShake <none> 0.00 No
Io11.png OnFullyClosed !self Open <none> 2.00 No
Io11.png OnFullyOpen !self Close <none> 2.00 No

Under flags, uncheck Touch Opens and check Door Silent

Piston Lighting

Create an info_target and set its name to crusher_lighting01. This is going to be the lighting origin of the piston body prop. Place it in a reasonable spot.

Piston Pressure Pad

Create a 112*144*4 brush with the nodraw texture. Tie the brush to a func_detail and cut the brush as seen in the image.

Open the Transformation window and type 270under the Y Axis and press OK

Open the Face Edit Sheet select all faces except for the back side. Set the texture to metal/metalwall_bts_004a and set the rotation to 90.

Add an overlay with the overlays/stain_oil_03 texture. Center the overlay with the front face.

Fast Piston

Piston Shake

Create an env_shake and enter the following properties

Property Name Value
Name shake_crusher01
Effect Radius 496
Frequency 100
Note.pngNote: For the fast piston seen in escape_00, the shake was removed because it likely made it a bit harder to jump on the platform, curiously the entity still exists but it has no inputs.

Implementation

To start the piston, open crusher_blocker_1. Only start the piston when the player gets considerably close.

Normal Speed Piston

Piston Base

Piston Base

Create a prop_static and enter the following properties

Property Name Value
Pitch Yaw Roll 90 0 0
World Model models/props_bts/vertical_med_piston_base.mdl
Disable Shadows Yes

Piston Body

Piston Base

Create a prop_static and enter the following properties

Property Name Value
Parent crusher1
Pitch Yaw Roll 90 0 0
World Model models/props_bts/vertical_med_piston_base.mdl
Disable Shadows Yes
Collisions Not Solid

Piston Movement

Piston Door

While both brushes are selected, tie the entity to a func_door. Position the entity as seen in the image and enter the following properties

Property Name Value
Name crusher1
Delay Before Reset -1
Lip 64
Blocking Damage 25
Force Closed Yes
Move Direction 0 180 0

Enter the following outputs

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyClosed relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyClosed !self Open <none> 2.00 No
Io12.png OnFullyOpen relay_stop_sound_room_1_1 Trigger <none> 0.00 No
Io11.png OnFullyOpen !self Close <none> 2.00 No

Under flags, uncheck Touch Opens and check Door Silent

Piston Sounds

Create a logic_relay and enter the following properties

Property Name Value
Name relay_stop_sound_room_1_1
Start Disabled Yes

Enter this output

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnTrigger stop_sound_room_1_1 PlaySound <none> 0.00 No

Create an ambient_generic and enter the following properties

Property Name Value
Name stop_sound_room_1_1
Sound Name Portal.giant_piston
Pitch 125
Start Pitch 125
SourceEntityName crusher1

Piston Pressure Pad

Piston

Create a 112*144*4 brush with the nodraw texture. Tie the brush to a func_detail and cut the brush as seen in the image.

Open the Transformation window and type 270under the Y Axis and press OK

Open the Face Edit Sheet select all faces except for the back side. Set the texture to metal/metalwall_bts_004a and set the rotation to 90.

Add an overlay with the overlays/stain_oil_03 texture. Center the overlay with the front face.

Other Pistons

Mini Pistons

These pistons are only seen in testchmb_a_15 after exiting and falling down the elevator shaft.

Piston Base

Piston Body

While all brushes are selected, tie the brushes to a func_door and enter the following properties

Property Name Value
Name mini_crusher_1
Disable Shadows Yes
Speed 50
Start Sound Doors.Move14
Stop Sound Doors.FullClose9
Delay Before Reset -1
Blocking Damage 1
Move Direction 90 0 0

Enter the following outputs

My Output Target Entity Target Input Parameter Delay Only Once
Io12.png OnClose steam_pressure_release1 TurnOn <none> 0.00 No
Io12.png OnClose sound_steam PlaySound <none> 0.00 No
Io12.png OnOpen steam_pressure_release1 TurnOff <none> 0.00 No
Io12.png OnOpen sound_steam StopSound <none> 0.00 No

Under Flags, uncheck Touch Opens and Check Starts Open

Piston Brush

Create a 64*64*180 brush with the playerclip texture. Clip and position the brush as seen in the image.

Create a 64*64*4 brush on top of that brush, clip the brush as seen in the image and texture all faces with metal/metalwall_bts_001b. Set both texture shift values to -256.

Select both the playerclip brush and the top brush and tie them to a func_brush then enter the following properties

Property Name Value
Parent mini_crusher_1
Disable Shadows Yes
Minimum Light Level .2

Piston Steam

Create an env_steam and enter the following properties.

Property Name Value
Name steam_pressure_release1
Pitch Yaw Roll -30 0 0
Length of steam jet 60

Create an env_steam and enter the following properties.

Property Name Value
Name steam_pressure_release1
Pitch Yaw Roll -30 90 0
Length of steam jet 60

Create an env_steam and enter the following properties.

Property Name Value
Name steam_pressure_release1
Pitch Yaw Roll -30 180 0
Length of steam jet 60
Piston Steam

Create an env_steam and enter the following properties.

Property Name Value
Name steam_pressure_release1
Pitch Yaw Roll -30 270 0
Length of steam jet 60
Mini Piston

Place each env_steam as seen in the image.

Create an ambient_generic and enter the following properties

Property Name Value
Name sound_steam
Sound Name ambient.steam01

Under flags, uncheck Is NOT Looped. Place the ambient_generic inside the mini-piston body

Mini-Piston Logic

Note.pngNote: This part is not officially in Portal and is done to make things easier. However the speed of which the piston opens and closes is officially part of Portal.


Create a logic_relay and set its name to close_mini_crusher_1 and enter the following outputs.

My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger mini_crusher_1 SetSpeed 40 0.00 No
Io11.png OnTrigger mini_crusher_1 Open <none> 0.01 No

Create a logic_relay and set its name to open_mini_crusher_1 and enter the following outputs.

My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger mini_crusher_1 SetSpeed 80 0.00 No
Io11.png OnTrigger mini_crusher_1 Close <none> 0.01 No

Do not miss the delays.

Note.pngNote:The piston will move up if we tell the func_door to close and the piston will move down if we tell func_door to open.

Separator Pistons

These pistons are seen in escape_00 after flinging up high. Only use these pistons in a group. 3-4 at the minimum.

Base Model

Create a prop_dynamic and enter the following properties.

Piston Base
Property Name Value
Pitch Yaw Roll 90 0 0
World Model models/props_bts/mini_piston_body.mdl
Disable Shadows Yes
Lighting Origin lighting_crusher_blocker_1

Body Model

Create a prop_dynamic and enter the following properties.

Piston Body
Property Name Value
Parent crusher_blocker_1
Pitch Yaw Roll 90 0 0
World Model models/props_bts/mini_piston_inside.mdl
Disable Shadows Yes

Piston Movement

Piston door

Create a 160*32*32 with the invisible texture and tie it to a func_door. Enter the following properties.

Property Name Value
Name crusher_blocker_1
Speed 400
Delay Before Reset -1
Blocking Damage 25
Force Closed Yes
Move Direction 0 180 0

Enter the following outputs

My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnFullyClosed !self Open <none> 0.00 No
Io11.png OnFullyOpen !self Close <none> 0.00 No

Under flags, uncheck Touch Opens and check Non-solid to Player, Passable and Door Silent.

Piston Lighting

Create an info_target and set its name to lighting_crusher_blocker_1. This is the lighting for the piston base. Place it in a reasonable spot.

Piston Sounds

Separator Piston

Create an ambient_generic and enter the following properties. Remember to only place one of these in a group.

Property Name Value
Name enginesound_room_1
Sound Name Portal.moving_pistons
Pitch 50
Start Pitch 50

Under flags uncheck Is NOT Looped.

Implementation

Open crusher_blocker_1 and play the enginesound_room_1 sound. When the player gets considerably far away, stop the enginesound_room_1 sound.

Extra

  • If a vertical piston's end point is a concrete texture, add an overlay textured with overlays/stain_oil_03 or overlays/stain_oil_04.
  • If a normal speed horizontal piston's end point is a metal texture, you can remove the pressure pad.

See also