game-source/klik/teleport.qc

93 lines
1.9 KiB
C++
Raw Normal View History

#include "common.qh"
#include "mapents_util.qh"
#include "damage.qh"
#include "effect.qh"
2003-10-27 22:27:29 +00:00
#include "misc.qh"
#include "teleport.qh"
void() _deathmsg_teleport = {
local string att_nname, def_nname;
def_nname = name(self);
att_nname = name(self.dmg_attacker);
if (self.dmg_inflictor.owner == self)
bprint(PRINT_DEATH, "Satan's power deflects ", att_nname, "'s telefrag.\n");
else
bprint(PRINT_DEATH, def_nname, " was telefragged by ", att_nname, ".\n");
};
void() _teleport_death_touch = {
if (self.owner == other)
return;
ghost_inflictor.classname = "TELEPORT_DEATH";
ghost_inflictor.dmg = DAMAGE_SHOULDDIE;
ghost_inflictor.mass = 800;
ghost_inflictor.velocity = '0 0 0';
ghost_inflictor.lip = 64;
ghost_inflictor.speed = 1000;
ghost_inflictor.owner = self.owner;
damage(other, self.owner, ghost_inflictor, DAMAGE_SHOULDDIE, _deathmsg_teleport);
};
void(vector org, entity death_owner) _teleport_death_spawn = {
local entity death;
death = spawn("TELEDEATH");
death.owner = death_owner;
death.solid = SOLID_TRIGGER;
setsize(death, death_owner.mins - '1 1 1', death_owner.maxs + '1 1 1');
setorigin(death, org);
death.touch = _teleport_death_touch;
death.think = SUB_remove;
death.nextthink = time + 0.1;
force_retouch = 2;
};
void(entity e, entity spot) teleport = {
local float spd;
if (e.th_teleport) {
local entity oldself, oldother;
local float do_teleport;
oldself = self;
oldother = other;
self = e;
other = spot;
do_teleport = self.th_teleport(other.origin);
self = oldself;
other = oldother;
if (!do_teleport)
return;
}
spd = vlen(e.velocity);
if (spd < 200)
spd = 200;
setorigin(e, spot.origin);
e.angles = spot.angles;
e.fixangle = TRUE;
e.teleport_time = 0.1;
makevectors(e.angles);
e.velocity = v_forward*spd;
if (is_living(e))
_teleport_death_spawn(spot.origin, e);
effect_teleport_fog(spot.origin);
};