Conveyor (Portal 2)

From Valve Developer Community
Jump to: navigation, search


To create the Portal 2 conveyor system, a series of func_tracktrains must be created, each with their own path_track destination, linked in a series, with the first one with the Teleport TO this option checked to make a loop from the first to last path.

Note:To get paint to stick to the conveyor belt, see Notes at the bottom of this page

Parent each of these func_tracktrains to a prop_dynamic model props_factory/conveyor_belt_module.mdl which will follow the paths.

Creating the Conveyor Track

Note:For the purpose of this tutorial, a short conveyor of four sections will be created. Duplicate more sections for a longer conveyor, and less for a shorter one.

1. Create a prop_static with the model name props_factory/conveyor_belt.mdl

2. Duplicate it and line up four of them. This will make the conveyor track:

ConveyorPortal2 1.png

Creating the Conveyor Belt

3. Create a prop_dynamic entity with the the model name props_factory/conveyor_belt_module.mdl

4. Align its origin with the origin of the prop_static base we made in step 1:

Make sure the conveyor belt is floating at least 8 units above the base

Moving the Belt

5. Create a small 20x24x16 rectangular brush and texture it with nodraw. Place it underneath the conveyor belt so it just occupies the space between the models:

ConveyorPortal2 3.png

6. Select the conveyor belt and the rectangular brush together, and copy-paste to duplicate and place one on each conveyor base origin.

In this tutorial, seven sections are needed.

7. To make this next process easier, hide everything except the first conveyor belt and rectangular nodraw brush (Hammer shortcuts: H = Hide Selected, U = Show All Hidden)

8. Create a path_track entity and place it inside the nodraw box so that the two share an origin:

ConveyorPortal2 5a.png
As mentioned earlier, there are seven sections, so there should be seven of these nodraw/path sets
Note:All further steps will be performed with models hidden and focus will be directed only on these sets of nodraw and path_tracks.

9. Make each nodraw box a func_tracktrain entity. Give each entity an individual name. In this tutorial, the naming convention will be conveyor_mover01 to conveyor_mover07. Each entity will have the following properties:

Max Speed: 60
Initial Speed: 60
Change Angles: Never
conveyor_mover01 'First stop target' is 'conveyor_path01'
conveyor_mover02 'First stop target' is 'conveyor_path02'
conveyor_mover03 'First stop target' is 'conveyor_path03'

Repeat this for each func_tracktrain entity.

10. Deselect and hide the nodraw func_tracktrain entities, leaving the path_tracks visible. Give each path_track a unique name similar to step 9 above. For this tutorial, they will be named conveyor_path01 to conveyor_path07

11. For each path_track, set 'Next stop target' to the next path in the track, so conveyor_path01 has a 'next stop' setting of 'conveyor_path02' and so on. The last path should point back to the first one, so conveyor_path07 target is conveyor_path01.

This screenshot shows the linked path_tracks with orange lines between them, sharing origins with nodraw tracktrains. Each tracktrain has its own path_track, and each has a unique name.

Finishing Up

12. Select the first path_track (conveyor_path01) and set the flag 'Teleport to THIS path_track':

This ensures that when the trains reach the last path (conveyor_path07) they will immediately teleport straight to the beginning again.
Note:Instead of using teleport to THIS, you can use a worldportal, aka linked_portal_door, hidden behind a brush with solidity turned off.

13. Finally, parent each conveyor belt prop to the tracktrains.


  • Entities can be spawned at one end of the conveyor using an env_entity_maker entity to spawn a template, which is carried along the belt and destroyed with a trigger, or dropped into a pit.
  • Paint will not stick to the belt using the method above. In order for this to happen, the moving belt sections should be tracktrain brushes and not models. Remove each prop_dynamic , and apply metal/conveyor_belt to the resized nodraw brushes (in place of the dynamic models)
  • func_tracktrain accepts an input of RemovePaint

External links