]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/tfplats.c
moved navnodeedit & TeamNexuiz to attic
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / tfplats.c
1 \r
2 void() SUB_Null;\r
3 float() CheckExistence;\r
4 void() train_next;\r
5 void() func_train_find;\r
6 void() plat_center_touch;\r
7 void() plat_outside_touch;\r
8 void() plat_trigger_use;\r
9 void() plat_go_up;\r
10 void() plat_go_down;\r
11 void() plat_crush;\r
12 \r
13 \r
14 \r
15 void() plat_spawn_inside_trigger = \r
16 {\r
17         local entity trigger;\r
18         local vector tmin;\r
19         local vector tmax;\r
20         trigger = spawn();\r
21         trigger.touch = plat_center_touch;\r
22         trigger.movetype = 0;\r
23         trigger.solid = 1;\r
24         trigger.enemy = self;\r
25         trigger.team_no = self.team_no;\r
26         trigger.playerclass = self.playerclass;\r
27         trigger.items_allowed = self.items_allowed;\r
28         trigger.activate_goal_no = self.activate_goal_no;\r
29         trigger.inactivate_goal_no = self.inactivate_goal_no;\r
30         trigger.remove_goal_no = self.remove_goal_no;\r
31         trigger.restore_goal_no = self.restore_goal_no;\r
32         trigger.activate_group_no = self.activate_group_no;\r
33         trigger.inactivate_group_no = self.inactivate_group_no;\r
34         trigger.remove_group_no = self.remove_group_no;\r
35         trigger.restore_group_no = self.restore_group_no;\r
36         trigger.goal_activation = self.goal_activation;\r
37         trigger.goal_effects = self.goal_effects;\r
38         trigger.goal_result = self.goal_result;\r
39         trigger.goal_group = self.goal_group;\r
40         tmin = self.mins + '25 25 0';\r
41         tmax = self.maxs - '25 25 -8';\r
42         tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8);\r
43         if (self.spawnflags & 1)\r
44         {\r
45                 tmax_z = tmin_z + 8;\r
46         }\r
47         if (self.size_x <= 50)\r
48         {\r
49                 tmin_x = (self.mins_x + self.maxs_x) / 2;\r
50                 tmax_x = tmin_x + 1;\r
51         }\r
52         if (self.size_y <= 50)\r
53         {\r
54                 tmin_y = (self.mins_y + self.maxs_y) / 2;\r
55                 tmax_y = tmin_y + 1;\r
56         }\r
57         setsize(trigger, tmin, tmax);\r
58 };\r
59 \r
60 void() plat_hit_top = \r
61 {\r
62         sound(self, 2, self.noise1, 1, 1);\r
63         self.state = 0;\r
64         self.think = plat_go_down;\r
65         self.nextthink = self.ltime + 3;\r
66 };\r
67 \r
68 void() plat_hit_bottom = \r
69 {\r
70         sound(self, 2, self.noise1, 1, 1);\r
71         self.state = 1;\r
72 };\r
73 \r
74 void() plat_go_down = \r
75 {\r
76         sound(self, 2, self.noise, 1, 1);\r
77         self.state = 3;\r
78         SUB_CalcMove(self.pos2, self.speed, plat_hit_bottom);\r
79 };\r
80 \r
81 void() plat_go_up = \r
82 {\r
83         sound(self, 2, self.noise, 1, 1);\r
84         self.state = 2;\r
85         SUB_CalcMove(self.pos1, self.speed, plat_hit_top);\r
86 };\r
87 \r
88 void() plat_center_touch = \r
89 {\r
90         local entity te;\r
91         if (other.classname != "player")\r
92         {\r
93                 return;\r
94         }\r
95         if (!Activated(self, other))\r
96         {\r
97                 if (self.else_goal != 0)\r
98                 {\r
99                         te = Findgoal(self.else_goal);\r
100                         if (te)\r
101                         {\r
102                                 DoResults(te, other, self.goal_result & 2);\r
103                         }\r
104                 }\r
105                 return;\r
106         }\r
107         if (other.health <= 0)\r
108         {\r
109                 return;\r
110         }\r
111         self = self.enemy;\r
112         if (self.state == 1)\r
113         {\r
114                 plat_go_up();\r
115         }\r
116         else\r
117         {\r
118                 if (self.state == 0)\r
119                 {\r
120                         self.nextthink = self.ltime + 1;\r
121                 }\r
122         }\r
123 };\r
124 \r
125 void() plat_outside_touch = \r
126 {\r
127         local entity te;\r
128         if (other.classname != "player")\r
129         {\r
130                 return;\r
131         }\r
132         if (!Activated(self, other))\r
133         {\r
134                 if (self.else_goal != 0)\r
135                 {\r
136                         te = Findgoal(self.else_goal);\r
137                         if (te)\r
138                         {\r
139                                 DoResults(te, other, self.goal_result & 2);\r
140                         }\r
141                 }\r
142                 return;\r
143         }\r
144         if (other.health <= 0)\r
145         {\r
146                 return;\r
147         }\r
148         self = self.enemy;\r
149         if (self.state == 0)\r
150         {\r
151                 plat_go_down();\r
152         }\r
153 };\r
154 \r
155 void() plat_trigger_use = \r
156 {\r
157         if (self.think)\r
158         {\r
159                 return;\r
160         }\r
161         plat_go_down();\r
162 };\r
163 \r
164 void() plat_crush = \r
165 {\r
166         T_Damage(other, self, self, 1);\r
167         if (self.state == 2)\r
168         {\r
169                 plat_go_down();\r
170         }\r
171         else\r
172         {\r
173                 if (self.state == 3)\r
174                 {\r
175                         plat_go_up();\r
176                 }\r
177                 else\r
178                 {\r
179                         objerror("plat_crush: bad self.state\n");\r
180                 }\r
181         }\r
182 };\r
183 \r
184 void() plat_use = \r
185 {\r
186         self.use = SUB_Null;\r
187         if (self.state != 2)\r
188         {\r
189                 objerror("plat_use: not in up state");\r
190         }\r
191         plat_go_down();\r
192 };\r
193 \r
194 void() func_plat = \r
195 {\r
196         // Q3F/ETF support\r
197         if (self.allowteams == "red")\r
198         {\r
199                 self.team_no = 2;\r
200         }\r
201         if (self.allowteams == "blue")\r
202         {\r
203                 self.team_no = 1;\r
204         }\r
205 \r
206         if (CheckExistence() == 0)\r
207         {\r
208                 dremove(self);\r
209                 return;\r
210         }\r
211         if (!(self.t_length))\r
212         {\r
213                 self.t_length = 80;\r
214         }\r
215         if (!(self.t_width))\r
216         {\r
217                 self.t_width = 10;\r
218         }\r
219         if (self.sounds == 0)\r
220         {\r
221                 self.sounds = 2;\r
222         }\r
223         if (self.sounds == 1)\r
224         {\r
225                 precache_sound("plats/plat1.wav");\r
226                 precache_sound("plats/plat2.wav");\r
227                 self.noise = "plats/plat1.wav";\r
228                 self.noise1 = "plats/plat2.wav";\r
229         }\r
230         if (self.sounds == 2)\r
231         {\r
232                 precache_sound("plats/medplat1.wav");\r
233                 precache_sound("plats/medplat2.wav");\r
234                 self.noise = "plats/medplat1.wav";\r
235                 self.noise1 = "plats/medplat2.wav";\r
236         }\r
237         if (self.sounds == 4)\r
238         {\r
239                 precache_sound("plats/track_st.wav");\r
240                 precache_sound("plats/track_e.wav");\r
241                 self.noise = "plats/track_st.wav";\r
242                 self.noise1 = "plats/track_e.wav";\r
243         }\r
244         self.mangle = self.angles;\r
245         self.angles = '0 0 0';\r
246         self.classname = "plat";\r
247         self.solid = 4;\r
248         self.movetype = 7;\r
249         setorigin(self, self.origin);\r
250         setmodel(self, self.model);\r
251         setsize(self, self.mins, self.maxs);\r
252         self.blocked = plat_crush;\r
253         if (!(self.speed))\r
254         {\r
255                 self.speed = 150;\r
256         }\r
257         self.pos1 = self.origin;\r
258         self.pos2 = self.origin;\r
259         if (self.height)\r
260         {\r
261                 self.pos2_z = self.origin_z - self.height;\r
262         }\r
263         else\r
264         {\r
265                 self.pos2_z = self.origin_z - self.size_z + 8;\r
266         }\r
267         self.use = plat_trigger_use;\r
268         plat_spawn_inside_trigger();\r
269         if (self.targetname)\r
270         {\r
271                 self.state = 2;\r
272                 self.use = plat_use;\r
273         }\r
274         else\r
275         {\r
276                 setorigin(self, self.pos2);\r
277                 self.state = 1;\r
278         }\r
279 };\r
280 \r
281 void() train_blocked = \r
282 {\r
283         if (time < self.attack_finished)\r
284         {\r
285                 return;\r
286         }\r
287         self.attack_finished = time + 0.5;\r
288         T_Damage(other, self, self, self.dmg);\r
289 };\r
290 \r
291 void() train_use = \r
292 {\r
293         if (self.think != func_train_find)\r
294         {\r
295                 return;\r
296         }\r
297         train_next();\r
298 };\r
299 \r
300 void() train_wait = \r
301 {\r
302         if (self.wait)\r
303         {\r
304                 self.nextthink = self.ltime + self.wait;\r
305                 if (self.wait == -1)\r
306                 {\r
307                         self.think = func_train_find;\r
308                 }\r
309                 self.sounds = 4;\r
310                 if (4)\r
311                 {\r
312                         sound(self, 2, self.noise, 1, 0);\r
313                 }\r
314                 else\r
315                 {\r
316                         sound(self, 2, self.noise, 1, 1);\r
317                 }\r
318         }\r
319         else\r
320         {\r
321                 self.nextthink = self.ltime + 0.1;\r
322         }\r
323         self.think = train_next;\r
324 };\r
325 \r
326 void() train_next = \r
327 {\r
328         local entity targ;\r
329         targ = find(world, targetname, self.target);\r
330         self.target = targ.target;\r
331         if (!(self.target))\r
332         {\r
333                 objerror("train_next: no next target");\r
334         }\r
335         if (targ.wait)\r
336         {\r
337                 self.wait = targ.wait;\r
338         }\r
339         else\r
340         {\r
341                 self.wait = 0;\r
342         }\r
343         self.sounds = 4;\r
344 //      if (4)\r
345 //      {\r
346 //              sound(self, 2, self.noise1, 1, 0);\r
347 //      }\r
348 //      else\r
349 //      {\r
350                 sound(self, 2, self.noise1, 1, 1);\r
351 //      }\r
352         SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);\r
353 };\r
354 \r
355 void() func_train_find = \r
356 {\r
357         local entity targ;\r
358         targ = find(world, targetname, self.target);\r
359         self.target = targ.target;\r
360         setorigin(self, targ.origin - self.mins);\r
361         if (!(self.targetname))\r
362         {\r
363                 self.nextthink = self.ltime + 0.1;\r
364                 self.think = train_next;\r
365         }\r
366 };\r
367 \r
368 void() followtrain = \r
369 {\r
370         setorigin(self, self.owner.origin);\r
371         self.nextthink = time + 0.1;\r
372         self.think = followtrain;\r
373 };\r
374 \r
375 void() func_train = \r
376 {\r
377         if (CheckExistence() == 0)\r
378         {\r
379                 dremove(self);\r
380                 return;\r
381         }\r
382         if (!(self.speed))\r
383         {\r
384                 self.speed = 100;\r
385         }\r
386         if (!(self.target))\r
387         {\r
388                 objerror("func_train without a target");\r
389         }\r
390         if (!(self.dmg))\r
391         {\r
392                 self.dmg = 2;\r
393         }\r
394         if (self.sounds == 0)\r
395         {\r
396                 self.noise = "misc/null.wav";\r
397                 precache_sound("misc/null.wav");\r
398                 self.noise1 = "misc/null.wav";\r
399                 precache_sound("misc/null.wav");\r
400         }\r
401         if (self.sounds == 1)\r
402         {\r
403                 self.noise = "plats/train2.wav";\r
404                 precache_sound("plats/train2.wav");\r
405                 self.noise1 = "plats/train1.wav";\r
406                 precache_sound("plats/train1.wav");\r
407         }\r
408         if (self.sounds == 4)\r
409         {\r
410                 precache_sound("plats/track_st.wav");\r
411                 precache_sound("plats/track_e.wav");\r
412                 self.noise = "plats/track_e.wav";\r
413                 self.noise1 = "plats/track_st.wav";\r
414         }\r
415         self.cnt = 1;\r
416         self.solid = 4;\r
417         self.movetype = 7;\r
418         self.blocked = train_blocked;\r
419         self.use = train_use;\r
420         self.classname = "train";\r
421         setmodel(self, self.model);\r
422         setsize(self, self.mins, self.maxs);\r
423         setorigin(self, self.origin);\r
424         self.nextthink = self.ltime + 0.1;\r
425         self.think = func_train_find;\r
426 };\r
427 \r
428 void() light_move = \r
429 {\r
430         if (CheckExistence() == 0)\r
431         {\r
432                 dremove(self);\r
433                 return;\r
434         }\r
435         if (!(self.speed))\r
436         {\r
437                 self.speed = 100;\r
438         }\r
439         if (!(self.target))\r
440         {\r
441                 objerror("light_move without a target");\r
442         }\r
443         self.noise = "misc/null.wav";\r
444         precache_sound("misc/null.wav");\r
445         self.noise1 = "misc/null.wav";\r
446         precache_sound("misc/null.wav");\r
447         self.cnt = 1;\r
448         if (!(self.effects))\r
449         {\r
450                 self.effects = 4;\r
451         }\r
452         self.solid = 4;\r
453         self.movetype = 7;\r
454         self.classname = "movelight";\r
455         precache_model("progs/s_null.spr");\r
456         setmodel(self, "progs/s_null.spr");\r
457         setsize(self, '0 0 0', '0 0 0');\r
458         setorigin(self, self.origin);\r
459         self.nextthink = self.ltime + 0.1;\r
460         self.think = func_train_find;\r
461 };\r
462 \r
463 void() misc_teleporttrain = \r
464 {\r
465         if (CheckExistence() == 0)\r
466         {\r
467                 dremove(self);\r
468                 return;\r
469         }\r
470         if (!(self.speed))\r
471         {\r
472                 self.speed = 100;\r
473         }\r
474         if (!(self.target))\r
475         {\r
476                 objerror("func_train without a target");\r
477         }\r
478         self.cnt = 1;\r
479         self.solid = 0;\r
480         self.movetype = 7;\r
481         self.blocked = train_blocked;\r
482         self.use = train_use;\r
483         self.avelocity = '100 200 300';\r
484         self.noise = "misc/null.wav";\r
485         precache_sound("misc/null.wav");\r
486         self.noise1 = "misc/null.wav";\r
487         precache_sound("misc/null.wav");\r
488         precache_model2("progs/teleport.mdl");\r
489         setmodel(self, "progs/teleport.mdl");\r
490         setsize(self, self.mins, self.maxs);\r
491         setorigin(self, self.origin);\r
492         self.nextthink = self.ltime + 0.1;\r
493         self.think = func_train_find;\r
494 };\r
495 \r
496 \r