]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tfplats.c
bumps for morphed's teleporter model
[divverent/nexuiz.git] / 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         local entity t;\r
197 \r
198         // Q3F/ETF support\r
199         if (self.allowteams == "red")\r
200         {\r
201                 self.team_no = 2;\r
202         }\r
203         if (self.allowteams == "blue")\r
204         {\r
205                 self.team_no = 1;\r
206         }\r
207 \r
208         if (CheckExistence() == 0)\r
209         {\r
210                 dremove(self);\r
211                 return;\r
212         }\r
213         if (!(self.t_length))\r
214         {\r
215                 self.t_length = 80;\r
216         }\r
217         if (!(self.t_width))\r
218         {\r
219                 self.t_width = 10;\r
220         }\r
221         if (self.sounds == 0)\r
222         {\r
223                 self.sounds = 2;\r
224         }\r
225         if (self.sounds == 1)\r
226         {\r
227                 precache_sound("plats/plat1.wav");\r
228                 precache_sound("plats/plat2.wav");\r
229                 self.noise = "plats/plat1.wav";\r
230                 self.noise1 = "plats/plat2.wav";\r
231         }\r
232         if (self.sounds == 2)\r
233         {\r
234                 precache_sound("plats/medplat1.wav");\r
235                 precache_sound("plats/medplat2.wav");\r
236                 self.noise = "plats/medplat1.wav";\r
237                 self.noise1 = "plats/medplat2.wav";\r
238         }\r
239         if (self.sounds == 4)\r
240         {\r
241                 precache_sound("plats/track_st.wav");\r
242                 precache_sound("plats/track_e.wav");\r
243                 self.noise = "plats/track_st.wav";\r
244                 self.noise1 = "plats/track_e.wav";\r
245         }\r
246         self.mangle = self.angles;\r
247         self.angles = '0 0 0';\r
248         self.classname = "plat";\r
249         self.solid = 4;\r
250         self.movetype = 7;\r
251         setorigin(self, self.origin);\r
252         setmodel(self, self.model);\r
253         setsize(self, self.mins, self.maxs);\r
254         self.blocked = plat_crush;\r
255         if (!(self.speed))\r
256         {\r
257                 self.speed = 150;\r
258         }\r
259         self.pos1 = self.origin;\r
260         self.pos2 = self.origin;\r
261         if (self.height)\r
262         {\r
263                 self.pos2_z = self.origin_z - self.height;\r
264         }\r
265         else\r
266         {\r
267                 self.pos2_z = self.origin_z - self.size_z + 8;\r
268         }\r
269         self.use = plat_trigger_use;\r
270         plat_spawn_inside_trigger();\r
271         if (self.targetname)\r
272         {\r
273                 self.state = 2;\r
274                 self.use = plat_use;\r
275         }\r
276         else\r
277         {\r
278                 setorigin(self, self.pos2);\r
279                 self.state = 1;\r
280         }\r
281 };\r
282 \r
283 void() train_blocked = \r
284 {\r
285         if (time < self.attack_finished)\r
286         {\r
287                 return;\r
288         }\r
289         self.attack_finished = time + 0.5;\r
290         T_Damage(other, self, self, self.dmg);\r
291 };\r
292 \r
293 void() train_use = \r
294 {\r
295         if (self.think != func_train_find)\r
296         {\r
297                 return;\r
298         }\r
299         train_next();\r
300 };\r
301 \r
302 void() train_wait = \r
303 {\r
304         if (self.wait)\r
305         {\r
306                 self.nextthink = self.ltime + self.wait;\r
307                 if (self.wait == -1)\r
308                 {\r
309                         self.think = func_train_find;\r
310                 }\r
311                 self.sounds = 4;\r
312                 if (4)\r
313                 {\r
314                         sound(self, 2, self.noise, 1, 0);\r
315                 }\r
316                 else\r
317                 {\r
318                         sound(self, 2, self.noise, 1, 1);\r
319                 }\r
320         }\r
321         else\r
322         {\r
323                 self.nextthink = self.ltime + 0.1;\r
324         }\r
325         self.think = train_next;\r
326 };\r
327 \r
328 void() train_next = \r
329 {\r
330         local entity targ;\r
331         targ = find(world, targetname, self.target);\r
332         self.target = targ.target;\r
333         if (!(self.target))\r
334         {\r
335                 objerror("train_next: no next target");\r
336         }\r
337         if (targ.wait)\r
338         {\r
339                 self.wait = targ.wait;\r
340         }\r
341         else\r
342         {\r
343                 self.wait = 0;\r
344         }\r
345         self.sounds = 4;\r
346 //      if (4)\r
347 //      {\r
348 //              sound(self, 2, self.noise1, 1, 0);\r
349 //      }\r
350 //      else\r
351 //      {\r
352                 sound(self, 2, self.noise1, 1, 1);\r
353 //      }\r
354         SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);\r
355 };\r
356 \r
357 void() func_train_find = \r
358 {\r
359         local entity targ;\r
360         targ = find(world, targetname, self.target);\r
361         self.target = targ.target;\r
362         setorigin(self, targ.origin - self.mins);\r
363         if (!(self.targetname))\r
364         {\r
365                 self.nextthink = self.ltime + 0.1;\r
366                 self.think = train_next;\r
367         }\r
368 };\r
369 \r
370 void() followtrain = \r
371 {\r
372         setorigin(self, self.owner.origin);\r
373         self.nextthink = time + 0.1;\r
374         self.think = followtrain;\r
375 };\r
376 \r
377 void() func_train = \r
378 {\r
379         local entity bob;\r
380         if (CheckExistence() == 0)\r
381         {\r
382                 dremove(self);\r
383                 return;\r
384         }\r
385         if (!(self.speed))\r
386         {\r
387                 self.speed = 100;\r
388         }\r
389         if (!(self.target))\r
390         {\r
391                 objerror("func_train without a target");\r
392         }\r
393         if (!(self.dmg))\r
394         {\r
395                 self.dmg = 2;\r
396         }\r
397         if (self.sounds == 0)\r
398         {\r
399                 self.noise = "misc/null.wav";\r
400                 precache_sound("misc/null.wav");\r
401                 self.noise1 = "misc/null.wav";\r
402                 precache_sound("misc/null.wav");\r
403         }\r
404         if (self.sounds == 1)\r
405         {\r
406                 self.noise = "plats/train2.wav";\r
407                 precache_sound("plats/train2.wav");\r
408                 self.noise1 = "plats/train1.wav";\r
409                 precache_sound("plats/train1.wav");\r
410         }\r
411         if (self.sounds == 4)\r
412         {\r
413                 precache_sound("plats/track_st.wav");\r
414                 precache_sound("plats/track_e.wav");\r
415                 self.noise = "plats/track_e.wav";\r
416                 self.noise1 = "plats/track_st.wav";\r
417         }\r
418         self.cnt = 1;\r
419         self.solid = 4;\r
420         self.movetype = 7;\r
421         self.blocked = train_blocked;\r
422         self.use = train_use;\r
423         self.classname = "train";\r
424         setmodel(self, self.model);\r
425         setsize(self, self.mins, self.maxs);\r
426         setorigin(self, self.origin);\r
427         self.nextthink = self.ltime + 0.1;\r
428         self.think = func_train_find;\r
429 };\r
430 \r
431 void() light_move = \r
432 {\r
433         if (CheckExistence() == 0)\r
434         {\r
435                 dremove(self);\r
436                 return;\r
437         }\r
438         if (!(self.speed))\r
439         {\r
440                 self.speed = 100;\r
441         }\r
442         if (!(self.target))\r
443         {\r
444                 objerror("light_move without a target");\r
445         }\r
446         self.noise = "misc/null.wav";\r
447         precache_sound("misc/null.wav");\r
448         self.noise1 = "misc/null.wav";\r
449         precache_sound("misc/null.wav");\r
450         self.cnt = 1;\r
451         if (!(self.effects))\r
452         {\r
453                 self.effects = 4;\r
454         }\r
455         self.solid = 4;\r
456         self.movetype = 7;\r
457         self.classname = "movelight";\r
458         precache_model("progs/s_null.spr");\r
459         setmodel(self, "progs/s_null.spr");\r
460         setsize(self, '0 0 0', '0 0 0');\r
461         setorigin(self, self.origin);\r
462         self.nextthink = self.ltime + 0.1;\r
463         self.think = func_train_find;\r
464 };\r
465 \r
466 void() misc_teleporttrain = \r
467 {\r
468         if (CheckExistence() == 0)\r
469         {\r
470                 dremove(self);\r
471                 return;\r
472         }\r
473         if (!(self.speed))\r
474         {\r
475                 self.speed = 100;\r
476         }\r
477         if (!(self.target))\r
478         {\r
479                 objerror("func_train without a target");\r
480         }\r
481         self.cnt = 1;\r
482         self.solid = 0;\r
483         self.movetype = 7;\r
484         self.blocked = train_blocked;\r
485         self.use = train_use;\r
486         self.avelocity = '100 200 300';\r
487         self.noise = "misc/null.wav";\r
488         precache_sound("misc/null.wav");\r
489         self.noise1 = "misc/null.wav";\r
490         precache_sound("misc/null.wav");\r
491         precache_model2("progs/teleport.mdl");\r
492         setmodel(self, "progs/teleport.mdl");\r
493         setsize(self, self.mins, self.maxs);\r
494         setorigin(self, self.origin);\r
495         self.nextthink = self.ltime + 0.1;\r
496         self.think = func_train_find;\r
497 };\r
498 \r
499 \r