]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tffunctions.c
- Spring cleaning! Cleaned up a lot of FTE warnings regarding unused locals
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tffunctions.c
1 // TF fucntions\r
2 .float goal_no;         // goal number - pair with defs file\r
3 .float goal_result; // pair with defs\r
4 .float else_goal;       // not sure\r
5 .float goal_result;\r
6 .float is_removed;      // entity is removed?\r
7 float (entity _p_10934, entity _p_10935) Activated;\r
8 float (float tno) TeamFortress_TeamGetScore;\r
9 float (float tno) TeamFortress_TeamGetColor;\r
10 void (entity _p_10980, entity _p_10981, float _p_10982) DoResults; //< - score increase thing\r
11 void (entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer;\r
12 void(entity client, string s) CenterPrint = #73;\r
13 \r
14 // misc stuff (move to TFDefs file)\r
15 entity newmis;          // This is what tf uses for spawning entities\r
16 .float has_disconnected;        //has the player disconnected?\r
17 .float no_grenades_1;\r
18 .float no_grenades_2;\r
19 //.float no_grenades_3;         //player has no gren3? Thought we should use this for the impulse 30/31 class specials\r
20 .float pausetime;       // not sure\r
21 float team1lives;\r
22 float team2lives;\r
23 float team3lives;\r
24 float team4lives;\r
25 float team1maxplayers;\r
26 float team2maxplayers;\r
27 float team3maxplayers;\r
28 float team4maxplayers;\r
29 /*float team1advantage;                 // might implement this later -- this is used in the function that\r
30 float team2advantage;                   //// displays messages like: "Team blah has an advantage of X players"\r
31 float team3advantage;\r
32 float team4advantage;*/\r
33 \r
34 // stuff that still needs a function\r
35 float number_of_teams; // Number of teams == IMPORTANT\r
36 \r
37 // Color/Teamchange cheat detection (using DP functions instead of tf)\r
38 void (entity ent, float colors) setcolor;\r
39 \r
40 // The following controls the team color of the player in-game, since DP can control color change\r
41 // Note: If anyone ever wants to add a spy color disguise fucntion, here's the places\r
42 void SV_ChangeTeam(float color)\r
43 {\r
44         local float team_color;\r
45 \r
46         if (self.team_no == 1 && color != 13)\r
47         {\r
48 //              setcolor(self, 13);             // used to use this for teams, ignore.\r
49                 team_color = TeamFortress_TeamGetColor(1) - 1;\r
50         }\r
51         if (self.team_no == 2 && color != 4)\r
52         {\r
53 //              setcolor(self, 4,4);\r
54                 team_color = TeamFortress_TeamGetColor(2) - 1;\r
55         }\r
56         if (self.team_no == 3 && color != 12)\r
57         {\r
58 //              setcolor(self, 12,12);\r
59                 team_color = TeamFortress_TeamGetColor(3) - 1;\r
60         }\r
61         if (self.team_no == 4 && color != 11)\r
62         {\r
63 //              setcolor(self, 11,11);\r
64                 team_color = TeamFortress_TeamGetColor(4) - 1;\r
65         }\r
66         setcolor(self, 16*team_color + team_color);\r
67 };\r
68 \r
69 \r
70 void(entity targ, entity attacker) ClientObituary =\r
71 {\r
72         ClientObituary(targ,attacker);          // TEMP -- SOON I WILL ADD REAL DEATH MESSAGES\r
73 };\r
74 \r
75 void () DoTFAliases =\r
76 {\r
77                 TeamFortress_Alias("primeone", 150, TF_FLARE_LIT);\r
78                 TeamFortress_Alias("primetwo", 151, TF_FLARE_LIT);\r
79                 TeamFortress_Alias("throwgren", 152, TF_FLARE_LIT);\r
80                 TeamFortress_Alias("+gren1", 150, TF_FLARE_LIT);\r
81                 TeamFortress_Alias("+gren2", 151, TF_FLARE_LIT);\r
82                 TeamFortress_Alias("-gren1", 152, TF_FLARE_LIT);\r
83                 TeamFortress_Alias("-gren2", 152, TF_FLARE_LIT);\r
84                 TeamFortress_Alias("dropflag", DROP_FLAG_IMPULSE, TF_FLARE_LIT);\r
85 };\r
86 \r
87 void (entity tempent) dremove =\r
88 {\r
89         if ((tempent == world))\r
90         {\r
91                 dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n");\r
92                 dprint ("WORLD has nearly been removed. Don't worry\n");\r
93                 dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n");\r
94                 return;\r
95         }\r
96         if ((tempent.is_removed == 1.000000))\r
97         {\r
98                 return;\r
99         }\r
100         tempent.is_removed = 1.000000;\r
101         remove (tempent);\r
102 };\r
103 \r
104 entity (float gno) Findgoal =\r
105 {\r
106         local entity tg;\r
107         local string st;\r
108 \r
109         tg = find (world, classname, "info_tfgoal");\r
110         while (tg)\r
111         {\r
112                 if ((tg.goal_no == gno))\r
113                 {\r
114                         return (tg);\r
115                 }\r
116                 tg = find (tg, classname, "info_tfgoal");\r
117         }\r
118         dprint ("Could not find a goal with a goal_no of ");\r
119         st = ftos (gno);\r
120         dprint (st);\r
121         dprint (".\n");\r
122         //return (tg);\r
123 };\r
124 \r
125 void(entity Goal, entity AP, entity ActivatingGoal) AttemptToActivate = \r
126 {\r
127         local entity te;\r
128         if (Activated(Goal, AP))\r
129         {\r
130                 if (ActivatingGoal == Goal)\r
131                 {\r
132                         DoResults(Goal, AP, TF_FLARE_OFF);\r
133                 }\r
134                 else\r
135                 {\r
136                         if (ActivatingGoal != world)\r
137                         {\r
138                                 DoResults(Goal, AP, ActivatingGoal.goal_result & 2);\r
139                         }\r
140                         else\r
141                         {\r
142                                 DoResults(Goal, AP, TF_FLARE_LIT);\r
143                         }\r
144                 }\r
145         }\r
146         else\r
147         {\r
148                 if (Goal.else_goal != TF_FLARE_LIT)\r
149                 {\r
150                         te = Findgoal(Goal.else_goal);\r
151                         if (te)\r
152                         {\r
153                                 AttemptToActivate(te, AP, ActivatingGoal);\r
154                         }\r
155                 }\r
156         }\r
157 };\r
158 \r
159 void (entity p) TeamFortress_SetSpeed =\r
160 {\r
161         local string sp;\r
162         local float tf;\r
163         local entity te;\r
164 \r
165         stuffcmd (p, "cl_movespeedkey 1\n");\r
166         if ((p.tfstate & 65536))\r
167         {\r
168                 if ((0 == 1))\r
169                 {\r
170                         stuffcmd (p, "m_forward 0\n");\r
171                         stuffcmd (p, "m_side 0\n");\r
172                 }\r
173                 p.velocity = '0 0 0';\r
174                 stuffcmd (p, "cl_backspeed 0\n");\r
175                 stuffcmd (p, "cl_forwardspeed 0\n");\r
176                 stuffcmd (p, "cl_sidespeed 0\n");\r
177                 return;\r
178         }\r
179         else\r
180         {\r
181                 if ((0 == 1))\r
182                 {\r
183                         stuffcmd (p, "m_forward 1\n");\r
184                         stuffcmd (p, "m_side 0.8\n");\r
185                 }\r
186         }\r
187         if ((p.class == 1))             //scout speed\r
188         {\r
189                 p.maxfbspeed = 450;\r
190                 p.maxstrafespeed = 450;\r
191         }\r
192         else\r
193         {\r
194                 if ((p.class == 2.1))                   // No sniper in nextf\r
195                 {\r
196                         p.maxfbspeed = 300;\r
197                         p.maxstrafespeed = 300;\r
198                 }\r
199                 else\r
200                 {\r
201                         if ((p.class == 4))             //soldier speed\r
202                         {\r
203                                 p.maxfbspeed = 240;\r
204                                 p.maxstrafespeed = 240;\r
205                         }\r
206                         else\r
207                         {\r
208                                 if ((p.class == 4.1))           // No demoman in nextf\r
209                                 {\r
210                                         p.maxfbspeed = 280;\r
211                                         p.maxstrafespeed = 280;\r
212                                 }\r
213                                 else\r
214                                 {\r
215                                         if ((p.class == 16))            // Medic Speed\r
216                                         {\r
217                                                 p.maxfbspeed = 320;\r
218                                                 p.maxstrafespeed = 320;\r
219                                         }\r
220                                         else\r
221                                         {\r
222                                                 if ((p.class == 6.1))           // No HWGuy in nextf\r
223                                                 {\r
224                                                         p.maxfbspeed = 230;\r
225                                                         p.maxstrafespeed = 230;\r
226                                                 }\r
227                                                 else\r
228                                                 {\r
229                                                         if ((p.class == 8))             // Pyro Speed\r
230                                                         {\r
231                                                                 p.maxfbspeed = 300;\r
232                                                                 p.maxstrafespeed = 300;\r
233                                                         }\r
234                                                         else\r
235                                                         {\r
236                                                                 if ((p.class == 11))            // Wazat -- We need a Civ class\r
237                                                                 {\r
238                                                                         p.maxfbspeed = 240;\r
239                                                                         p.maxstrafespeed = 240;\r
240                                                                 }\r
241                                                                 else\r
242                                                                 {\r
243                                                                         if ((p.class == 2))             // Spy Speed\r
244                                                                         {\r
245                                                                                 p.maxfbspeed = 300;\r
246                                                                                 p.maxstrafespeed = 300;\r
247                                                                         }\r
248                                                                         else\r
249                                                                         {\r
250                                                                                 if ((p.class == 32))            // Engineer Speed\r
251                                                                                 {\r
252                                                                                         p.maxfbspeed = 300;\r
253                                                                                         p.maxstrafespeed = 300;\r
254                                                                                 }\r
255                                                                                 else\r
256                                                                                 {\r
257                                                                                         if ((p.class == 0))             // No class\r
258                                                                                         {\r
259                                                                                                 p.maxfbspeed = 320;\r
260                                                                                                 p.maxstrafespeed = 320;\r
261                                                                                                 return;\r
262                                                                                         }\r
263                                                                                 }\r
264                                                                         }\r
265                                                                 }\r
266                                                         }\r
267                                                 }\r
268                                         }\r
269                                 }\r
270                         }\r
271                 }\r
272         }\r
273         tf = 0;\r
274         te = find (world, classname, "item_tfgoal");\r
275         while (((te != world) && (tf == 0)))\r
276         {\r
277                 if ((te.owner == p))\r
278                 {\r
279                         if ((te.goal_activation & 2))\r
280                         {\r
281                                 tf = 1;\r
282                                 p.maxfbspeed = (p.maxfbspeed / 2);\r
283                                 p.maxstrafespeed = (p.maxstrafespeed / 2);\r
284                         }\r
285                 }\r
286                 te = find (te, classname, "item_tfgoal");\r
287         }\r
288         if ((p.tfstate & 32768))\r
289         {\r
290                 p.maxfbspeed = (p.maxfbspeed / 2);\r
291                 p.maxstrafespeed = (p.maxstrafespeed / 2);\r
292         }\r
293 /*      if (p.leg_damage)                       // Railgun does leg damage :D -- check cl_physics.c\r
294         {\r
295                 if ((p.leg_damage > 6))\r
296                 {\r
297                         p.leg_damage = 6;\r
298                 }\r
299                 p.maxfbspeed = (p.maxfbspeed * ((10 - p.leg_damage) / 10));\r
300                 p.maxstrafespeed = ((p.maxstrafespeed * (10 - p.leg_damage)) / 10);\r
301         }*/\r
302         if ((p.tfstate & 2048))\r
303         {\r
304                 if ((p.maxfbspeed > 80))\r
305                 {\r
306                         p.maxfbspeed = 80;\r
307                 }\r
308                 if ((p.maxstrafespeed > 80))\r
309                 {\r
310                         p.maxstrafespeed = 80;\r
311                 }\r
312         }\r
313         sp = ftos (p.maxfbspeed);\r
314         stuffcmd (p, "cl_backspeed ");\r
315         stuffcmd (p, sp);\r
316         stuffcmd (p, "\n");\r
317         stuffcmd (p, "cl_forwardspeed ");\r
318         stuffcmd (p, sp);\r
319         stuffcmd (p, "\n");\r
320         sp = ftos (p.maxstrafespeed);\r
321         stuffcmd (p, "cl_sidespeed ");\r
322         stuffcmd (p, sp);\r
323         stuffcmd (p, "\n");\r
324 };\r
325 \r
326 float (entity Retriever, float AmmoType) TeamFortress_GetMaxAmmo =\r
327 {\r
328         if ((AmmoType == 256))\r
329         {\r
330                 return (Retriever.maxammo_shells);\r
331         }\r
332         else\r
333         {\r
334                 if ((AmmoType == 512))\r
335                 {\r
336                         return (Retriever.maxammo_nails);\r
337                 }\r
338                 else\r
339                 {\r
340                         if ((AmmoType == 2048))\r
341                         {\r
342                                 return (Retriever.maxammo_cells);\r
343                         }\r
344                         else\r
345                         {\r
346                                 if ((AmmoType == 1024))\r
347                                 {\r
348                                         return (Retriever.maxammo_rockets);\r
349                                 }\r
350                                 else\r
351                                 {\r
352                                         if ((AmmoType == 4))\r
353                                         {\r
354                                                 return (Retriever.maxammo_medikit);\r
355                                         }\r
356                                         else\r
357                                         {\r
358                                                 if ((AmmoType == 131072))\r
359                                                 {\r
360                                                         return (Retriever.maxammo_detpack);\r
361                                                 }\r
362                                         }\r
363                                 }\r
364                         }\r
365                 }\r
366         }\r
367         dprint ("Error in TeamFortress_GetMaxAmmo()\n");\r
368         dprint ("Invalid ammo type passed.\n");\r
369         return (0);\r
370 };\r
371 \r
372 void () TeamFortress_CheckClassStats =\r
373 {\r
374 //              Wazat - Implement your armor system here, eh?\r
375 /*      if ((self.armortype > self.armor_allowed))\r
376         {\r
377                 self.armortype = self.armor_allowed;\r
378         }*/\r
379         if ((self.armorvalue > self.max_armor))\r
380         {\r
381                 self.armorvalue = self.max_armor;\r
382         }\r
383         if ((self.armortype < 0))\r
384         {\r
385                 self.armortype = 0;\r
386         }\r
387         if ((self.armorvalue < 0))\r
388         {\r
389                 self.armorvalue = 0;\r
390         }\r
391         if ((self.ammo_shells > TeamFortress_GetMaxAmmo (self, 256)))\r
392         {\r
393                 self.ammo_shells = TeamFortress_GetMaxAmmo (self, 256);\r
394         }\r
395         if ((self.ammo_shells < 0))\r
396         {\r
397                 self.ammo_shells = 0;\r
398         }\r
399         if ((self.ammo_nails > TeamFortress_GetMaxAmmo (self, 512)))\r
400         {\r
401                 self.ammo_nails = TeamFortress_GetMaxAmmo (self, 512);\r
402         }\r
403         if ((self.ammo_nails < 0))\r
404         {\r
405                 self.ammo_nails = 0;\r
406         }\r
407         if ((self.ammo_rockets > (TeamFortress_GetMaxAmmo (self, 1024) * 3)))\r
408         {\r
409                 self.ammo_rockets = (TeamFortress_GetMaxAmmo (self, 1024) * 3);\r
410         }\r
411         if ((self.ammo_rockets < 0))\r
412         {\r
413                 self.ammo_rockets = 0;\r
414         }\r
415         if ((self.ammo_cells > TeamFortress_GetMaxAmmo (self, 2048)))\r
416         {\r
417                 self.ammo_cells = TeamFortress_GetMaxAmmo (self, 2048);\r
418         }\r
419         if ((self.ammo_cells < 0))\r
420         {\r
421                 self.ammo_cells = 0;\r
422         }\r
423         if ((self.ammo_medikit > TeamFortress_GetMaxAmmo (self, 4)))\r
424         {\r
425                 self.ammo_medikit = TeamFortress_GetMaxAmmo (self, 4);\r
426         }\r
427         if ((self.ammo_medikit < 0))\r
428         {\r
429                 self.ammo_medikit = 0;\r
430         }\r
431         if ((self.ammo_detpack > TeamFortress_GetMaxAmmo (self, 131072)))\r
432         {\r
433                 self.ammo_detpack = TeamFortress_GetMaxAmmo (self, 131072);\r
434         }\r
435         if ((self.ammo_detpack < 0))\r
436         {\r
437                 self.ammo_detpack = 0;\r
438         }\r
439         if ((self.no_grenades_1 < 0))\r
440         {\r
441                 self.no_grenades_1 = 0;\r
442         }\r
443         if ((self.no_grenades_2 < 0))\r
444         {\r
445                 self.no_grenades_2 = 0;\r
446         }\r
447 //              NexTF uses auto-rot, so there's no need for this function.\r
448 //      if (((self.health > self.max_health) && !(self.items & 65536)))\r
449 //      {\r
450 //              TF_T_Damage (self, world, world, (self.max_health - self.health), 0, 256);\r
451 //      }\r
452         if ((self.health < 0))\r
453         {\r
454                 T_Heal (self, (self.health - self.health), 0);\r
455         }\r
456         self.items = (self.items - (self.items & ((8192 | 16384) | 32768)));\r
457         if ((self.armortype >= 0.8))\r
458         {\r
459                 self.items = (self.items | 32768);\r
460         }\r
461         else\r
462         {\r
463                 if ((self.armortype >= 0.6))\r
464                 {\r
465                         self.items = (self.items | 16384);\r
466                 }\r
467                 else\r
468                 {\r
469                         if ((self.armortype >= 0.3))\r
470                         {\r
471                                 self.items = (self.items | 8192);\r
472                         }\r
473                 }\r
474         }\r
475         weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now\r
476 };\r
477 \r
478 // TF Get Score Frags\r
479 float (float tno) TeamFortress_TeamGetScoreFrags =\r
480 {\r
481         if (((toggleflags & 128) || (toggleflags & 2048)))\r
482         {\r
483                 if ((tno == 1))\r
484                 {\r
485                         return (team1score);\r
486                 }\r
487                 if ((tno == 2))\r
488                 {\r
489                         return (team2score);\r
490                 }\r
491                 if ((tno == 3))\r
492                 {\r
493                         return (team3score);\r
494                 }\r
495                 if ((tno == 4))\r
496                 {\r
497                         return (team4score);\r
498                 }\r
499         }\r
500         else\r
501         {\r
502                 if ((tno == 1))\r
503                 {\r
504                         return (team1frags);\r
505                 }\r
506                 if ((tno == 2))\r
507                 {\r
508                         return (team2frags);\r
509                 }\r
510                 if ((tno == 3))\r
511                 {\r
512                         return (team3frags);\r
513                 }\r
514                 if ((tno == 4))\r
515                 {\r
516                         return (team4frags);\r
517                 }\r
518         }\r
519         return (0);\r
520 };\r
521 \r
522 // TF Get Team Winner\r
523 float () TeamFortress_TeamGetWinner =\r
524 {\r
525         local float i;\r
526         local float j;\r
527         local float highest;\r
528         local float highestteam;\r
529 \r
530         i = 1;\r
531         highest = 0;\r
532         highestteam = 0;\r
533         while ((i < (number_of_teams + 1)))\r
534         {\r
535                 j = TeamFortress_TeamGetScoreFrags (i);\r
536                 if ((j > highest))\r
537                 {\r
538                         highest = j;\r
539                         highestteam = i;\r
540                 }\r
541                 i = (i + 1);\r
542         }\r
543         return (highestteam);\r
544 };\r
545 \r
546 // TF Score Increaser\r
547 void (float tno, float scoretoadd) TeamFortress_TeamIncreaseScore =\r
548 {\r
549         local entity e;\r
550 \r
551         if (((tno == 0) || (scoretoadd == 0)))\r
552         {\r
553                 return;\r
554         }\r
555         if ((tno == 1))\r
556         {\r
557                 team1score = (team1score + scoretoadd);\r
558         }\r
559         if ((tno == 2))\r
560         {\r
561                 team2score = (team2score + scoretoadd);\r
562         }\r
563         if ((tno == 3))\r
564         {\r
565                 team3score = (team3score + scoretoadd);\r
566         }\r
567         if ((tno == 4))\r
568         {\r
569                 team4score = (team4score + scoretoadd);\r
570         }\r
571         if (((toggleflags & 128) || (toggleflags & 2048)))\r
572         {\r
573                 e = find (world, classname, "player");\r
574                 while (e)\r
575                 {\r
576                         if ((e.team_no == tno))\r
577                         {\r
578                                 e.frags = TeamFortress_TeamGetScore (tno);\r
579                         }\r
580                         e = find (e, classname, "player");\r
581                 }\r
582         }\r
583 };\r
584 \r
585 // Returns Team Color Name (String)\r
586 string (float tno) TeamFortress_TeamGetColorString =\r
587 {\r
588         local float col;\r
589 \r
590         col = TeamFortress_TeamGetColor (tno);\r
591         if ((col == 1))\r
592         {\r
593                 return ("White");\r
594         }\r
595         if ((col == 2))\r
596         {\r
597                 return ("Brown");\r
598         }\r
599         if ((col == 3))\r
600         {\r
601                 return ("Blue");\r
602         }\r
603         if ((col == 4))\r
604         {\r
605                 return ("Green");\r
606         }\r
607         if ((col == 5))\r
608         {\r
609                 return ("Red");\r
610         }\r
611         if ((col == 6))\r
612         {\r
613                 return ("Tan");\r
614         }\r
615         if ((col == 7))\r
616         {\r
617                 return ("Pink");\r
618         }\r
619         if ((col == 8))\r
620         {\r
621                 return ("Orange");\r
622         }\r
623         if ((col == 9))\r
624         {\r
625                 return ("Purple");\r
626         }\r
627         if ((col == 10))\r
628         {\r
629                 return ("DarkPurple");\r
630         }\r
631         if ((col == 11))\r
632         {\r
633                 return ("Grey");\r
634         }\r
635         if ((col == 12))\r
636         {\r
637                 return ("DarkGreen");\r
638         }\r
639         if ((col == 13))\r
640         {\r
641                 return ("Yellow");\r
642         }\r
643         return ("DarkBlue");\r
644 };\r
645 \r
646 // Is civilian?\r
647 float (float tno) TeamFortress_TeamIsCivilian =\r
648 {\r
649         if ((tno == 1))\r
650         {\r
651                 if ((civilianteams & 1))\r
652                 {\r
653                         return (1);\r
654                 }\r
655         }\r
656         else\r
657         {\r
658                 if ((tno == 2))\r
659                 {\r
660                         if ((civilianteams & 2))\r
661                         {\r
662                                 return (1);\r
663                         }\r
664                 }\r
665                 else\r
666                 {\r
667                         if ((tno == 3))\r
668                         {\r
669                                 if ((civilianteams & 4))\r
670                                 {\r
671                                         return (1);\r
672                                 }\r
673                         }\r
674                         else\r
675                         {\r
676                                 if ((civilianteams & 8))\r
677                                 {\r
678                                         return (1);\r
679                                 }\r
680                         }\r
681                 }\r
682         }\r
683         return (0);\r
684 };\r
685 \r
686 // Change Class\r
687 //              You use a different method of handling this tho Wazat?\r
688 void () TeamFortress_ChangeClass;\r
689 /*void () TeamFortress_ChangeClass =\r
690 {\r
691         local entity spot;\r
692         local entity te;\r
693         local float tc;\r
694         local string st;\r
695 \r
696         if ((self.playerclass != 0))\r
697         {\r
698                 if (((deathmatch != 3) && (cb_prematch_time < time)))\r
699                 {\r
700                         return;\r
701                 }\r
702                 if (TeamFortress_TeamIsCivilian (self.team_no))\r
703                 {\r
704                         sprint (self, "You cannot change class.\n");\r
705                         return;\r
706                 }\r
707                 if (!IsLegalClass ((self.impulse - 100)))\r
708                 {\r
709                         sprint (self, "Your team cannot play that class.\n");\r
710                         TeamFortress_DisplayLegalClasses ();\r
711                         return;\r
712                 }\r
713                 if (((spy_off == 1) && ((self.impulse - 100) == 8)))\r
714                 {\r
715                         sprint (self, "The spy class has been disabled on the server by the administrator.\n");\r
716                         return;\r
717                 }\r
718                 self.nextpc = (self.impulse - 100);\r
719                 sprint (self, "After dying, you will return as a ");\r
720                 TeamFortress_PrintClassName (self, self.nextpc, (self.tfstate & 8));\r
721                 self.immune_to_check = (time + 10);\r
722                 return;\r
723         }\r
724         if ((teamplay && (self.team_no == 0)))\r
725         {\r
726                 if ((toggleflags & 64))\r
727                 {\r
728                         if ((TeamFortress_TeamPutPlayerInTeam () == 0))\r
729                         {\r
730                                 return;\r
731                         }\r
732                 }\r
733                 else\r
734                 {\r
735                         sprint (self, "You must join a team first. \n");\r
736                         sprint (self, "use imin1, imin2, imin3, or imin4\n");\r
737                         return;\r
738                 }\r
739         }\r
740         if ((self.lives == 0))\r
741         {\r
742                 sprint (self, "You have no lives left.\n");\r
743                 return;\r
744         }\r
745         if ((!IsLegalClass ((self.impulse - 100)) && (self.impulse != 1)))\r
746         {\r
747                 sprint (self, "You cannot play that playerclass on this map. \n");\r
748                 TeamFortress_DisplayLegalClasses ();\r
749                 return;\r
750         }\r
751         if (((spy_off == 1) && ((self.impulse - 100) == 8)))\r
752         {\r
753                 sprint (self, "The spy class has been disabled on the server by the administrator.\n");\r
754                 return;\r
755         }\r
756         if ((self.impulse != 1))\r
757         {\r
758                 self.playerclass = (self.impulse - 100);\r
759         }\r
760         else\r
761         {\r
762                 self.playerclass = 11;\r
763         }\r
764         self.nextpc = 0;\r
765         self.takedamage = 2;\r
766         self.movetype = 3;\r
767         self.flags = (8 | 512);\r
768         self.waterlevel = 0;\r
769         self.air_finished = (time + 12);\r
770         self.solid = 3;\r
771         self.pausetime = 0;\r
772         spot = SelectSpawnPoint ();\r
773         self.origin = (spot.origin + '0 0 1');\r
774         self.angles = spot.angles;\r
775         self.fixangle = 1;\r
776         setmodel (self, string_null);\r
777         modelindex_null = self.modelindex;\r
778         setmodel (self, "progs/eyes.mdl");\r
779         modelindex_eyes = self.modelindex;\r
780         setmodel (self, "progs/player.mdl");\r
781         modelindex_player = self.modelindex;\r
782         setsize (self, '-16 -16 -24', '16 16 32');\r
783         self.view_ofs = '0 0 22';\r
784         player_stand1 ();\r
785         if ((deathmatch || coop))\r
786         {\r
787                 makevectors (self.angles);\r
788                 spawn_tfog ((self.origin + (v_forward * 20)));\r
789         }\r
790         if ((self.playerclass == 10))\r
791         {\r
792                 sprint (self, "Random Playerclass.\n");\r
793                 self.tfstate = (self.tfstate | 8);\r
794                 self.playerclass = (1 + floor ((random () * (10 - 1))));\r
795         }\r
796         if (((spot.classname == "info_player_teamspawn") && (cb_prematch_time < time)))\r
797         {\r
798                 if ((spot.items != 0))\r
799                 {\r
800                         te = Finditem (spot.items);\r
801                         if (te)\r
802                         {\r
803                                 tfgoalitem_GiveToPlayer (te, self, self);\r
804                         }\r
805                         if (!(spot.goal_activation & 1))\r
806                         {\r
807                                 spot.items = 0;\r
808                         }\r
809                 }\r
810                 if (spot.message)\r
811                 {\r
812                         CenterPrint (self, spot.message);\r
813                         if (!(spot.goal_activation & 2))\r
814                         {\r
815                                 spot.message = string_null;\r
816                         }\r
817                 }\r
818                 if ((spot.activate_goal_no != 0))\r
819                 {\r
820                         te = Findgoal (spot.activate_goal_no);\r
821                         if (te)\r
822                         {\r
823                                 AttemptToActivate (te, self, spot);\r
824                         }\r
825                 }\r
826                 if ((spot.goal_effects == 1))\r
827                 {\r
828                         spot.classname = "deadpoint";\r
829                         spot.team_str_home = string_null;\r
830                         spot.nextthink = (time + 1);\r
831                         spot.think = SUB_Remove;\r
832                 }\r
833         }\r
834         spot = find (world, classname, "player");\r
835         while (spot)\r
836         {\r
837                 if (((spot.team_no == self.team_no) && (spot != self)))\r
838                 {\r
839                         sprint (spot, 2, self.netname);\r
840                         sprint (spot, 2, " is playing as a ");\r
841                         TeamFortress_PrintClassName (spot, self.playerclass, (self.tfstate & 8));\r
842                 }\r
843                 spot = find (spot, classname, "player");\r
844         }\r
845         TeamFortress_PrintClassName (self, self.playerclass, (self.tfstate & 8));\r
846         TeamFortress_SetEquipment ();\r
847         TeamFortress_SetHealth ();\r
848         TeamFortress_SetSpeed (self);\r
849         TeamFortress_SetSkin (self);\r
850         if (cease_fire)\r
851         {\r
852                 sprint (self, "\n\nCEASE FIRE MODE\n");\r
853                 self.immune_to_check = (time + 10);\r
854                 self.tfstate = (self.tfstate | 65536);\r
855                 TeamFortress_SetSpeed (self);\r
856         }\r
857 };*/\r
858 \r
859 // Show what class each member of the team is -- NEEDS AN IMPULSE CALL FUNCTION\r
860 void (entity Player) TeamFortress_TeamShowMemberClasses =\r
861 {\r
862         local entity e;\r
863         local float found;\r
864 \r
865         found = 0;\r
866         e = find (world, classname, "player");\r
867         while (e)\r
868         {\r
869                 if ((((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player)))\r
870                 {\r
871                         if ((e.model != string_null))\r
872                         {\r
873                                 if (!found)\r
874                                 {\r
875                                         found = 1;\r
876                                         sprint (self, "The other members of your team are:\n");\r
877                                 }\r
878                                 sprint (Player, e.netname);\r
879                                 sprint (Player, " : ");\r
880 //                              TeamFortress_PrintClassName (Player, e.playerclass, (e.tfstate & 8));\r
881                                 TeamFortress_PrintClassName (Player, e.class, (e.tfstate & 8));\r
882                         }\r
883                 }\r
884                 e = find (e, classname, "player");\r
885         }\r
886         if (!found)\r
887         {\r
888                 sprint (Player, "There are no other players on your team.\n");\r
889         }\r
890 };\r
891 \r
892 // Returns class name value\r
893 string (float pc) TeamFortress_GetClassName =\r
894 {\r
895         if ((pc == 1))                  // Scout is class 1 (normal)\r
896         {\r
897                 return ("Scout");\r
898         }\r
899         else\r
900         {\r
901                 if ((pc == 2.1))\r
902                 {\r
903                         return ("Sniper");              // Player Class 2 is Spy in NexTF -- no Snipers\r
904                 }\r
905                 else\r
906                 {\r
907                         if ((pc == 4))                          // Player Class 4 is soldier in NexTF\r
908                         {\r
909                                 return ("Soldier");\r
910                         }\r
911                         else\r
912                         {\r
913                                 if ((pc == 4.1))                        // No DemoMan in NexTF\r
914                                 {\r
915                                         return ("Demolitions Man");\r
916                                 }\r
917                                 else\r
918                                 {\r
919                                         if ((pc == 16))\r
920                                         {\r
921                                                 return ("Combat Medic");                // Medic is Class 16 in NexTF\r
922                                         }\r
923                                         else\r
924                                         {\r
925                                                 if ((pc == 6.1))\r
926                                                 {\r
927                                                         return ("Heavy Weapons Guy");           // No HWGuy in NexTF\r
928                                                 }\r
929                                                 else\r
930                                                 {\r
931                                                         if ((pc == 8))\r
932                                                         {\r
933                                                                 return ("Pyro");                // Pyro is class 8 in NexTF\r
934                                                         }\r
935                                                         else\r
936                                                         {\r
937                                                                 if ((pc == 2))\r
938                                                                 {\r
939                                                                         return ("Spy");                 // Spy is class 2 in NexTF\r
940                                                                 }\r
941                                                                 else\r
942                                                                 {\r
943                                                                         if ((pc == 32))\r
944                                                                         {\r
945                                                                                 return ("Engineer");            // Engineer is class 32 in nextf\r
946                                                                         }\r
947                                                                         else\r
948                                                                         {\r
949                                                                                 if ((pc == 11))                 // Wazat- we need to make civ class\r
950                                                                                 {\r
951                                                                                         return ("Civilian");\r
952                                                                                 }\r
953                                                                                 else\r
954                                                                                 {\r
955                                                                                         if ((pc == 0))\r
956                                                                                         {\r
957                                                                                                 return ("Observer");\r
958                                                                                         }\r
959                                                                                         else\r
960                                                                                         {\r
961                                                                                                 if ((pc == 10))                 // Wazat- we need to add "random class" feature\r
962                                                                                                 {\r
963                                                                                                         return ("Random Playerclass");\r
964                                                                                                 }\r
965                                                                                         }\r
966                                                                                 }\r
967                                                                         }\r
968                                                                 }\r
969                                                         }\r
970                                                 }\r
971                                         }\r
972                                 }\r
973                         }\r
974                 }\r
975         }\r
976 };\r
977 \r
978 // Prints the classname using TeamFortress_GetClassName function\r
979 void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName =\r
980 {\r
981         local string st;\r
982 \r
983         st = TeamFortress_GetClassName (pc);\r
984         sprint (Viewer, st);\r
985         if ((rpc != 0))\r
986         {\r
987                 sprint (Viewer, " (Random)");\r
988         }\r
989         sprint (Viewer, "\n");\r
990 };\r
991 \r
992 // Returns Team Color Value\r
993 //                      note: this value is actually incorrect, the actual color values are the ones listed here\r
994 //                                minus one.\r
995 float (float tno) TeamFortress_TeamGetColor =\r
996 {\r
997         if ((tno == 1))\r
998         {\r
999                 return (14);\r
1000         }\r
1001         if ((tno == 2))\r
1002         {\r
1003                 return (5);\r
1004         }\r
1005         if ((tno == 3))\r
1006         {\r
1007                 return (13);\r
1008         }\r
1009         if ((tno == 4))\r
1010         {\r
1011                 return (12);\r
1012         }\r
1013         return (0);\r
1014 };\r
1015 \r
1016 // Returns Team Score Value\r
1017 float (float tno) TeamFortress_TeamGetScore =\r
1018 {\r
1019         if ((tno == 1))\r
1020         {\r
1021                 return (team1score);\r
1022         }\r
1023         if ((tno == 2))\r
1024         {\r
1025                 return (team2score);\r
1026         }\r
1027         if ((tno == 3))\r
1028         {\r
1029                 return (team3score);\r
1030         }\r
1031         if ((tno == 4))\r
1032         {\r
1033                 return (team4score);\r
1034         }\r
1035         return (0);\r
1036 };\r
1037 \r
1038 // Get Team Lives\r
1039 float (float tno) TeamFortress_TeamGetLives =\r
1040 {\r
1041         if ((tno == 1))\r
1042         {\r
1043                 return (team1lives);\r
1044         }\r
1045         if ((tno == 2))\r
1046         {\r
1047                 return (team2lives);\r
1048         }\r
1049         if ((tno == 3))\r
1050         {\r
1051                 return (team3lives);\r
1052         }\r
1053         if ((tno == 4))\r
1054         {\r
1055                 return (team4lives);\r
1056         }\r
1057         return (0);\r
1058 };\r
1059 \r
1060 // Show Team Scores\r
1061 void (float all) TeamFortress_TeamShowScores =\r
1062 {\r
1063         local string st;\r
1064         local float i;\r
1065         local float j;\r
1066 \r
1067         i = 1;\r
1068         if ((all == 2))\r
1069         {\r
1070                 while ((i <= number_of_teams))\r
1071                 {\r
1072                         if ((TeamFortress_TeamGetColor (i) > 0))\r
1073                         {\r
1074                                 j = TeamFortress_TeamGetScore (i);\r
1075                                 st = TeamFortress_TeamGetColorString (i);\r
1076 //                              bprint (st);\r
1077 //                              bprint (": ");\r
1078                                 bprint (st);\r
1079                                 bprint (": ");\r
1080                                 st = ftos (j);\r
1081                                 //bprint (st);\r
1082                                 //bprint (" ");\r
1083                                 bprint (st);\r
1084                                 bprint (" ");\r
1085                         }\r
1086                         i = (i + 1);\r
1087                 }\r
1088 //              bprint ("\n");\r
1089                 bprint ("\n");\r
1090                 return;\r
1091         }\r
1092         while ((i <= number_of_teams))\r
1093         {\r
1094                 if ((TeamFortress_TeamGetColor (i) > 0))\r
1095                 {\r
1096                         if (all)\r
1097                         {\r
1098                                 bprint ("Team ");\r
1099                         }\r
1100                         else\r
1101                         {\r
1102                                 sprint (self, "Team ");\r
1103                         }\r
1104                         st = ftos (i);\r
1105                         if (all)\r
1106                         {\r
1107                                 bprint (st);\r
1108                         }\r
1109                         else\r
1110                         {\r
1111                                 sprint (self, st);\r
1112                         }\r
1113                         if (all)\r
1114                         {\r
1115                                 bprint (" (");\r
1116                         }\r
1117                         else\r
1118                         {\r
1119                                 sprint (self, " (");\r
1120                         }\r
1121                         st = TeamFortress_TeamGetColorString (i);\r
1122                         if (all)\r
1123                         {\r
1124                                 bprint (st);\r
1125                         }\r
1126                         else\r
1127                         {\r
1128                                 sprint (self, st);\r
1129                         }\r
1130                         if (all)\r
1131                         {\r
1132                                 bprint (") : ");\r
1133                         }\r
1134                         else\r
1135                         {\r
1136                                 sprint (self, ") : ");\r
1137                         }\r
1138                         j = TeamFortress_TeamGetScore (i);\r
1139                         st = ftos (j);\r
1140                         if (all)\r
1141                         {\r
1142                                 bprint (st);\r
1143                         }\r
1144                         else\r
1145                         {\r
1146                                 sprint (self, st);\r
1147                         }\r
1148                         if (all)\r
1149                         {\r
1150                                 bprint ("\n");\r
1151                         }\r
1152                         else\r
1153                         {\r
1154                                 sprint (self, "\n");\r
1155                         }\r
1156                 }\r
1157                 i = (i + 1);\r
1158         }\r
1159 };\r
1160 \r
1161 // Get Number Of Players On Team\r
1162 float (float tno) TeamFortress_TeamGetNoPlayers =\r
1163 {\r
1164         local float size_team;\r
1165         local entity search;\r
1166 \r
1167         search = find (world, classname, "player");\r
1168         while ((search != world))\r
1169         {\r
1170                 if ((search.team_no == tno))\r
1171                 {\r
1172                         size_team = (size_team + 1);\r
1173                 }\r
1174                 search = find (search, classname, "player");\r
1175         }\r
1176         return (size_team);\r
1177 };\r
1178 \r
1179 // Get general number of players\r
1180 float () TeamFortress_GetNoPlayers =\r
1181 {\r
1182         local float nump;\r
1183         local entity search;\r
1184 \r
1185         search = find (world, classname, "player");\r
1186         while ((search != world))\r
1187         {\r
1188                 if ((search.netname != string_null))\r
1189                 {\r
1190                         nump = (nump + 1);\r
1191                 }\r
1192                 search = find (search, classname, "player");\r
1193         }\r
1194         return (nump);\r
1195 };\r
1196 \r
1197 // Get max players for a team\r
1198 float (float tno) TeamFortress_TeamGetMaxPlayers =\r
1199 {\r
1200         if ((tno == 1))\r
1201         {\r
1202                 return (team1maxplayers);\r
1203         }\r
1204         if ((tno == 2))\r
1205         {\r
1206                 return (team2maxplayers);\r
1207         }\r
1208         if ((tno == 3))\r
1209         {\r
1210                 return (team3maxplayers);\r
1211         }\r
1212         if ((tno == 4))\r
1213         {\r
1214                 return (team4maxplayers);\r
1215         }\r
1216         return (0);\r
1217 };\r
1218 \r
1219 // Set The Team Color\r
1220 void (float tno) TeamFortress_TeamSetColor =\r
1221 {\r
1222         if ((tno == 1))\r
1223         {\r
1224                 team1col = 14;\r
1225                 return;\r
1226         }\r
1227         if ((tno == 2))\r
1228         {\r
1229                 team2col = 5;\r
1230                 return;\r
1231         }\r
1232         if ((tno == 3))\r
1233         {\r
1234                 team3col = 13;\r
1235                 return;\r
1236         }\r
1237         if ((tno == 4))\r
1238         {\r
1239                 team4col = 12;\r
1240                 return;\r
1241         }\r
1242 };\r
1243 \r
1244 // Set The Team Number\r
1245 float (float tno) TeamFortress_TeamSet =\r
1246 {\r
1247         local string st;\r
1248         local float tc;\r
1249 \r
1250         if ((teamplay < 1))\r
1251         {\r
1252                 sprint (self, "Teamplay is not On, so FortressTeams are inactive.\n");\r
1253                 return (0);\r
1254         }\r
1255         if (((tno > number_of_teams) && (number_of_teams != 0)))\r
1256         {\r
1257                 sprint (self, "There can be only ");\r
1258                 st = ftos (number_of_teams);\r
1259                 sprint (self, st);\r
1260                 sprint (self, " teams on this map.\nTry again\n");\r
1261                 return (0);\r
1262         }\r
1263         if ((self.team_no > 0))\r
1264         {\r
1265                 sprint (self, "You're already in Team No ");\r
1266                 st = ftos (self.team_no);\r
1267                 sprint (self, st);\r
1268                 sprint (self, ".\n");\r
1269                 return (0);\r
1270         }\r
1271         tc = TeamFortress_TeamGetNoPlayers (tno);\r
1272         if ((tc >= TeamFortress_TeamGetMaxPlayers (tno)))\r
1273         {\r
1274                 sprint (self, "That team is full. Pick another.\n");\r
1275                 return (0);\r
1276         }\r
1277         if ((TeamFortress_TeamGetColor (tno) == 0))\r
1278         {\r
1279                 TeamFortress_TeamSetColor (tno);\r
1280                 if ((TeamFortress_TeamGetColor (tno) == 0))\r
1281                 {\r
1282                         sprint (self, "You can't start a new team with your color, since another ");\r
1283                         sprint (self, "already using that color. Change your pants color, then try again.\n");\r
1284                         return (0);\r
1285                 }\r
1286                 bprint (self.netname);\r
1287                 bprint (" has started Team No ");\r
1288                 st = ftos (tno);\r
1289                 bprint (st);\r
1290                 bprint (".\n");\r
1291                 self.immune_to_check = (time + 10);\r
1292                 if (((toggleflags & 128) || (toggleflags & 2048)))\r
1293                 {\r
1294                         self.frags = TeamFortress_TeamGetScore (tno);\r
1295                 }\r
1296                 stuffcmd (self, "color ");\r
1297                 tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1298                 st = ftos (tc);\r
1299                 stuffcmd (self, st);\r
1300                 stuffcmd (self, "\n");\r
1301                 self.team_no = tno;\r
1302                 self.lives = TeamFortress_TeamGetLives (tno);\r
1303                 //if ((self.playerclass == 0))\r
1304                 if ((self.class == 0))\r
1305                 {\r
1306                         if (TeamFortress_TeamIsCivilian (self.team_no))\r
1307                         {\r
1308                                 self.impulse = 1;\r
1309                                 TeamFortress_ChangeClass ();\r
1310                         }\r
1311                 }\r
1312                 return (1);\r
1313         }\r
1314         bprint (self.netname);\r
1315         bprint (" has joined Team No ");\r
1316         st = ftos (tno);\r
1317         bprint (st);\r
1318         bprint (".\n");\r
1319         stuffcmd (self, "color ");\r
1320         tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1321         st = ftos (tc);\r
1322         stuffcmd (self, st);\r
1323         stuffcmd (self, "\n");\r
1324         self.team_no = tno;\r
1325         self.immune_to_check = (time + 10);\r
1326         self.lives = TeamFortress_TeamGetLives (tno);\r
1327         if (((toggleflags & 128) || (toggleflags & 2048)))\r
1328         {\r
1329                 self.frags = TeamFortress_TeamGetScore (tno);\r
1330         }\r
1331         TeamFortress_TeamShowMemberClasses (self);\r
1332         //if ((self.playerclass == 0))\r
1333         if ((self.class == 0))\r
1334         {\r
1335                 if (TeamFortress_TeamIsCivilian (self.team_no))\r
1336                 {\r
1337                         self.impulse = 1;\r
1338                         TeamFortress_ChangeClass ();\r
1339                 }\r
1340         }\r
1341         return (1);\r
1342 };\r
1343 \r
1344 // Get team score (used in conjunction with autoteam..)\r
1345 float (float tno) TeamFortress_GetRealScore =\r
1346 {\r
1347         local entity te;\r
1348         local float total;\r
1349 \r
1350         te = find (world, classname, "player");\r
1351         while (te)\r
1352         {\r
1353                 if (te.team_no == tno)\r
1354                 {                       \r
1355                         total = total + te.real_frags;\r
1356                 }\r
1357                 te = find (te, classname, "player");\r
1358         }\r
1359         return total;\r
1360 }\r
1361 \r
1362 // Find best team for player (autoteam?)\r
1363 float() TeamFortress_TeamPutPlayerInTeam = \r
1364 {\r
1365         local float i;\r
1366         local float j;\r
1367         local float score1;\r
1368         local float score2;\r
1369 \r
1370         local float lowest;\r
1371         local float likely_team;\r
1372 \r
1373         i = 1;\r
1374         likely_team = random() * number_of_teams;\r
1375         likely_team = ceil(likely_team);\r
1376         if (likely_team == 0)\r
1377         {\r
1378                 likely_team = number_of_teams;\r
1379         }\r
1380 \r
1381         lowest = 33;\r
1382         while (i < number_of_teams + 1)\r
1383         {\r
1384                 j = TeamFortress_TeamGetNoPlayers(i);\r
1385                 \r
1386                 if (j < lowest)\r
1387                 {\r
1388                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1389                         {\r
1390                                 lowest = j;\r
1391                                 likely_team = i;\r
1392                         }\r
1393                 }\r
1394                 // pablo. fancier autoteam for even teams.\r
1395                 else if (j == lowest)\r
1396                 {\r
1397                         \r
1398                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1399                         {\r
1400                                 score1 = TeamFortress_GetRealScore(i);\r
1401                                 score2 = TeamFortress_GetRealScore(likely_team);\r
1402 \r
1403                                 if ( score1 < score2 )\r
1404                                 {\r
1405                                         likely_team = i;\r
1406                                 }\r
1407                                 else if (score1 == score2)\r
1408                                 {\r
1409                                         if (random() > 0.5)\r
1410                                         {\r
1411                                                 likely_team = i;\r
1412                                         }\r
1413                                 }\r
1414                         }\r
1415                 }\r
1416                 //\r
1417                 i = i + 1;\r
1418         }\r
1419         return TeamFortress_TeamSet(likely_team);\r
1420 };\r
1421 \r
1422 // Remove item_tfgoal timers\r
1423 void() TeamFortress_RemoveTimers = \r
1424 {\r
1425         local entity te;\r
1426 //      self.leg_damage = 0;            // No Snipers\r
1427 //      self.is_undercover = 0;         // I think this function is called in PlayerKill\r
1428 //      self.is_building = 0;           // To Be Added ?\r
1429 //      self.building = world;          // To Be Added ?\r
1430         if (self.tfstate & 2048)\r
1431         {\r
1432                 self.tfstate = self.tfstate - 2048;\r
1433                 TeamFortress_SetSpeed(self);\r
1434                 self.heat = 0;\r
1435         }\r
1436         te = find(world, classname, "timer");\r
1437         while (te != world)\r
1438         {\r
1439                 if (te.owner == self)\r
1440                 {\r
1441                         dremove(te);\r
1442                         te = find(world, classname, "timer");\r
1443                 }\r
1444                 else\r
1445                 {\r
1446                         te = find(te, classname, "timer");\r
1447                 }\r
1448         }\r
1449         te = find(world, classname, "item_tfgoal");\r
1450         while (te)\r
1451         {\r
1452                 if (te.owner == self)\r
1453                 {\r
1454                         if (!(te.goal_activation & 256))\r
1455                         {\r
1456                                 tfgoalitem_RemoveFromPlayer(te, self, 0);\r
1457                         }\r
1458                         if (CTF_Map == 1 && te.goal_no == 1)\r
1459                         {\r
1460                                 bprint(self.netname);\r
1461                                 bprint(" ÌÏÓÔ the ÂÌÕÅ flag!\n");\r
1462                         }\r
1463                         else\r
1464                         {\r
1465                                 if (CTF_Map == 1 && te.goal_no == 2)\r
1466                                 {\r
1467                                         bprint(self.netname);\r
1468                                         bprint(" ÌÏÓÔ the ÒÅÄ flag!\n");\r
1469                                 }\r
1470                         }\r
1471                 }\r
1472                 te = find(te, classname, "item_tfgoal");\r
1473         }\r
1474         te = find(world, classname, "detpack");\r
1475         while (te)\r
1476         {\r
1477                 if (te.weaponmode == 1 && te.enemy == self)\r
1478                 {\r
1479                         te.weaponmode = 0;\r
1480                 }\r
1481                 te = find(te, classname, "detpack");\r
1482         }\r
1483 //      TeamFortress_DetonatePipebombs(); gold. this is the old code for removing pipebombs on quitting.  new one written by pablo is below.\r
1484         // NO PIPEBOMBS IN NEXTF\r
1485 /*      te = find(world, classname, "pipebomb");\r
1486         while (te != world)\r
1487         {\r
1488                 if(te.owner == self)\r
1489                 {\r
1490                         decrement_team_pipebombs(self.team_no);\r
1491                         deathmsg = te.weapon;\r
1492                         te.weapon = 10;\r
1493                         T_RadiusDamage(te, self, 120, world);\r
1494                         WriteByte(4, 23);\r
1495                         WriteByte(4, 3);\r
1496                         WriteCoord(4, te.origin_x);\r
1497                         WriteCoord(4, te.origin_y);\r
1498                         WriteCoord(4, te.origin_z);\r
1499                         multicast(te.origin, TF_FLARE_OFF);\r
1500                         dremove(te);\r
1501                 }\r
1502         te = find(te, classname, "pipebomb");\r
1503         }*/\r
1504 //      stuffcmd(self, "v_idlescale 0\n");\r
1505 //      stuffcmd(self, "v_cshift 0 0 0 0\n");\r
1506 //      self.item_list = 0;                     // To Be Added?\r
1507 //      self.FlashTime = 0;\r
1508         CenterPrint(self, "\n");\r
1509         self.menu_count = 25;           // Menu Stuff - important\r
1510         self.current_menu = 1;          ////\r
1511         self.impulse = 0;\r
1512 };\r
1513 \r
1514 // TF's Become Explosion\r
1515 void() BecomeExplosion = \r
1516 {\r
1517         dremove(self);\r
1518 };\r
1519 \r
1520 // TF Alias Maker\r
1521 void(string halias, float himpulse1, float himpulse2) TeamFortress_Alias = \r
1522 {\r
1523         local string imp;\r
1524         stuffcmd(self, "alias ");\r
1525         stuffcmd(self, halias);\r
1526         stuffcmd(self, " \"impulse ");\r
1527         imp = ftos(himpulse1);\r
1528         stuffcmd(self, imp);\r
1529         if (himpulse2 != 0)\r
1530         {\r
1531                 stuffcmd(self, ";wait; impulse ");\r
1532                 imp = ftos(himpulse2);\r
1533                 stuffcmd(self, imp);\r
1534         }\r
1535         stuffcmd(self, "\"\n");\r
1536 };\r
1537 \r
1538 float (float tno) TeamFortress_TeamGetIllegalClasses =\r
1539 {\r
1540         if ((tno == 1))\r
1541         {\r
1542                 return (illegalclasses1);\r
1543         }\r
1544         if ((tno == 2))\r
1545         {\r
1546                 return (illegalclasses2);\r
1547         }\r
1548         if ((tno == 3))\r
1549         {\r
1550                 return (illegalclasses3);\r
1551         }\r
1552         if ((tno == 4))\r
1553         {\r
1554                 return (illegalclasses4);\r
1555         }\r
1556         return (0);\r
1557 };\r
1558 \r
1559 // Check if legal class\r
1560 float (float pc) IsLegalClass =\r
1561 {\r
1562         local float bit;\r
1563 \r
1564 /*      if (((spy_off == 1) && (pc == 8)))\r
1565         {\r
1566                 return (0);\r
1567         }*/\r
1568         if ((pc == 1))\r
1569         {\r
1570                 bit = 1;\r
1571         }\r
1572         else\r
1573         {\r
1574                 if ((pc == 2))\r
1575                 {\r
1576                         bit = 2;\r
1577                 }\r
1578                 else\r
1579                 {\r
1580                         if ((pc == 3))\r
1581                         {\r
1582                                 bit = 4;\r
1583                         }\r
1584                         else\r
1585                         {\r
1586                                 if ((pc == 4))\r
1587                                 {\r
1588                                         bit = 8;\r
1589                                 }\r
1590                                 else\r
1591                                 {\r
1592                                         if ((pc == 5))\r
1593                                         {\r
1594                                                 bit = 16;\r
1595                                         }\r
1596                                         else\r
1597                                         {\r
1598                                                 if ((pc == 6))\r
1599                                                 {\r
1600                                                         bit = 32;\r
1601                                                 }\r
1602                                                 else\r
1603                                                 {\r
1604                                                         if ((pc == 7))\r
1605                                                         {\r
1606                                                                 bit = 64;\r
1607                                                         }\r
1608                                                         else\r
1609                                                         {\r
1610                                                                 if ((pc == 8))\r
1611                                                                 {\r
1612                                                                         bit = 256;\r
1613                                                                 }\r
1614                                                                 else\r
1615                                                                 {\r
1616                                                                         if ((pc == 9))\r
1617                                                                         {\r
1618                                                                                 bit = 512;\r
1619                                                                         }\r
1620                                                                         else\r
1621                                                                         {\r
1622                                                                                 if ((pc == 10))\r
1623                                                                                 {\r
1624                                                                                         bit = 128;\r
1625                                                                                 }\r
1626                                                                         }\r
1627                                                                 }\r
1628                                                         }\r
1629                                                 }\r
1630                                         }\r
1631                                 }\r
1632                         }\r
1633                 }\r
1634         }\r
1635         if (((illegalclasses & bit) || (TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)))\r
1636         {\r
1637                 return (0);\r
1638         }\r
1639         return (1);\r
1640 };\r
1641 \r
1642 // Display legal classes for map\r
1643 void () TeamFortress_DisplayLegalClasses =\r
1644 {\r
1645         local float gotone;\r
1646         local float ill;\r
1647 \r
1648         sprint (self, "Legal Classes for your team are:\n");\r
1649         gotone = 0;\r
1650         ill = TeamFortress_TeamGetIllegalClasses (self.team_no);\r
1651         if ((!(illegalclasses & 1) && !(ill & 1)))\r
1652         {\r
1653                 if (gotone)\r
1654                 {\r
1655                         sprint (self, ", ");\r
1656                 }\r
1657                 gotone = 1;\r
1658                 sprint (self, "Scout");\r
1659         }\r
1660         if ((!(illegalclasses & 2) && !(ill & 2)))\r
1661         {\r
1662                 if (gotone)\r
1663                 {\r
1664                         sprint (self, ", ");\r
1665                 }\r
1666                 gotone = 1;\r
1667                 sprint (self, "Sniper");\r
1668         }\r
1669         if ((!(illegalclasses & 4) && !(ill & 4)))\r
1670         {\r
1671                 if (gotone)\r
1672                 {\r
1673                         sprint (self, ", ");\r
1674                 }\r
1675                 gotone = 1;\r
1676                 sprint (self, "Soldier");\r
1677         }\r
1678         if ((!(illegalclasses & 8) && !(ill & 8)))\r
1679         {\r
1680                 if (gotone)\r
1681                 {\r
1682                         sprint (self, ", ");\r
1683                 }\r
1684                 gotone = 1;\r
1685                 sprint (self, "Demolitions Man");\r
1686         }\r
1687         if ((!(illegalclasses & 16) && !(ill & 16)))\r
1688         {\r
1689                 if (gotone)\r
1690                 {\r
1691                         sprint (self, ", ");\r
1692                 }\r
1693                 gotone = 1;\r
1694                 sprint (self, "Combat Medic");\r
1695         }\r
1696         if ((!(illegalclasses & 32) && !(ill & 32)))\r
1697         {\r
1698                 if (gotone)\r
1699                 {\r
1700                         sprint (self, ", ");\r
1701                 }\r
1702                 gotone = 1;\r
1703                 sprint (self, "Heavy Weapons Guy");\r
1704         }\r
1705         if ((!(illegalclasses & 64) && !(ill & 64)))\r
1706         {\r
1707                 if (gotone)\r
1708                 {\r
1709                         sprint (self, ", ");\r
1710                 }\r
1711                 gotone = 1;\r
1712                 sprint (self, "Pyro");\r
1713         }\r
1714         if ((!(illegalclasses & 256) && !(ill & 256)))\r
1715         {\r
1716                 if (gotone)\r
1717                 {\r
1718                         sprint (self, ", ");\r
1719                 }\r
1720                 gotone = 1;\r
1721                 sprint (self, "Spy");\r
1722         }\r
1723         if ((!(illegalclasses & 512) && !(ill & 512)))\r
1724         {\r
1725                 if (gotone)\r
1726                 {\r
1727                         sprint (self, ", ");\r
1728                 }\r
1729                 gotone = 1;\r
1730                 sprint (self, "Engineer");\r
1731         }\r
1732         if ((!(illegalclasses & 128) && !(ill & 128)))\r
1733         {\r
1734                 if (gotone)\r
1735                 {\r
1736                         sprint (self, ", ");\r
1737                 }\r
1738                 gotone = 1;\r
1739                 sprint (self, "RandomPC");\r
1740         }\r
1741         sprint (self, "\n");\r
1742 };\r
1743 \r
1744 // TF class change/select function\r
1745 void() TeamFortress_ChangeClass = \r
1746 {\r
1747 //      local float tc;\r
1748 //      local string st;\r
1749 \r
1750         self.impulse += 100;            //temp\r
1751 \r
1752         if (self.playerclass != 0)\r
1753         {\r
1754 //              if (deathmatch != 3)\r
1755 //              {\r
1756 //                      return;\r
1757 //              }\r
1758                 if (TeamFortress_TeamIsCivilian(self.team_no))\r
1759                 {\r
1760                         sprint(self, "You cannot change class.\n");\r
1761                         return;\r
1762                 }\r
1763                 if (!IsLegalClass(self.impulse - 100))\r
1764                 {\r
1765                         sprint(self, "Your team cannot play that class.\n");\r
1766                         TeamFortress_DisplayLegalClasses();\r
1767                         return;\r
1768                 }\r
1769 /*              tc = IsRestrictedClass(self.impulse - 100);                     // TBA ADD THIS FUNCTION\r
1770                 if (tc != 0)                                                                            // it's actually a megatf fucntion\r
1771                 {                                                                                                       // -- gonna need cvars for it\r
1772                         if (tc > 0)\r
1773                         {\r
1774                                 sprint(self, "That class is restricted to ");\r
1775                                 st = ftos(tc);\r
1776                                 sprint(self, st);\r
1777                                 sprint(self, " per team.\n");\r
1778                         }\r
1779                         else\r
1780                         {\r
1781                                 sprint(self, "That class is disabled.\n");\r
1782                         }\r
1783                         return;\r
1784                 }*/\r
1785                 self.nextpc = self.impulse - 100;\r
1786                 sprint(self, "After dying, you will return as a ");\r
1787                 TeamFortress_PrintClassName(self, self.nextpc, self.tfstate & 8);\r
1788                 self.immune_to_check = time + 10;\r
1789                 return;\r
1790         }\r
1791 /*if (teamplay && self.team_no == 0)            //handled in cmd function\r
1792         {\r
1793                 if (toggleflags & 64)\r
1794                 {\r
1795                         if (TeamFortress_TeamPutPlayerInTeam() == 0)\r
1796                         {\r
1797                                 return;\r
1798                         }\r
1799                 }\r
1800                 else\r
1801                 {\r
1802                         sprint(self, "You must join a team first. \n");\r
1803                         sprint(self, "use imin1, imin2, imin3, or imin4\n");\r
1804                         return;\r
1805                 }\r
1806         }*/\r
1807         if (self.lives == 0)\r
1808         {\r
1809                 sprint(self, "You have no lives left.\n");\r
1810                 return;\r
1811         }\r
1812         if (!IsLegalClass(self.impulse - 100) && self.impulse != 1)\r
1813         {\r
1814                 sprint(self, "You cannot play that playerclass on this map. \n");\r
1815                 TeamFortress_DisplayLegalClasses();\r
1816                 return;\r
1817         }\r
1818 \r
1819 /*      tc = IsRestrictedClass(self.impulse - 100);                     // TBA\r
1820         if (tc != 0)\r
1821         {\r
1822                 if (tc > 0)\r
1823                 {\r
1824                         sprint(self, "That class is restricted to ");\r
1825                         st = ftos(tc);\r
1826                         sprint(self, st);\r
1827                         sprint(self, " per team.\n");\r
1828                 }\r
1829                 else\r
1830                 {\r
1831                         sprint(self, "That class is disabled.\n");\r
1832                 }\r
1833                 return;\r
1834         }*/\r
1835         if (self.impulse != 1)\r
1836         {\r
1837                 self.playerclass = self.impulse - 100;\r
1838         }\r
1839         else\r
1840         {\r
1841                 self.playerclass = 11;\r
1842         }\r
1843         if (self.playerclass == 10)\r
1844         {               \r
1845                 sprint(self, "Random Playerclass.\n");\r
1846                 self.tfstate = self.tfstate | 8;\r
1847 /*              tc = 1 + floor(random() * (10 - 1));\r
1848                 while (IsRestrictedClass(tc) != 0)\r
1849                 {\r
1850                         tc = 1 + floor(random() * (10 - 1));\r
1851                 }*/\r
1852 //              self.playerclass = tc;\r
1853                 self.playerclass = 10;\r
1854                 ChooseRandomClass();\r
1855         }\r
1856         //ftos(TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)\r
1857 \r
1858         PutClientInServer ();           //temp\r
1859 };\r
1860 \r
1861 // XavioR's new TF reload function\r
1862 void (float o, float m, void () g) weapon_thinkf;\r
1863 void () Reload_Restore_Weapon =\r
1864 {\r
1865         if (self.owner.weaponentity.pos1 != '0 0 0')\r
1866         {\r
1867                 self.owner.weaponentity.pos1 = '0 0 0';\r
1868                 self.owner.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
1869         }\r
1870 };\r
1871 \r
1872 void (float rweapon, float amount) DoReload =\r
1873 {\r
1874         local float rtime;\r
1875 \r
1876         if (self.reload_time > time)\r
1877                 return;\r
1878         if (amount == 0)\r
1879                 return;\r
1880 \r
1881         weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now\r
1882         if (rweapon != 5)\r
1883                 sprint(self, "Reloading...\n");\r
1884 \r
1885         if (rweapon == 2)               // CryLink (flak cannon)\r
1886         {\r
1887                 rtime = (amount * .80);\r
1888                 self.clip_crylink = CLIP_MAX_CRYLINK;\r
1889         }\r
1890         if (rweapon == 3)               // Rocket launcher\r
1891         {\r
1892                 rtime = (amount * 1.30);\r
1893                 self.clip_rockets = 4;\r
1894         }\r
1895         if (rweapon == 4)               // Pipe Grenade Launcher\r
1896         {\r
1897                 rtime = (amount * 1.05);\r
1898                 self.clip_pipegrenades = 6;\r
1899         }\r
1900         if (rweapon == 5)               // Building something... (senrtry gun, tesla, etc.)\r
1901         {\r
1902                 rtime = amount;\r
1903         }\r
1904 \r
1905         self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;\r
1906         self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
1907         newmis = spawn();\r
1908         newmis.owner = self;\r
1909         newmis.think = Reload_Restore_Weapon;\r
1910         newmis.nextthink = time + rtime;\r
1911 \r
1912         self.reload_time = time + rtime;\r
1913 };\r
1914 \r
1915 // Xavior's self.playerclass to self.class conversion\r
1916 string(string s1, ...) strcat;\r
1917 void () Do_TFClass_Conversion =\r
1918 {\r
1919         local float cl;\r
1920         local string cst;\r
1921 \r
1922         if (self.respawn_as_new_class > 0)\r
1923         {\r
1924                 self.playerclass = self.respawn_as_new_class;\r
1925                 self.respawn_as_new_class = 0;\r
1926                 return;\r
1927         }\r
1928 \r
1929         if (self.playerclass == TF_CLASS_SCOUT) {\r
1930                 self.class = CLASS_SCOUT;\r
1931                 cst = "scout"; }\r
1932         if (self.playerclass == TF_CLASS_SOLDIER) {\r
1933                 self.class = CLASS_SOLDIER;\r
1934                 cst = "soldier"; }\r
1935         if (self.playerclass == TF_CLASS_MEDIC) {\r
1936                 self.class = CLASS_MEDIC;\r
1937                 cst = "medic"; }\r
1938         if (self.playerclass == TF_CLASS_PYRO) {\r
1939                 self.class = CLASS_PYRO;\r
1940                 cst = "pyro"; }\r
1941         if (self.playerclass == TF_CLASS_SPY) {\r
1942                 self.class = CLASS_SPY;\r
1943                 cst = "spy"; }\r
1944         if (self.playerclass == TF_CLASS_ENGINEER) {\r
1945                 self.class = CLASS_ENGINEER;\r
1946                 cst = "engineer"; }\r
1947         if (self.playerclass == TF_CLASS_RANDOM || self.tfstate == self.tfstate | 8) {\r
1948                 cst = ChooseRandomClass(); }\r
1949         // Note to self: add Random and Civilian\r
1950 \r
1951         cl = GetPlayerClass();\r
1952 \r
1953         if (!self.class == cl)\r
1954         {\r
1955                 if (cst == "engineer")\r
1956                 {\r
1957                         self.playermodel = strcat("models/class/",cst,"_other.zym");\r
1958                 }\r
1959                 else\r
1960                 {\r
1961                         self.playermodel = strcat("models/class/",cst,"_mechanical.zym");\r
1962                 }\r
1963         }\r
1964         SetPlayerSpeed(self);\r
1965 };\r
1966 \r
1967 // XavioR's Random Class select\r
1968 string () ChooseRandomClass =\r
1969 {\r
1970         local float choose;\r
1971         local float good;\r
1972 \r
1973         while (good < 1)\r
1974         {\r
1975                 choose = (1 + floor ((random () * (10 - 1))));\r
1976                 if (IsLegalClass(choose) && choose != TF_CLASS_SNIPER && choose != TF_CLASS_DEMOMAN && choose != TF_CLASS_HWGUY)\r
1977                 {\r
1978                         good = 1;\r
1979 //                      sprint (self, ftos(choose));\r
1980 //                      sprint (self, "\n");\r
1981                         if (choose == TF_CLASS_SCOUT) {\r
1982                                 self.class = CLASS_SCOUT;\r
1983                                 return ("scout"); }\r
1984                         if (choose == TF_CLASS_SOLDIER) {\r
1985                                 self.class = CLASS_SOLDIER;\r
1986                                 return ("soldier"); }\r
1987                         if (choose == TF_CLASS_PYRO) {\r
1988                                 self.class = CLASS_PYRO;\r
1989                                 return ("pyro"); }\r
1990                         if (choose == TF_CLASS_ENGINEER) {\r
1991                                 self.class = CLASS_ENGINEER;\r
1992                                 return ("engineer"); }\r
1993                         if (choose == TF_CLASS_MEDIC) {\r
1994                                 self.class = CLASS_MEDIC;\r
1995                                 return ("medic"); }\r
1996                         if (choose == TF_CLASS_SPY) {\r
1997                                 self.class = CLASS_SPY;\r
1998                                 return ("spy"); }\r
1999                 }\r
2000         }\r
2001 };\r
2002 \r
2003 // Nail projectile and blood\r
2004 float current_yaw;\r
2005 float (float fl) anglemod =\r
2006 {\r
2007         while (fl >= 360)\r
2008         {\r
2009                 fl = fl - 360;\r
2010         }\r
2011         while (fl < 0)\r
2012         {\r
2013                 fl = fl + 360;\r
2014         }\r
2015         return (fl);\r
2016 };\r
2017 \r
2018 vector () wall_velocity =\r
2019 {\r
2020         local vector vel;\r
2021 \r
2022         vel = normalize (self.velocity);\r
2023         vel = normalize (((vel + (v_up * (random () - 0.5))) + (v_right * (random () - 0.5))));\r
2024         vel = (vel + (2 * trace_plane_normal));\r
2025         vel = (vel * 200);\r
2026         return (vel);\r
2027 };\r
2028 \r
2029 void (vector org, float damage) SpawnBlood =\r
2030 {\r
2031         particle (org, '0 0 0', 73, (damage * 2));\r
2032 };\r
2033 \r
2034 void (float damage) spawn_touchblood =\r
2035 {\r
2036         local vector vel;\r
2037 \r
2038         vel = (wall_velocity () * 0.2);\r
2039         SpawnBlood ((self.origin + (vel * 0.01)), damage);\r
2040 };\r
2041 \r
2042 void () superspike_touch =\r
2043 {\r
2044         local float ndmg;\r
2045 \r
2046 /*      if (self.voided)                                // temp?\r
2047         {\r
2048                 return;\r
2049         }\r
2050         self.voided = 1;*/\r
2051         if (other == self.owner)\r
2052         {\r
2053                 return;\r
2054         }\r
2055         if (other.solid == 1)\r
2056         {\r
2057                 return;\r
2058         }\r
2059         if (pointcontents (self.origin) == -6)\r
2060         {\r
2061                 dremove (self);\r
2062                 return;\r
2063         }\r
2064         if (other.takedamage)\r
2065         {\r
2066                 spawn_touchblood (18);\r
2067                 deathmsg = self.weapon;\r
2068                 if ((deathmsg == 9))\r
2069                 {\r
2070                         ndmg = 13;\r
2071                 }\r
2072                 else\r
2073                 {\r
2074                         ndmg = 26;\r
2075                 }\r
2076                 if (self.owner.classname == "grenade")\r
2077                 {\r
2078                         TF_T_Damage (other, self, self.owner.owner, ndmg, 2, 2);\r
2079                 }\r
2080                 else\r
2081                 {\r
2082                         TF_T_Damage (other, self, self.owner, ndmg, 2, 2);\r
2083                 }\r
2084         }\r
2085         else\r
2086         {\r
2087                 WriteByte (0, 23);\r
2088                 WriteByte (0, 1);\r
2089                 WriteCoord (0, self.origin_x);\r
2090                 WriteCoord (0, self.origin_y);\r
2091                 WriteCoord (0, self.origin_z);\r
2092         }\r
2093         dremove (self);\r
2094 };\r
2095 \r
2096 void () spike_touch =\r
2097 {\r
2098         if (other.solid == 1)\r
2099         {\r
2100                 return;\r
2101         }\r
2102         if (pointcontents (self.origin) == -6)\r
2103         {\r
2104                 dremove (self);\r
2105                 return;\r
2106         }\r
2107         if (other.takedamage)\r
2108         {\r
2109                 spawn_touchblood (9);\r
2110                 deathmsg = self.weapon;\r
2111                 if (self.owner.classname == "grenade")\r
2112                 {\r
2113                         TF_T_Damage (other, self, self.owner.owner, 9, 2, 2);\r
2114                 }\r
2115                 else\r
2116                 {\r
2117                         TF_T_Damage (other, self, self.owner, 9, 2, 2);\r
2118                 }\r
2119         }\r
2120         else\r
2121         {\r
2122                 WriteByte (4, 23);\r
2123                 if ((self.classname == "wizspike"))\r
2124                 {\r
2125                         WriteByte (4, 7);\r
2126                 }\r
2127                 else\r
2128                 {\r
2129                         if ((self.classname == "knightspike"))\r
2130                         {\r
2131                                 WriteByte (4, 8);\r
2132                         }\r
2133                         else\r
2134                         {\r
2135                                 WriteByte (4, 0);\r
2136                         }\r
2137                 }\r
2138                 WriteCoord (4, self.origin_x);\r
2139                 WriteCoord (4, self.origin_y);\r
2140                 WriteCoord (4, self.origin_z);\r
2141         }\r
2142         dremove (self);\r
2143 };\r
2144 \r
2145 void(vector org) te_gunshot;\r
2146 float   EF_ADDITIVE/*     = 32*/;\r
2147 void () ChangeModelTime =\r
2148 {\r
2149         if (self.owner)\r
2150                 setmodel (self.owner, self.classname);\r
2151         dremove(self);\r
2152 };\r
2153 \r
2154 void (entity ent, string st, float wait_time) soonmodel =\r
2155 {\r
2156         local entity x;\r
2157         x = spawn ();\r
2158         x.classname = st;\r
2159         x.owner = ent;\r
2160         x.nextthink = time + wait_time;\r
2161         x.think = ChangeModelTime;\r
2162 };\r
2163 \r
2164 .float scale;\r
2165 \r
2166 void (vector vect_a, vector vect_b) launch_spike =\r
2167 {\r
2168         local entity e;                 // bullet trail\r
2169 \r
2170         newmis = spawn ();\r
2171         newmis.owner = self;\r
2172         newmis.movetype = 9;\r
2173         newmis.solid = 2;\r
2174         newmis.angles = vectoangles (vect_b);\r
2175         newmis.touch = spike_touch;\r
2176         newmis.weapon = 3;\r
2177         newmis.classname = "spike";\r
2178         newmis.think = SUB_Remove;\r
2179         newmis.nextthink = (time + 3);\r
2180         if (deathmsg != 9)\r
2181         {\r
2182                 setmodel (newmis, "models/plasmatrail.mdl");\r
2183         }\r
2184         setsize (newmis, '0 0 0', '0 0 0');\r
2185         setorigin (newmis, vect_a);\r
2186         newmis.velocity = (vect_b * 2000);\r
2187 \r
2188                 e = spawn();\r
2189                 e.owner = self;\r
2190                 e.movetype = MOVETYPE_FLY;\r
2191                 e.solid = SOLID_NOT;\r
2192                 e.think = SUB_Remove;\r
2193                 e.nextthink = time + vlen(trace_endpos - self.origin) / 6000;\r
2194                 e.velocity = vect_b * 4000;\r
2195                 e.angles = vectoangles (vect_b);\r
2196                 e.scale = .3;\r
2197 //              soonmodel (e, "models/tracer.mdl", .1);\r
2198                 setmodel (e, "models/tracer.mdl");\r
2199                 setsize (e, '0 0 0', '0 0 0');\r
2200                 setorigin (e, vect_a);\r
2201                 e.effects = e.effects | EF_ADDITIVE;\r
2202 };\r
2203 \r
2204 // TF's Ammo-Updater\r
2205 void () W_SetCurrentAmmo =\r
2206 {\r
2207         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
2208 };\r
2209 \r
2210 // TF Team Sprint\r
2211 void (float tno, entity ignore, string st) teamsprint =\r
2212 {\r
2213         local entity te;\r
2214 \r
2215         if ((tno == 0))\r
2216         {\r
2217                 return;\r
2218         }\r
2219         te = find (world, classname, "player");\r
2220         while (te)\r
2221         {\r
2222                 if (((te.team_no == tno) && (te != ignore)))\r
2223                 {\r
2224                         sprint (te, st);\r
2225                 }\r
2226                 te = find (te, classname, "player");\r
2227         }\r
2228 };\r
2229 \r
2230 // CENTERPRINT\r
2231 void (entity pl, string s1, string s2) CenterPrint2 =\r
2232 {\r
2233         centerprint (pl, s1, s2);\r
2234         pl.StatusRefreshTime = (time + 1.5);\r
2235 };\r
2236 \r
2237 // another ammo check caleld by the menu system. I dont know exactly what function this is for. - XavioR\r
2238 void(entity p) bound_other_ammo = \r
2239 {\r
2240         if (p.ammo_shells > TeamFortress_GetMaxAmmo(p, 256))\r
2241         {\r
2242                 p.ammo_shells = TeamFortress_GetMaxAmmo(p, 256);\r
2243         }\r
2244         if (p.ammo_nails > TeamFortress_GetMaxAmmo(p, 512))\r
2245         {\r
2246                 p.ammo_nails = TeamFortress_GetMaxAmmo(p, 512);\r
2247         }\r
2248         if (p.ammo_rockets > TeamFortress_GetMaxAmmo(p, 1024))\r
2249         {\r
2250                 p.ammo_rockets = TeamFortress_GetMaxAmmo(p, 1024);\r
2251         }\r
2252         if (p.ammo_cells > TeamFortress_GetMaxAmmo(p, 2048))\r
2253         {\r
2254                 p.ammo_cells = TeamFortress_GetMaxAmmo(p, 2048);\r
2255         }\r
2256 /*      if (p.ammo_medikit > p.maxammo_medikit)                         // addme\r
2257         {\r
2258                 p.ammo_medikit = p.maxammo_medikit;\r
2259         }*/\r
2260         if (p.armorvalue > p.maxarmor)\r
2261         {\r
2262                 p.armorvalue = p.max_armor;\r
2263         }\r
2264         if (p.no_grenades_1 > 4)\r
2265         {\r
2266                 p.no_grenades_1 = 4;\r
2267         }\r
2268         if (p.no_grenades_2 > 4)\r
2269         {\r
2270                 p.no_grenades_2 = 4;\r
2271         }\r
2272 };\r
2273 \r
2274 // TF Drop Flag Function\r
2275 void () tfgoalitem_dropthink;\r
2276 void () item_tfgoal_touch;\r
2277 void () DropFlag =\r
2278 {\r
2279         local entity Item;\r
2280         local entity te;\r
2281         local float f;\r
2282         local string st;\r
2283 \r
2284         te = find (world, classname, "item_tfgoal");\r
2285         while (te)\r
2286         {\r
2287                 if (te.owner == self)\r
2288                 {\r
2289                         Item = te;\r
2290                 }\r
2291                 te = find (te, classname, "item_tfgoal");\r
2292         }\r
2293 \r
2294         if (Item == world)\r
2295         {\r
2296                 sprint (self, "You don't have the flag.\n");    \r
2297                 return;\r
2298         }\r
2299 \r
2300         // Delay\r
2301         if (self.DropFlagDelay > time)\r
2302         {\r
2303                 sprint (self, "Can't drop again for another "); \r
2304                 f = ceil(self.DropFlagDelay - time);\r
2305                 st = ftos(f);\r
2306                 sprint (self, st);\r
2307                 sprint (self, " seconds.\n");   \r
2308                 return;\r
2309         }\r
2310         self.DropFlagDelay = time + 10;\r
2311         //\r
2312 \r
2313         // Flash of particles\r
2314         WriteByte(4, 23);\r
2315         WriteByte(4, 11);\r
2316         WriteCoord(4, self.origin_x);\r
2317         WriteCoord(4, self.origin_y);\r
2318         WriteCoord(4, self.origin_z);\r
2319 \r
2320         tfgoalitem_RemoveFromPlayer(Item, self, 2);\r
2321 \r
2322         setorigin (Item, self.origin - '0 0 -24');      // - vf*(16));// - '0 0 15');   //Item.origin = self.origin + v_forward*56 + '0 0 8';\r
2323         Item.velocity = '0 0 1';                //((vf * 150) + '0 0 150';\r
2324                                                         //gold.  i didn't even have to change the origin, just the velocity. used to be '0 0 150'\r
2325         Item.goal_state = 2;\r
2326         Item.movetype = 6;\r
2327         Item.solid = TF_FLARE_OFF;\r
2328         setsize(Item, '-16 -16 0', '16 16 56');\r
2329         if (Item.mdl != string_null)\r
2330         {\r
2331                 setmodel(Item, Item.mdl);\r
2332         }\r
2333         Item.option5 = time + 2;\r
2334         Item.tent = self;\r
2335         \r
2336         Item.nextthink = time + 5;\r
2337         Item.think = tfgoalitem_dropthink;\r
2338         Item.touch = item_tfgoal_touch;\r
2339 }