And if You like my "see through walls" engine...
Here You are

It probably could be done easyer and faster...
Code:
/////////////////
// Portal door //
// by TomPo /////
/////////////////
entity* door_portal;
var portal_door_exit[3];
var moved =0;
var my_top[3];
var dist_1; var dist_2; var dist_dif;
view camera_door {layer = -1;arc = 60; aspect=0.5; size_x = 1024; size_y = 768;}
/////////////////// PORTAL "DOOR" /////////////////////////////////////
function door_portal
{
door_portal = me;
my.passable =on; my.invisible = on;
while(1)
{
if(mouse_right == 1) //while RMP is pressing
{
//trace from center of the screen and place portal at target
temp.x = screen_size.x /2 ; temp.y = screen_size.y /2; temp.z = 10000; vec_for_screen(temp,CAMERA);
result = c_trace (camera.x, temp, IGNORE_ME | IGNORE_PASSABLE | IGNORE_SPRITES);
vec_set(my.x,target.x); vec_to_angle(my.pan,normal); vec_add(my.x,normal);
my.invisible = off; //make me visible
vec_set(portal_door_exit, nullvector); portal_door_exit.x = -100; //set my exit 100 quants
vec_rotate(portal_door_exit, my.pan); vec_add(portal_door_exit, my.x); //behind me (in the next room)
vec_set(camera_door.x,portal_door_exit.x); //place camera at the same position
camera_door.bmap = bmap_for_entity(me,0); //play on me
temp = door_portal.pan + 180; //camera pan is opposit to portal pan
camera_door.pan = (temp - camera.pan) *2; //changing pan by moving main camera
vec_set(temp, nullvector); temp.x = -5000; //trace far behind portal
vec_rotate(temp, my.pan); vec_add(temp, my.x);
result = c_trace (camera_door.x, temp, IGNORE_ME | IGNORE_PASSABLE | IGNORE_SPRITES);
if(result != 0){camera_door.visible = on;} //if something is behind then show it
if(result == 0){my.invisible = on; camera_door.visible = off;} //else close door_portal
if(my.tilt != 0){my.invisible =on;} //or if I'm not on the wall close me too
if(mouse_left == 1) //while pressing RMB press LMB
{
if(moved == 0) //if player haven't been moved
{
if(result != 0) //if another room exist
{
moved = 1; //player is moving
vec_set(player.x,portal_door_exit.x); //teleport player
}
if(result == 0) //if another room doesn't exist
{
moved = 1; //player is moving
if(my.tilt == 0) //if I'm at the wall
{
vec_set(temp, nullvector); temp.x = 200;
vec_rotate(temp, my.pan); vec_add(temp, my.x);
vec_set(player.x,temp); // place player 200 quants front of me
player.pan = my.pan; //change player pan to portal pan
}
else //if I'm not on the wall
{
vec_set(player.x,my.x); //set player position at my position
}
}
}
}
if(mouse_left == 0) //to avoid loop with teloporting
{
moved = 0; //if release LMB player is ready to next teleport
}
vec_set(temp, nullvector); temp.x = -5000; //trace from my center
vec_rotate(temp, my.pan); vec_add(temp, my.x);
c_trace (my.x, temp, IGNORE_ME | IGNORE_PASSABLE | IGNORE_SPRITES);
dist_1 = vec_dist(my.x, target.x); //distance from my center to traced hit (=1)
vec_for_vertex(my_top,me,16); //set where is my top (I used a model and vertex #16 was the upper one)
c_trace (my_top, temp, IGNORE_ME | IGNORE_PASSABLE | IGNORE_SPRITES); //trace from my top
dist_2 = vec_dist(my_top, target.x); //distance from my top to traced hit
dist_dif = dist_2 - dist_1; //if distance between traced from center and traced from top
if(dist_dif > 200){my.invisible = on;} // is bigger than f.e. 200 it means that I'm on the edge so don't display me
}
if(mouse_right == 0) //if RMB is no longer pressing
{
my.invisible = on; my.alpha = 0; //close portal
camera_door.visible = off;
}
wait(1);
}
}
function create_portal_door //create only once
{
you = ent_create("portal_door.mdl",my.x,door_portal);
}