Seamless teleports are incredibly useful for connecting two maps that would otherwise overlap with each other, or connecting two sections in a map that would otherwise be impossible to connect. These are frequently used in Sven Co-op's Half-Life campaign due to the tendency of the original Half-Life maps to overlap on the grid, which was not noticeable due to changelevel triggers between maps.

Here is an example of a seamless teleport in action:

Setting up the teleports

Note: This tutorial assumes that you already know how to set up a trigger_teleport and its corresponding info_teleport_destination.

I'm going to use the Half-Life Hazard Course as an example (see the video in the introduction). There are two maps that I needed to connect, which overlayed each other on the grid when directly connected. I decided to place a seamless teleport where a trigger_changelevel would normally be in the original maps. Players would walk down a hallway, the level would change, and the new area would be accessible.

The first thing I do is create a trigger_teleport brush with an origin brush. The origin brush allows the teleport to move players relative to their position on entry to the teleport. Do this for one hallway, then make a second trigger_teleport brush with an origin brush in the connecting hallway. Place the origin brush in the exact spot where the first origin is located, but in the connecting hallway. Make sure that when players teleport to the new area, they do not immediately enter the trigger_teleport that sends them in the reverse direction. Doing so will result in an infinite teleport loop. The teleport brushes must not overlap, but the origins must be in the same place relative to the hallway.

At the center of both of the origin brushes, place an info_teleport_destination. The trigger_teleport target should be set to the name of the info_teleport_destination in the opposite hallway.

It should look like this on one side of your teleport:

Configure the trigger_teleport entities as follows:

  1. Relative Teleport
  2. Keep Angles
  3. Keep Velocity

  1. "Ignore Delays" (teleport_ignore_delay) should be set to Yes (1).
  2. "Teleport If Blocked" (teleport_if_blocked) should be set to Yes (1).

I also usually set the "Teleport Cooldown Delay" (teleport_cooldown) keyvalue for both the trigger_teleport and the info_teleport_destination to 0, although "Ignore Delays" set to "Yes" on the trigger_teleport should take care of that.

This is how players will flow through the hallway once the teleports are complete:

Players walking through the teleport on the lower side (represented by the orange arrow) will teleport to the upper hallway relative to their position upon walking into the teleport. The green arrow shows players walking through the upper teleport and through to the lower hallway.

As long as the lighting and texture alignments are identical on both sides of the teleport, players will never notice that they're being shifted to a new place on the grid (aside from possibly seeing other players pop in and out of existence as they walk through the teleport.

Other Uses

I have also used this method to create the seamless teleport airlocks in hl_c05_a2 (Blast Pit), which teleports players back and forth between the inside and outside of the rocket test silo. I may someday create a second tutorial on setting this up, but all that you need to do is set up a multimanager that makes sure both doors on either side of the airlock are closed and turns the teleport on in one direction (depending on which button/lever is used and on which side players are trying to transfer to).

This also works quite well for Half-Life's level-change elevators. See this video:

It is also possible to turn players to face a new direction by setting the "Rotate (Dest Angle)" flag on the trigger_teleport, and set the yaw-angle of the info_teleport_destination entity to rotate players to face a new direction. Fancy fancy.

Let me know if any of this tutorial needs clarification, or if you need assistance with any of the setup.