Inside3D tutorials.
Created By: Ursader
eMail: ursader@flash.net
Difficulty Scale: Easy


Step 1
This is a quite easy patch, which makes bullets, rockets, grenades, etc, teleport. (Good if you are chasing an enemy thru a teleporter)

Step 2
Open up TRIGGERS.QC, and find teleport_touch:
void() teleport_touch =
{
local entity	t;
local vector	org;

/*
This is added:
*/
        if (other.teleport_time > time) return;  // Can't teleport before time is up

        if ( (other.classname != "missile") && (other.classname != "grenade") &&
             (other.classname != "player") && (other.classname != "spike") &&
             (other.classname != "gib") && (other.classname != "weapon_supershotgun") &&    
             (other.classname != "weapon_grenadelauncher") && (other.classname != "weapon_supernailgun") &&
             (other.classname != "weapon_nailgun") && (other.classname != "weapon_lightning") &&
             (other.classname != "weapon_rocketlauncher") && (other.classname != "") )
                return;
/*
^-- Keeps things that spawn near the teleporter from teleporting..
This is a BAD thing to have happen :(
If you use this in a TC or something, just add any new classnames you make up
there..
*/

/* That parts done */

	if (self.targetname)
	{
		if (self.nextthink < time)
		{
			return;		// not fired yet
		}
	}

// When you find this, comment it out.  Allows things other than "player"
// to pass through...

/*
        if (self.spawnflags & PLAYER_ONLY)
        {
                if (other.classname != "player")
                        return;
        }

*/
// only teleport living creatures
// if (other.health <= 0 || other.solid != SOLID_SLIDEBOX)
//                return;
// Allowing teleporting of non-living objects!
        if ((other.health <= 0) && (other.solid == SOLID_NOT))
                return;
        if (other.classname == "trigger_teleport")
                return;
// Done..
	SUB_UseTargets ();

// put a tfog where the player was
        if (other.classname == "player")
                spawn_tfog (other.origin);

	t = find (world, targetname, self.target);
	if (!t)
		objerror ("couldn't find target");
		
// spawn a tfog flash in front of the destination
	makevectors (t.mangle);
	org = t.origin + 32 * v_forward;

/*
Lets not allow telefragging with nails/rockets/grenades :)
*/
        if (other.classname == "player")
        {
                spawn_tfog (org);
                spawn_tdeath(t.origin, other);
        } 
/* Done.. */

// move the player and lock him down for a little while
	if (!other.health)
	{
		other.origin = t.origin;
/*
For right speed and angle of teleported things..
*/
//    other.velocity = (v_forward * other.velocity_x) + (v_forward * other.velocity_y);
//    other.velocity = v_forward * 600;
if (other.velocity_y < 0) other.velocity_y = other.velocity_y * -1;
                other.fixangle = 1;             // turn this way immediately
                other.teleport_time = time + 0.7;
                other.angles = t.mangle;
/* Yadda, Yadda.. */
		return;
	}
	setorigin (other, t.origin);
	other.angles = t.mangle;

	if (other.classname == "player")
	{
		other.fixangle = 1;		// turn this way immediately
		other.teleport_time = time + 0.7;

		if (other.flags & FL_ONGROUND)
			other.flags = other.flags - FL_ONGROUND;
		other.velocity = v_forward * 300;
	}
	other.flags = other.flags - other.flags & FL_ONGROUND;
};


Step 3
Now that was quite a bit, eh? You can just copy\paste the whole part above, and re-place it with the one in triggers.qc. Makes it easier. Ok now, Find trigger_teleport. This part will let you always teleport something.. For instance: If you didn't add this little tid-bit of code, there would have to be a certain spot on the teleporter that would allow shooting.. This allows it everywhere..
void() trigger_teleport =
{
	local vector o;

	InitTrigger ();
        self.flags = self.flags | FL_ITEM;     // Make big.. BIG!! :) (add this)
	self.touch = teleport_touch;

	// find the destination
	if (!self.target)
		objerror ("no target");
	self.use = teleport_use;

	if (!(self.spawnflags & SILENT))
	{
		precache_sound ("ambience/hum1.wav");
		o = (self.mins + self.maxs)*0.5;
		ambientsound (o, "ambience/hum1.wav",0.5 , ATTN_STATIC);
	}
};
Step 4
Now, that wasn't too hard, was it?? Compile, and load it up the usual way. Fire a grenade or something thru a teleporter, then run thru it.. Just to look at how it's working.