]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/t_teleporters.c
Added a Game C folder
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / t_teleporters.c
1 void Damage (entity targ, entity inflictor, entity attacker, float\r
2 damage, float deathtype, vector hitloc, vector force);\r
3 \r
4 void() tdeath_touch =\r
5 {\r
6         if (other == self.owner)\r
7                 return;\r
8         // so teleporting shots etc can't telefrag\r
9         if (!self.owner.takedamage)\r
10                 return;\r
11         if (!other.takedamage)\r
12                 return;\r
13 \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
20 };\r
21 \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
24 {\r
25         local entity death;\r
26 \r
27         death = spawn();\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
32         death.dest2 = org2;\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
39 \r
40         force_retouch = 2;              // make sure even still objects get hit\r
41 };\r
42 \r
43 /*void Teleport_Touch (void)\r
44 {\r
45         if (other.health < 1)\r
46                 return;\r
47         if (other.classname != "player")        // FIXME: Make missiles firable through the teleport too\r
48                 return;\r
49 \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
53 \r
54         dest = find (world, targetname, self.target);\r
55         if (!dest)\r
56                 objerror ("Teleporter with nonexistant target");\r
57 \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
62 \r
63         spawn_tdeath(dest.origin, other, other.origin);\r
64 \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
70 \r
71         other.velocity = '0 0 0';\r
72 \r
73         other.flags = other.flags - (other.flags & FL_ONGROUND);\r
74 }\r
75 \r
76 void info_teleport_destination (void)\r
77 {\r
78         self.mangle = self.angles;\r
79         self.angles = '0 0 0';\r
80 \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
83 \r
84         if (!self.targetname)\r
85                 objerror ("Teleport destination without a targetname");\r
86 }*/\r
87 /*\r
88 void misc_teleporter_dest (void)                        // Moved down\r
89 {\r
90         info_teleport_destination();\r
91 }\r
92 */\r
93 /*\r
94 void trigger_teleport (void)\r
95 {\r
96         self.angles = '0 0 0';\r
97 \r
98         self.solid = SOLID_TRIGGER;\r
99         self.movetype = MOVETYPE_NONE;\r
100 \r
101         setmodel (self, self.model);\r
102 \r
103         self.model = "";\r
104         self.modelindex = 0;\r
105 \r
106         self.touch = Teleport_Touch;\r
107 \r
108         if (!self.target)\r
109                 objerror ("Teleporter with no target");\r
110 }\r
111 */\r
112 \r
113 // TF Teleporters\r
114 entity s;\r
115 void() SUB_UseTargets;\r
116 \r
117 void () play_teleport =\r
118 {\r
119         local float v;\r
120         local string tmpstr;\r
121 \r
122         v = (random () * 5);\r
123         if ((v < 1))\r
124         {\r
125                 tmpstr = "misc/teleport.wav";\r
126         }\r
127         else\r
128         {\r
129                 if ((v < 2))\r
130                 {\r
131                         tmpstr = "misc/teleport.wav";\r
132                 }\r
133                 else\r
134                 {\r
135                         if ((v < 3))\r
136                         {\r
137                                 tmpstr = "misc/teleport.wav";\r
138                         }\r
139                         else\r
140                         {\r
141                                 if ((v < 4))\r
142                                 {\r
143                                         tmpstr = "misc/teleport.wav";\r
144                                 }\r
145                                 else\r
146                                 {\r
147                                         tmpstr = "misc/teleport.wav";\r
148                                 }\r
149                         }\r
150                 }\r
151         }\r
152         sound (self, 2, tmpstr, 1, 1);\r
153         remove (self);\r
154 };\r
155 \r
156 void (vector org) spawn_tfog =\r
157 {\r
158         s = spawn ();\r
159         s.origin = org;\r
160         s.nextthink = (time + 0.2);\r
161         s.think = play_teleport;\r
162         WriteByte (0, 23);\r
163         WriteByte (0, 11);\r
164         WriteCoord (0, org_x);\r
165         WriteCoord (0, org_y);\r
166         WriteCoord (0, org_z);\r
167 };\r
168 \r
169 void () teleport_touch =\r
170 {\r
171         local entity t;\r
172         local entity te;\r
173         local vector org;\r
174 \r
175         if (self.targetname)\r
176         {\r
177                 if ((self.nextthink < time))\r
178                 {\r
179                         return;\r
180                 }\r
181         }\r
182         if ((self.spawnflags & 1))\r
183         {\r
184                 if ((other.classname != "player"))\r
185                 {\r
186                         return;\r
187                 }\r
188         }\r
189         if (!Activated (self, other))\r
190         {\r
191                 if ((self.else_goal != 0))\r
192                 {\r
193                         te = Findgoal (self.else_goal);\r
194                         if (te)\r
195                         {\r
196                                 AttemptToActivate (te, other, self);\r
197                         }\r
198                 }\r
199                 return;\r
200         }\r
201         if (((other.health <= 0) || (other.solid != 3)))\r
202         {\r
203                 return;\r
204         }\r
205         SUB_UseTargets ();\r
206         spawn_tfog (other.origin);\r
207         t = find (world, targetname, self.target);\r
208         if (!t)\r
209         {\r
210                 objerror ("couldn't find target");\r
211         }\r
212         makevectors (t.mangle);\r
213         org = (t.origin + (32 * v_forward));\r
214         spawn_tfog (org);\r
215         spawn_tdeath (t.origin, other);\r
216         if (!other.health)\r
217         {\r
218                 other.origin = t.origin;\r
219                 other.velocity = ((v_forward * other.velocity_x) + (v_forward * other.velocity_y));\r
220                 return;\r
221         }\r
222         setorigin (other, t.origin);\r
223         other.angles = t.mangle;\r
224         if ((other.classname == "player"))\r
225         {\r
226                 if (((other.weapon == 1)/* && other.hook_out*/))                // Hook out code needs replacement\r
227                 {\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
234                 }\r
235                 other.fixangle = 1;\r
236                 other.teleport_time = (time + 0.7);\r
237                 if ((other.flags & 512))\r
238                 {\r
239                         other.flags = (other.flags - 512);\r
240                 }\r
241                 other.velocity = (v_forward * 300);\r
242         }\r
243         other.flags = (other.flags - (other.flags & 512));\r
244 };\r
245 \r
246 void () teleport_use =\r
247 {\r
248         self.nextthink = (time + 0.2);\r
249         force_retouch = 2;\r
250         self.think = SUB_Null;\r
251 };\r
252 \r
253 void () info_teleport_destination =\r
254 {\r
255         if ((CheckExistence () == 0))\r
256         {\r
257                 dremove (self);\r
258                 return;\r
259         }\r
260         self.mangle = self.angles;\r
261         self.angles = '0 0 0';\r
262         self.model = "";\r
263         self.origin = (self.origin + '0 0 27');\r
264         if (!self.targetname)\r
265         {\r
266                 objerror ("no targetname");\r
267         }\r
268 };\r
269 \r
270 void () trigger_teleport =\r
271 {\r
272         if (self.allowteams == "red")\r
273         {\r
274                 self.team_no = 2;\r
275                 self.owned_by = 2;\r
276         }\r
277         if (self.allowteams == "blue")\r
278         {\r
279                 self.owned_by = 1;\r
280                 self.team_no = 1;\r
281         }\r
282 \r
283         local vector o;\r
284 \r
285         if ((CheckExistence () == 0))\r
286         {\r
287                 dremove (self);\r
288                 return;\r
289         }\r
290         InitTrigger ();\r
291         self.touch = teleport_touch;\r
292         if (!self.target)\r
293         {\r
294                 objerror ("no target");\r
295         }\r
296         self.use = teleport_use;\r
297         if (!(self.spawnflags & 2))\r
298         {\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
302         }\r
303 };\r
304 \r
305 void misc_teleporter_dest (void)                        // Moved from above\r
306 {\r
307         info_teleport_destination();\r
308 }