]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tftesla.c
- Tesla no longer crashes game while attacking (changed MSG_BROADCAST to "2")
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tftesla.c
1 /*~\r
2 ========================================\r
3         Custom TF/BeyondTF Tesla Coil\r
4 ========================================\r
5         Originally made for Custom TF\r
6         Borrowed from Catch22's BeyondTF\r
7         Modified by XavioR (aka avirox) for MegaTF United and Team:Nexuiz\r
8                                                                                                                                                 ~*/\r
9 \r
10 float () Tesla_Fire;\r
11 float () Tesla_FindTarget;\r
12 void () Tesla_FoundTarget;\r
13 \r
14 .float frame_loop;\r
15 void () Tesla_Animate =\r
16 {\r
17         if (self.owner.health <= 0 || (!self.owner))\r
18                 dremove(self);\r
19 \r
20         if (self.owner.effects == (self.owner.effects | 8))\r
21         {\r
22                 if (self.owner.frame > 3)\r
23                         self.owner.frame = 0;\r
24                 else if (self.owner.frame == 0)\r
25                         self.owner.frame = 1;\r
26                 else if (self.owner.frame == 1)\r
27                         self.owner.frame = 2;\r
28                 else if (self.owner.frame == 2)\r
29                         self.owner.frame = 3;\r
30         }\r
31         else \r
32         {\r
33                 if (self.frame_loop == 0)\r
34                         self.frame = 5;\r
35                 else if (self.frame_loop == 1)\r
36                         self.owner.frame = 6;\r
37                 else if (self.frame_loop == 2)\r
38                         self.owner.frame = 7;\r
39                 else if (self.frame_loop == 3)\r
40                         self.owner.frame = 8;\r
41                 else if (self.frame_loop == 4)\r
42                         self.owner.frame = 9;\r
43                 else if (self.frame_loop == 5)\r
44                         self.owner.frame = 8;\r
45                 else if (self.frame_loop == 6)\r
46                         self.owner.frame = 7;\r
47                 else if (self.frame_loop == 7)\r
48                         self.owner.frame = 6;\r
49                 else if (self.frame_loop == 8)\r
50                         self.owner.frame = 5;\r
51                 else if (self.frame_loop == 9) {\r
52                         self.owner.frame = 4;\r
53                         self.frame_loop = -1;\r
54                 }\r
55                 self.frame_loop = self.frame_loop + 1;\r
56         }\r
57 \r
58         self.nextthink = time + .05;\r
59 };\r
60 \r
61 \r
62 void () Tesla_Idle =\r
63 {\r
64         if (self.waitmax)\r
65         {\r
66                 self.waitmax = Tesla_Fire ();\r
67         }\r
68         if ((self.waitmax == 0))\r
69         {\r
70                 if (Tesla_FindTarget ())\r
71                 {\r
72                         self.waitmax = 1;\r
73                 }\r
74                 else\r
75                 {\r
76                         self.effects = (self.effects - (self.effects & 8));\r
77                         self.nextthink = (time + 0.250000);\r
78                 }\r
79         }\r
80         self.think = Tesla_Idle;\r
81 };\r
82 \r
83 float () Tesla_FindTarget =\r
84 {\r
85         local entity client;\r
86         local entity te;\r
87         local float r;\r
88         local float gotone;\r
89         local float loopc;\r
90 \r
91         if ((self.tf_items & 2))\r
92         {\r
93                 self.origin_z = (self.origin_z - 40);\r
94         }\r
95         else\r
96         {\r
97                 self.origin_z = (self.origin_z + 24);\r
98         }\r
99         r = 0;\r
100         loopc = 0;\r
101         gotone = 0;\r
102         while (((loopc < 8) && (gotone == 0)))\r
103         {\r
104                 client = checkclient ();\r
105                 te = find (world, classname, "bot");\r
106                 if (te)\r
107                 {\r
108                         if (te.health)\r
109                         {\r
110                                 if (visible (te))\r
111                                 {\r
112                                         client = te;\r
113                                 }\r
114                         }\r
115                 }\r
116                 gotone = 1;\r
117                 if (!client)\r
118                 {\r
119                         gotone = 0;\r
120                 }\r
121                 if ((client.playerclass == 0))\r
122                 {\r
123                         gotone = 0;\r
124                 }\r
125                 if ((client.health <= 0))\r
126                 {\r
127                         gotone = 0;\r
128                 }\r
129                 if (client.has_disconnected)\r
130                 {\r
131                         gotone = 0;\r
132                 }\r
133                 if (teamplay)\r
134                 {\r
135                         if (((client.team_no == self.team_no) && (self.team_no != 0)))\r
136                         {\r
137                                 gotone = 0;\r
138                         }\r
139                         if (((client.undercover_team == self.team_no) && (self.team_no != 0)))\r
140                         {\r
141                                 if (!(self.tf_items & 1024))\r
142                                 {\r
143                                         gotone = 0;\r
144                                 }\r
145                         }\r
146                 }\r
147                 if ((client == self.real_owner))\r
148                 {\r
149                         gotone = 0;\r
150                 }\r
151 /*              if (client.is_feigning)                         // no feigning in NTF (yet?)\r
152                 {\r
153                         if (!(self.tf_items & 1024))\r
154                         {\r
155                                 gotone = 0;\r
156                         }\r
157                 }*/\r
158                 if ((client.flags & 128))\r
159                 {\r
160                         gotone = 0;\r
161                 }\r
162                 if ((client.items & 524288))\r
163                 {\r
164                         gotone = 0;\r
165                 }\r
166                 if (!visible (client))\r
167                 {\r
168                         gotone = 0;\r
169                 }\r
170                 r = vlen ((client.origin - self.origin));\r
171                 if (((self.ammo_shells == 0) && (r > 400)))\r
172                 {\r
173                         gotone = 0;\r
174                 }\r
175                 if (((self.ammo_shells == 1) && (r > 800)))\r
176                 {\r
177                         gotone = 0;\r
178                 }\r
179                 if (((self.ammo_shells == 2) && (r > 1200)))\r
180                 {\r
181                         gotone = 0;\r
182                 }\r
183                 loopc = loopc + 1;\r
184                 if (gotone)\r
185                 {\r
186                         loopc = 1000;\r
187                 }\r
188         }\r
189         if ((self.tf_items & 2))\r
190         {\r
191                 self.origin_z = (self.origin_z + 40);\r
192         }\r
193         else\r
194         {\r
195                 self.origin_z = (self.origin_z - 24);\r
196         }\r
197         if (!gotone)\r
198         {\r
199                 return (0);\r
200         }\r
201         if ((self.enemy == client))\r
202         {\r
203                 return (Tesla_Fire ());\r
204         }\r
205         self.enemy = client;\r
206         if (((self.enemy.classname != "player") && (self.enemy.classname != "bot")))\r
207         {\r
208                 self.enemy = self.enemy.enemy;\r
209                 if (((self.enemy.classname != "player") && (self.enemy.classname != "bot")))\r
210                 {\r
211                         self.enemy = world;\r
212                         return (0);\r
213                 }\r
214         }\r
215         Tesla_FoundTarget ();\r
216         return (1);\r
217 };\r
218 \r
219 void () Tesla_FoundTarget =\r
220 {\r
221         if ((self.ammo_cells > self.waitmin))\r
222         {\r
223                 sound (self, 2, "weapons/guerilla_set.wav", 1, 1);\r
224         }\r
225         self.effects = (self.effects | 8);\r
226         self.goalentity = self.enemy;\r
227         if ((self.ammo_nails <= 1))\r
228         {\r
229                 self.nextthink = (time + 1);\r
230         }\r
231         else\r
232         {\r
233                 if ((self.ammo_nails == 2))\r
234                 {\r
235                         self.nextthink = (time + 0.500000);\r
236                 }\r
237                 else\r
238                 {\r
239                         self.nextthink = (time + 1.500000);\r
240                 }\r
241         }\r
242         if ((self.enemy.modelindex == modelindex_null))\r
243         {\r
244                 self.nextthink = (self.nextthink + 2);\r
245         }\r
246         else\r
247         {\r
248                 if ((self.enemy.modelindex == modelindex_eyes))\r
249                 {\r
250                         self.nextthink = (self.nextthink + 1.500000);\r
251                 }\r
252         }\r
253         if ((self.tf_items & 1))\r
254         {\r
255                 self.nextthink = (time + 0.500000);\r
256         }\r
257 };\r
258 \r
259 void () Tesla_Pain =\r
260 {\r
261         self.real_owner.StatusRefreshTime = (time + 0.200000);\r
262 };\r
263 \r
264 void () Tesla_Die =\r
265 {\r
266         sprint (self.real_owner, "Your tesla coil was destroyed.\n");\r
267         self.real_owner.has_tesla = 0;\r
268         self.real_owner.has_turretized_tesla = 0;\r
269 /*      ThrowGib ("progs/tgib1.mdl", -70);                      // use other explosion method?\r
270         ThrowGib ("progs/tgib2.mdl", -70);\r
271         ThrowGib ("progs/tgib3.mdl", -70);*/\r
272         WriteByte (2, 23);\r
273         WriteByte (2, 3);\r
274         WriteCoord (4, self.origin_x);\r
275         WriteCoord (4, self.origin_y);\r
276         WriteCoord (4, self.origin_z);\r
277 //      multicast (self.origin, 1);                     // where are my scriptable particles? :(\r
278         BecomeExplosion ();\r
279 };\r
280 \r
281 float () Tesla_Fire =\r
282 {\r
283         local vector dir;\r
284         local float damage;\r
285 \r
286         dir = self.enemy.origin - self.origin;\r
287         if ((self.enemy.classname == "bot"))\r
288         {\r
289                 dir = (self.enemy.origin + '0 0 -35') - self.origin;\r
290         }\r
291         if (!self.enemy)\r
292         {\r
293                 return (0);\r
294         }\r
295         if ((self.enemy == world))\r
296         {\r
297                 return (0);\r
298         }\r
299         if (self.enemy.has_disconnected)\r
300         {\r
301                 self.enemy = world;\r
302                 return (0);\r
303         }\r
304 /*      if (self.enemy.is_feigning)                     // no feigning yet\r
305         {\r
306                 if (!(self.tf_items & 1024))\r
307                 {\r
308                         return (0);\r
309                 }\r
310         }*/\r
311         if ((self.tf_items & 2))\r
312         {\r
313                 self.origin_z = (self.origin_z - 40);\r
314         }\r
315         else\r
316         {\r
317                 self.origin_z = (self.origin_z + 24);\r
318         }\r
319         if (!visible (self.enemy))\r
320         {\r
321                 if ((self.tf_items & 2))\r
322                 {\r
323                         self.origin_z = (self.origin_z + 40);\r
324                 }\r
325                 else\r
326                 {\r
327                         self.origin_z = (self.origin_z - 24);\r
328                 }\r
329                 return (0);\r
330         }\r
331         self.ammo_cells = (self.ammo_cells - self.waitmin);\r
332         if ((self.ammo_cells < 0))\r
333         {\r
334                 self.ammo_cells = 0;\r
335                 if ((self.tf_items & 2))\r
336                 {\r
337                         self.origin_z = (self.origin_z + 40);\r
338                 }\r
339                 else\r
340                 {\r
341                         self.origin_z = (self.origin_z - 24);\r
342                 }\r
343                 self.enemy = world;\r
344                 return (0);\r
345         }\r
346         self.effects = (self.effects | 8);\r
347         deathmsg = 51;\r
348         WriteByte (2, 23);\r
349         WriteByte (2, 6);\r
350         WriteEntity (4, self);\r
351         WriteCoord (4, self.origin_x);\r
352         WriteCoord (4, self.origin_y);\r
353         WriteCoord (4, (self.origin_z + 24));\r
354         WriteCoord (4, self.enemy.origin_x);\r
355         WriteCoord (4, self.enemy.origin_y);\r
356         WriteCoord (4, self.enemy.origin_z);\r
357 //      void(entity own, vector start, vector end) te_lightning2 = #429;\r
358 //      te_lightning2(self, self.origin, self.enemy.origin);\r
359 //      multicast (self.origin, 1);     \r
360         sound (self, 1, "weapons/tesla.wav", 1, 1);\r
361         if ((self.ammo_nails == 0))\r
362         {\r
363                 damage = 40;\r
364         }\r
365         if ((self.ammo_nails == 1))\r
366         {\r
367                 damage = 100;\r
368         }\r
369         if ((self.ammo_nails == 2))\r
370         {\r
371                 damage = 200;\r
372         }\r
373         if ((self.ammo_nails == 3))\r
374         {\r
375                 damage = 400;\r
376         }\r
377 \r
378         TF_T_Damage (self.enemy, self, self.real_owner, damage, 2, 8);\r
379         if ((self.ammo_nails <= 1))\r
380         {\r
381                 self.nextthink = (time + 1.500000);\r
382         }\r
383         else\r
384         {\r
385                 if ((self.ammo_nails == 2))\r
386                 {\r
387                         self.nextthink = (time + 1);\r
388                 }\r
389                 else\r
390                 {\r
391                         self.nextthink = (time + 2);\r
392                 }\r
393         }\r
394         if (((self.ammo_cells == 0) && (random () < 0.100000)))\r
395         {\r
396                 sprint (self.real_owner, "Tesla is out of cells.\n");\r
397         }\r
398         else\r
399         {\r
400                 if ((self.ammo_cells <= self.waitmin))\r
401                 {\r
402                         sprint (self.real_owner, "Tesla is low on cells.\n");\r
403                 }\r
404         }\r
405         if ((self.tf_items & 2))\r
406         {\r
407                 self.origin_z = (self.origin_z + 40);\r
408         }\r
409         else\r
410         {\r
411                 self.origin_z = (self.origin_z - 24);\r
412         }\r
413         if ((self.enemy.health <= 0))\r
414         {\r
415                 self.enemy = world;\r
416                 return (0);\r
417         }\r
418         return (1);\r
419 };\r
420 \r
421 void () Tesla_Touch =\r
422 {\r
423         if ((pointcontents (self.origin) == -6))\r
424         {\r
425                 sprint (self.real_owner, "Your sentry gun flew away.\n");\r
426                 Tesla_Die ();\r
427                 return;\r
428         }\r
429         if ((other.takedamage && !(self.tf_items & 2)))\r
430         {\r
431                 deathmsg = 52;\r
432                 if ((((other.team_no > 0) && (other.team_no != self.real_owner.team_no)) && (other.is_undercover != 1)))\r
433                 {\r
434                         TF_T_Damage (other, self, self.real_owner, 400, 2, 8);\r
435                 }\r
436                 return;\r
437         }\r
438         if (((self.tf_items & 2) && (self.movetype == 5)))\r
439         {\r
440                 if (((((((((pointcontents (self.origin) == -6) || (pointcontents ((self.origin - '0 0 10')) == -6)) || (pointcontents ((self.origin + '0 0 5')) == -6)) || (pointcontents ((self.origin + '0 0 10')) == -6)) || (pointcontents ((self.origin + '0 0 15')) == -6)) || (pointcontents ((self.origin + '0 0 20')) == -6)) || (pointcontents ((self.origin + '0 0 30')) == -6)) || (pointcontents ((self.origin + '0 0 40')) == -6)))\r
441                 {\r
442                         sprint (self.real_owner, "Your sentry gun flew away.\n");\r
443                         Tesla_Die ();\r
444                         return;\r
445                 }\r
446                 if ((other == world))\r
447                 {\r
448                         self.flags = (self.flags | 512);\r
449                         self.movetype = 4;\r
450                         self.origin_z = (self.origin_z + 40);\r
451                         return;\r
452                 }\r
453                 else\r
454                 {\r
455                         if ((other.classname == "player"))\r
456                         {\r
457                                 deathmsg = 52;\r
458                                 TF_T_Damage (other, self, self.real_owner, 400, 2, 8);\r
459                         }\r
460                 }\r
461                 Tesla_Die ();\r
462         }\r
463 };\r