]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/g_subs.c
Added new GameC with class selection and random class selection working
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / g_subs.c
1 void() SUB_Null = {};\r
2 \r
3 void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove;\r
4 void()  SUB_CalcMoveDone;\r
5 void() SUB_CalcAngleMoveDone;\r
6 //void() SUB_UseTargets;\r
7 void() SUB_Remove;\r
8 \r
9 void info_null (void)\r
10 {\r
11 }\r
12 \r
13 /*\r
14 ==================\r
15 SUB_Remove\r
16 \r
17 Remove self\r
18 ==================\r
19 */\r
20 void SUB_Remove (void)\r
21 {\r
22         remove (self);\r
23 }\r
24 \r
25 /*\r
26 ==================\r
27 SUB_VanishOrRemove\r
28 \r
29 Makes client invisible or removes non-client\r
30 ==================\r
31 */\r
32 void SUB_VanishOrRemove (entity ent)\r
33 {\r
34         if (ent.flags & FL_CLIENT)\r
35         {\r
36                 // vanish\r
37                 ent.effects = EF_NODRAW;\r
38         }\r
39         else\r
40         {\r
41                 // remove\r
42                 remove (ent);\r
43         }\r
44 }\r
45 \r
46 void ExtinguishFlame(entity targ);\r
47 \r
48 void SUB_SetFade_Think (void)\r
49 {\r
50         if(self.onfire)\r
51                 ExtinguishFlame(self);\r
52         self.think = SUB_SetFade_Think;\r
53         self.nextthink = self.fade_time;\r
54         self.alpha = 1 - (time - self.fade_time) * self.fade_rate;\r
55         if (self.alpha < 0.01)\r
56                 SUB_VanishOrRemove(self);\r
57         self.alpha = bound(0.01, self.alpha, 1);\r
58 }\r
59 \r
60 /*\r
61 ==================\r
62 SUB_SetFade\r
63 \r
64 Fade 'ent' out when time >= 'when'\r
65 ==================\r
66 */\r
67 void SUB_SetFade (entity ent, float when, float fadetime)\r
68 {\r
69         //if (ent.flags & FL_CLIENT) // && ent.deadflag != DEAD_NO)\r
70         //      return;\r
71         //ent.alpha = 1;\r
72         ent.fade_rate = 1/fadetime;\r
73         ent.fade_time = when;\r
74         ent.think = SUB_SetFade_Think;\r
75         ent.nextthink = when;\r
76 }\r
77 \r
78 /*\r
79 =============\r
80 SUB_CalcMove\r
81 \r
82 calculate self.velocity and self.nextthink to reach dest from\r
83 self.origin traveling at speed\r
84 ===============\r
85 */\r
86 /*\r
87 void SUB_CalcMoveDone (void)\r
88 {\r
89         // After moving, set origin to exact final destination\r
90 \r
91         setorigin (self, self.finaldest);\r
92         self.velocity = '0 0 0';\r
93         self.nextthink = -1;\r
94         if (self.think1)\r
95                 self.think1 ();\r
96 }\r
97 */\r
98 /*void SUB_CalcMove (vector tdest, float tspeed, void() func)\r
99 {\r
100         vector  delta;\r
101         float   traveltime;\r
102 \r
103         if (!tspeed)\r
104                 objerror ("No speed is defined!");\r
105 \r
106         self.think1 = func;\r
107         self.finaldest = tdest;\r
108         self.think = SUB_CalcMoveDone;\r
109 \r
110         if (tdest == self.origin)\r
111         {\r
112                 self.velocity = '0 0 0';\r
113                 self.nextthink = self.ltime + 0.1;\r
114                 return;\r
115         }\r
116 \r
117         delta = tdest - self.origin;\r
118         traveltime = vlen (delta) / tspeed;\r
119 \r
120         if (traveltime < 0.1)\r
121         {\r
122                 self.velocity = '0 0 0';\r
123                 self.nextthink = self.ltime + 0.1;\r
124                 return;\r
125         }\r
126 \r
127         self.velocity = delta * (1/traveltime); // QuakeC doesn't allow vector/float division\r
128 \r
129         self.nextthink = self.ltime + traveltime;\r
130 }*/\r
131 \r
132 void () SUB_CalcMoveDone =\r
133 {\r
134         setorigin (self, self.finaldest);\r
135         self.velocity = '0 0 0';\r
136         self.nextthink = -1;\r
137         if (self.think1)\r
138         {\r
139                 self.think1 ();\r
140         }\r
141 };\r
142 \r
143 void (vector tdest, float tspeed, void() func) SUB_CalcMove =\r
144 {\r
145         local vector vdestdelta;\r
146         local float len;\r
147         local float traveltime;\r
148 \r
149         if (!tspeed)\r
150         {\r
151                 objerror ("No speed is defined!");\r
152         }\r
153         self.think1 = func;\r
154         self.finaldest = tdest;\r
155         self.think = SUB_CalcMoveDone;\r
156         if ((tdest == self.origin))\r
157         {\r
158                 self.velocity = '0 0 0';\r
159                 self.nextthink = (self.ltime + 0.1);\r
160                 return;\r
161         }\r
162         vdestdelta = (tdest - self.origin);\r
163         len = vlen (vdestdelta);\r
164         traveltime = (len / tspeed);\r
165         if ((traveltime < 0.1))\r
166         {\r
167                 self.velocity = '0 0 0';\r
168                 self.nextthink = (self.ltime + 0.1);\r
169                 return;\r
170         }\r
171         self.nextthink = (self.ltime + traveltime);\r
172         self.velocity = (vdestdelta * (1 / traveltime));\r
173 };\r
174 \r
175 void SUB_CalcMoveEnt (entity ent, vector tdest, float tspeed, void() func)\r
176 {\r
177         entity  oldself;\r
178 \r
179         oldself = self;\r
180         self = ent;\r
181 \r
182         SUB_CalcMove (tdest, tspeed, func);\r
183 \r
184         self = oldself;\r
185 }\r
186 \r
187 /*\r
188 =============\r
189 SUB_CalcAngleMove\r
190 \r
191 calculate self.avelocity and self.nextthink to reach destangle from\r
192 self.angles rotating\r
193 \r
194 The calling function should make sure self.think is valid\r
195 ===============\r
196 */\r
197 void SUB_CalcAngleMoveDone (void)\r
198 {\r
199         // After rotating, set angle to exact final angle\r
200         self.angles = self.finalangle;\r
201         self.avelocity = '0 0 0';\r
202         self.nextthink = -1;\r
203         if (self.think1)\r
204                 self.think1 ();\r
205 }\r
206 \r
207 void SUB_CalcAngleMove (vector destangle, float tspeed, void() func)\r
208 {\r
209         vector  delta;\r
210         float   traveltime;\r
211 \r
212         if (!tspeed)\r
213                 objerror ("No speed is defined!");\r
214 \r
215         delta = destangle = self.angles;\r
216         traveltime = vlen (delta) / tspeed;\r
217 \r
218         self.avelocity = delta * (1 / traveltime);\r
219 \r
220         self.think1 = func;\r
221         self.finalangle = destangle;\r
222 \r
223         self.think = SUB_CalcAngleMoveDone;\r
224         self.nextthink = self.ltime + traveltime;\r
225 }\r
226 \r
227 void SUB_CalcAngleMoveEnt (entity ent, vector destangle, float tspeed, void() func)\r
228 {\r
229         entity  oldself;\r
230 \r
231         oldself = self;\r
232         self = ent;\r
233 \r
234         SUB_CalcAngleMove (destangle, tspeed, func);\r
235 \r
236         self = oldself;\r
237 }\r
238 \r
239 /*\r
240 ==================\r
241 main\r
242 \r
243 unused but required by the engine\r
244 ==================\r
245 */\r
246 void main (void)\r
247 {\r
248 \r
249 }\r
250 \r
251 // Sound functions\r
252 \r
253 /*\r
254 ==================\r
255 PointSound\r
256 \r
257 Play a sound at the given location\r
258 ==================\r
259 */\r
260 void PointSound (vector org, string snd, float vol, float attn)\r
261 {\r
262         entity  speaker;\r
263 \r
264         speaker = spawn ();\r
265         setorigin (speaker, org);\r
266         sound (speaker, CHAN_BODY, snd, vol, attn);\r
267         remove (speaker);\r
268 }\r
269 \r
270 // Misc\r
271 \r
272 /*\r
273 ==================\r
274 traceline_hitcorpse\r
275 \r
276 A version of traceline that must be used by SOLID_SLIDEBOX things that want to hit SOLID_CORPSE things with a trace attack\r
277 ==================\r
278 */\r
279 void traceline_hitcorpse (entity source, vector v1, vector v2, float nomonst, entity forent)\r
280 {\r
281         float   oldsolid;\r
282 \r
283         oldsolid = source.solid;\r
284         source.solid = SOLID_BBOX;\r
285 \r
286         traceline (v1, v2, nomonst, forent);\r
287 \r
288         source.solid = oldsolid;\r
289 }\r
290 \r
291 /*\r
292 ==================\r
293 findbetterlocation\r
294 \r
295 Returns a point at least 12 units away from walls\r
296 (useful for explosion animations, although the blast is performed where it really happened)\r
297 Ripped from DPMod\r
298 ==================\r
299 */\r
300 vector findbetterlocation (vector org)\r
301 {\r
302         vector  loc;\r
303 \r
304         traceline (org, org - '12 0 0', TRUE, world);\r
305         if (trace_fraction < 1)\r
306         {\r
307                 loc = trace_endpos;\r
308                 traceline (loc, loc + '12 0 0', TRUE, world);\r
309                 if (trace_fraction >= 1)\r
310                         org = loc + '12 0 0';\r
311         }\r
312 \r
313         traceline (org, org - '-12 0 0', TRUE, world);\r
314         if (trace_fraction < 1)\r
315         {\r
316                 loc = trace_endpos;\r
317                 traceline (loc, loc + '-12 0 0', TRUE, world);\r
318                 if (trace_fraction >= 1)\r
319                         org = loc + '-12 0 0';\r
320         }\r
321 \r
322         traceline (org, org - '0 12 0' , TRUE, world);\r
323         if (trace_fraction < 1)\r
324         {\r
325                 loc = trace_endpos;\r
326                 traceline (loc, loc + '0 12 0', TRUE, world);\r
327                 if (trace_fraction >= 1)\r
328                         org = loc + '0 12 0';\r
329         }\r
330 \r
331         traceline (org, org - '0 -12 0', TRUE, world);\r
332         if (trace_fraction < 1)\r
333         {\r
334                 loc = trace_endpos;\r
335                 traceline (loc, loc + '0 -12 0', TRUE, world);\r
336                 if (trace_fraction >= 1)\r
337                         org = loc + '0 -12 0';\r
338         }\r
339 \r
340         traceline (org, org - '0 0 12' , TRUE, world);\r
341         if (trace_fraction < 1)\r
342         {\r
343                 loc = trace_endpos;\r
344                 traceline (loc, loc + '0 0 12', TRUE, world);\r
345                 if (trace_fraction >= 1)\r
346                         org = loc + '0 0 12';\r
347         }\r
348 \r
349         traceline (org, org - '0 0 -12', TRUE, world);\r
350         if (trace_fraction < 1)\r
351         {\r
352                 loc = trace_endpos;\r
353                 traceline (loc, loc + '0 0 -12', TRUE, world);\r
354                 if (trace_fraction >= 1)\r
355                         org = loc + '0 0 -12';\r
356         }\r
357 \r
358         return org;\r
359 }\r
360 \r
361 /*\r
362 ==================\r
363 crandom\r
364 \r
365 Returns a random number between -1.0 and 1.0\r
366 ==================\r
367 */\r
368 float crandom (void)\r
369 {\r
370         return 2 * (random () - 0.5);\r
371 }\r
372 \r
373 /*\r
374 ==================\r
375 Angc used for animations\r
376 ==================\r
377 */\r
378 \r
379 \r
380 float angc (float a1, float a2)\r
381 {\r
382         float   a;\r
383 \r
384         while (a1 > 180)\r
385                 a1 = a1 - 360;\r
386         while (a1 < -179)\r
387                 a1 = a1 + 360;\r
388 \r
389         while (a2 > 180)\r
390                 a2 = a2 - 360;\r
391         while (a2 < -179)\r
392                 a2 = a2 + 360;\r
393 \r
394         a = a1 - a2;\r
395         while (a > 180)\r
396                 a = a - 360;\r
397         while (a < -179)\r
398                 a = a + 360;\r
399 \r
400         return a;\r
401 }\r
402 \r
403 \r
404 /*\r
405 ================\r
406 InitTrigger\r
407 ================\r
408 */\r
409 \r
410 void() SetMovedir =\r
411 {\r
412         if (self.movedir != '0 0 0')\r
413                 self.movedir = normalize(self.movedir);\r
414         else\r
415         {\r
416                 if (self.angles == '0 -1 0')\r
417                         self.movedir = '0 0 1';\r
418                 else if (self.angles == '0 -2 0')\r
419                         self.movedir = '0 0 -1';\r
420                 else\r
421                 {\r
422                         makevectors (self.angles);\r
423                         self.movedir = v_forward;\r
424                 }\r
425         }\r
426 \r
427         self.angles = '0 0 0';\r
428 };\r
429 \r
430 void() InitTrigger =\r
431 {\r
432 // trigger angles are used for one-way touches.  An angle of 0 is assumed\r
433 // to mean no restrictions, so use a yaw of 360 instead.\r
434         if (self.movedir == '0 0 0')\r
435         if (self.angles != '0 0 0')\r
436                 SetMovedir ();\r
437         self.solid = SOLID_TRIGGER;\r
438         setmodel (self, self.model);    // set size and link into world\r
439         self.movetype = MOVETYPE_NONE;\r
440         self.modelindex = 0;\r
441         self.model = "";\r
442 };\r
443 \r
444 void() InitSolidBSPTrigger =\r
445 {\r
446 // trigger angles are used for one-way touches.  An angle of 0 is assumed\r
447 // to mean no restrictions, so use a yaw of 360 instead.\r
448         if (self.movedir == '0 0 0')\r
449         if (self.angles != '0 0 0')\r
450                 SetMovedir ();\r
451         self.solid = SOLID_BSP;\r
452         setmodel (self, self.model);    // set size and link into world\r
453         self.movetype = MOVETYPE_PUSH;\r
454 //      self.modelindex = 0;\r
455         self.model = "";\r
456 };\r