[Image]

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

 [Image]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)

 [Image]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;
        };

 [Image]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);
                }
        };

 [Image]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.
