1 void Damage (entity targ, entity inflictor, entity attacker, float
2 damage, float deathtype, vector hitloc, vector force);
6 if (other == self.owner)
8 // so teleporting shots etc can't telefrag
9 if (!self.owner.takedamage)
11 if (!other.takedamage)
14 if ((self.owner.classname == "player") && (self.owner.health >= 1))
15 Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0');
16 else if (other.health < 1) // corpses gib
17 Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0');
18 else // dead bodies and monsters gib themselves instead of telefragging
19 Damage (self.owner, self, self.owner, 10000, DEATH_TELEFRAG, self.owner.origin, '0 0 0');
26 self.owner.effects = self.owner.effects - (self.owner.effects & EF_NODRAW);
27 if (self.owner.weaponentity)
28 self.owner.weaponentity.flags = self.owner.weaponentity.flags - (self.owner.weaponentity.flags & FL_FLY);
33 // org2 is where they will return to if the teleport fails
34 void(vector org, entity death_owner, vector org2) spawn_tdeath =
39 // death.classname = "teledeath";
40 death.movetype = MOVETYPE_NONE;
41 death.solid = SOLID_TRIGGER;
42 death.angles = '0 0 0';
44 setsize (death, death_owner.mins - '1 1 1', death_owner.maxs + '1 1 1');
45 setorigin (death, org);
46 death.touch = tdeath_touch;
47 death.nextthink = time + 0.2;
48 death.think = tdeath_remove;
49 death.owner = death_owner;
51 // hide entity to avoid "ghosts" between teleporter and destination caused by clientside interpolation
52 death.owner.effects = death.owner.effects | EF_NODRAW;
53 if (death.owner.weaponentity) // misuse FL_FLY to avoid EF_NODRAW on viewmodel
54 death.owner.weaponentity.flags = death.owner.weaponentity.flags | FL_FLY;
56 force_retouch = 2; // make sure even still objects get hit
59 void Teleport_Touch (void)
63 if (!other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too
66 // Make teleport effect where the player left
67 sound (other, CHAN_ITEM, "misc/teleport.ogg", 1, ATTN_NORM);
68 te_teleport (other.origin);
70 // Make teleport effect where the player arrived
71 sound (other, CHAN_ITEM, "misc/teleport.ogg", 1, ATTN_NORM);
72 makevectors (self.enemy.mangle);
73 te_teleport (self.enemy.origin + v_forward * 32);
75 spawn_tdeath(self.enemy.origin, other, other.origin);
77 // Relocate the player
78 //setorigin (other, self.enemy.origin);
79 setorigin (other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24));
80 other.angles = self.enemy.mangle;
81 other.fixangle = TRUE;
83 // keep velocity but change movement direction
84 other.velocity = v_forward * vlen(other.velocity);
86 other.flags = other.flags - (other.flags & FL_ONGROUND);
87 // reset tracking of oldvelocity for impact damage (sudden velocity changes)
88 other.oldvelocity = other.velocity;
89 // reset tracking of who pushed you into a hazard (for kill credit)
93 void info_teleport_destination (void)
95 self.mangle = self.angles;
96 self.angles = '0 0 0';
98 //setorigin (self, self.origin + '0 0 27'); // To fix a mappers' habit as old as Quake
99 setorigin (self, self.origin);
101 if (!self.targetname)
102 objerror ("Teleport destination without a targetname");
105 void misc_teleporter_dest (void)
107 info_teleport_destination();
110 void teleport_findtarget (void)
113 self.touch = Teleport_Touch;
115 self.enemy = find (world, targetname, self.target);
118 objerror ("Teleporter with nonexistant target");
123 self.dest = self.enemy.origin;
124 waypoint_spawnforteleporter(self, self.dest, 0);
127 void trigger_teleport (void)
129 self.angles = '0 0 0';
131 self.solid = SOLID_TRIGGER;
132 self.movetype = MOVETYPE_NONE;
134 setmodel (self, self.model);
139 self.think = teleport_findtarget;
140 self.nextthink = time + 0.2;
143 objerror ("Teleporter with no target");