1 void Damage (entity targ, entity inflictor, entity attacker, float
\r
2 damage, float deathtype, vector hitloc, vector force);
\r
4 void() tdeath_touch =
\r
6 if (other == self.owner)
\r
8 // so teleporting shots etc can't telefrag
\r
9 if (!self.owner.takedamage)
\r
11 if (!other.takedamage)
\r
14 if ((self.owner.classname == "player") && (self.owner.health >= 1))
\r
15 Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0');
\r
16 else if (other.health < 1) // corpses gib
\r
17 Damage (other, self, self.owner, 10000, DEATH_TELEFRAG, other.origin, '0 0 0');
\r
18 else // dead bodies and monsters gib themselves instead of telefragging
\r
19 Damage (self.owner, self, self.owner, 10000, DEATH_TELEFRAG, self.owner.origin, '0 0 0');
\r
22 // org2 is where they will return to if the teleport fails
\r
23 void(vector org, entity death_owner, vector org2) spawn_tdeath =
\r
28 // death.classname = "teledeath";
\r
29 death.movetype = MOVETYPE_NONE;
\r
30 death.solid = SOLID_TRIGGER;
\r
31 death.angles = '0 0 0';
\r
33 setsize (death, death_owner.mins - '1 1 1', death_owner.maxs + '1 1 1');
\r
34 setorigin (death, org);
\r
35 death.touch = tdeath_touch;
\r
36 death.nextthink = time + 0.2;
\r
37 death.think = SUB_Remove;
\r
38 death.owner = death_owner;
\r
40 force_retouch = 2; // make sure even still objects get hit
\r
43 /*void Teleport_Touch (void)
\r
45 if (other.health < 1)
\r
47 if (other.classname != "player") // FIXME: Make missiles firable through the teleport too
\r
50 // Make teleport effect where the player left
\r
51 sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM);
\r
52 te_teleport (other.origin);
\r
54 dest = find (world, targetname, self.target);
\r
56 objerror ("Teleporter with nonexistant target");
\r
58 // Make teleport effect where the player arrived
\r
59 sound (other, CHAN_ITEM, "misc/teleport.wav", 1, ATTN_NORM);
\r
60 makevectors (dest.mangle);
\r
61 te_teleport (dest.origin + v_forward * 32);
\r
63 spawn_tdeath(dest.origin, other, other.origin);
\r
65 // Relocate the player
\r
66 //setorigin (other, dest.origin);
\r
67 setorigin (other, dest.origin + '0 0 1' * (1 - other.mins_z - 24));
\r
68 other.angles = dest.mangle;
\r
69 other.fixangle = TRUE;
\r
71 other.velocity = '0 0 0';
\r
73 other.flags = other.flags - (other.flags & FL_ONGROUND);
\r
76 void info_teleport_destination (void)
\r
78 self.mangle = self.angles;
\r
79 self.angles = '0 0 0';
\r
81 //setorigin (self, self.origin + '0 0 27'); // To fix a mappers' habit as old as Quake
\r
82 setorigin (self, self.origin);
\r
84 if (!self.targetname)
\r
85 objerror ("Teleport destination without a targetname");
\r
88 void misc_teleporter_dest (void) // Moved down
\r
90 info_teleport_destination();
\r
94 void trigger_teleport (void)
\r
96 self.angles = '0 0 0';
\r
98 self.solid = SOLID_TRIGGER;
\r
99 self.movetype = MOVETYPE_NONE;
\r
101 setmodel (self, self.model);
\r
104 self.modelindex = 0;
\r
106 self.touch = Teleport_Touch;
\r
109 objerror ("Teleporter with no target");
\r
115 void() SUB_UseTargets;
\r
117 void () play_teleport =
\r
120 local string tmpstr;
\r
122 v = (random () * 5);
\r
125 tmpstr = "misc/teleport.wav";
\r
131 tmpstr = "misc/teleport.wav";
\r
137 tmpstr = "misc/teleport.wav";
\r
143 tmpstr = "misc/teleport.wav";
\r
147 tmpstr = "misc/teleport.wav";
\r
152 sound (self, 2, tmpstr, 1, 1);
\r
156 void (vector org) spawn_tfog =
\r
160 s.nextthink = (time + 0.2);
\r
161 s.think = play_teleport;
\r
164 WriteCoord (0, org_x);
\r
165 WriteCoord (0, org_y);
\r
166 WriteCoord (0, org_z);
\r
169 void () teleport_touch =
\r
175 if (self.targetname)
\r
177 if ((self.nextthink < time))
\r
182 if ((self.spawnflags & 1))
\r
184 if ((other.classname != "player"))
\r
189 if (!Activated (self, other))
\r
191 if ((self.else_goal != 0))
\r
193 te = Findgoal (self.else_goal);
\r
196 AttemptToActivate (te, other, self);
\r
201 if (((other.health <= 0) || (other.solid != 3)))
\r
206 spawn_tfog (other.origin);
\r
207 t = find (world, targetname, self.target);
\r
210 objerror ("couldn't find target");
\r
212 makevectors (t.mangle);
\r
213 org = (t.origin + (32 * v_forward));
\r
215 spawn_tdeath (t.origin, other);
\r
218 other.origin = t.origin;
\r
219 other.velocity = ((v_forward * other.velocity_x) + (v_forward * other.velocity_y));
\r
222 setorigin (other, t.origin);
\r
223 other.angles = t.mangle;
\r
224 if ((other.classname == "player"))
\r
226 if (((other.weapon == 1)/* && other.hook_out*/)) // Hook out code needs replacement
\r
228 sound (other, 1, "weapons/bounce2.wav", 1, 1);
\r
229 // other.on_hook = 0;
\r
230 // other.hook_out = 0;
\r
231 // other.fire_held_down = 0;
\r
232 other.weaponframe = 0;
\r
233 other.attack_finished = (time + 0.75);
\r
235 other.fixangle = 1;
\r
236 other.teleport_time = (time + 0.7);
\r
237 if ((other.flags & 512))
\r
239 other.flags = (other.flags - 512);
\r
241 other.velocity = (v_forward * 300);
\r
243 other.flags = (other.flags - (other.flags & 512));
\r
246 void () teleport_use =
\r
248 self.nextthink = (time + 0.2);
\r
250 self.think = SUB_Null;
\r
253 void () info_teleport_destination =
\r
255 if ((CheckExistence () == 0))
\r
260 self.mangle = self.angles;
\r
261 self.angles = '0 0 0';
\r
263 self.origin = (self.origin + '0 0 27');
\r
264 if (!self.targetname)
\r
266 objerror ("no targetname");
\r
270 void () trigger_teleport =
\r
272 if (self.allowteams == "red")
\r
277 if (self.allowteams == "blue")
\r
285 if ((CheckExistence () == 0))
\r
291 self.touch = teleport_touch;
\r
294 objerror ("no target");
\r
296 self.use = teleport_use;
\r
297 if (!(self.spawnflags & 2))
\r
299 precache_sound ("ambience/hum1.wav");
\r
300 o = ((self.mins + self.maxs) * 0.5);
\r
301 ambientsound (o, "ambience/hum1.wav", 0.5, 3);
\r
305 void misc_teleporter_dest (void) // Moved from above
\r
307 info_teleport_destination();
\r